blob: d832deb028d69b25c2e4e5d396607d4aeb11be29 [file] [log] [blame]
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "ACameraMetadata"
19
20#include "ACameraMetadata.h"
21#include <utils/Vector.h>
Yin-Chia Yehc3603822016-01-18 22:11:19 -080022#include <system/graphics.h>
Colin Cross7e8d4ba2017-05-04 16:17:42 -070023#include <media/NdkImage.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080024
25using namespace android;
26
27/**
28 * ACameraMetadata Implementation
29 */
30ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type) :
31 mData(buffer), mType(type) {
Yin-Chia Yehead91462016-01-06 16:45:08 -080032 if (mType == ACM_CHARACTERISTICS) {
33 filterUnsupportedFeatures();
Yin-Chia Yehc3603822016-01-18 22:11:19 -080034 filterStreamConfigurations();
Yin-Chia Yehe57e9a22018-08-23 15:36:41 -070035 filterDurations(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
36 filterDurations(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
37 filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS);
38 filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
Shuzhen Wang68ac7ad2019-01-30 14:03:28 -080039 filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS);
40 filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS);
Emilian Peev44df34d2019-02-12 09:30:15 -080041 filterDurations(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS);
42 filterDurations(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS);
Yin-Chia Yehead91462016-01-06 16:45:08 -080043 }
44 // TODO: filter request/result keys
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080045}
46
47bool
48ACameraMetadata::isNdkSupportedCapability(int32_t capability) {
49 switch (capability) {
50 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE:
51 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
52 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING:
53 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW:
54 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS:
55 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE:
56 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080057 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080058 return true;
59 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING:
60 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING:
61 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO:
62 return false;
63 default:
64 // Newly defined capabilities will be unsupported by default (blacklist)
65 // TODO: Should we do whitelist or blacklist here?
66 ALOGE("%s: Unknonwn capability %d", __FUNCTION__, capability);
67 return false;
68 }
69}
70
71void
72ACameraMetadata::filterUnsupportedFeatures() {
73 // Hide unsupported capabilities (reprocessing)
74 camera_metadata_entry entry = mData.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080075 if (entry.count == 0 || entry.type != TYPE_BYTE) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080076 ALOGE("%s: malformed available capability key! count %zu, type %d",
77 __FUNCTION__, entry.count, entry.type);
78 return;
79 }
80
81 Vector<uint8_t> capabilities;
82 capabilities.setCapacity(entry.count);
83 for (size_t i = 0; i < entry.count; i++) {
84 uint8_t capability = entry.data.u8[i];
85 if (isNdkSupportedCapability(capability)) {
86 capabilities.push(capability);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080087
88 if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
89 derivePhysicalCameraIds();
90 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080091 }
92 }
93 mData.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, capabilities);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080094}
95
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080096void
97ACameraMetadata::derivePhysicalCameraIds() {
98 ACameraMetadata_const_entry entry;
99 auto ret = getConstEntry(ACAMERA_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS, &entry);
100 if (ret != ACAMERA_OK) {
101 ALOGE("%s: Get ACAMERA_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS key failed. ret %d",
102 __FUNCTION__, ret);
103 return;
104 }
105
106 const uint8_t* ids = entry.data.u8;
107 size_t start = 0;
108 for (size_t i = 0; i < entry.count; ++i) {
109 if (ids[i] == '\0') {
110 if (start != i) {
Emilian Peev1da379a2019-02-05 15:36:31 -0800111 mStaticPhysicalCameraIdValues.push_back(String8((const char *)ids+start));
112 mStaticPhysicalCameraIds.push_back(mStaticPhysicalCameraIdValues.back().string());
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800113 }
114 start = i+1;
115 }
116 }
117
118 if (mStaticPhysicalCameraIds.size() < 2) {
119 ALOGW("%s: Logical multi-camera device only has %zu physical cameras",
120 __FUNCTION__, mStaticPhysicalCameraIds.size());
121 }
122}
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800123
124void
Yin-Chia Yehe57e9a22018-08-23 15:36:41 -0700125ACameraMetadata::filterDurations(uint32_t tag) {
126 const int STREAM_CONFIGURATION_SIZE = 4;
127 const int STREAM_FORMAT_OFFSET = 0;
128 const int STREAM_WIDTH_OFFSET = 1;
129 const int STREAM_HEIGHT_OFFSET = 2;
130 const int STREAM_DURATION_OFFSET = 3;
131 camera_metadata_entry entry = mData.find(tag);
132 if (entry.count == 0 || entry.count % 4 || entry.type != TYPE_INT64) {
133 ALOGE("%s: malformed duration key %d! count %zu, type %d",
134 __FUNCTION__, tag, entry.count, entry.type);
135 return;
136 }
137 Vector<int64_t> filteredDurations;
138 filteredDurations.setCapacity(entry.count * 2);
139
140 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
141 int64_t format = entry.data.i64[i + STREAM_FORMAT_OFFSET];
142 int64_t width = entry.data.i64[i + STREAM_WIDTH_OFFSET];
143 int64_t height = entry.data.i64[i + STREAM_HEIGHT_OFFSET];
144 int64_t duration = entry.data.i32[i + STREAM_DURATION_OFFSET];
145
146 // Leave the unfiltered format in so apps depending on previous wrong
147 // filter behavior continue to work
148 filteredDurations.push_back(format);
149 filteredDurations.push_back(width);
150 filteredDurations.push_back(height);
151 filteredDurations.push_back(duration);
152
153 // Translate HAL formats to NDK format
154 switch (tag) {
155 case ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS:
156 case ANDROID_SCALER_AVAILABLE_STALL_DURATIONS:
157 if (format == HAL_PIXEL_FORMAT_BLOB) {
158 format = AIMAGE_FORMAT_JPEG;
159 filteredDurations.push_back(format);
160 filteredDurations.push_back(width);
161 filteredDurations.push_back(height);
162 filteredDurations.push_back(duration);
163 }
164 break;
165 case ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:
166 case ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:
167 if (format == HAL_PIXEL_FORMAT_BLOB) {
168 format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD;
169 filteredDurations.push_back(format);
170 filteredDurations.push_back(width);
171 filteredDurations.push_back(height);
172 filteredDurations.push_back(duration);
173 } else if (format == HAL_PIXEL_FORMAT_Y16) {
174 format = AIMAGE_FORMAT_DEPTH16;
175 filteredDurations.push_back(format);
176 filteredDurations.push_back(width);
177 filteredDurations.push_back(height);
178 filteredDurations.push_back(duration);
179 }
180 break;
Shuzhen Wang68ac7ad2019-01-30 14:03:28 -0800181 case ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS:
182 case ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS:
183 if (format == HAL_PIXEL_FORMAT_BLOB) {
184 format = AIMAGE_FORMAT_HEIC;
185 filteredDurations.push_back(format);
186 filteredDurations.push_back(width);
187 filteredDurations.push_back(height);
188 filteredDurations.push_back(duration);
189 }
190 break;
Emilian Peev44df34d2019-02-12 09:30:15 -0800191 case ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS:
192 case ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS:
193 if (format == HAL_PIXEL_FORMAT_BLOB) {
194 format = AIMAGE_FORMAT_DEPTH_JPEG;
195 filteredDurations.push_back(format);
196 filteredDurations.push_back(width);
197 filteredDurations.push_back(height);
198 filteredDurations.push_back(duration);
199 }
200 break;
Yin-Chia Yehe57e9a22018-08-23 15:36:41 -0700201 default:
202 // Should not reach here
203 ALOGE("%s: Unkown tag 0x%x", __FUNCTION__, tag);
204 }
205 }
206
207 mData.update(tag, filteredDurations);
208}
209
210void
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800211ACameraMetadata::filterStreamConfigurations() {
212 const int STREAM_CONFIGURATION_SIZE = 4;
213 const int STREAM_FORMAT_OFFSET = 0;
214 const int STREAM_WIDTH_OFFSET = 1;
215 const int STREAM_HEIGHT_OFFSET = 2;
216 const int STREAM_IS_INPUT_OFFSET = 3;
217 camera_metadata_entry entry = mData.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800218 if (entry.count > 0 && (entry.count % 4 || entry.type != TYPE_INT32)) {
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800219 ALOGE("%s: malformed available stream configuration key! count %zu, type %d",
220 __FUNCTION__, entry.count, entry.type);
221 return;
222 }
223
224 Vector<int32_t> filteredStreamConfigs;
225 filteredStreamConfigs.setCapacity(entry.count);
226
227 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
228 int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
229 int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
230 int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
231 int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
232 if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
233 // Hide input streams
234 continue;
235 }
236 // Translate HAL formats to NDK format
237 if (format == HAL_PIXEL_FORMAT_BLOB) {
238 format = AIMAGE_FORMAT_JPEG;
239 }
240 filteredStreamConfigs.push_back(format);
241 filteredStreamConfigs.push_back(width);
242 filteredStreamConfigs.push_back(height);
243 filteredStreamConfigs.push_back(isInput);
244 }
245
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800246 if (filteredStreamConfigs.size() > 0) {
247 mData.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, filteredStreamConfigs);
248 }
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800249
250 entry = mData.find(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS);
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800251 if (entry.count > 0 && (entry.count % 4 || entry.type != TYPE_INT32)) {
252 ALOGE("%s: malformed available depth stream configuration key! count %zu, type %d",
253 __FUNCTION__, entry.count, entry.type);
254 return;
255 }
256
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800257 Vector<int32_t> filteredDepthStreamConfigs;
258 filteredDepthStreamConfigs.setCapacity(entry.count);
259
260 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
261 int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
262 int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
263 int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
264 int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
265 if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
266 // Hide input streams
267 continue;
268 }
269 // Translate HAL formats to NDK format
270 if (format == HAL_PIXEL_FORMAT_BLOB) {
271 format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD;
272 } else if (format == HAL_PIXEL_FORMAT_Y16) {
273 format = AIMAGE_FORMAT_DEPTH16;
274 }
275
276 filteredDepthStreamConfigs.push_back(format);
277 filteredDepthStreamConfigs.push_back(width);
278 filteredDepthStreamConfigs.push_back(height);
279 filteredDepthStreamConfigs.push_back(isInput);
280 }
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800281
282 if (filteredDepthStreamConfigs.size() > 0) {
283 mData.update(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
284 filteredDepthStreamConfigs);
285 }
Shuzhen Wang68ac7ad2019-01-30 14:03:28 -0800286
287 entry = mData.find(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS);
288 Vector<int32_t> filteredHeicStreamConfigs;
289 filteredHeicStreamConfigs.setCapacity(entry.count);
290
291 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
292 int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
293 int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
294 int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
295 int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
296 if (isInput == ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT) {
297 // Hide input streams
298 continue;
299 }
300 // Translate HAL formats to NDK format
301 if (format == HAL_PIXEL_FORMAT_BLOB) {
302 format = AIMAGE_FORMAT_HEIC;
303 }
304
305 filteredHeicStreamConfigs.push_back(format);
306 filteredHeicStreamConfigs.push_back(width);
307 filteredHeicStreamConfigs.push_back(height);
308 filteredHeicStreamConfigs.push_back(isInput);
309 }
310 mData.update(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, filteredHeicStreamConfigs);
Emilian Peev44df34d2019-02-12 09:30:15 -0800311
312 entry = mData.find(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS);
313 Vector<int32_t> filteredDynamicDepthStreamConfigs;
314 filteredDynamicDepthStreamConfigs.setCapacity(entry.count);
315
316 for (size_t i = 0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
317 int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
318 int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
319 int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
320 int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
321 if (isInput == ACAMERA_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_INPUT) {
322 // Hide input streams
323 continue;
324 }
325 // Translate HAL formats to NDK format
326 if (format == HAL_PIXEL_FORMAT_BLOB) {
327 format = AIMAGE_FORMAT_DEPTH_JPEG;
328 }
329
330 filteredDynamicDepthStreamConfigs.push_back(format);
331 filteredDynamicDepthStreamConfigs.push_back(width);
332 filteredDynamicDepthStreamConfigs.push_back(height);
333 filteredDynamicDepthStreamConfigs.push_back(isInput);
334 }
335 mData.update(ACAMERA_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS,
336 filteredDynamicDepthStreamConfigs);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800337}
338
339bool
340ACameraMetadata::isVendorTag(const uint32_t tag) {
341 uint32_t tag_section = tag >> 16;
342 if (tag_section >= VENDOR_SECTION) {
343 return true;
344 }
345 return false;
346}
347
348camera_status_t
349ACameraMetadata::getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) const {
350 if (entry == nullptr) {
351 return ACAMERA_ERROR_INVALID_PARAMETER;
352 }
353
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800354 Mutex::Autolock _l(mLock);
355
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800356 camera_metadata_ro_entry rawEntry = mData.find(tag);
357 if (rawEntry.count == 0) {
358 ALOGE("%s: cannot find metadata tag %d", __FUNCTION__, tag);
359 return ACAMERA_ERROR_METADATA_NOT_FOUND;
360 }
361 entry->tag = tag;
362 entry->type = rawEntry.type;
363 entry->count = rawEntry.count;
364 entry->data.u8 = rawEntry.data.u8;
365 return ACAMERA_OK;
366}
367
368camera_status_t
369ACameraMetadata::update(uint32_t tag, uint32_t count, const uint8_t* data) {
370 return updateImpl<uint8_t>(tag, count, data);
371}
372
373camera_status_t
374ACameraMetadata::update(uint32_t tag, uint32_t count, const int32_t* data) {
375 return updateImpl<int32_t>(tag, count, data);
376}
377
378camera_status_t
379ACameraMetadata::update(uint32_t tag, uint32_t count, const float* data) {
380 return updateImpl<float>(tag, count, data);
381}
382
383camera_status_t
384ACameraMetadata::update(uint32_t tag, uint32_t count, const double* data) {
385 return updateImpl<double>(tag, count, data);
386}
387
388camera_status_t
389ACameraMetadata::update(uint32_t tag, uint32_t count, const int64_t* data) {
390 return updateImpl<int64_t>(tag, count, data);
391}
392
393camera_status_t
394ACameraMetadata::update(uint32_t tag, uint32_t count, const ACameraMetadata_rational* data) {
395 return updateImpl<camera_metadata_rational_t>(tag, count, data);
396}
397
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800398camera_status_t
399ACameraMetadata::getTags(/*out*/int32_t* numTags,
400 /*out*/const uint32_t** tags) const {
401 Mutex::Autolock _l(mLock);
402 if (mTags.size() == 0) {
403 size_t entry_count = mData.entryCount();
404 mTags.setCapacity(entry_count);
405 const camera_metadata_t* rawMetadata = mData.getAndLock();
406 for (size_t i = 0; i < entry_count; i++) {
407 camera_metadata_ro_entry_t entry;
408 int ret = get_camera_metadata_ro_entry(rawMetadata, i, &entry);
409 if (ret != 0) {
410 ALOGE("%s: error reading metadata index %zu", __FUNCTION__, i);
411 return ACAMERA_ERROR_UNKNOWN;
412 }
413 // Hide system key from users
414 if (sSystemTags.count(entry.tag) == 0) {
415 mTags.push_back(entry.tag);
416 }
417 }
418 mData.unlock(rawMetadata);
419 }
420
421 *numTags = mTags.size();
422 *tags = mTags.array();
423 return ACAMERA_OK;
424}
425
426const CameraMetadata&
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100427ACameraMetadata::getInternalData() const {
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800428 return mData;
429}
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800430
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800431bool
432ACameraMetadata::isLogicalMultiCamera(size_t* count, const char*const** physicalCameraIds) const {
433 if (mType != ACM_CHARACTERISTICS) {
434 ALOGE("%s must be called for a static metadata!", __FUNCTION__);
435 return false;
436 }
437 if (count == nullptr || physicalCameraIds == nullptr) {
438 ALOGE("%s: Invalid input count: %p, physicalCameraIds: %p", __FUNCTION__,
439 count, physicalCameraIds);
440 return false;
441 }
442
443 if (mStaticPhysicalCameraIds.size() >= 2) {
444 *count = mStaticPhysicalCameraIds.size();
445 *physicalCameraIds = mStaticPhysicalCameraIds.data();
446 return true;
447 }
448
449 return false;
450}
451
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800452// TODO: some of key below should be hidden from user
453// ex: ACAMERA_REQUEST_ID and ACAMERA_REPROCESS_EFFECTIVE_EXPOSURE_FACTOR
454/*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
455 * The key entries below this point are generated from metadata
456 * definitions in /system/media/camera/docs. Do not modify by hand or
457 * modify the comment blocks at the start or end.
458 *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
459
460bool
461ACameraMetadata::isCaptureRequestTag(const uint32_t tag) {
462 // Skip check for vendor keys
463 if (isVendorTag(tag)) {
464 return true;
465 }
466
467 switch (tag) {
468 case ACAMERA_COLOR_CORRECTION_MODE:
469 case ACAMERA_COLOR_CORRECTION_TRANSFORM:
470 case ACAMERA_COLOR_CORRECTION_GAINS:
471 case ACAMERA_COLOR_CORRECTION_ABERRATION_MODE:
472 case ACAMERA_CONTROL_AE_ANTIBANDING_MODE:
473 case ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION:
474 case ACAMERA_CONTROL_AE_LOCK:
475 case ACAMERA_CONTROL_AE_MODE:
476 case ACAMERA_CONTROL_AE_REGIONS:
477 case ACAMERA_CONTROL_AE_TARGET_FPS_RANGE:
478 case ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER:
479 case ACAMERA_CONTROL_AF_MODE:
480 case ACAMERA_CONTROL_AF_REGIONS:
481 case ACAMERA_CONTROL_AF_TRIGGER:
482 case ACAMERA_CONTROL_AWB_LOCK:
483 case ACAMERA_CONTROL_AWB_MODE:
484 case ACAMERA_CONTROL_AWB_REGIONS:
485 case ACAMERA_CONTROL_CAPTURE_INTENT:
486 case ACAMERA_CONTROL_EFFECT_MODE:
487 case ACAMERA_CONTROL_MODE:
488 case ACAMERA_CONTROL_SCENE_MODE:
489 case ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE:
490 case ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST:
Chien-Yu Chenc0dede92017-01-11 11:10:28 -0800491 case ACAMERA_CONTROL_ENABLE_ZSL:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800492 case ACAMERA_EDGE_MODE:
493 case ACAMERA_FLASH_MODE:
494 case ACAMERA_HOT_PIXEL_MODE:
495 case ACAMERA_JPEG_GPS_COORDINATES:
496 case ACAMERA_JPEG_GPS_PROCESSING_METHOD:
497 case ACAMERA_JPEG_GPS_TIMESTAMP:
498 case ACAMERA_JPEG_ORIENTATION:
499 case ACAMERA_JPEG_QUALITY:
500 case ACAMERA_JPEG_THUMBNAIL_QUALITY:
501 case ACAMERA_JPEG_THUMBNAIL_SIZE:
502 case ACAMERA_LENS_APERTURE:
503 case ACAMERA_LENS_FILTER_DENSITY:
504 case ACAMERA_LENS_FOCAL_LENGTH:
505 case ACAMERA_LENS_FOCUS_DISTANCE:
506 case ACAMERA_LENS_OPTICAL_STABILIZATION_MODE:
507 case ACAMERA_NOISE_REDUCTION_MODE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800508 case ACAMERA_SCALER_CROP_REGION:
509 case ACAMERA_SENSOR_EXPOSURE_TIME:
510 case ACAMERA_SENSOR_FRAME_DURATION:
511 case ACAMERA_SENSOR_SENSITIVITY:
512 case ACAMERA_SENSOR_TEST_PATTERN_DATA:
513 case ACAMERA_SENSOR_TEST_PATTERN_MODE:
514 case ACAMERA_SHADING_MODE:
515 case ACAMERA_STATISTICS_FACE_DETECT_MODE:
516 case ACAMERA_STATISTICS_HOT_PIXEL_MAP_MODE:
517 case ACAMERA_STATISTICS_LENS_SHADING_MAP_MODE:
Chien-Yu Chen5ca4a9b2018-01-18 12:23:50 -0800518 case ACAMERA_STATISTICS_OIS_DATA_MODE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800519 case ACAMERA_TONEMAP_CURVE_BLUE:
520 case ACAMERA_TONEMAP_CURVE_GREEN:
521 case ACAMERA_TONEMAP_CURVE_RED:
522 case ACAMERA_TONEMAP_MODE:
523 case ACAMERA_TONEMAP_GAMMA:
524 case ACAMERA_TONEMAP_PRESET_CURVE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800525 case ACAMERA_BLACK_LEVEL_LOCK:
Eino-Ville Talvala2d960922018-03-13 19:46:23 -0700526 case ACAMERA_DISTORTION_CORRECTION_MODE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800527 return true;
528 default:
529 return false;
530 }
531}
532
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800533// System tags that should be hidden from users
534std::unordered_set<uint32_t> ACameraMetadata::sSystemTags ({
535 ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
536 ANDROID_CONTROL_AE_PRECAPTURE_ID,
537 ANDROID_CONTROL_AF_TRIGGER_ID,
538 ANDROID_DEMOSAIC_MODE,
539 ANDROID_EDGE_STRENGTH,
540 ANDROID_FLASH_FIRING_POWER,
541 ANDROID_FLASH_FIRING_TIME,
542 ANDROID_FLASH_COLOR_TEMPERATURE,
543 ANDROID_FLASH_MAX_ENERGY,
544 ANDROID_FLASH_INFO_CHARGE_DURATION,
545 ANDROID_JPEG_MAX_SIZE,
546 ANDROID_JPEG_SIZE,
547 ANDROID_NOISE_REDUCTION_STRENGTH,
548 ANDROID_QUIRKS_METERING_CROP_REGION,
549 ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO,
550 ANDROID_QUIRKS_USE_ZSL_FORMAT,
551 ANDROID_REQUEST_INPUT_STREAMS,
552 ANDROID_REQUEST_METADATA_MODE,
553 ANDROID_REQUEST_OUTPUT_STREAMS,
554 ANDROID_REQUEST_TYPE,
555 ANDROID_REQUEST_MAX_NUM_REPROCESS_STREAMS,
556 ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
557 ANDROID_SCALER_AVAILABLE_RAW_SIZES,
558 ANDROID_SENSOR_BASE_GAIN_FACTOR,
559 ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS,
560 ANDROID_SENSOR_TEMPERATURE,
561 ANDROID_SENSOR_PROFILE_HUE_SAT_MAP,
562 ANDROID_SENSOR_PROFILE_TONE_CURVE,
563 ANDROID_SENSOR_OPAQUE_RAW_SIZE,
564 ANDROID_SHADING_STRENGTH,
565 ANDROID_STATISTICS_HISTOGRAM_MODE,
566 ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
567 ANDROID_STATISTICS_HISTOGRAM,
568 ANDROID_STATISTICS_SHARPNESS_MAP,
569 ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
570 ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
571 ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
572 ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
Yin-Chia Yeh2be96a22018-09-17 11:51:24 -0700573 ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION,
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800574 ANDROID_DEPTH_MAX_DEPTH_SAMPLES,
Shuzhen Wang68ac7ad2019-01-30 14:03:28 -0800575 ANDROID_HEIC_INFO_SUPPORTED,
576 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT,
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800577});
578
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800579/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
580 * End generated code
581 *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/