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

发布时间 : 星期六 文章Android Camera API2中采用CameraMetadata用于从APP到HAL的参数交互更新完毕开始阅读cd02a0ac27d3240c8547ef44

1. public static int getTag(String key) { 2. return nativeGetTagFromKey(key); 3. } 是将Java层的String交由Native来转为一个Java层的tag值。

再来看writeValues的实现,同样调用的是一个native接口,很好的阐明了CameraMetadataNative的意思: [java] view plaincopy

1. public void writeValues(int tag, byte[] src) { 2. nativeWriteValues(tag, src); 3. } 相关native层的实现在下一小节说明。

5. Native层的CameraMetadata结构完成camera参数的传递

在描述万了CameraMetadata数据的相关操作之后,可明确的一点是SECTION下的TAG是操作他的核心所在。 这里先说明一个在API1 Camera2Client 参数传递的过程,他采用的逻辑是还是在Java层预留了setParameters接口,只是当Parameter在设置时比起CameraClient而言,他是将这个Parameter根据不同的TAG形式直接绑定到CameraMetadata mPreviewRequest/mRecordRequest/mCaptureRequest中,这些数据会由Capture_Request转为camera3_capture_request中的

camera_metadata_t settings完成参数从Java到native到HAL3的传递。 但是在Camera API2下,不再需要那么复杂的转换过程,在Java层中直接对参数进行设置并将其封装到Capture_Request即可,即参数控制由Java层来完成。这也体现了API2中Request和Result在APP中就大量存在的原因。对此为了和Framework Native层相关TAG数据的统一,在Java层中大量出现的参数设置是通过Section Tag的name来交由Native完成转换生成在Java层的TAG。 对于第三小节中提到的native层的实现,其对应的实现函数位于android_hardware_camera2_CameraMetadata.c中,如

CameraMetadata_getTagFromKey是实现将一个Java层的string转为一个tag的值,他的主要原理如下:根据传入的key string值本质是由一个字符串组成的如上文中提到的android.control.mode。对比最初不同的Section name就可以发现前面两个x.y的字符串就是代表是Section name.而后面mode即是在该section下的tag数值,所以通过对这个string的分析可知,就可以定位他的section以及tag值。这样返回到Java层的就是key相应的tag值了。 如果要写数据,那么在native同样需要一个CameraMetadata对象,这里是在Java构造CameraMetadataNative时实现的,调用的native接口是nativeAllocate():

[cpp] view plaincopy

1. static jlong CameraMetadata_allocate(JNIEnv *env, jobject thiz) { 2. ALOGV(\, __FUNCTION__); 3. 4. return reinterpret_cast(new CameraMetadata()); 5. } 最终可以明确的是CameraMetadata相关的参数是被Java层来set/get,但本质是在native层进行了实现,后续如果相关控制参数是被打包到CaptureRequest中时传入到native时即操作的还是native中的CameraMetadata。