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更新单个参数的设置



















![[C++随笔录] list模拟实现](https://img-blog.csdnimg.cn/c94b6303ab14489088a728eefea03a1a.png)