SLProject  4.3.020
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
SENSAndroidCameraUtils.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2017 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 #include <vector>
17 #include <string>
18 #include <utility>
19 #include <typeinfo>
20 #include <cinttypes>
21 #include <media/NdkImage.h>
22 #include <camera/NdkCameraManager.h>
23 #include "SENSAndroidCameraUtils.h"
24 
25 #include <android/log.h>
26 
27 #define LOG_TAG "CAMERA-SAMPLE"
28 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
29 #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
30 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
31 #define ASSERT(cond, fmt, ...) \
32  if (!(cond)) \
33  { \
34  __android_log_assert(#cond, LOG_TAG, fmt, ##__VA_ARGS__); \
35  }
36 
37 #define UKNOWN_TAG "UNKNOW_TAG"
38 #define MAKE_PAIR(val) std::make_pair(val, #val)
39 template<typename T>
40 const char* GetPairStr(T key, std::vector<std::pair<T, const char*>>& store)
41 {
42  typedef typename std::vector<std::pair<T, const char*>>::iterator iterator;
43  for (iterator it = store.begin(); it != store.end(); ++it)
44  {
45  if (it->first == key)
46  {
47  return it->second;
48  }
49  }
50  LOGW("(%#08x) : UNKNOWN_TAG for %s", key, typeid(store[0].first).name());
51  return UKNOWN_TAG;
52 }
53 
54 /*
55  * camera_status_t error translation
56  */
57 using ERROR_PAIR = std::pair<camera_status_t, const char*>;
58 static std::vector<ERROR_PAIR> errorInfo{
59  MAKE_PAIR(ACAMERA_OK),
60  MAKE_PAIR(ACAMERA_ERROR_UNKNOWN),
61  MAKE_PAIR(ACAMERA_ERROR_INVALID_PARAMETER),
62  MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISCONNECTED),
63  MAKE_PAIR(ACAMERA_ERROR_NOT_ENOUGH_MEMORY),
64  MAKE_PAIR(ACAMERA_ERROR_METADATA_NOT_FOUND),
65  MAKE_PAIR(ACAMERA_ERROR_CAMERA_DEVICE),
66  MAKE_PAIR(ACAMERA_ERROR_CAMERA_SERVICE),
67  MAKE_PAIR(ACAMERA_ERROR_SESSION_CLOSED),
68  MAKE_PAIR(ACAMERA_ERROR_INVALID_OPERATION),
69  MAKE_PAIR(ACAMERA_ERROR_STREAM_CONFIGURE_FAIL),
70  MAKE_PAIR(ACAMERA_ERROR_CAMERA_IN_USE),
71  MAKE_PAIR(ACAMERA_ERROR_MAX_CAMERA_IN_USE),
72  MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISABLED),
73  MAKE_PAIR(ACAMERA_ERROR_PERMISSION_DENIED),
74 };
75 const char* GetErrorStr(camera_status_t err)
76 {
77  return GetPairStr<camera_status_t>(err, errorInfo);
78 }
79 
80 /*
81  * camera_metadata_tag_t translation. Useful to look at available tags
82  * on the underneath platform
83  */
84 using TAG_PAIR = std::pair<acamera_metadata_tag_t, const char*>;
85 static std::vector<TAG_PAIR> tagInfo{
86  MAKE_PAIR(ACAMERA_COLOR_CORRECTION_MODE),
87  MAKE_PAIR(ACAMERA_COLOR_CORRECTION_TRANSFORM),
88  MAKE_PAIR(ACAMERA_COLOR_CORRECTION_GAINS),
89  MAKE_PAIR(ACAMERA_COLOR_CORRECTION_ABERRATION_MODE),
90  MAKE_PAIR(ACAMERA_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES),
91  MAKE_PAIR(ACAMERA_COLOR_CORRECTION_END),
92  MAKE_PAIR(ACAMERA_CONTROL_AE_ANTIBANDING_MODE),
93  MAKE_PAIR(ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION),
94  MAKE_PAIR(ACAMERA_CONTROL_AE_LOCK),
95  MAKE_PAIR(ACAMERA_CONTROL_AE_MODE),
96  MAKE_PAIR(ACAMERA_CONTROL_AE_REGIONS),
97  MAKE_PAIR(ACAMERA_CONTROL_AE_TARGET_FPS_RANGE),
98  MAKE_PAIR(ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER),
99  MAKE_PAIR(ACAMERA_CONTROL_AF_MODE),
100  MAKE_PAIR(ACAMERA_CONTROL_AF_REGIONS),
101  MAKE_PAIR(ACAMERA_CONTROL_AF_TRIGGER),
102  MAKE_PAIR(ACAMERA_CONTROL_AWB_LOCK),
103  MAKE_PAIR(ACAMERA_CONTROL_AWB_MODE),
104  MAKE_PAIR(ACAMERA_CONTROL_AWB_REGIONS),
105  MAKE_PAIR(ACAMERA_CONTROL_CAPTURE_INTENT),
106  MAKE_PAIR(ACAMERA_CONTROL_EFFECT_MODE),
107  MAKE_PAIR(ACAMERA_CONTROL_MODE),
108  MAKE_PAIR(ACAMERA_CONTROL_SCENE_MODE),
109  MAKE_PAIR(ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE),
110  MAKE_PAIR(ACAMERA_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES),
111  MAKE_PAIR(ACAMERA_CONTROL_AE_AVAILABLE_MODES),
112  MAKE_PAIR(ACAMERA_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES),
113  MAKE_PAIR(ACAMERA_CONTROL_AE_COMPENSATION_RANGE),
114  MAKE_PAIR(ACAMERA_CONTROL_AE_COMPENSATION_STEP),
115  MAKE_PAIR(ACAMERA_CONTROL_AF_AVAILABLE_MODES),
116  MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_EFFECTS),
117  MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_SCENE_MODES),
118  MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES),
119  MAKE_PAIR(ACAMERA_CONTROL_AWB_AVAILABLE_MODES),
120  MAKE_PAIR(ACAMERA_CONTROL_MAX_REGIONS),
121  MAKE_PAIR(ACAMERA_CONTROL_AE_STATE),
122  MAKE_PAIR(ACAMERA_CONTROL_AF_STATE),
123  MAKE_PAIR(ACAMERA_CONTROL_AWB_STATE),
124  MAKE_PAIR(ACAMERA_CONTROL_AE_LOCK_AVAILABLE),
125  MAKE_PAIR(ACAMERA_CONTROL_AWB_LOCK_AVAILABLE),
126  MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_MODES),
127  MAKE_PAIR(ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE),
128  MAKE_PAIR(ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST),
129  MAKE_PAIR(ACAMERA_CONTROL_END),
130  MAKE_PAIR(ACAMERA_EDGE_MODE),
131  MAKE_PAIR(ACAMERA_EDGE_AVAILABLE_EDGE_MODES),
132  MAKE_PAIR(ACAMERA_EDGE_END),
133  MAKE_PAIR(ACAMERA_FLASH_MODE),
134  MAKE_PAIR(ACAMERA_FLASH_STATE),
135  MAKE_PAIR(ACAMERA_FLASH_END),
136  MAKE_PAIR(ACAMERA_FLASH_INFO_AVAILABLE),
137  MAKE_PAIR(ACAMERA_FLASH_INFO_END),
138  MAKE_PAIR(ACAMERA_HOT_PIXEL_MODE),
139  MAKE_PAIR(ACAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES),
140  MAKE_PAIR(ACAMERA_HOT_PIXEL_END),
141  MAKE_PAIR(ACAMERA_JPEG_GPS_COORDINATES),
142  MAKE_PAIR(ACAMERA_JPEG_GPS_PROCESSING_METHOD),
143  MAKE_PAIR(ACAMERA_JPEG_GPS_TIMESTAMP),
144  MAKE_PAIR(ACAMERA_JPEG_ORIENTATION),
145  MAKE_PAIR(ACAMERA_JPEG_QUALITY),
146  MAKE_PAIR(ACAMERA_JPEG_THUMBNAIL_QUALITY),
147  MAKE_PAIR(ACAMERA_JPEG_THUMBNAIL_SIZE),
148  MAKE_PAIR(ACAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES),
149  MAKE_PAIR(ACAMERA_JPEG_END),
150  MAKE_PAIR(ACAMERA_LENS_APERTURE),
151  MAKE_PAIR(ACAMERA_LENS_FILTER_DENSITY),
152  MAKE_PAIR(ACAMERA_LENS_FOCAL_LENGTH),
153  MAKE_PAIR(ACAMERA_LENS_FOCUS_DISTANCE),
154  MAKE_PAIR(ACAMERA_LENS_OPTICAL_STABILIZATION_MODE),
155  MAKE_PAIR(ACAMERA_LENS_FACING),
156  MAKE_PAIR(ACAMERA_LENS_POSE_ROTATION),
157  MAKE_PAIR(ACAMERA_LENS_POSE_TRANSLATION),
158  MAKE_PAIR(ACAMERA_LENS_FOCUS_RANGE),
159  MAKE_PAIR(ACAMERA_LENS_STATE),
160  MAKE_PAIR(ACAMERA_LENS_INTRINSIC_CALIBRATION),
161  MAKE_PAIR(ACAMERA_LENS_RADIAL_DISTORTION),
162  MAKE_PAIR(ACAMERA_LENS_END),
163 
164  MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_APERTURES),
165  MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES),
166  MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS),
167  MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION),
168  MAKE_PAIR(ACAMERA_LENS_INFO_HYPERFOCAL_DISTANCE),
169  MAKE_PAIR(ACAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE),
170  MAKE_PAIR(ACAMERA_LENS_INFO_SHADING_MAP_SIZE),
171  MAKE_PAIR(ACAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION),
172  MAKE_PAIR(ACAMERA_LENS_INFO_END),
173 
174  MAKE_PAIR(ACAMERA_NOISE_REDUCTION_MODE),
175  MAKE_PAIR(ACAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES),
176  MAKE_PAIR(ACAMERA_NOISE_REDUCTION_END),
177 
178  MAKE_PAIR(ACAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS),
179  MAKE_PAIR(ACAMERA_REQUEST_PIPELINE_DEPTH),
180  MAKE_PAIR(ACAMERA_REQUEST_PIPELINE_MAX_DEPTH),
181  MAKE_PAIR(ACAMERA_REQUEST_PARTIAL_RESULT_COUNT),
182  MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_CAPABILITIES),
183  MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_REQUEST_KEYS),
184  MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_RESULT_KEYS),
185  MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS),
186  MAKE_PAIR(ACAMERA_REQUEST_END),
187 
188  MAKE_PAIR(ACAMERA_SCALER_CROP_REGION),
189  MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM),
190  MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS),
191  MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS),
192  MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_STALL_DURATIONS),
193  MAKE_PAIR(ACAMERA_SCALER_CROPPING_TYPE),
194  MAKE_PAIR(ACAMERA_SCALER_END),
195 
196  MAKE_PAIR(ACAMERA_SENSOR_EXPOSURE_TIME),
197  MAKE_PAIR(ACAMERA_SENSOR_FRAME_DURATION),
198  MAKE_PAIR(ACAMERA_SENSOR_SENSITIVITY),
199  MAKE_PAIR(ACAMERA_SENSOR_REFERENCE_ILLUMINANT1),
200  MAKE_PAIR(ACAMERA_SENSOR_REFERENCE_ILLUMINANT2),
201  MAKE_PAIR(ACAMERA_SENSOR_CALIBRATION_TRANSFORM1),
202  MAKE_PAIR(ACAMERA_SENSOR_CALIBRATION_TRANSFORM2),
203  MAKE_PAIR(ACAMERA_SENSOR_COLOR_TRANSFORM1),
204  MAKE_PAIR(ACAMERA_SENSOR_COLOR_TRANSFORM2),
205  MAKE_PAIR(ACAMERA_SENSOR_FORWARD_MATRIX1),
206  MAKE_PAIR(ACAMERA_SENSOR_FORWARD_MATRIX2),
207  MAKE_PAIR(ACAMERA_SENSOR_BLACK_LEVEL_PATTERN),
208  MAKE_PAIR(ACAMERA_SENSOR_MAX_ANALOG_SENSITIVITY),
209  MAKE_PAIR(ACAMERA_SENSOR_ORIENTATION),
210  MAKE_PAIR(ACAMERA_SENSOR_TIMESTAMP),
211  MAKE_PAIR(ACAMERA_SENSOR_NEUTRAL_COLOR_POINT),
212  MAKE_PAIR(ACAMERA_SENSOR_NOISE_PROFILE),
213  MAKE_PAIR(ACAMERA_SENSOR_GREEN_SPLIT),
214  MAKE_PAIR(ACAMERA_SENSOR_TEST_PATTERN_DATA),
215  MAKE_PAIR(ACAMERA_SENSOR_TEST_PATTERN_MODE),
216  MAKE_PAIR(ACAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES),
217  MAKE_PAIR(ACAMERA_SENSOR_ROLLING_SHUTTER_SKEW),
218  MAKE_PAIR(ACAMERA_SENSOR_OPTICAL_BLACK_REGIONS),
219  MAKE_PAIR(ACAMERA_SENSOR_DYNAMIC_BLACK_LEVEL),
220  MAKE_PAIR(ACAMERA_SENSOR_DYNAMIC_WHITE_LEVEL),
221  MAKE_PAIR(ACAMERA_SENSOR_END),
222 
223  MAKE_PAIR(ACAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE),
224  MAKE_PAIR(ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE),
225  MAKE_PAIR(ACAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT),
226  MAKE_PAIR(ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE),
227  MAKE_PAIR(ACAMERA_SENSOR_INFO_MAX_FRAME_DURATION),
228  MAKE_PAIR(ACAMERA_SENSOR_INFO_PHYSICAL_SIZE),
229  MAKE_PAIR(ACAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE),
230  MAKE_PAIR(ACAMERA_SENSOR_INFO_WHITE_LEVEL),
231  MAKE_PAIR(ACAMERA_SENSOR_INFO_TIMESTAMP_SOURCE),
232  MAKE_PAIR(ACAMERA_SENSOR_INFO_LENS_SHADING_APPLIED),
233  MAKE_PAIR(ACAMERA_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE),
234  MAKE_PAIR(ACAMERA_SENSOR_INFO_END),
235 
236  MAKE_PAIR(ACAMERA_SHADING_MODE),
237  MAKE_PAIR(ACAMERA_SHADING_AVAILABLE_MODES),
238  MAKE_PAIR(ACAMERA_SHADING_END),
239 
240  MAKE_PAIR(ACAMERA_STATISTICS_FACE_DETECT_MODE),
241  MAKE_PAIR(ACAMERA_STATISTICS_HOT_PIXEL_MAP_MODE),
242  MAKE_PAIR(ACAMERA_STATISTICS_FACE_IDS),
243  MAKE_PAIR(ACAMERA_STATISTICS_FACE_LANDMARKS),
244  MAKE_PAIR(ACAMERA_STATISTICS_FACE_RECTANGLES),
245  MAKE_PAIR(ACAMERA_STATISTICS_FACE_SCORES),
246  MAKE_PAIR(ACAMERA_STATISTICS_LENS_SHADING_MAP),
247  MAKE_PAIR(ACAMERA_STATISTICS_SCENE_FLICKER),
248  MAKE_PAIR(ACAMERA_STATISTICS_HOT_PIXEL_MAP),
249  MAKE_PAIR(ACAMERA_STATISTICS_LENS_SHADING_MAP_MODE),
250  MAKE_PAIR(ACAMERA_STATISTICS_END),
251 
252  MAKE_PAIR(ACAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES),
253  MAKE_PAIR(ACAMERA_STATISTICS_INFO_MAX_FACE_COUNT),
254  MAKE_PAIR(ACAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES),
255  MAKE_PAIR(ACAMERA_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES),
256  MAKE_PAIR(ACAMERA_STATISTICS_INFO_END),
257 
258  MAKE_PAIR(ACAMERA_TONEMAP_CURVE_BLUE),
259  MAKE_PAIR(ACAMERA_TONEMAP_CURVE_GREEN),
260  MAKE_PAIR(ACAMERA_TONEMAP_CURVE_RED),
261  MAKE_PAIR(ACAMERA_TONEMAP_MODE),
262  MAKE_PAIR(ACAMERA_TONEMAP_MAX_CURVE_POINTS),
263  MAKE_PAIR(ACAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES),
264  MAKE_PAIR(ACAMERA_TONEMAP_GAMMA),
265  MAKE_PAIR(ACAMERA_TONEMAP_PRESET_CURVE),
266  MAKE_PAIR(ACAMERA_TONEMAP_END),
267 
268  MAKE_PAIR(ACAMERA_INFO_SUPPORTED_HARDWARE_LEVEL),
269  MAKE_PAIR(ACAMERA_INFO_END),
270  MAKE_PAIR(ACAMERA_BLACK_LEVEL_LOCK),
271  MAKE_PAIR(ACAMERA_BLACK_LEVEL_END),
272  MAKE_PAIR(ACAMERA_SYNC_FRAME_NUMBER),
273  MAKE_PAIR(ACAMERA_SYNC_MAX_LATENCY),
274  MAKE_PAIR(ACAMERA_SYNC_END),
275  MAKE_PAIR(ACAMERA_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS),
276 
277  MAKE_PAIR(ACAMERA_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS),
278  MAKE_PAIR(ACAMERA_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS),
279  MAKE_PAIR(ACAMERA_DEPTH_DEPTH_IS_EXCLUSIVE),
280  MAKE_PAIR(ACAMERA_DEPTH_END),
281 };
282 const char* GetTagStr(acamera_metadata_tag_t tag)
283 {
284  return GetPairStr<acamera_metadata_tag_t>(tag, tagInfo);
285 }
286 
287 using FORMAT_PAIR = std::pair<int, const char*>;
288 static std::vector<FORMAT_PAIR> formatInfo{
289  MAKE_PAIR(AIMAGE_FORMAT_YUV_420_888),
290  MAKE_PAIR(AIMAGE_FORMAT_JPEG),
291  MAKE_PAIR(AIMAGE_FORMAT_RAW16),
292  MAKE_PAIR(AIMAGE_FORMAT_RAW_PRIVATE),
293  MAKE_PAIR(AIMAGE_FORMAT_RAW10),
294  MAKE_PAIR(AIMAGE_FORMAT_RAW12),
295  MAKE_PAIR(AIMAGE_FORMAT_DEPTH16),
296  MAKE_PAIR(AIMAGE_FORMAT_DEPTH_POINT_CLOUD),
297  MAKE_PAIR(AIMAGE_FORMAT_PRIVATE),
298 };
299 const char* GetFormatStr(int fmt) { return GetPairStr<int>(fmt, formatInfo); }
300 
301 void PrintMetadataTags(int32_t entries, const uint32_t* pTags)
302 {
303  LOGI("MetadataTag (start):");
304  for (int32_t idx = 0; idx < entries; ++idx)
305  {
306  const char* name =
307  GetTagStr(static_cast<acamera_metadata_tag_t>(pTags[idx]));
308  LOGI("(%#08x) : %s", pTags[idx], name);
309  }
310  LOGI("MetadataTag (end)");
311 }
312 
313 void PrintLensFacing(ACameraMetadata_const_entry& lens)
314 {
315  ASSERT(lens.tag == ACAMERA_LENS_FACING, "Wrong tag(%#x) of %s to %s", lens.tag, GetTagStr((acamera_metadata_tag_t)lens.tag), __FUNCTION__);
316  LOGI("LensFacing: tag(%#x), type(%d), count(%d), val(%#x)", lens.tag, lens.type, lens.count, lens.data.u8[0]);
317 }
318 
319 /*
320  * Stream_Configuration is in format of:
321  * format, width, height, input?
322  * ACAMERA_TYPE_INT32 type
323  */
324 void PrintStreamConfigurations(ACameraMetadata_const_entry& val)
325 {
326 #define MODE_LABLE "ModeInfo:"
327  const char* tagName = GetTagStr(static_cast<acamera_metadata_tag_t>(val.tag));
328  ASSERT(!(val.count & 0x3), "STREAM_CONFIGURATION (%d) should multiple of 4", val.count);
329  ASSERT(val.type == ACAMERA_TYPE_INT32,
330  "STREAM_CONFIGURATION TYPE(%d) is not ACAMERA_TYPE_INT32(1)",
331  val.type);
332  LOGI("%s -- %s:", tagName, MODE_LABLE);
333  for (uint32_t i = 0; i < val.count; i += 4)
334  {
335  LOGI("%s: %08d x %08d %s", GetFormatStr(val.data.i32[i]), val.data.i32[i + 1], val.data.i32[i + 2], val.data.i32[i + 3] ? "INPUT" : "OUTPUT");
336  }
337 #undef MODE_LABLE
338 }
339 void PrintTagVal(const char* printLabel, ACameraMetadata_const_entry& val)
340 {
341  if (val.tag == ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS)
342  {
344  return;
345  }
346  const char* name = GetTagStr(static_cast<acamera_metadata_tag_t>(val.tag));
347  for (int i = 0; i < val.count; ++i)
348  {
349  switch (val.type)
350  {
351  case ACAMERA_TYPE_INT32:
352  LOGI("%s %s: %08d", printLabel, name, val.data.i32[i]);
353  break;
354  case ACAMERA_TYPE_BYTE:
355  LOGI("%s %s: %#02x", printLabel, name, val.data.u8[i]);
356  break;
357  case ACAMERA_TYPE_INT64:
358  LOGI("%s %s: %" PRIu64, printLabel, name, (int64_t)val.data.i64[i]);
359  break;
360  case ACAMERA_TYPE_FLOAT:
361  LOGI("%s %s: %f", printLabel, name, val.data.f[i]);
362  break;
363  case ACAMERA_TYPE_DOUBLE:
364  LOGI("%s %s: %" PRIx64, printLabel, name, val.data.i64[i]);
365  break;
366  case ACAMERA_TYPE_RATIONAL:
367  LOGI("%s %s: %08x, %08x", printLabel, name, val.data.r[i].numerator, val.data.r[i].denominator);
368  break;
369  default:
370  ASSERT(false, "Unknown tag value type: %d", val.type);
371  }
372  }
373 }
374 
375 /*
376  * PrintCamera():
377  * Enumerate existing camera and its metadata.
378  */
379 void PrintCameras(ACameraManager* cmrMgr)
380 {
381  if (!cmrMgr) return;
382 
383  ACameraIdList* cameraIds = nullptr;
384  camera_status_t status = ACameraManager_getCameraIdList(cmrMgr, &cameraIds);
385  LOGI("camera Status = %d, %s", status, GetErrorStr(status));
386 
387  for (int i = 0; i < cameraIds->numCameras; ++i)
388  {
389  const char* id = cameraIds->cameraIds[i];
390  LOGI("=====cameraId = %d, cameraName = %s=====", i, id);
391  ACameraMetadata* metadataObj;
392  ACameraManager_getCameraCharacteristics(cmrMgr, id, &metadataObj);
393 
394  int32_t count = 0;
395  const uint32_t* tags = nullptr;
396  ACameraMetadata_getAllTags(metadataObj, &count, &tags);
397 
398  for (int tagIdx = 0; tagIdx < count; ++tagIdx)
399  {
400  ACameraMetadata_const_entry val = {
401  0,
402  };
403  camera_status_t status =
404  ACameraMetadata_getConstEntry(metadataObj, tags[tagIdx], &val);
405  if (status != ACAMERA_OK)
406  {
407  LOGW("Unsupported Tag: %s",
408  GetTagStr(static_cast<acamera_metadata_tag_t>(tags[tagIdx])));
409  continue;
410  }
411 
412  PrintTagVal("Camera Tag:", val);
413 
414  if (ACAMERA_LENS_FACING == tags[tagIdx])
415  {
416  PrintLensFacing(val);
417  }
418  }
419  ACameraMetadata_free(metadataObj);
420  }
421 
422  ACameraManager_deleteCameraIdList(cameraIds);
423 }
424 
425 void PrintRequestMetadata(ACaptureRequest* req)
426 {
427  if (!req) return;
428  int32_t count;
429  const uint32_t* tags;
430  ACaptureRequest_getAllTags(req, &count, &tags);
431  for (int32_t idx = 0; idx < count; ++idx)
432  {
433  ACameraMetadata_const_entry val;
434  ACaptureRequest_getConstEntry(req, tags[idx], &val);
435  const char* name =
436  GetTagStr(static_cast<acamera_metadata_tag_t>(tags[idx]));
437 
438  for (int i = 0; i < val.count; ++i)
439  {
440  switch (val.type)
441  {
442  case ACAMERA_TYPE_INT32:
443  LOGI("Capture Tag %s: %08d", name, val.data.i32[i]);
444  break;
445  case ACAMERA_TYPE_BYTE:
446  LOGI("Capture Tag %s: %#08x", name, val.data.u8[i]);
447  break;
448  case ACAMERA_TYPE_INT64:
449  LOGI("Capture Tag %s: %" PRIu64, name, (int64_t)val.data.i64[i]);
450  break;
451  case ACAMERA_TYPE_FLOAT:
452  LOGI("Capture Tag %s: %f", name, val.data.f[i]);
453  break;
454  case ACAMERA_TYPE_DOUBLE:
455  LOGI("Capture Tag %s: %" PRIx64, name, val.data.i64[i]);
456  break;
457  case ACAMERA_TYPE_RATIONAL:
458  LOGI("Capture Tag %s: %08x, %08x", name, val.data.r[i].numerator, val.data.r[i].denominator);
459  break;
460  default:
461  ASSERT(false, "Unknown tag value type: %d", val.type);
462  }
463  }
464  }
465 }
466 
467 /*
468  * CameraDevice error state translation, used in
469  * ACameraDevice_ErrorStateCallback
470  */
471 using DEV_ERROR_PAIR = std::pair<int, const char*>;
472 static std::vector<DEV_ERROR_PAIR> devErrors{
473  MAKE_PAIR(ERROR_CAMERA_IN_USE),
474  MAKE_PAIR(ERROR_MAX_CAMERAS_IN_USE),
475  MAKE_PAIR(ERROR_CAMERA_DISABLED),
476  MAKE_PAIR(ERROR_CAMERA_DEVICE),
477  MAKE_PAIR(ERROR_CAMERA_SERVICE),
478 };
479 
480 const char* GetCameraDeviceErrorStr(int err)
481 {
482  return GetPairStr<int>(err, devErrors);
483 }
485 {
486  LOGI("CameraDeviceError(%#x): %s", err, GetCameraDeviceErrorStr(err));
487 }
void PrintCameraDeviceError(int err)
#define LOGW(...)
void PrintCameras(ACameraManager *cmrMgr)
std::pair< int, const char * > DEV_ERROR_PAIR
static std::vector< TAG_PAIR > tagInfo
void PrintLensFacing(ACameraMetadata_const_entry &lens)
#define ASSERT(cond, fmt,...)
void PrintMetadataTags(int32_t entries, const uint32_t *pTags)
#define LOGI(...)
#define UKNOWN_TAG
#define MODE_LABLE
const char * GetErrorStr(camera_status_t err)
const char * GetCameraDeviceErrorStr(int err)
void PrintTagVal(const char *printLabel, ACameraMetadata_const_entry &val)
const char * GetPairStr(T key, std::vector< std::pair< T, const char * >> &store)
std::pair< acamera_metadata_tag_t, const char * > TAG_PAIR
void PrintStreamConfigurations(ACameraMetadata_const_entry &val)
const char * GetTagStr(acamera_metadata_tag_t tag)
std::pair< int, const char * > FORMAT_PAIR
static std::vector< DEV_ERROR_PAIR > devErrors
#define MAKE_PAIR(val)
static std::vector< FORMAT_PAIR > formatInfo
std::pair< camera_status_t, const char * > ERROR_PAIR
const char * GetFormatStr(int fmt)
void PrintRequestMetadata(ACaptureRequest *req)
static std::vector< ERROR_PAIR > errorInfo