Android Camera API2中采用CameraMetadata用于从APP到HAL的参数交互

管我坏不坏,又没叫你爱!
966次浏览
2020年01月05日 08:27
最佳经验
本文由作者推荐
安卓app开发api
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,,camera_metadata.c。对于每个Metadata数据,其通过不同业务控制需求,将整个camera工作需要的参数划分成多个不同的Section,其中在camera_metadata_tag_info.c表定义了所有Camera需要使用到的Section段的Name:
[cpp] view plaincopy
1. constchar*camera_metadata_section_names[ANDROID_SECTION_COUNT] = { 
2. [ANDROID_COLOR_CORRECTION]     = "orrection", 
3. [ANDROID_CONTROL]              = "l", 
4. [ANDROID_DEMOSAIC]             = "ic",  
5. [ANDROID_EDGE]                 = "",  
6. [ANDROID_FLASH]                = "",  
7. [ANDROID_FLASH_INFO]           = "",  
8. [ANDROID_GEOMETRIC]            = "ric",  
9. [ANDROID_HOT_PIXEL]            = "el",  
10. [ANDROID_HOT_PIXEL_INFO]       = "",  
11. [ANDROID_JPEG]                 = "",  
12. [ANDROID_LENS]                 = "",  
13. [ANDROID_LENS_INFO]            = "",  
14. [ANDROID_NOISE_REDUCTION]      = "eduction",  
15. [ANDROID_QUIRKS]               = "",  
16. [ANDROID_REQUEST]              = "t",  
17. [ANDROID_SCALER]               = "",  
18. [ANDROID_SENSOR]               = "",  
19. [ANDROID_SENSOR_INFO]          = "",  
20. [ANDROID_SHADING]              = "g",  
21. [ANDROID_STATISTICS]           = "tics",  
22. [ANDROID_STATISTICS_INFO]      = "",  
23. [ANDROID_TONEMAP]              = "p",  
24. [ANDROID_LED]                  = "",  
25. [ANDROID_INFO]                 = "",  
26. [ANDROID_BLACK_LEVEL]          = "evel",  
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. typedefstructtag_info {  
2. constchar*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的布局图,下图以最常见的l Section为例进行了描述:

2. CameraMetadata通过camera_metadata来维护数据信息
假设现在存在一个CameraMetadata对象,那么他是如何将一个tag标记的参数维护起来的呢?
[cpp] view plaincopy
1. CameraMetadata::CameraMetadata(size_tentryCapacity, size_tdataCapacity) :  
2. mLocked(false)  
3. {  
4. mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity);  
5. }  
[cpp] view plaincopy
1. camera_metadata_t *allocate_camera_metadata(size_tentry_capacity,  
2. size_tdata_capacity) {  
3. if(entry_capacity == 0) returnNULL;  
4.
5. size_tmemory_needed = calculate_camera_metadata_size(entry_capacity,  
6. data_capacity);  
7. void*buffer = malloc(memory_needed);  
8. returnplace_camera_metadata(buffer, memory_needed,  
9. entry_capacity,  
10. data_capacity);