Android Camera API2中采用CameraMetadata用于从APP到HAL的参数交互
前沿: 在全新的Camera API2架构下,常常会有人疑问再也看不到熟悉的SetParameter/Paramters等相关的身影,取而代之的是一种全新的
CameraMetadata结构的出现,他不仅很早就出现在Camera API1/API2结构下的Camera2Device、Camera3Device中用于和HAL3的数据交互,而现在在API2的驱使下都取代了Parameter,实现了Java到native到hal3的参数传递。那么现在假如需要在APP中设置某一项控制参数,对于Camera API2而言,涉及到对Sensor相关参数的set/control时又需要做哪些工作呢?
1. camera_metadata类整体布局结构 主要涉及到的源文件包括camera_metadata_tags.h,
camera_metadata_tag_info.c,CameraMetadata.cpp,camera_metadata.c。对于每个Metadata数据,其通过不同业务控制需求,将整个camera工作需要的参数划分成多个不同的Section,其中在camera_metadata_tag_info.c表定义了所有Camera需要使用到的Section段的Name: [cpp] view plaincopy
1. const char *camera_metadata_section_names[ANDROID_SECTION_COUNT] = { 2. [ANDROID_COLOR_CORRECTION] = \n\, 3. [ANDROID_CONTROL] = \, 4. [ANDROID_DEMOSAIC] = \, 5. [ANDROID_EDGE] = \, 6. [ANDROID_FLASH] = \, 7. [ANDROID_FLASH_INFO] = \, 8. [ANDROID_GEOMETRIC] = \, 9. [ANDROID_HOT_PIXEL] = \, 10. [ANDROID_HOT_PIXEL_INFO] = \.info\, 11. [ANDROID_JPEG] = \, 12. [ANDROID_LENS] = \, 13. [ANDROID_LENS_INFO] = \o\, 14. [ANDROID_NOISE_REDUCTION] = %uction\, 15. [ANDROID_QUIRKS] = \, 16. [ANDROID_REQUEST] = \, 17. [ANDROID_SCALER] = \, 18. [ANDROID_SENSOR] = \, 19. [ANDROID_SENSOR_INFO] = \nfo\, 20. [ANDROID_SHADING] = \, 21. [ANDROID_STATISTICS] = \cs\, 22. [ANDROID_STATISTICS_INFO] = \cs.info\, 23. [ANDROID_TONEMAP] = \, 24. [ANDROID_LED] = \, 25. [ANDROID_INFO] = \, 26. [ANDROID_BLACK_LEVEL] = \el\, 27. }; 对于每个Section端而言,其都占据一个索引区域section_bounds,比如ANDROID_CONTROL Section他所代表的control区域是从
ANDROID_CONTROL_START到ANDROID_CONTROL_END之间,且每个Section所拥有的Index范围理论最大可到(1 << 16)大小,完全可以满足统一Section下不同的控制参数的维护。 以ANDROID_CONTROL为列,他的Section index = 1,即对应的section index区间可到(1<<16,2<<16),但一般以实际section中维护的tag的数量来结束,即ANDROID_CONTROL_END决定最终的section index区间。对于每一个section,其下具备不同数量的tag,这个tag是一个指定section下的index值,通过该值来维护一个tag所在的数据区域,此外每个tag都有相应的
string name,在camera_metadata_tag_info.c通过struct tag_info_t来维护一个tag的相关属性:
[cpp] view plaincopy
1. typedef struct tag_info { 2. const char *tag_name; 3. uint8_t tag_type; 4. } tag_info_t; 其中tag_name为对应section下不同tag的name值 ,tag_type指定了这个tag所维护的数据类型,包括如下: [cpp] view plaincopy 1. enum { 2. // Unsigned 8-bit integer (uint8_t) 3. TYPE_BYTE = 0, 4. // Signed 32-bit integer (int32_t) 5. TYPE_INT32 = 1, 6. // 32-bit float (float) 7. TYPE_FLOAT = 2, 8. // Signed 64-bit integer (int64_t) 9. TYPE_INT64 = 3, 10. // 64-bit float (double) 11. TYPE_DOUBLE = 4, 12. // A 64-bit fraction (camera_metadata_rational_t) 13. TYPE_RATIONAL = 5, 14. // Number of type fields 15. NUM_TYPES 16. }; 对每一个section所拥有的tag_info信息,通过全局结构体tag_info_t *tag_info[ANDROID_SECTION_COUNT] 来定义。
下图是对整个Camera Metadata对不同section以及相应section下不同tag的布局图,下图以最常见的android.control Section为例进行了描述:
2. CameraMetadata通过camera_metadata来维护数据信息
假设现在存在一个CameraMetadata对象,那么他是如何将一个tag标记的参数维护起来的呢? [cpp] view plaincopy
1. CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) : 2. mLocked(false) 3. { 4. mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity); 5. } [cpp] view plaincopy
1. camera_metadata_t *allocate_camera_metadata(size_t entry_capacity, 2. size_t data_capacity) { 3. if (entry_capacity == 0) return NULL; 4. 5. size_t memory_needed = calculate_camera_metadata_size(entry_capacity, 6. data_capacity); 7. void *buffer = malloc(memory_needed); 8. return place_camera_metadata(buffer, memory_needed, 9. entry_capacity, 10. data_capacity); 11. } 一个CameraMetadata数据内存块中组成的最小基本单元是
struct camera_metadata_buffer_entry,总的entry数目等信息需要struct camera_metadata_t来维护: [cpp] view plaincopy
1. struct camera_metadata { 2. size_t size; 3. uint32_t version; 4. uint32_t flags; 5. size_t entry_count;//当前实际的entry数目 6. size_t entry_capacity;//entry最大可以存储的数目
相关推荐: