SLProject  4.3.020
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
SENSAndroidCameraUtils.cpp File Reference
#include <vector>
#include <string>
#include <utility>
#include <typeinfo>
#include <cinttypes>
#include <media/NdkImage.h>
#include <camera/NdkCameraManager.h>
#include "SENSAndroidCameraUtils.h"
#include <android/log.h>
Include dependency graph for SENSAndroidCameraUtils.cpp:

Go to the source code of this file.

Macros

#define LOG_TAG   "CAMERA-SAMPLE"
 
#define LOGI(...)   __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
 
#define LOGW(...)   __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
 
#define LOGE(...)   __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
 
#define ASSERT(cond, fmt, ...)
 
#define UKNOWN_TAG   "UNKNOW_TAG"
 
#define MAKE_PAIR(val)   std::make_pair(val, #val)
 
#define MODE_LABLE   "ModeInfo:"
 

Typedefs

using ERROR_PAIR = std::pair< camera_status_t, const char * >
 
using TAG_PAIR = std::pair< acamera_metadata_tag_t, const char * >
 
using FORMAT_PAIR = std::pair< int, const char * >
 
using DEV_ERROR_PAIR = std::pair< int, const char * >
 

Functions

template<typename T >
const char * GetPairStr (T key, std::vector< std::pair< T, const char * >> &store)
 
const char * GetErrorStr (camera_status_t err)
 
const char * GetTagStr (acamera_metadata_tag_t tag)
 
const char * GetFormatStr (int fmt)
 
void PrintMetadataTags (int32_t entries, const uint32_t *pTags)
 
void PrintLensFacing (ACameraMetadata_const_entry &lens)
 
void PrintStreamConfigurations (ACameraMetadata_const_entry &val)
 
void PrintTagVal (const char *printLabel, ACameraMetadata_const_entry &val)
 
void PrintCameras (ACameraManager *cmrMgr)
 
void PrintRequestMetadata (ACaptureRequest *req)
 
const char * GetCameraDeviceErrorStr (int err)
 
void PrintCameraDeviceError (int err)
 

Variables

static std::vector< ERROR_PAIRerrorInfo
 
static std::vector< TAG_PAIRtagInfo
 
static std::vector< FORMAT_PAIRformatInfo
 
static std::vector< DEV_ERROR_PAIRdevErrors
 

Macro Definition Documentation

◆ ASSERT

#define ASSERT (   cond,
  fmt,
  ... 
)
Value:
if (!(cond)) \
{ \
__android_log_assert(#cond, LOG_TAG, fmt, ##__VA_ARGS__); \
}
#define LOG_TAG

Definition at line 31 of file SENSAndroidCameraUtils.cpp.

◆ LOG_TAG

#define LOG_TAG   "CAMERA-SAMPLE"

Definition at line 27 of file SENSAndroidCameraUtils.cpp.

◆ LOGE

#define LOGE (   ...)    __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

Definition at line 30 of file SENSAndroidCameraUtils.cpp.

◆ LOGI

#define LOGI (   ...)    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

Definition at line 28 of file SENSAndroidCameraUtils.cpp.

◆ LOGW

#define LOGW (   ...)    __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)

Definition at line 29 of file SENSAndroidCameraUtils.cpp.

◆ MAKE_PAIR

#define MAKE_PAIR (   val)    std::make_pair(val, #val)

Definition at line 38 of file SENSAndroidCameraUtils.cpp.

◆ MODE_LABLE

#define MODE_LABLE   "ModeInfo:"

◆ UKNOWN_TAG

#define UKNOWN_TAG   "UNKNOW_TAG"

Definition at line 37 of file SENSAndroidCameraUtils.cpp.

Typedef Documentation

◆ DEV_ERROR_PAIR

using DEV_ERROR_PAIR = std::pair<int, const char*>

Definition at line 471 of file SENSAndroidCameraUtils.cpp.

◆ ERROR_PAIR

using ERROR_PAIR = std::pair<camera_status_t, const char*>

Definition at line 57 of file SENSAndroidCameraUtils.cpp.

◆ FORMAT_PAIR

using FORMAT_PAIR = std::pair<int, const char*>

Definition at line 287 of file SENSAndroidCameraUtils.cpp.

◆ TAG_PAIR

using TAG_PAIR = std::pair<acamera_metadata_tag_t, const char*>

Definition at line 84 of file SENSAndroidCameraUtils.cpp.

Function Documentation

◆ GetCameraDeviceErrorStr()

const char* GetCameraDeviceErrorStr ( int  err)

Definition at line 480 of file SENSAndroidCameraUtils.cpp.

481 {
482  return GetPairStr<int>(err, devErrors);
483 }
static std::vector< DEV_ERROR_PAIR > devErrors

◆ GetErrorStr()

const char* GetErrorStr ( camera_status_t  err)

Definition at line 75 of file SENSAndroidCameraUtils.cpp.

76 {
77  return GetPairStr<camera_status_t>(err, errorInfo);
78 }
static std::vector< ERROR_PAIR > errorInfo

◆ GetFormatStr()

const char* GetFormatStr ( int  fmt)

Definition at line 299 of file SENSAndroidCameraUtils.cpp.

299 { return GetPairStr<int>(fmt, formatInfo); }
static std::vector< FORMAT_PAIR > formatInfo

◆ GetPairStr()

template<typename T >
const char* GetPairStr ( key,
std::vector< std::pair< T, const char * >> &  store 
)

Definition at line 40 of file SENSAndroidCameraUtils.cpp.

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 }
#define LOGW(...)
#define UKNOWN_TAG

◆ GetTagStr()

const char* GetTagStr ( acamera_metadata_tag_t  tag)

Definition at line 282 of file SENSAndroidCameraUtils.cpp.

283 {
284  return GetPairStr<acamera_metadata_tag_t>(tag, tagInfo);
285 }
static std::vector< TAG_PAIR > tagInfo

◆ PrintCameraDeviceError()

void PrintCameraDeviceError ( int  err)

Definition at line 484 of file SENSAndroidCameraUtils.cpp.

485 {
486  LOGI("CameraDeviceError(%#x): %s", err, GetCameraDeviceErrorStr(err));
487 }
#define LOGI(...)
const char * GetCameraDeviceErrorStr(int err)

◆ PrintCameras()

void PrintCameras ( ACameraManager *  cmrMgr)

Definition at line 379 of file SENSAndroidCameraUtils.cpp.

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 }
void PrintLensFacing(ACameraMetadata_const_entry &lens)
const char * GetErrorStr(camera_status_t err)
void PrintTagVal(const char *printLabel, ACameraMetadata_const_entry &val)
const char * GetTagStr(acamera_metadata_tag_t tag)

◆ PrintLensFacing()

void PrintLensFacing ( ACameraMetadata_const_entry &  lens)

Definition at line 313 of file SENSAndroidCameraUtils.cpp.

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 }
#define ASSERT(cond, fmt,...)

◆ PrintMetadataTags()

void PrintMetadataTags ( int32_t  entries,
const uint32_t *  pTags 
)

Definition at line 301 of file SENSAndroidCameraUtils.cpp.

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 }

◆ PrintRequestMetadata()

void PrintRequestMetadata ( ACaptureRequest *  req)

Definition at line 425 of file SENSAndroidCameraUtils.cpp.

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 }

◆ PrintStreamConfigurations()

void PrintStreamConfigurations ( ACameraMetadata_const_entry &  val)

Definition at line 324 of file SENSAndroidCameraUtils.cpp.

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 }
#define MODE_LABLE
const char * GetFormatStr(int fmt)

◆ PrintTagVal()

void PrintTagVal ( const char *  printLabel,
ACameraMetadata_const_entry &  val 
)

Definition at line 339 of file SENSAndroidCameraUtils.cpp.

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 }
void PrintStreamConfigurations(ACameraMetadata_const_entry &val)

Variable Documentation

◆ devErrors

std::vector<DEV_ERROR_PAIR> devErrors
static
Initial value:
{
std::make_pair( ERROR_CAMERA_IN_USE , "ERROR_CAMERA_IN_USE"),
std::make_pair( ERROR_MAX_CAMERAS_IN_USE , "ERROR_MAX_CAMERAS_IN_USE"),
std::make_pair( ERROR_CAMERA_DISABLED , "ERROR_CAMERA_DISABLED"),
std::make_pair( ERROR_CAMERA_DEVICE , "ERROR_CAMERA_DEVICE"),
std::make_pair( ERROR_CAMERA_SERVICE , "ERROR_CAMERA_SERVICE"),
}

Definition at line 472 of file SENSAndroidCameraUtils.cpp.

◆ errorInfo

std::vector<ERROR_PAIR> errorInfo
static
Initial value:
{
std::make_pair( ACAMERA_OK , "ACAMERA_OK"),
std::make_pair( ACAMERA_ERROR_UNKNOWN , "ACAMERA_ERROR_UNKNOWN"),
std::make_pair( ACAMERA_ERROR_INVALID_PARAMETER , "ACAMERA_ERROR_INVALID_PARAMETER"),
std::make_pair( ACAMERA_ERROR_CAMERA_DISCONNECTED , "ACAMERA_ERROR_CAMERA_DISCONNECTED"),
std::make_pair( ACAMERA_ERROR_NOT_ENOUGH_MEMORY , "ACAMERA_ERROR_NOT_ENOUGH_MEMORY"),
std::make_pair( ACAMERA_ERROR_METADATA_NOT_FOUND , "ACAMERA_ERROR_METADATA_NOT_FOUND"),
std::make_pair( ACAMERA_ERROR_CAMERA_DEVICE , "ACAMERA_ERROR_CAMERA_DEVICE"),
std::make_pair( ACAMERA_ERROR_CAMERA_SERVICE , "ACAMERA_ERROR_CAMERA_SERVICE"),
std::make_pair( ACAMERA_ERROR_SESSION_CLOSED , "ACAMERA_ERROR_SESSION_CLOSED"),
std::make_pair( ACAMERA_ERROR_INVALID_OPERATION , "ACAMERA_ERROR_INVALID_OPERATION"),
std::make_pair( ACAMERA_ERROR_STREAM_CONFIGURE_FAIL , "ACAMERA_ERROR_STREAM_CONFIGURE_FAIL"),
std::make_pair( ACAMERA_ERROR_CAMERA_IN_USE , "ACAMERA_ERROR_CAMERA_IN_USE"),
std::make_pair( ACAMERA_ERROR_MAX_CAMERA_IN_USE , "ACAMERA_ERROR_MAX_CAMERA_IN_USE"),
std::make_pair( ACAMERA_ERROR_CAMERA_DISABLED , "ACAMERA_ERROR_CAMERA_DISABLED"),
std::make_pair( ACAMERA_ERROR_PERMISSION_DENIED , "ACAMERA_ERROR_PERMISSION_DENIED"),
}

Definition at line 58 of file SENSAndroidCameraUtils.cpp.

◆ formatInfo

std::vector<FORMAT_PAIR> formatInfo
static
Initial value:
{
std::make_pair( AIMAGE_FORMAT_YUV_420_888 , "AIMAGE_FORMAT_YUV_420_888"),
std::make_pair( AIMAGE_FORMAT_JPEG , "AIMAGE_FORMAT_JPEG"),
std::make_pair( AIMAGE_FORMAT_RAW16 , "AIMAGE_FORMAT_RAW16"),
std::make_pair( AIMAGE_FORMAT_RAW_PRIVATE , "AIMAGE_FORMAT_RAW_PRIVATE"),
std::make_pair( AIMAGE_FORMAT_RAW10 , "AIMAGE_FORMAT_RAW10"),
std::make_pair( AIMAGE_FORMAT_RAW12 , "AIMAGE_FORMAT_RAW12"),
std::make_pair( AIMAGE_FORMAT_DEPTH16 , "AIMAGE_FORMAT_DEPTH16"),
std::make_pair( AIMAGE_FORMAT_DEPTH_POINT_CLOUD , "AIMAGE_FORMAT_DEPTH_POINT_CLOUD"),
std::make_pair( AIMAGE_FORMAT_PRIVATE , "AIMAGE_FORMAT_PRIVATE"),
}

Definition at line 288 of file SENSAndroidCameraUtils.cpp.

◆ tagInfo

std::vector<TAG_PAIR> tagInfo
static

Definition at line 85 of file SENSAndroidCameraUtils.cpp.