• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package android.hardware.camera2.marshal.impl;
17 
18 import android.hardware.camera2.marshal.Marshaler;
19 import android.hardware.camera2.marshal.MarshalQueryable;
20 import android.hardware.camera2.params.ReprocessFormatsMap;
21 import android.hardware.camera2.params.StreamConfigurationMap;
22 import android.hardware.camera2.utils.TypeReference;
23 
24 import static android.hardware.camera2.impl.CameraMetadataNative.*;
25 import static android.hardware.camera2.marshal.MarshalHelpers.*;
26 
27 import java.nio.ByteBuffer;
28 import java.nio.IntBuffer;
29 
30 /**
31  * Marshaler for {@code android.scaler.availableInputOutputFormatsMap} custom class
32  * {@link ReprocessFormatsMap}
33  */
34 public class MarshalQueryableReprocessFormatsMap
35         implements MarshalQueryable<ReprocessFormatsMap> {
36 
37     private class MarshalerReprocessFormatsMap extends Marshaler<ReprocessFormatsMap> {
MarshalerReprocessFormatsMap( TypeReference<ReprocessFormatsMap> typeReference, int nativeType)38         protected MarshalerReprocessFormatsMap(
39                 TypeReference<ReprocessFormatsMap> typeReference, int nativeType) {
40             super(MarshalQueryableReprocessFormatsMap.this, typeReference, nativeType);
41         }
42 
43         @Override
marshal(ReprocessFormatsMap value, ByteBuffer buffer)44         public void marshal(ReprocessFormatsMap value, ByteBuffer buffer) {
45             /*
46              * // writing (static example, DNG+ZSL)
47              * int32_t[] contents = {
48              *   RAW_OPAQUE, 3, RAW16, YUV_420_888, BLOB,
49              *   RAW16, 2, YUV_420_888, BLOB,
50              *   ...,
51              *   INPUT_FORMAT, OUTPUT_FORMAT_COUNT, [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1]
52              * };
53              */
54             int[] inputs = StreamConfigurationMap.imageFormatToInternal(value.getInputs());
55             for (int input : inputs) {
56                 // INPUT_FORMAT
57                 buffer.putInt(input);
58 
59                 int[] outputs =
60                         StreamConfigurationMap.imageFormatToInternal(value.getOutputs(input));
61                 // OUTPUT_FORMAT_COUNT
62                 buffer.putInt(outputs.length);
63 
64                 // [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1]
65                 for (int output : outputs) {
66                     buffer.putInt(output);
67                 }
68             }
69         }
70 
71         @Override
unmarshal(ByteBuffer buffer)72         public ReprocessFormatsMap unmarshal(ByteBuffer buffer) {
73             int len = buffer.remaining() / SIZEOF_INT32;
74             if (buffer.remaining() % SIZEOF_INT32 != 0) {
75                 throw new AssertionError("ReprocessFormatsMap was not TYPE_INT32");
76             }
77 
78             int[] entries = new int[len];
79 
80             IntBuffer intBuffer = buffer.asIntBuffer();
81             intBuffer.get(entries);
82 
83             // TODO: consider moving rest of parsing code from ReprocessFormatsMap to here
84 
85             return new ReprocessFormatsMap(entries);
86         }
87 
88         @Override
getNativeSize()89         public int getNativeSize() {
90             return NATIVE_SIZE_DYNAMIC;
91         }
92 
93         @Override
calculateMarshalSize(ReprocessFormatsMap value)94         public int calculateMarshalSize(ReprocessFormatsMap value) {
95             /*
96              * // writing (static example, DNG+ZSL)
97              * int32_t[] contents = {
98              *   RAW_OPAQUE, 3, RAW16, YUV_420_888, BLOB,
99              *   RAW16, 2, YUV_420_888, BLOB,
100              *   ...,
101              *   INPUT_FORMAT, OUTPUT_FORMAT_COUNT, [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1]
102              * };
103              */
104             int length = 0;
105 
106             int[] inputs = value.getInputs();
107             for (int input : inputs) {
108 
109                 length += 1; // INPUT_FORMAT
110                 length += 1; // OUTPUT_FORMAT_COUNT
111 
112                 int[] outputs = value.getOutputs(input);
113                 length += outputs.length; // [OUTPUT_0, OUTPUT_1, ..., OUTPUT_FORMAT_COUNT-1]
114             }
115 
116             return length * SIZEOF_INT32;
117         }
118     }
119 
120     @Override
createMarshaler( TypeReference<ReprocessFormatsMap> managedType, int nativeType)121     public Marshaler<ReprocessFormatsMap> createMarshaler(
122             TypeReference<ReprocessFormatsMap> managedType, int nativeType) {
123         return new MarshalerReprocessFormatsMap(managedType, nativeType);
124     }
125 
126     @Override
isTypeMappingSupported(TypeReference<ReprocessFormatsMap> managedType, int nativeType)127     public boolean isTypeMappingSupported(TypeReference<ReprocessFormatsMap> managedType,
128             int nativeType) {
129         return nativeType == TYPE_INT32 && managedType.getType().equals(ReprocessFormatsMap.class);
130     }
131 }
132