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