| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package android.hardware.camera2.marshal.impl; |
| |
| import android.hardware.camera2.marshal.Marshaler; |
| import android.hardware.camera2.marshal.MarshalQueryable; |
| import android.hardware.camera2.params.ReprocessFormatsMap; |
| import android.hardware.camera2.params.StreamConfigurationMap; |
| import android.hardware.camera2.utils.TypeReference; |
| |
| import static android.hardware.camera2.impl.CameraMetadataNative.*; |
| import static android.hardware.camera2.marshal.MarshalHelpers.*; |
| |
| import java.nio.ByteBuffer; |
| import java.nio.IntBuffer; |
| |
| /** |
| * Marshaler for {@code android.scaler.availableInputOutputFormatsMap} custom class |
| * {@link ReprocessFormatsMap} |
| */ |
| public class MarshalQueryableReprocessFormatsMap |
| implements MarshalQueryable<ReprocessFormatsMap> { |
| |
| private class MarshalerReprocessFormatsMap extends Marshaler<ReprocessFormatsMap> { |
| protected MarshalerReprocessFormatsMap( |
| TypeReference<ReprocessFormatsMap> typeReference, int nativeType) { |
| super(MarshalQueryableReprocessFormatsMap.this, typeReference, nativeType); |
| } |
| |
| @Override |
| public void marshal(ReprocessFormatsMap value, ByteBuffer buffer) { |
| /* |
| * // writing (static example, DNG+ZSL) |
| * int32_t[] contents = { |
| * RAW_OPAQUE, 3, RAW16, YUV_420_888, BLOB, |
| * RAW16, 2, YUV_420_888, BLOB, |
| * ..., |
| * INPUT_FORMAT, OUTPUT_FORMAT_COUNT, [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1] |
| * }; |
| */ |
| int[] inputs = StreamConfigurationMap.imageFormatToInternal(value.getInputs()); |
| for (int input : inputs) { |
| // INPUT_FORMAT |
| buffer.putInt(input); |
| |
| int[] outputs = |
| StreamConfigurationMap.imageFormatToInternal(value.getOutputs(input)); |
| // OUTPUT_FORMAT_COUNT |
| buffer.putInt(outputs.length); |
| |
| // [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1] |
| for (int output : outputs) { |
| buffer.putInt(output); |
| } |
| } |
| } |
| |
| @Override |
| public ReprocessFormatsMap unmarshal(ByteBuffer buffer) { |
| int len = buffer.remaining() / SIZEOF_INT32; |
| if (buffer.remaining() % SIZEOF_INT32 != 0) { |
| throw new AssertionError("ReprocessFormatsMap was not TYPE_INT32"); |
| } |
| |
| int[] entries = new int[len]; |
| |
| IntBuffer intBuffer = buffer.asIntBuffer(); |
| intBuffer.get(entries); |
| |
| // TODO: consider moving rest of parsing code from ReprocessFormatsMap to here |
| |
| return new ReprocessFormatsMap(entries); |
| } |
| |
| @Override |
| public int getNativeSize() { |
| return NATIVE_SIZE_DYNAMIC; |
| } |
| |
| @Override |
| public int calculateMarshalSize(ReprocessFormatsMap value) { |
| /* |
| * // writing (static example, DNG+ZSL) |
| * int32_t[] contents = { |
| * RAW_OPAQUE, 3, RAW16, YUV_420_888, BLOB, |
| * RAW16, 2, YUV_420_888, BLOB, |
| * ..., |
| * INPUT_FORMAT, OUTPUT_FORMAT_COUNT, [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1] |
| * }; |
| */ |
| int length = 0; |
| |
| int[] inputs = value.getInputs(); |
| for (int input : inputs) { |
| |
| length += 1; // INPUT_FORMAT |
| length += 1; // OUTPUT_FORMAT_COUNT |
| |
| int[] outputs = value.getOutputs(input); |
| length += outputs.length; // [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1] |
| } |
| |
| return length * SIZEOF_INT32; |
| } |
| } |
| |
| @Override |
| public Marshaler<ReprocessFormatsMap> createMarshaler( |
| TypeReference<ReprocessFormatsMap> managedType, int nativeType) { |
| return new MarshalerReprocessFormatsMap(managedType, nativeType); |
| } |
| |
| @Override |
| public boolean isTypeMappingSupported(TypeReference<ReprocessFormatsMap> managedType, |
| int nativeType) { |
| return nativeType == TYPE_INT32 && managedType.getType().equals(ReprocessFormatsMap.class); |
| } |
| } |