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