google camera2的参数设置都是通过CaptureRequest来设置的,相关的对象都实现了Parcelable接口才能进行跨进程传递。
一、整个Metadata的传递
1、CameraDeviceImpl.java
无论是capture还是repeating都会调用到下面的 submitRequestList 方法
mRemoteDevice就是CameraService对象在java端的代理,mRemoteDevice.submitRequestList直接到cameraserver进程。
既然是跨进程通信,那么requestArray对象就是实现了Parcelable接口的。
2、CaptureRequest.java
CaptureRequest实现了Parcelable接口,writeToParcel将需要传递的数据写进Parcel,主要是
mLogicalCameraSettings.writeToParcel
3、CameraMetadataNative.java
CameraMetadataNative也实现Parcelable,nativeWriteToParcel走到 jni 层
4、android_hardware_camera2_CameraMetadata.cpp
5、frameworks/av/camera/CameraMetadata.cpp
到这边就是将真正的metadata数据拷贝到Parcel,所以实际上还是memcpy,数据量过大且频繁设置参数的话会有性能问题。
二、单个Metadata参数设置
1、CaptureRequest.Builder
通过内部类Builder设置单个参数
2、CameraMetadataNative.java
最终会调用setBase, nativeWriteValues
3、android_hardware_camera2_CameraMetadata.cpp
最终调用到updateAny更新单个参数的设置
三、binder调用
以submitRequest为例, 下面是Bp端的调用
writeParcelable最终会调到 Parcel.h的 writeData,writeToParcel就是CaptureRequest里面实现的接口
随后 transact调用到Bn端了