blob: c126cf8d40a54fd6a9108a93dc8460634658c0b8 [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);
Yin-Chia Yehead91462016-01-06 16:45:08 -080041 }
42 // TODO: filter request/result keys
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080043}
44
45bool
46ACameraMetadata::isNdkSupportedCapability(int32_t capability) {
47 switch (capability) {
48 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE:
49 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
50 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING:
51 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW:
52 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS:
53 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE:
54 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080055 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080056 return true;
57 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING:
58 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING:
59 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO:
60 return false;
61 default:
62 // Newly defined capabilities will be unsupported by default (blacklist)
63 // TODO: Should we do whitelist or blacklist here?
64 ALOGE("%s: Unknonwn capability %d", __FUNCTION__, capability);
65 return false;
66 }
67}
68
69void
70ACameraMetadata::filterUnsupportedFeatures() {
71 // Hide unsupported capabilities (reprocessing)
72 camera_metadata_entry entry = mData.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080073 if (entry.count == 0 || entry.type != TYPE_BYTE) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080074 ALOGE("%s: malformed available capability key! count %zu, type %d",
75 __FUNCTION__, entry.count, entry.type);
76 return;
77 }
78
79 Vector<uint8_t> capabilities;
80 capabilities.setCapacity(entry.count);
81 for (size_t i = 0; i < entry.count; i++) {
82 uint8_t capability = entry.data.u8[i];
83 if (isNdkSupportedCapability(capability)) {
84 capabilities.push(capability);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080085
86 if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
87 derivePhysicalCameraIds();
88 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080089 }
90 }
91 mData.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, capabilities);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080092}
93
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080094void
95ACameraMetadata::derivePhysicalCameraIds() {
96 ACameraMetadata_const_entry entry;
97 auto ret = getConstEntry(ACAMERA_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS, &entry);
98 if (ret != ACAMERA_OK) {
99 ALOGE("%s: Get ACAMERA_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS key failed. ret %d",
100 __FUNCTION__, ret);
101 return;
102 }
103
104 const uint8_t* ids = entry.data.u8;
105 size_t start = 0;
106 for (size_t i = 0; i < entry.count; ++i) {
107 if (ids[i] == '\0') {
108 if (start != i) {
Emilian Peev1da379a2019-02-05 15:36:31 -0800109 mStaticPhysicalCameraIdValues.push_back(String8((const char *)ids+start));
110 mStaticPhysicalCameraIds.push_back(mStaticPhysicalCameraIdValues.back().string());
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800111 }
112 start = i+1;
113 }
114 }
115
116 if (mStaticPhysicalCameraIds.size() < 2) {
117 ALOGW("%s: Logical multi-camera device only has %zu physical cameras",
118 __FUNCTION__, mStaticPhysicalCameraIds.size());
119 }
120}
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800121
122void
Yin-Chia Yehe57e9a22018-08-23 15:36:41 -0700123ACameraMetadata::filterDurations(uint32_t tag) {
124 const int STREAM_CONFIGURATION_SIZE = 4;
125 const int STREAM_FORMAT_OFFSET = 0;
126 const int STREAM_WIDTH_OFFSET = 1;
127 const int STREAM_HEIGHT_OFFSET = 2;
128 const int STREAM_DURATION_OFFSET = 3;
129 camera_metadata_entry entry = mData.find(tag);
130 if (entry.count == 0 || entry.count % 4 || entry.type != TYPE_INT64) {
131 ALOGE("%s: malformed duration key %d! count %zu, type %d",
132 __FUNCTION__, tag, entry.count, entry.type);
133 return;
134 }
135 Vector<int64_t> filteredDurations;
136 filteredDurations.setCapacity(entry.count * 2);
137
138 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
139 int64_t format = entry.data.i64[i + STREAM_FORMAT_OFFSET];
140 int64_t width = entry.data.i64[i + STREAM_WIDTH_OFFSET];
141 int64_t height = entry.data.i64[i + STREAM_HEIGHT_OFFSET];
142 int64_t duration = entry.data.i32[i + STREAM_DURATION_OFFSET];
143
144 // Leave the unfiltered format in so apps depending on previous wrong
145 // filter behavior continue to work
146 filteredDurations.push_back(format);
147 filteredDurations.push_back(width);
148 filteredDurations.push_back(height);
149 filteredDurations.push_back(duration);
150
151 // Translate HAL formats to NDK format
152 switch (tag) {
153 case ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS:
154 case ANDROID_SCALER_AVAILABLE_STALL_DURATIONS:
155 if (format == HAL_PIXEL_FORMAT_BLOB) {
156 format = AIMAGE_FORMAT_JPEG;
157 filteredDurations.push_back(format);
158 filteredDurations.push_back(width);
159 filteredDurations.push_back(height);
160 filteredDurations.push_back(duration);
161 }
162 break;
163 case ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:
164 case ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:
165 if (format == HAL_PIXEL_FORMAT_BLOB) {
166 format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD;
167 filteredDurations.push_back(format);
168 filteredDurations.push_back(width);
169 filteredDurations.push_back(height);
170 filteredDurations.push_back(duration);
171 } else if (format == HAL_PIXEL_FORMAT_Y16) {
172 format = AIMAGE_FORMAT_DEPTH16;
173 filteredDurations.push_back(format);
174 filteredDurations.push_back(width);
175 filteredDurations.push_back(height);
176 filteredDurations.push_back(duration);
177 }
178 break;
Shuzhen Wang68ac7ad2019-01-30 14:03:28 -0800179 case ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS:
180 case ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS:
181 if (format == HAL_PIXEL_FORMAT_BLOB) {
182 format = AIMAGE_FORMAT_HEIC;
183 filteredDurations.push_back(format);
184 filteredDurations.push_back(width);
185 filteredDurations.push_back(height);
186 filteredDurations.push_back(duration);
187 }
188 break;
Yin-Chia Yehe57e9a22018-08-23 15:36:41 -0700189 default:
190 // Should not reach here
191 ALOGE("%s: Unkown tag 0x%x", __FUNCTION__, tag);
192 }
193 }
194
195 mData.update(tag, filteredDurations);
196}
197
198void
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800199ACameraMetadata::filterStreamConfigurations() {
200 const int STREAM_CONFIGURATION_SIZE = 4;
201 const int STREAM_FORMAT_OFFSET = 0;
202 const int STREAM_WIDTH_OFFSET = 1;
203 const int STREAM_HEIGHT_OFFSET = 2;
204 const int STREAM_IS_INPUT_OFFSET = 3;
205 camera_metadata_entry entry = mData.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800206 if (entry.count > 0 && (entry.count % 4 || entry.type != TYPE_INT32)) {
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800207 ALOGE("%s: malformed available stream configuration key! count %zu, type %d",
208 __FUNCTION__, entry.count, entry.type);
209 return;
210 }
211
212 Vector<int32_t> filteredStreamConfigs;
213 filteredStreamConfigs.setCapacity(entry.count);
214
215 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
216 int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
217 int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
218 int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
219 int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
220 if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
221 // Hide input streams
222 continue;
223 }
224 // Translate HAL formats to NDK format
225 if (format == HAL_PIXEL_FORMAT_BLOB) {
226 format = AIMAGE_FORMAT_JPEG;
227 }
228 filteredStreamConfigs.push_back(format);
229 filteredStreamConfigs.push_back(width);
230 filteredStreamConfigs.push_back(height);
231 filteredStreamConfigs.push_back(isInput);
232 }
233
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800234 if (filteredStreamConfigs.size() > 0) {
235 mData.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, filteredStreamConfigs);
236 }
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800237
238 entry = mData.find(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS);
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800239 if (entry.count > 0 && (entry.count % 4 || entry.type != TYPE_INT32)) {
240 ALOGE("%s: malformed available depth stream configuration key! count %zu, type %d",
241 __FUNCTION__, entry.count, entry.type);
242 return;
243 }
244
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800245 Vector<int32_t> filteredDepthStreamConfigs;
246 filteredDepthStreamConfigs.setCapacity(entry.count);
247
248 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
249 int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
250 int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
251 int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
252 int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
253 if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
254 // Hide input streams
255 continue;
256 }
257 // Translate HAL formats to NDK format
258 if (format == HAL_PIXEL_FORMAT_BLOB) {
259 format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD;
260 } else if (format == HAL_PIXEL_FORMAT_Y16) {
261 format = AIMAGE_FORMAT_DEPTH16;
262 }
263
264 filteredDepthStreamConfigs.push_back(format);
265 filteredDepthStreamConfigs.push_back(width);
266 filteredDepthStreamConfigs.push_back(height);
267 filteredDepthStreamConfigs.push_back(isInput);
268 }
Yin-Chia Yeh38c13a72019-02-26 14:02:15 -0800269
270 if (filteredDepthStreamConfigs.size() > 0) {
271 mData.update(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
272 filteredDepthStreamConfigs);
273 }
Shuzhen Wang68ac7ad2019-01-30 14:03:28 -0800274
275 entry = mData.find(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS);
276 Vector<int32_t> filteredHeicStreamConfigs;
277 filteredHeicStreamConfigs.setCapacity(entry.count);
278
279 for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
280 int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET];
281 int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET];
282 int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET];
283 int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET];
284 if (isInput == ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT) {
285 // Hide input streams
286 continue;
287 }
288 // Translate HAL formats to NDK format
289 if (format == HAL_PIXEL_FORMAT_BLOB) {
290 format = AIMAGE_FORMAT_HEIC;
291 }
292
293 filteredHeicStreamConfigs.push_back(format);
294 filteredHeicStreamConfigs.push_back(width);
295 filteredHeicStreamConfigs.push_back(height);
296 filteredHeicStreamConfigs.push_back(isInput);
297 }
298 mData.update(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, filteredHeicStreamConfigs);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800299}
300
301bool
302ACameraMetadata::isVendorTag(const uint32_t tag) {
303 uint32_t tag_section = tag >> 16;
304 if (tag_section >= VENDOR_SECTION) {
305 return true;
306 }
307 return false;
308}
309
310camera_status_t
311ACameraMetadata::getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) const {
312 if (entry == nullptr) {
313 return ACAMERA_ERROR_INVALID_PARAMETER;
314 }
315
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800316 Mutex::Autolock _l(mLock);
317
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800318 camera_metadata_ro_entry rawEntry = mData.find(tag);
319 if (rawEntry.count == 0) {
320 ALOGE("%s: cannot find metadata tag %d", __FUNCTION__, tag);
321 return ACAMERA_ERROR_METADATA_NOT_FOUND;
322 }
323 entry->tag = tag;
324 entry->type = rawEntry.type;
325 entry->count = rawEntry.count;
326 entry->data.u8 = rawEntry.data.u8;
327 return ACAMERA_OK;
328}
329
330camera_status_t
331ACameraMetadata::update(uint32_t tag, uint32_t count, const uint8_t* data) {
332 return updateImpl<uint8_t>(tag, count, data);
333}
334
335camera_status_t
336ACameraMetadata::update(uint32_t tag, uint32_t count, const int32_t* data) {
337 return updateImpl<int32_t>(tag, count, data);
338}
339
340camera_status_t
341ACameraMetadata::update(uint32_t tag, uint32_t count, const float* data) {
342 return updateImpl<float>(tag, count, data);
343}
344
345camera_status_t
346ACameraMetadata::update(uint32_t tag, uint32_t count, const double* data) {
347 return updateImpl<double>(tag, count, data);
348}
349
350camera_status_t
351ACameraMetadata::update(uint32_t tag, uint32_t count, const int64_t* data) {
352 return updateImpl<int64_t>(tag, count, data);
353}
354
355camera_status_t
356ACameraMetadata::update(uint32_t tag, uint32_t count, const ACameraMetadata_rational* data) {
357 return updateImpl<camera_metadata_rational_t>(tag, count, data);
358}
359
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800360camera_status_t
361ACameraMetadata::getTags(/*out*/int32_t* numTags,
362 /*out*/const uint32_t** tags) const {
363 Mutex::Autolock _l(mLock);
364 if (mTags.size() == 0) {
365 size_t entry_count = mData.entryCount();
366 mTags.setCapacity(entry_count);
367 const camera_metadata_t* rawMetadata = mData.getAndLock();
368 for (size_t i = 0; i < entry_count; i++) {
369 camera_metadata_ro_entry_t entry;
370 int ret = get_camera_metadata_ro_entry(rawMetadata, i, &entry);
371 if (ret != 0) {
372 ALOGE("%s: error reading metadata index %zu", __FUNCTION__, i);
373 return ACAMERA_ERROR_UNKNOWN;
374 }
375 // Hide system key from users
376 if (sSystemTags.count(entry.tag) == 0) {
377 mTags.push_back(entry.tag);
378 }
379 }
380 mData.unlock(rawMetadata);
381 }
382
383 *numTags = mTags.size();
384 *tags = mTags.array();
385 return ACAMERA_OK;
386}
387
388const CameraMetadata&
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100389ACameraMetadata::getInternalData() const {
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800390 return mData;
391}
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800392
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800393bool
394ACameraMetadata::isLogicalMultiCamera(size_t* count, const char*const** physicalCameraIds) const {
395 if (mType != ACM_CHARACTERISTICS) {
396 ALOGE("%s must be called for a static metadata!", __FUNCTION__);
397 return false;
398 }
399 if (count == nullptr || physicalCameraIds == nullptr) {
400 ALOGE("%s: Invalid input count: %p, physicalCameraIds: %p", __FUNCTION__,
401 count, physicalCameraIds);
402 return false;
403 }
404
405 if (mStaticPhysicalCameraIds.size() >= 2) {
406 *count = mStaticPhysicalCameraIds.size();
407 *physicalCameraIds = mStaticPhysicalCameraIds.data();
408 return true;
409 }
410
411 return false;
412}
413
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800414// TODO: some of key below should be hidden from user
415// ex: ACAMERA_REQUEST_ID and ACAMERA_REPROCESS_EFFECTIVE_EXPOSURE_FACTOR
416/*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
417 * The key entries below this point are generated from metadata
418 * definitions in /system/media/camera/docs. Do not modify by hand or
419 * modify the comment blocks at the start or end.
420 *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
421
422bool
423ACameraMetadata::isCaptureRequestTag(const uint32_t tag) {
424 // Skip check for vendor keys
425 if (isVendorTag(tag)) {
426 return true;
427 }
428
429 switch (tag) {
430 case ACAMERA_COLOR_CORRECTION_MODE:
431 case ACAMERA_COLOR_CORRECTION_TRANSFORM:
432 case ACAMERA_COLOR_CORRECTION_GAINS:
433 case ACAMERA_COLOR_CORRECTION_ABERRATION_MODE:
434 case ACAMERA_CONTROL_AE_ANTIBANDING_MODE:
435 case ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION:
436 case ACAMERA_CONTROL_AE_LOCK:
437 case ACAMERA_CONTROL_AE_MODE:
438 case ACAMERA_CONTROL_AE_REGIONS:
439 case ACAMERA_CONTROL_AE_TARGET_FPS_RANGE:
440 case ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER:
441 case ACAMERA_CONTROL_AF_MODE:
442 case ACAMERA_CONTROL_AF_REGIONS:
443 case ACAMERA_CONTROL_AF_TRIGGER:
444 case ACAMERA_CONTROL_AWB_LOCK:
445 case ACAMERA_CONTROL_AWB_MODE:
446 case ACAMERA_CONTROL_AWB_REGIONS:
447 case ACAMERA_CONTROL_CAPTURE_INTENT:
448 case ACAMERA_CONTROL_EFFECT_MODE:
449 case ACAMERA_CONTROL_MODE:
450 case ACAMERA_CONTROL_SCENE_MODE:
451 case ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE:
452 case ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST:
Chien-Yu Chenc0dede92017-01-11 11:10:28 -0800453 case ACAMERA_CONTROL_ENABLE_ZSL:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800454 case ACAMERA_EDGE_MODE:
455 case ACAMERA_FLASH_MODE:
456 case ACAMERA_HOT_PIXEL_MODE:
457 case ACAMERA_JPEG_GPS_COORDINATES:
458 case ACAMERA_JPEG_GPS_PROCESSING_METHOD:
459 case ACAMERA_JPEG_GPS_TIMESTAMP:
460 case ACAMERA_JPEG_ORIENTATION:
461 case ACAMERA_JPEG_QUALITY:
462 case ACAMERA_JPEG_THUMBNAIL_QUALITY:
463 case ACAMERA_JPEG_THUMBNAIL_SIZE:
464 case ACAMERA_LENS_APERTURE:
465 case ACAMERA_LENS_FILTER_DENSITY:
466 case ACAMERA_LENS_FOCAL_LENGTH:
467 case ACAMERA_LENS_FOCUS_DISTANCE:
468 case ACAMERA_LENS_OPTICAL_STABILIZATION_MODE:
469 case ACAMERA_NOISE_REDUCTION_MODE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800470 case ACAMERA_SCALER_CROP_REGION:
471 case ACAMERA_SENSOR_EXPOSURE_TIME:
472 case ACAMERA_SENSOR_FRAME_DURATION:
473 case ACAMERA_SENSOR_SENSITIVITY:
474 case ACAMERA_SENSOR_TEST_PATTERN_DATA:
475 case ACAMERA_SENSOR_TEST_PATTERN_MODE:
476 case ACAMERA_SHADING_MODE:
477 case ACAMERA_STATISTICS_FACE_DETECT_MODE:
478 case ACAMERA_STATISTICS_HOT_PIXEL_MAP_MODE:
479 case ACAMERA_STATISTICS_LENS_SHADING_MAP_MODE:
Chien-Yu Chen5ca4a9b2018-01-18 12:23:50 -0800480 case ACAMERA_STATISTICS_OIS_DATA_MODE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800481 case ACAMERA_TONEMAP_CURVE_BLUE:
482 case ACAMERA_TONEMAP_CURVE_GREEN:
483 case ACAMERA_TONEMAP_CURVE_RED:
484 case ACAMERA_TONEMAP_MODE:
485 case ACAMERA_TONEMAP_GAMMA:
486 case ACAMERA_TONEMAP_PRESET_CURVE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800487 case ACAMERA_BLACK_LEVEL_LOCK:
Eino-Ville Talvala2d960922018-03-13 19:46:23 -0700488 case ACAMERA_DISTORTION_CORRECTION_MODE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800489 return true;
490 default:
491 return false;
492 }
493}
494
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800495// System tags that should be hidden from users
496std::unordered_set<uint32_t> ACameraMetadata::sSystemTags ({
497 ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
498 ANDROID_CONTROL_AE_PRECAPTURE_ID,
499 ANDROID_CONTROL_AF_TRIGGER_ID,
500 ANDROID_DEMOSAIC_MODE,
501 ANDROID_EDGE_STRENGTH,
502 ANDROID_FLASH_FIRING_POWER,
503 ANDROID_FLASH_FIRING_TIME,
504 ANDROID_FLASH_COLOR_TEMPERATURE,
505 ANDROID_FLASH_MAX_ENERGY,
506 ANDROID_FLASH_INFO_CHARGE_DURATION,
507 ANDROID_JPEG_MAX_SIZE,
508 ANDROID_JPEG_SIZE,
509 ANDROID_NOISE_REDUCTION_STRENGTH,
510 ANDROID_QUIRKS_METERING_CROP_REGION,
511 ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO,
512 ANDROID_QUIRKS_USE_ZSL_FORMAT,
513 ANDROID_REQUEST_INPUT_STREAMS,
514 ANDROID_REQUEST_METADATA_MODE,
515 ANDROID_REQUEST_OUTPUT_STREAMS,
516 ANDROID_REQUEST_TYPE,
517 ANDROID_REQUEST_MAX_NUM_REPROCESS_STREAMS,
518 ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
519 ANDROID_SCALER_AVAILABLE_RAW_SIZES,
520 ANDROID_SENSOR_BASE_GAIN_FACTOR,
521 ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS,
522 ANDROID_SENSOR_TEMPERATURE,
523 ANDROID_SENSOR_PROFILE_HUE_SAT_MAP,
524 ANDROID_SENSOR_PROFILE_TONE_CURVE,
525 ANDROID_SENSOR_OPAQUE_RAW_SIZE,
526 ANDROID_SHADING_STRENGTH,
527 ANDROID_STATISTICS_HISTOGRAM_MODE,
528 ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
529 ANDROID_STATISTICS_HISTOGRAM,
530 ANDROID_STATISTICS_SHARPNESS_MAP,
531 ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
532 ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
533 ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
534 ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
Yin-Chia Yeh2be96a22018-09-17 11:51:24 -0700535 ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION,
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800536 ANDROID_DEPTH_MAX_DEPTH_SAMPLES,
Shuzhen Wang68ac7ad2019-01-30 14:03:28 -0800537 ANDROID_HEIC_INFO_SUPPORTED,
538 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT,
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -0800539});
540
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800541/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
542 * End generated code
543 *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/