xref: /aosp_15_r20/frameworks/av/camera/ndk/impl/ACameraMetadata.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "ACameraMetadata"
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include "ACameraMetadata.h"
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <camera_metadata_hidden.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <system/graphics.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/NdkImage.h>
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker using namespace android;
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker // Formats not listed in the public API, but still available to AImageReader
30*ec779b8eSAndroid Build Coastguard Worker // Enum value must match corresponding enum in ui/PublicFormat.h (which is not
31*ec779b8eSAndroid Build Coastguard Worker // available to VNDK)
32*ec779b8eSAndroid Build Coastguard Worker enum AIMAGE_PRIVATE_FORMATS {
33*ec779b8eSAndroid Build Coastguard Worker     /**
34*ec779b8eSAndroid Build Coastguard Worker      * Unprocessed implementation-dependent raw
35*ec779b8eSAndroid Build Coastguard Worker      * depth measurements, opaque with 16 bit
36*ec779b8eSAndroid Build Coastguard Worker      * samples.
37*ec779b8eSAndroid Build Coastguard Worker      *
38*ec779b8eSAndroid Build Coastguard Worker      */
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker     AIMAGE_FORMAT_RAW_DEPTH = 0x1002,
41*ec779b8eSAndroid Build Coastguard Worker 
42*ec779b8eSAndroid Build Coastguard Worker     /**
43*ec779b8eSAndroid Build Coastguard Worker      * Device specific 10 bits depth RAW image format.
44*ec779b8eSAndroid Build Coastguard Worker      *
45*ec779b8eSAndroid Build Coastguard Worker      * <p>Unprocessed implementation-dependent raw depth measurements, opaque with 10 bit samples
46*ec779b8eSAndroid Build Coastguard Worker      * and device specific bit layout.</p>
47*ec779b8eSAndroid Build Coastguard Worker      */
48*ec779b8eSAndroid Build Coastguard Worker     AIMAGE_FORMAT_RAW_DEPTH10 = 0x1003,
49*ec779b8eSAndroid Build Coastguard Worker };
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker /**
52*ec779b8eSAndroid Build Coastguard Worker  * ACameraMetadata Implementation
53*ec779b8eSAndroid Build Coastguard Worker  */
ACameraMetadata(camera_metadata_t * buffer,ACAMERA_METADATA_TYPE type)54*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type) :
55*ec779b8eSAndroid Build Coastguard Worker         mData(std::make_shared<CameraMetadata>(buffer)),
56*ec779b8eSAndroid Build Coastguard Worker         mType(type) {
57*ec779b8eSAndroid Build Coastguard Worker     init();
58*ec779b8eSAndroid Build Coastguard Worker }
59*ec779b8eSAndroid Build Coastguard Worker 
ACameraMetadata(const std::shared_ptr<CameraMetadata> & cameraMetadata,ACAMERA_METADATA_TYPE type)60*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata,
61*ec779b8eSAndroid Build Coastguard Worker         ACAMERA_METADATA_TYPE type) :
62*ec779b8eSAndroid Build Coastguard Worker         mData(cameraMetadata),
63*ec779b8eSAndroid Build Coastguard Worker         mType(type) {
64*ec779b8eSAndroid Build Coastguard Worker     init();
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker 
ACameraMetadata(const ACameraMetadata & other)67*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::ACameraMetadata(const ACameraMetadata& other) :
68*ec779b8eSAndroid Build Coastguard Worker         mData(std::make_shared<CameraMetadata>(*(other.mData))),
69*ec779b8eSAndroid Build Coastguard Worker         mType(other.mType) {
70*ec779b8eSAndroid Build Coastguard Worker }
71*ec779b8eSAndroid Build Coastguard Worker 
~ACameraMetadata()72*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::~ACameraMetadata() {
73*ec779b8eSAndroid Build Coastguard Worker }
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker void
init()76*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::init() {
77*ec779b8eSAndroid Build Coastguard Worker     if (mType == ACM_CHARACTERISTICS) {
78*ec779b8eSAndroid Build Coastguard Worker         filterUnsupportedFeatures();
79*ec779b8eSAndroid Build Coastguard Worker         filterStreamConfigurations();
80*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
81*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
82*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS);
83*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
84*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS);
85*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS);
86*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS);
87*ec779b8eSAndroid Build Coastguard Worker         filterDurations(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS);
88*ec779b8eSAndroid Build Coastguard Worker     }
89*ec779b8eSAndroid Build Coastguard Worker     // TODO: filter request/result keys
90*ec779b8eSAndroid Build Coastguard Worker     const CameraMetadata& metadata = *mData;
91*ec779b8eSAndroid Build Coastguard Worker     const camera_metadata_t *rawMetadata = metadata.getAndLock();
92*ec779b8eSAndroid Build Coastguard Worker     metadata_vendor_id_t vendorTagId = get_camera_metadata_vendor_id(rawMetadata);
93*ec779b8eSAndroid Build Coastguard Worker     metadata.unlock(rawMetadata);
94*ec779b8eSAndroid Build Coastguard Worker     sp<VendorTagDescriptorCache> vtCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
95*ec779b8eSAndroid Build Coastguard Worker     if (vtCache == nullptr) {
96*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: error vendor tag descriptor cache is not initialized", __FUNCTION__);
97*ec779b8eSAndroid Build Coastguard Worker         return;
98*ec779b8eSAndroid Build Coastguard Worker     }
99*ec779b8eSAndroid Build Coastguard Worker     vtCache->getVendorTagDescriptor(vendorTagId, &mVTags);
100*ec779b8eSAndroid Build Coastguard Worker     if (mVTags == nullptr) {
101*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: error retrieving vendor tag descriptor", __FUNCTION__);
102*ec779b8eSAndroid Build Coastguard Worker     }
103*ec779b8eSAndroid Build Coastguard Worker }
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker bool
isNdkSupportedCapability(int32_t capability)106*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::isNdkSupportedCapability(int32_t capability) {
107*ec779b8eSAndroid Build Coastguard Worker     switch (capability) {
108*ec779b8eSAndroid Build Coastguard Worker         case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING:
109*ec779b8eSAndroid Build Coastguard Worker         case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING:
110*ec779b8eSAndroid Build Coastguard Worker         case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO:
111*ec779b8eSAndroid Build Coastguard Worker             return false;
112*ec779b8eSAndroid Build Coastguard Worker         default:
113*ec779b8eSAndroid Build Coastguard Worker             // Assuming every capability passed to this function is actually a
114*ec779b8eSAndroid Build Coastguard Worker             // valid capability.
115*ec779b8eSAndroid Build Coastguard Worker             return true;
116*ec779b8eSAndroid Build Coastguard Worker     }
117*ec779b8eSAndroid Build Coastguard Worker }
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker void
filterUnsupportedFeatures()120*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::filterUnsupportedFeatures() {
121*ec779b8eSAndroid Build Coastguard Worker     // Hide unsupported capabilities (reprocessing)
122*ec779b8eSAndroid Build Coastguard Worker     camera_metadata_entry entry = mData->find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
123*ec779b8eSAndroid Build Coastguard Worker     if (entry.count == 0 || entry.type != TYPE_BYTE) {
124*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: malformed available capability key! count %zu, type %d",
125*ec779b8eSAndroid Build Coastguard Worker                 __FUNCTION__, entry.count, entry.type);
126*ec779b8eSAndroid Build Coastguard Worker         return;
127*ec779b8eSAndroid Build Coastguard Worker     }
128*ec779b8eSAndroid Build Coastguard Worker 
129*ec779b8eSAndroid Build Coastguard Worker     Vector<uint8_t> capabilities;
130*ec779b8eSAndroid Build Coastguard Worker     capabilities.setCapacity(entry.count);
131*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < entry.count; i++) {
132*ec779b8eSAndroid Build Coastguard Worker         uint8_t capability = entry.data.u8[i];
133*ec779b8eSAndroid Build Coastguard Worker         if (isNdkSupportedCapability(capability)) {
134*ec779b8eSAndroid Build Coastguard Worker             capabilities.push(capability);
135*ec779b8eSAndroid Build Coastguard Worker 
136*ec779b8eSAndroid Build Coastguard Worker             if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
137*ec779b8eSAndroid Build Coastguard Worker                 derivePhysicalCameraIds();
138*ec779b8eSAndroid Build Coastguard Worker             }
139*ec779b8eSAndroid Build Coastguard Worker         }
140*ec779b8eSAndroid Build Coastguard Worker     }
141*ec779b8eSAndroid Build Coastguard Worker     mData->update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, capabilities);
142*ec779b8eSAndroid Build Coastguard Worker }
143*ec779b8eSAndroid Build Coastguard Worker 
144*ec779b8eSAndroid Build Coastguard Worker void
derivePhysicalCameraIds()145*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::derivePhysicalCameraIds() {
146*ec779b8eSAndroid Build Coastguard Worker     ACameraMetadata_const_entry entry;
147*ec779b8eSAndroid Build Coastguard Worker     auto ret = getConstEntry(ACAMERA_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS, &entry);
148*ec779b8eSAndroid Build Coastguard Worker     if (ret != ACAMERA_OK) {
149*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Get ACAMERA_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS key failed. ret %d",
150*ec779b8eSAndroid Build Coastguard Worker                 __FUNCTION__, ret);
151*ec779b8eSAndroid Build Coastguard Worker         return;
152*ec779b8eSAndroid Build Coastguard Worker     }
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker     const uint8_t* ids = entry.data.u8;
155*ec779b8eSAndroid Build Coastguard Worker     size_t start = 0;
156*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < entry.count; ++i) {
157*ec779b8eSAndroid Build Coastguard Worker         if (ids[i] == '\0') {
158*ec779b8eSAndroid Build Coastguard Worker             if (start != i) {
159*ec779b8eSAndroid Build Coastguard Worker                 mStaticPhysicalCameraIdValues.push_back(String8((const char *)ids+start));
160*ec779b8eSAndroid Build Coastguard Worker                 mStaticPhysicalCameraIds.push_back(mStaticPhysicalCameraIdValues.back().c_str());
161*ec779b8eSAndroid Build Coastguard Worker             }
162*ec779b8eSAndroid Build Coastguard Worker             start = i+1;
163*ec779b8eSAndroid Build Coastguard Worker         }
164*ec779b8eSAndroid Build Coastguard Worker     }
165*ec779b8eSAndroid Build Coastguard Worker 
166*ec779b8eSAndroid Build Coastguard Worker     if (mStaticPhysicalCameraIds.size() < 2) {
167*ec779b8eSAndroid Build Coastguard Worker         ALOGW("%s: Logical multi-camera device only has %zu physical cameras",
168*ec779b8eSAndroid Build Coastguard Worker                 __FUNCTION__, mStaticPhysicalCameraIds.size());
169*ec779b8eSAndroid Build Coastguard Worker     }
170*ec779b8eSAndroid Build Coastguard Worker }
171*ec779b8eSAndroid Build Coastguard Worker 
172*ec779b8eSAndroid Build Coastguard Worker void
filterDurations(uint32_t tag)173*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::filterDurations(uint32_t tag) {
174*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_CONFIGURATION_SIZE = 4;
175*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_FORMAT_OFFSET = 0;
176*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_WIDTH_OFFSET = 1;
177*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_HEIGHT_OFFSET = 2;
178*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_DURATION_OFFSET = 3;
179*ec779b8eSAndroid Build Coastguard Worker 
180*ec779b8eSAndroid Build Coastguard Worker     camera_metadata_entry entry = mData->find(tag);
181*ec779b8eSAndroid Build Coastguard Worker 
182*ec779b8eSAndroid Build Coastguard Worker     if (entry.count == 0) {
183*ec779b8eSAndroid Build Coastguard Worker         // Duration keys can be missing when corresponding capture feature is not supported
184*ec779b8eSAndroid Build Coastguard Worker         return;
185*ec779b8eSAndroid Build Coastguard Worker     }
186*ec779b8eSAndroid Build Coastguard Worker 
187*ec779b8eSAndroid Build Coastguard Worker     if (entry.count % 4 || entry.type != TYPE_INT64) {
188*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: malformed duration key %d! count %zu, type %d",
189*ec779b8eSAndroid Build Coastguard Worker                 __FUNCTION__, tag, entry.count, entry.type);
190*ec779b8eSAndroid Build Coastguard Worker         return;
191*ec779b8eSAndroid Build Coastguard Worker     }
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker     Vector<int64_t> filteredDurations;
194*ec779b8eSAndroid Build Coastguard Worker     filteredDurations.setCapacity(entry.count * 2);
195*ec779b8eSAndroid Build Coastguard Worker 
196*ec779b8eSAndroid Build Coastguard Worker     for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
197*ec779b8eSAndroid Build Coastguard Worker         int64_t format = entry.data.i64[i + STREAM_FORMAT_OFFSET];
198*ec779b8eSAndroid Build Coastguard Worker         int64_t width = entry.data.i64[i + STREAM_WIDTH_OFFSET];
199*ec779b8eSAndroid Build Coastguard Worker         int64_t height = entry.data.i64[i + STREAM_HEIGHT_OFFSET];
200*ec779b8eSAndroid Build Coastguard Worker         int64_t duration = entry.data.i64[i + STREAM_DURATION_OFFSET];
201*ec779b8eSAndroid Build Coastguard Worker 
202*ec779b8eSAndroid Build Coastguard Worker         // Leave the unfiltered format in so apps depending on previous wrong
203*ec779b8eSAndroid Build Coastguard Worker         // filter behavior continue to work
204*ec779b8eSAndroid Build Coastguard Worker         filteredDurations.push_back(format);
205*ec779b8eSAndroid Build Coastguard Worker         filteredDurations.push_back(width);
206*ec779b8eSAndroid Build Coastguard Worker         filteredDurations.push_back(height);
207*ec779b8eSAndroid Build Coastguard Worker         filteredDurations.push_back(duration);
208*ec779b8eSAndroid Build Coastguard Worker 
209*ec779b8eSAndroid Build Coastguard Worker         // Translate HAL formats to NDK format
210*ec779b8eSAndroid Build Coastguard Worker         switch (tag) {
211*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS:
212*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_SCALER_AVAILABLE_STALL_DURATIONS:
213*ec779b8eSAndroid Build Coastguard Worker                 if (format == HAL_PIXEL_FORMAT_BLOB) {
214*ec779b8eSAndroid Build Coastguard Worker                     format = AIMAGE_FORMAT_JPEG;
215*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(format);
216*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(width);
217*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(height);
218*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(duration);
219*ec779b8eSAndroid Build Coastguard Worker                 }
220*ec779b8eSAndroid Build Coastguard Worker                 break;
221*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:
222*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:
223*ec779b8eSAndroid Build Coastguard Worker                 if (format == HAL_PIXEL_FORMAT_BLOB) {
224*ec779b8eSAndroid Build Coastguard Worker                     format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD;
225*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(format);
226*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(width);
227*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(height);
228*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(duration);
229*ec779b8eSAndroid Build Coastguard Worker                 } else if (format == HAL_PIXEL_FORMAT_Y16) {
230*ec779b8eSAndroid Build Coastguard Worker                     format = AIMAGE_FORMAT_DEPTH16;
231*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(format);
232*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(width);
233*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(height);
234*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(duration);
235*ec779b8eSAndroid Build Coastguard Worker                 }
236*ec779b8eSAndroid Build Coastguard Worker                 break;
237*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS:
238*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS:
239*ec779b8eSAndroid Build Coastguard Worker                 if (format == HAL_PIXEL_FORMAT_BLOB) {
240*ec779b8eSAndroid Build Coastguard Worker                     format = AIMAGE_FORMAT_HEIC;
241*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(format);
242*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(width);
243*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(height);
244*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(duration);
245*ec779b8eSAndroid Build Coastguard Worker                 }
246*ec779b8eSAndroid Build Coastguard Worker                 break;
247*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS:
248*ec779b8eSAndroid Build Coastguard Worker             case ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS:
249*ec779b8eSAndroid Build Coastguard Worker                 if (format == HAL_PIXEL_FORMAT_BLOB) {
250*ec779b8eSAndroid Build Coastguard Worker                     format = AIMAGE_FORMAT_DEPTH_JPEG;
251*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(format);
252*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(width);
253*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(height);
254*ec779b8eSAndroid Build Coastguard Worker                     filteredDurations.push_back(duration);
255*ec779b8eSAndroid Build Coastguard Worker                 }
256*ec779b8eSAndroid Build Coastguard Worker                 break;
257*ec779b8eSAndroid Build Coastguard Worker             default:
258*ec779b8eSAndroid Build Coastguard Worker                 // Should not reach here
259*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: Unkown tag 0x%x", __FUNCTION__, tag);
260*ec779b8eSAndroid Build Coastguard Worker         }
261*ec779b8eSAndroid Build Coastguard Worker     }
262*ec779b8eSAndroid Build Coastguard Worker 
263*ec779b8eSAndroid Build Coastguard Worker     mData->update(tag, filteredDurations);
264*ec779b8eSAndroid Build Coastguard Worker }
265*ec779b8eSAndroid Build Coastguard Worker 
266*ec779b8eSAndroid Build Coastguard Worker void
filterStreamConfigurations()267*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::filterStreamConfigurations() {
268*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_CONFIGURATION_SIZE = 4;
269*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_FORMAT_OFFSET = 0;
270*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_WIDTH_OFFSET = 1;
271*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_HEIGHT_OFFSET = 2;
272*ec779b8eSAndroid Build Coastguard Worker     const int STREAM_IS_INPUT_OFFSET = 3;
273*ec779b8eSAndroid Build Coastguard Worker     camera_metadata_entry entry = mData->find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
274*ec779b8eSAndroid Build Coastguard Worker     if (entry.count > 0 && (entry.count % 4 || entry.type != TYPE_INT32)) {
275*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: malformed available stream configuration key! count %zu, type %d",
276*ec779b8eSAndroid Build Coastguard Worker                 __FUNCTION__, entry.count, entry.type);
277*ec779b8eSAndroid Build Coastguard Worker         return;
278*ec779b8eSAndroid Build Coastguard Worker     }
279*ec779b8eSAndroid Build Coastguard Worker 
280*ec779b8eSAndroid Build Coastguard Worker     Vector<int32_t> filteredStreamConfigs;
281*ec779b8eSAndroid Build Coastguard Worker     filteredStreamConfigs.setCapacity(entry.count);
282*ec779b8eSAndroid Build Coastguard Worker 
283*ec779b8eSAndroid Build Coastguard Worker     for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
284*ec779b8eSAndroid Build Coastguard Worker         int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
285*ec779b8eSAndroid Build Coastguard Worker         int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
286*ec779b8eSAndroid Build Coastguard Worker         int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
287*ec779b8eSAndroid Build Coastguard Worker         int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
288*ec779b8eSAndroid Build Coastguard Worker         if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
289*ec779b8eSAndroid Build Coastguard Worker             // Hide input streams
290*ec779b8eSAndroid Build Coastguard Worker             continue;
291*ec779b8eSAndroid Build Coastguard Worker         }
292*ec779b8eSAndroid Build Coastguard Worker         // Translate HAL formats to NDK format
293*ec779b8eSAndroid Build Coastguard Worker         if (format == HAL_PIXEL_FORMAT_BLOB) {
294*ec779b8eSAndroid Build Coastguard Worker             format = AIMAGE_FORMAT_JPEG;
295*ec779b8eSAndroid Build Coastguard Worker         }
296*ec779b8eSAndroid Build Coastguard Worker         filteredStreamConfigs.push_back(format);
297*ec779b8eSAndroid Build Coastguard Worker         filteredStreamConfigs.push_back(width);
298*ec779b8eSAndroid Build Coastguard Worker         filteredStreamConfigs.push_back(height);
299*ec779b8eSAndroid Build Coastguard Worker         filteredStreamConfigs.push_back(isInput);
300*ec779b8eSAndroid Build Coastguard Worker     }
301*ec779b8eSAndroid Build Coastguard Worker 
302*ec779b8eSAndroid Build Coastguard Worker     if (filteredStreamConfigs.size() > 0) {
303*ec779b8eSAndroid Build Coastguard Worker         mData->update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, filteredStreamConfigs);
304*ec779b8eSAndroid Build Coastguard Worker     }
305*ec779b8eSAndroid Build Coastguard Worker 
306*ec779b8eSAndroid Build Coastguard Worker     entry = mData->find(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS);
307*ec779b8eSAndroid Build Coastguard Worker     if (entry.count > 0 && (entry.count % 4 || entry.type != TYPE_INT32)) {
308*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: malformed available depth stream configuration key! count %zu, type %d",
309*ec779b8eSAndroid Build Coastguard Worker                 __FUNCTION__, entry.count, entry.type);
310*ec779b8eSAndroid Build Coastguard Worker         return;
311*ec779b8eSAndroid Build Coastguard Worker     }
312*ec779b8eSAndroid Build Coastguard Worker 
313*ec779b8eSAndroid Build Coastguard Worker     Vector<int32_t> filteredDepthStreamConfigs;
314*ec779b8eSAndroid Build Coastguard Worker     filteredDepthStreamConfigs.setCapacity(entry.count);
315*ec779b8eSAndroid Build Coastguard Worker 
316*ec779b8eSAndroid Build Coastguard Worker     for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
317*ec779b8eSAndroid Build Coastguard Worker         int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
318*ec779b8eSAndroid Build Coastguard Worker         int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
319*ec779b8eSAndroid Build Coastguard Worker         int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
320*ec779b8eSAndroid Build Coastguard Worker         int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
321*ec779b8eSAndroid Build Coastguard Worker         if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
322*ec779b8eSAndroid Build Coastguard Worker             // Hide input streams
323*ec779b8eSAndroid Build Coastguard Worker             continue;
324*ec779b8eSAndroid Build Coastguard Worker         }
325*ec779b8eSAndroid Build Coastguard Worker         // Translate HAL formats to NDK format
326*ec779b8eSAndroid Build Coastguard Worker         if (format == HAL_PIXEL_FORMAT_BLOB) {
327*ec779b8eSAndroid Build Coastguard Worker             format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD;
328*ec779b8eSAndroid Build Coastguard Worker         } else if (format == HAL_PIXEL_FORMAT_Y16) {
329*ec779b8eSAndroid Build Coastguard Worker             format = AIMAGE_FORMAT_DEPTH16;
330*ec779b8eSAndroid Build Coastguard Worker         } else if (format == HAL_PIXEL_FORMAT_RAW16) {
331*ec779b8eSAndroid Build Coastguard Worker             format = static_cast<int32_t>(AIMAGE_FORMAT_RAW_DEPTH);
332*ec779b8eSAndroid Build Coastguard Worker         } else if (format == HAL_PIXEL_FORMAT_RAW10) {
333*ec779b8eSAndroid Build Coastguard Worker             format = static_cast<int32_t>(AIMAGE_FORMAT_RAW_DEPTH10);
334*ec779b8eSAndroid Build Coastguard Worker         }
335*ec779b8eSAndroid Build Coastguard Worker 
336*ec779b8eSAndroid Build Coastguard Worker         filteredDepthStreamConfigs.push_back(format);
337*ec779b8eSAndroid Build Coastguard Worker         filteredDepthStreamConfigs.push_back(width);
338*ec779b8eSAndroid Build Coastguard Worker         filteredDepthStreamConfigs.push_back(height);
339*ec779b8eSAndroid Build Coastguard Worker         filteredDepthStreamConfigs.push_back(isInput);
340*ec779b8eSAndroid Build Coastguard Worker     }
341*ec779b8eSAndroid Build Coastguard Worker 
342*ec779b8eSAndroid Build Coastguard Worker     if (filteredDepthStreamConfigs.size() > 0) {
343*ec779b8eSAndroid Build Coastguard Worker         mData->update(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
344*ec779b8eSAndroid Build Coastguard Worker                 filteredDepthStreamConfigs);
345*ec779b8eSAndroid Build Coastguard Worker     }
346*ec779b8eSAndroid Build Coastguard Worker 
347*ec779b8eSAndroid Build Coastguard Worker     entry = mData->find(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS);
348*ec779b8eSAndroid Build Coastguard Worker     Vector<int32_t> filteredHeicStreamConfigs;
349*ec779b8eSAndroid Build Coastguard Worker     filteredHeicStreamConfigs.setCapacity(entry.count);
350*ec779b8eSAndroid Build Coastguard Worker 
351*ec779b8eSAndroid Build Coastguard Worker     for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
352*ec779b8eSAndroid Build Coastguard Worker         int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
353*ec779b8eSAndroid Build Coastguard Worker         int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
354*ec779b8eSAndroid Build Coastguard Worker         int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
355*ec779b8eSAndroid Build Coastguard Worker         int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
356*ec779b8eSAndroid Build Coastguard Worker         if (isInput == ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT) {
357*ec779b8eSAndroid Build Coastguard Worker             // Hide input streams
358*ec779b8eSAndroid Build Coastguard Worker             continue;
359*ec779b8eSAndroid Build Coastguard Worker         }
360*ec779b8eSAndroid Build Coastguard Worker         // Translate HAL formats to NDK format
361*ec779b8eSAndroid Build Coastguard Worker         if (format == HAL_PIXEL_FORMAT_BLOB) {
362*ec779b8eSAndroid Build Coastguard Worker             format = AIMAGE_FORMAT_HEIC;
363*ec779b8eSAndroid Build Coastguard Worker         }
364*ec779b8eSAndroid Build Coastguard Worker 
365*ec779b8eSAndroid Build Coastguard Worker         filteredHeicStreamConfigs.push_back(format);
366*ec779b8eSAndroid Build Coastguard Worker         filteredHeicStreamConfigs.push_back(width);
367*ec779b8eSAndroid Build Coastguard Worker         filteredHeicStreamConfigs.push_back(height);
368*ec779b8eSAndroid Build Coastguard Worker         filteredHeicStreamConfigs.push_back(isInput);
369*ec779b8eSAndroid Build Coastguard Worker     }
370*ec779b8eSAndroid Build Coastguard Worker     mData->update(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, filteredHeicStreamConfigs);
371*ec779b8eSAndroid Build Coastguard Worker 
372*ec779b8eSAndroid Build Coastguard Worker     entry = mData->find(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS);
373*ec779b8eSAndroid Build Coastguard Worker     Vector<int32_t> filteredDynamicDepthStreamConfigs;
374*ec779b8eSAndroid Build Coastguard Worker     filteredDynamicDepthStreamConfigs.setCapacity(entry.count);
375*ec779b8eSAndroid Build Coastguard Worker 
376*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
377*ec779b8eSAndroid Build Coastguard Worker         int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
378*ec779b8eSAndroid Build Coastguard Worker         int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
379*ec779b8eSAndroid Build Coastguard Worker         int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
380*ec779b8eSAndroid Build Coastguard Worker         int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
381*ec779b8eSAndroid Build Coastguard Worker         if (isInput == ACAMERA_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_INPUT) {
382*ec779b8eSAndroid Build Coastguard Worker             // Hide input streams
383*ec779b8eSAndroid Build Coastguard Worker             continue;
384*ec779b8eSAndroid Build Coastguard Worker         }
385*ec779b8eSAndroid Build Coastguard Worker         // Translate HAL formats to NDK format
386*ec779b8eSAndroid Build Coastguard Worker         if (format == HAL_PIXEL_FORMAT_BLOB) {
387*ec779b8eSAndroid Build Coastguard Worker             format = AIMAGE_FORMAT_DEPTH_JPEG;
388*ec779b8eSAndroid Build Coastguard Worker         }
389*ec779b8eSAndroid Build Coastguard Worker 
390*ec779b8eSAndroid Build Coastguard Worker         filteredDynamicDepthStreamConfigs.push_back(format);
391*ec779b8eSAndroid Build Coastguard Worker         filteredDynamicDepthStreamConfigs.push_back(width);
392*ec779b8eSAndroid Build Coastguard Worker         filteredDynamicDepthStreamConfigs.push_back(height);
393*ec779b8eSAndroid Build Coastguard Worker         filteredDynamicDepthStreamConfigs.push_back(isInput);
394*ec779b8eSAndroid Build Coastguard Worker     }
395*ec779b8eSAndroid Build Coastguard Worker     mData->update(ACAMERA_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS,
396*ec779b8eSAndroid Build Coastguard Worker             filteredDynamicDepthStreamConfigs);
397*ec779b8eSAndroid Build Coastguard Worker }
398*ec779b8eSAndroid Build Coastguard Worker 
399*ec779b8eSAndroid Build Coastguard Worker bool
isVendorTag(const uint32_t tag)400*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::isVendorTag(const uint32_t tag) {
401*ec779b8eSAndroid Build Coastguard Worker     uint32_t tag_section = tag >> 16;
402*ec779b8eSAndroid Build Coastguard Worker     if (tag_section >= VENDOR_SECTION) {
403*ec779b8eSAndroid Build Coastguard Worker         return true;
404*ec779b8eSAndroid Build Coastguard Worker     }
405*ec779b8eSAndroid Build Coastguard Worker     return false;
406*ec779b8eSAndroid Build Coastguard Worker }
407*ec779b8eSAndroid Build Coastguard Worker 
408*ec779b8eSAndroid Build Coastguard Worker camera_status_t
getConstEntry(uint32_t tag,ACameraMetadata_const_entry * entry) const409*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) const {
410*ec779b8eSAndroid Build Coastguard Worker     if (entry == nullptr) {
411*ec779b8eSAndroid Build Coastguard Worker         return ACAMERA_ERROR_INVALID_PARAMETER;
412*ec779b8eSAndroid Build Coastguard Worker     }
413*ec779b8eSAndroid Build Coastguard Worker 
414*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
415*ec779b8eSAndroid Build Coastguard Worker 
416*ec779b8eSAndroid Build Coastguard Worker     camera_metadata_ro_entry rawEntry = static_cast<const CameraMetadata*>(mData.get())->find(tag);
417*ec779b8eSAndroid Build Coastguard Worker     if (rawEntry.count == 0) {
418*ec779b8eSAndroid Build Coastguard Worker         return ACAMERA_ERROR_METADATA_NOT_FOUND;
419*ec779b8eSAndroid Build Coastguard Worker     }
420*ec779b8eSAndroid Build Coastguard Worker     entry->tag = tag;
421*ec779b8eSAndroid Build Coastguard Worker     entry->type = rawEntry.type;
422*ec779b8eSAndroid Build Coastguard Worker     entry->count = rawEntry.count;
423*ec779b8eSAndroid Build Coastguard Worker     entry->data.u8 = rawEntry.data.u8;
424*ec779b8eSAndroid Build Coastguard Worker     return ACAMERA_OK;
425*ec779b8eSAndroid Build Coastguard Worker }
426*ec779b8eSAndroid Build Coastguard Worker 
427*ec779b8eSAndroid Build Coastguard Worker camera_status_t
update(uint32_t tag,uint32_t count,const uint8_t * data)428*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::update(uint32_t tag, uint32_t count, const uint8_t* data) {
429*ec779b8eSAndroid Build Coastguard Worker     return updateImpl<uint8_t>(tag, count, data);
430*ec779b8eSAndroid Build Coastguard Worker }
431*ec779b8eSAndroid Build Coastguard Worker 
432*ec779b8eSAndroid Build Coastguard Worker camera_status_t
update(uint32_t tag,uint32_t count,const int32_t * data)433*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::update(uint32_t tag, uint32_t count, const int32_t* data) {
434*ec779b8eSAndroid Build Coastguard Worker     return updateImpl<int32_t>(tag, count, data);
435*ec779b8eSAndroid Build Coastguard Worker }
436*ec779b8eSAndroid Build Coastguard Worker 
437*ec779b8eSAndroid Build Coastguard Worker camera_status_t
update(uint32_t tag,uint32_t count,const float * data)438*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::update(uint32_t tag, uint32_t count, const float* data) {
439*ec779b8eSAndroid Build Coastguard Worker     return updateImpl<float>(tag, count, data);
440*ec779b8eSAndroid Build Coastguard Worker }
441*ec779b8eSAndroid Build Coastguard Worker 
442*ec779b8eSAndroid Build Coastguard Worker camera_status_t
update(uint32_t tag,uint32_t count,const double * data)443*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::update(uint32_t tag, uint32_t count, const double* data) {
444*ec779b8eSAndroid Build Coastguard Worker     return updateImpl<double>(tag, count, data);
445*ec779b8eSAndroid Build Coastguard Worker }
446*ec779b8eSAndroid Build Coastguard Worker 
447*ec779b8eSAndroid Build Coastguard Worker camera_status_t
update(uint32_t tag,uint32_t count,const int64_t * data)448*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::update(uint32_t tag, uint32_t count, const int64_t* data) {
449*ec779b8eSAndroid Build Coastguard Worker     return updateImpl<int64_t>(tag, count, data);
450*ec779b8eSAndroid Build Coastguard Worker }
451*ec779b8eSAndroid Build Coastguard Worker 
452*ec779b8eSAndroid Build Coastguard Worker camera_status_t
update(uint32_t tag,uint32_t count,const ACameraMetadata_rational * data)453*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::update(uint32_t tag, uint32_t count, const ACameraMetadata_rational* data) {
454*ec779b8eSAndroid Build Coastguard Worker     return updateImpl<camera_metadata_rational_t>(tag, count, data);
455*ec779b8eSAndroid Build Coastguard Worker }
456*ec779b8eSAndroid Build Coastguard Worker 
457*ec779b8eSAndroid Build Coastguard Worker camera_status_t
getTags(int32_t * numTags,const uint32_t ** tags) const458*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::getTags(/*out*/int32_t* numTags,
459*ec779b8eSAndroid Build Coastguard Worker                          /*out*/const uint32_t** tags) const {
460*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
461*ec779b8eSAndroid Build Coastguard Worker     if (mTags.size() == 0) {
462*ec779b8eSAndroid Build Coastguard Worker         size_t entry_count = mData->entryCount();
463*ec779b8eSAndroid Build Coastguard Worker         mTags.setCapacity(entry_count);
464*ec779b8eSAndroid Build Coastguard Worker         const camera_metadata_t* rawMetadata = mData->getAndLock();
465*ec779b8eSAndroid Build Coastguard Worker         for (size_t i = 0; i < entry_count; i++) {
466*ec779b8eSAndroid Build Coastguard Worker             camera_metadata_ro_entry_t entry;
467*ec779b8eSAndroid Build Coastguard Worker             int ret = get_camera_metadata_ro_entry(rawMetadata, i, &entry);
468*ec779b8eSAndroid Build Coastguard Worker             if (ret != 0) {
469*ec779b8eSAndroid Build Coastguard Worker                 mData->unlock(rawMetadata);
470*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: error reading metadata index %zu", __FUNCTION__, i);
471*ec779b8eSAndroid Build Coastguard Worker                 return ACAMERA_ERROR_UNKNOWN;
472*ec779b8eSAndroid Build Coastguard Worker             }
473*ec779b8eSAndroid Build Coastguard Worker             // Hide system key from users
474*ec779b8eSAndroid Build Coastguard Worker             if (sSystemTags.count(entry.tag) == 0) {
475*ec779b8eSAndroid Build Coastguard Worker                 mTags.push_back(entry.tag);
476*ec779b8eSAndroid Build Coastguard Worker             }
477*ec779b8eSAndroid Build Coastguard Worker         }
478*ec779b8eSAndroid Build Coastguard Worker         mData->unlock(rawMetadata);
479*ec779b8eSAndroid Build Coastguard Worker     }
480*ec779b8eSAndroid Build Coastguard Worker 
481*ec779b8eSAndroid Build Coastguard Worker     *numTags = mTags.size();
482*ec779b8eSAndroid Build Coastguard Worker     *tags = mTags.array();
483*ec779b8eSAndroid Build Coastguard Worker     return ACAMERA_OK;
484*ec779b8eSAndroid Build Coastguard Worker }
485*ec779b8eSAndroid Build Coastguard Worker 
486*ec779b8eSAndroid Build Coastguard Worker const CameraMetadata&
getInternalData() const487*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::getInternalData() const {
488*ec779b8eSAndroid Build Coastguard Worker     return (*mData);
489*ec779b8eSAndroid Build Coastguard Worker }
490*ec779b8eSAndroid Build Coastguard Worker 
491*ec779b8eSAndroid Build Coastguard Worker camera_status_t
getTagFromName(const char * name,uint32_t * tag) const492*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::getTagFromName(const char *name, uint32_t *tag) const {
493*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
494*ec779b8eSAndroid Build Coastguard Worker     status_t status = CameraMetadata::getTagFromName(name, mVTags.get(), tag);
495*ec779b8eSAndroid Build Coastguard Worker     return status == OK ? ACAMERA_OK : ACAMERA_ERROR_METADATA_NOT_FOUND;
496*ec779b8eSAndroid Build Coastguard Worker }
497*ec779b8eSAndroid Build Coastguard Worker 
498*ec779b8eSAndroid Build Coastguard Worker bool
isLogicalMultiCamera(size_t * count,const char * const ** physicalCameraIds) const499*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::isLogicalMultiCamera(size_t* count, const char*const** physicalCameraIds) const {
500*ec779b8eSAndroid Build Coastguard Worker     if (mType != ACM_CHARACTERISTICS) {
501*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s must be called for a static metadata!", __FUNCTION__);
502*ec779b8eSAndroid Build Coastguard Worker         return false;
503*ec779b8eSAndroid Build Coastguard Worker     }
504*ec779b8eSAndroid Build Coastguard Worker     if (count == nullptr || physicalCameraIds == nullptr) {
505*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Invalid input count: %p, physicalCameraIds: %p", __FUNCTION__,
506*ec779b8eSAndroid Build Coastguard Worker                 count, physicalCameraIds);
507*ec779b8eSAndroid Build Coastguard Worker         return false;
508*ec779b8eSAndroid Build Coastguard Worker     }
509*ec779b8eSAndroid Build Coastguard Worker 
510*ec779b8eSAndroid Build Coastguard Worker     if (mStaticPhysicalCameraIds.size() >= 2) {
511*ec779b8eSAndroid Build Coastguard Worker         *count = mStaticPhysicalCameraIds.size();
512*ec779b8eSAndroid Build Coastguard Worker         *physicalCameraIds = mStaticPhysicalCameraIds.data();
513*ec779b8eSAndroid Build Coastguard Worker         return true;
514*ec779b8eSAndroid Build Coastguard Worker     }
515*ec779b8eSAndroid Build Coastguard Worker 
516*ec779b8eSAndroid Build Coastguard Worker     return false;
517*ec779b8eSAndroid Build Coastguard Worker }
518*ec779b8eSAndroid Build Coastguard Worker 
519*ec779b8eSAndroid Build Coastguard Worker // TODO: some of key below should be hidden from user
520*ec779b8eSAndroid Build Coastguard Worker // ex: ACAMERA_REQUEST_ID and ACAMERA_REPROCESS_EFFECTIVE_EXPOSURE_FACTOR
521*ec779b8eSAndroid Build Coastguard Worker /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
522*ec779b8eSAndroid Build Coastguard Worker  * The key entries below this point are generated from metadata
523*ec779b8eSAndroid Build Coastguard Worker  * definitions in /system/media/camera/docs. Do not modify by hand or
524*ec779b8eSAndroid Build Coastguard Worker  * modify the comment blocks at the start or end.
525*ec779b8eSAndroid Build Coastguard Worker  *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
526*ec779b8eSAndroid Build Coastguard Worker 
527*ec779b8eSAndroid Build Coastguard Worker bool
isCaptureRequestTag(const uint32_t tag)528*ec779b8eSAndroid Build Coastguard Worker ACameraMetadata::isCaptureRequestTag(const uint32_t tag) {
529*ec779b8eSAndroid Build Coastguard Worker     // Skip check for vendor keys
530*ec779b8eSAndroid Build Coastguard Worker     if (isVendorTag(tag)) {
531*ec779b8eSAndroid Build Coastguard Worker         return true;
532*ec779b8eSAndroid Build Coastguard Worker     }
533*ec779b8eSAndroid Build Coastguard Worker 
534*ec779b8eSAndroid Build Coastguard Worker     switch (tag) {
535*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_COLOR_CORRECTION_MODE:
536*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_COLOR_CORRECTION_TRANSFORM:
537*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_COLOR_CORRECTION_GAINS:
538*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_COLOR_CORRECTION_ABERRATION_MODE:
539*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_COLOR_CORRECTION_COLOR_TEMPERATURE:
540*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_COLOR_CORRECTION_COLOR_TINT:
541*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_ANTIBANDING_MODE:
542*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION:
543*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_LOCK:
544*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_MODE:
545*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_REGIONS:
546*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_TARGET_FPS_RANGE:
547*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER:
548*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AF_MODE:
549*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AF_REGIONS:
550*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AF_TRIGGER:
551*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AWB_LOCK:
552*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AWB_MODE:
553*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AWB_REGIONS:
554*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_CAPTURE_INTENT:
555*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_EFFECT_MODE:
556*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_MODE:
557*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_SCENE_MODE:
558*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE:
559*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST:
560*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_ENABLE_ZSL:
561*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_EXTENDED_SCENE_MODE:
562*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_ZOOM_RATIO:
563*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_SETTINGS_OVERRIDE:
564*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AUTOFRAMING:
565*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_ZOOM_METHOD:
566*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_CONTROL_AE_PRIORITY_MODE:
567*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_EDGE_MODE:
568*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_FLASH_MODE:
569*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_FLASH_STRENGTH_LEVEL:
570*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_HOT_PIXEL_MODE:
571*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_JPEG_GPS_COORDINATES:
572*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_JPEG_GPS_PROCESSING_METHOD:
573*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_JPEG_GPS_TIMESTAMP:
574*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_JPEG_ORIENTATION:
575*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_JPEG_QUALITY:
576*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_JPEG_THUMBNAIL_QUALITY:
577*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_JPEG_THUMBNAIL_SIZE:
578*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_LENS_APERTURE:
579*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_LENS_FILTER_DENSITY:
580*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_LENS_FOCAL_LENGTH:
581*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_LENS_FOCUS_DISTANCE:
582*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_LENS_OPTICAL_STABILIZATION_MODE:
583*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_NOISE_REDUCTION_MODE:
584*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SCALER_CROP_REGION:
585*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SCALER_ROTATE_AND_CROP:
586*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SENSOR_EXPOSURE_TIME:
587*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SENSOR_FRAME_DURATION:
588*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SENSOR_SENSITIVITY:
589*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SENSOR_TEST_PATTERN_DATA:
590*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SENSOR_TEST_PATTERN_MODE:
591*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SENSOR_PIXEL_MODE:
592*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_SHADING_MODE:
593*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_STATISTICS_FACE_DETECT_MODE:
594*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_STATISTICS_HOT_PIXEL_MAP_MODE:
595*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_STATISTICS_LENS_SHADING_MAP_MODE:
596*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_STATISTICS_OIS_DATA_MODE:
597*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_TONEMAP_CURVE_BLUE:
598*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_TONEMAP_CURVE_GREEN:
599*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_TONEMAP_CURVE_RED:
600*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_TONEMAP_MODE:
601*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_TONEMAP_GAMMA:
602*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_TONEMAP_PRESET_CURVE:
603*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_BLACK_LEVEL_LOCK:
604*ec779b8eSAndroid Build Coastguard Worker         case ACAMERA_DISTORTION_CORRECTION_MODE:
605*ec779b8eSAndroid Build Coastguard Worker             return true;
606*ec779b8eSAndroid Build Coastguard Worker         default:
607*ec779b8eSAndroid Build Coastguard Worker             return false;
608*ec779b8eSAndroid Build Coastguard Worker     }
609*ec779b8eSAndroid Build Coastguard Worker }
610*ec779b8eSAndroid Build Coastguard Worker 
611*ec779b8eSAndroid Build Coastguard Worker // System tags that should be hidden from users
612*ec779b8eSAndroid Build Coastguard Worker std::unordered_set<uint32_t> ACameraMetadata::sSystemTags ({
613*ec779b8eSAndroid Build Coastguard Worker     ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
614*ec779b8eSAndroid Build Coastguard Worker     ANDROID_CONTROL_AE_PRECAPTURE_ID,
615*ec779b8eSAndroid Build Coastguard Worker     ANDROID_CONTROL_AF_TRIGGER_ID,
616*ec779b8eSAndroid Build Coastguard Worker     ANDROID_CONTROL_SETTINGS_OVERRIDING_FRAME_NUMBER,
617*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DEMOSAIC_MODE,
618*ec779b8eSAndroid Build Coastguard Worker     ANDROID_EDGE_STRENGTH,
619*ec779b8eSAndroid Build Coastguard Worker     ANDROID_FLASH_FIRING_POWER,
620*ec779b8eSAndroid Build Coastguard Worker     ANDROID_FLASH_FIRING_TIME,
621*ec779b8eSAndroid Build Coastguard Worker     ANDROID_FLASH_COLOR_TEMPERATURE,
622*ec779b8eSAndroid Build Coastguard Worker     ANDROID_FLASH_MAX_ENERGY,
623*ec779b8eSAndroid Build Coastguard Worker     ANDROID_FLASH_INFO_CHARGE_DURATION,
624*ec779b8eSAndroid Build Coastguard Worker     ANDROID_JPEG_MAX_SIZE,
625*ec779b8eSAndroid Build Coastguard Worker     ANDROID_JPEG_SIZE,
626*ec779b8eSAndroid Build Coastguard Worker     ANDROID_NOISE_REDUCTION_STRENGTH,
627*ec779b8eSAndroid Build Coastguard Worker     ANDROID_QUIRKS_METERING_CROP_REGION,
628*ec779b8eSAndroid Build Coastguard Worker     ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO,
629*ec779b8eSAndroid Build Coastguard Worker     ANDROID_QUIRKS_USE_ZSL_FORMAT,
630*ec779b8eSAndroid Build Coastguard Worker     ANDROID_REQUEST_INPUT_STREAMS,
631*ec779b8eSAndroid Build Coastguard Worker     ANDROID_REQUEST_METADATA_MODE,
632*ec779b8eSAndroid Build Coastguard Worker     ANDROID_REQUEST_OUTPUT_STREAMS,
633*ec779b8eSAndroid Build Coastguard Worker     ANDROID_REQUEST_TYPE,
634*ec779b8eSAndroid Build Coastguard Worker     ANDROID_REQUEST_MAX_NUM_REPROCESS_STREAMS,
635*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
636*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SCALER_AVAILABLE_RAW_SIZES,
637*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SENSOR_BASE_GAIN_FACTOR,
638*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS,
639*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SENSOR_TEMPERATURE,
640*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SENSOR_PROFILE_HUE_SAT_MAP,
641*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SENSOR_PROFILE_TONE_CURVE,
642*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SENSOR_OPAQUE_RAW_SIZE,
643*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SENSOR_OPAQUE_RAW_SIZE_MAXIMUM_RESOLUTION,
644*ec779b8eSAndroid Build Coastguard Worker     ANDROID_SHADING_STRENGTH,
645*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_HISTOGRAM_MODE,
646*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
647*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_HISTOGRAM,
648*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_SHARPNESS_MAP,
649*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
650*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
651*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
652*ec779b8eSAndroid Build Coastguard Worker     ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
653*ec779b8eSAndroid Build Coastguard Worker     ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION,
654*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DEPTH_MAX_DEPTH_SAMPLES,
655*ec779b8eSAndroid Build Coastguard Worker     ANDROID_HEIC_INFO_SUPPORTED,
656*ec779b8eSAndroid Build Coastguard Worker     ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT,
657*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DESKTOP_EFFECTS_CAPABILITIES,
658*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DESKTOP_EFFECTS_BACKGROUND_BLUR_MODES,
659*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DESKTOP_EFFECTS_BACKGROUND_BLUR_MODE,
660*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DESKTOP_EFFECTS_FACE_RETOUCH_MODE,
661*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DESKTOP_EFFECTS_FACE_RETOUCH_STRENGTH,
662*ec779b8eSAndroid Build Coastguard Worker     ANDROID_DESKTOP_EFFECTS_PORTRAIT_RELIGHT_MODE,
663*ec779b8eSAndroid Build Coastguard Worker });
664*ec779b8eSAndroid Build Coastguard Worker 
665*ec779b8eSAndroid Build Coastguard Worker /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
666*ec779b8eSAndroid Build Coastguard Worker  * End generated code
667*ec779b8eSAndroid Build Coastguard Worker  *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
668