高通camx架构学习(四)——Camera Framework
高通camx架构学习(四)——Camera Framework
- 1.Camera Framework 列文件目录
- 2. JNI 相关
- 3. AIDL 相关
- 4.IInterface 类型文件
- 5.parcelable 类型文件
- 6. ICameraService 相关
- 7. ICameraServiceProxy.aidl 文件
- 8. ICamera 相关
- 9.ICameraDevice 相关
- 10.Services 目录下的文件介绍
- 11. API1/API2
- 12. QTICamera2Client
- 13.device1/device3
1.Camera Framework 列文件目录
1.API1:(frameworks/base/core/java/android/hardware/Camera.java)
2.API2:(frameworks/base/core/java/android/hardware/camera2/)
3.JNI: (frameworks/base/core/jni/)
4.AIDL:( frameworks/av/camera/aidl/)
5.Native: (frameworks/av/camera/)
6.Service: (frameworks/av/services/camera/libcameraservice/)
7.Qcom Hal: (vendor/qcom/propietary/camx/)
8.Qcom Kernel:(kernel/msm-4.19/techpack/camera/)
2. JNI 相关
主目录为 frameworks/base/core/jni
//frameworks/base/core/jni
./android_hardware_camera2_legacy_LegacyCameraDevice.cpp
./android_hardware_Camera.cpp ./android/graphics/Camera.cpp
./include/android_runtime/android_hardware_camera2_CameraMetadata.h
./android_hardware_camera2_DngCreator.cpp
./android_hardware_camera2_CameraMetadata.cpp
./android_hardware_camera2_legacy_PerfMeasurement.cpp
API 1 中,使用 jni 通过 Binder 机制和 CameraService 通信。
API 2 中,直接在 CameraManager.java 中通过 Binder 机制和 CameraService 通信。
3. AIDL 相关
Framework Camera AIDL 是 Camera 中客户端和服务端跨进程通信时使用的 AIDL 文件,代码都在frameworks/av/camera/目录下,其中 aidl 文件一共有 16 个
xmt@server005:~/frameworks/av/camera/aidl/android/hardware$ tree
.
├—— camera2
│ ├—— CaptureRequest.aidl
│ ├—— ICameraDeviceCallbacks.aidl
│ ├—— ICameraDeviceUser.aidl
│ ├—— impl
│ │ ├—— CameraMetadataNative.aidl
│ │ └—— CaptureResultExtras.aidl
│ ├—— params
│ │ ├—— OutputConfiguration.aidl
│ │ ├—— VendorTagDescriptor.aidl
│ │ └—— VendorTagDescriptorCache.aidl
│ └—— utils
│ └—— SubmitInfo.aidl
├—— CameraInfo.aidl
├—— CameraStatus.aidl
├—— ICamera.aidl
├—— ICameraClient.aidl
├—— ICameraService.aidl
├—— ICameraServiceListener.aidl
└—— ICameraServiceProxy.aidl
4directories, 16 files
frameworks/av/camera/aidl/目录下的 aidl 文件有两种类型:
- 作为 Binder 中的 IInterface 跨进程通信中能提供的方法
- 作为 Binder 中的 parcelable 跨进程通信数据传输的数据结构
很容易从名字上区分这两种类型的文件,IInterface 类型的文件都是以 I 开头的,比如:ICameraService.aidl, ICameraDeviceUser.aidl等。不管是哪种类型的 aidl 文件,它们都会生成对应的 .java, .h, .cpp 文件,分别供 Java 层和 CPP 层调用。
4.IInterface 类型文件
IInterface 类型文件一共有 7 个,它们的 .java, .h, .cpp 文件,绝大部分都是自动生成的。
Java 文件是在 frameworks/base/Android.mk 中定义规则,在编译时自动生成:
//frameworks/base/Android.mk
LOCAL_SRC_FILES +=
…
…/av/camera/aidl/android/hardware/ICameraService.aidl
…/av/camera/aidl/android/hardware/ICameraServiceListener.aidl
…/av/camera/aidl/android/hardware/ICameraServiceProxy.aidl
…/av/camera/aidl/android/hardware/ICamera.aidl
…/av/camera/aidl/android/hardware/ICameraClient.aidl …/av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl
…/av/camera/aidl/android/hardware/camera2/ICameraDeviceCallbacks.aidl
…
…
在 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/dotdot/ 目录下生成对应的 Java 文件:
//out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/dotdot/
av/camera/aidl/android/hardware/ICameraService.java
av/camera/aidl/android/hardware/ICameraServiceListener.java
av/camera/aidl/android/hardware/ICameraServiceProxy.java
av/camera/aidl/android/hardware/ICamera.java
av/camera/aidl/android/hardware/ICameraClient.java
av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.java
av/camera/aidl/android/hardware/camera2/ICameraDeviceCallbacks.java
.h, .cpp 文件中,ICamera.aidl, ICameraClient.aidl 两个文件是直接以代码形式手动实现的:
// 1. ICameraClient.aidl
frameworks/av/camera/aidl/android/hardware/ICameraClient.aidl
frameworks/av/camera/include/camera/android/hardware/ICameraClient.h
frameworks/av/camera/ICameraClient.cpp// 2.ICamera.aidl
frameworks/av/camera/aidl/android/hardware/ICamera.aidl
frameworks/av/camera/include/camera/android/hardware/ICamera.h
frameworks/av/camera/ICamera.cpp
其他 5 个 aidl 文件是在 frameworks/av/camera/Android.bp 中定义规则,编译时自动生成对应的 .h, .cpp 文件:
//frameworks/av/camera/Android.bp cc_library_shared {
name: “libcamera_client”,aidl: {export_aidl_headers: true,local_include_dirs: ["aidl"],include_dirs: ["frameworks/native/aidl/gui",], },srcs: [// AIDL files for camerainterfaces// The headers for theseinterfaces will be // available to anymodules that// include libcamera_client,at the path "aidl/package/path/BnFoo.h""aidl/android/hardware/ICameraService.aidl","aidl/android/hardware/ICameraServiceListener.aidl","aidl/android/hardware/ICameraServiceProxy.aidl","aidl/android/hardware/camera2/ICameraDeviceCallbacks.aidl","aidl/android/hardware/camera2/ICameraDeviceUser.aidl",// Source for camerainterface parcelables, // and manually-writteninterfaces"Camera.cpp","CameraMetadata.cpp","CameraParameters.cpp",... }
在 out/soong/.intermediates/frameworks/av/camera/libcamera_client/ 目录下生成对应的 .h, .cpp 文件,通常在该目录下会同时生成 32 和 64 位两套代码,但实际两份代码是一样的,这里选取 64 位的:
64 位:android_arm64_armv8-a_shared_core
32 位:android_arm_armv7-a-neon_cortex-a53_shared_core
目录out/soong/.intermediates/frameworks/av/camera/libcamera_client// 64 位 android_arm64_armv8-a_shared_core/gen/aidl/
android/hardware/ICameraService.h android/hardware/BnCameraService.h
frameworks/av/camera/aidl/android/hardware/ICameraService.cpp
android/hardware/ICameraServiceListener.h
android/hardware/BnCameraServiceListener.h
frameworks/av/camera/aidl/android/hardware/ICameraServiceListener.cpp
android/hardware/ICameraServiceProxy.h
android/hardware/BnCameraServiceProxy.h
frameworks/av/camera/aidl/android/hardware/ICameraServiceProxy.cpp
android/hardware/camera2/ICameraDeviceUser.h
android/hardware/camera2/BnCameraDeviceUser.h
frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.cpp
android/hardware/camera2/ICameraDeviceCallbacks.h
android/hardware/camera2/BnCameraDeviceCallbacks.h
frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceCallbacks.cpp
5.parcelable 类型文件
parcelable 类型文件一共有 9 个,它们都是手动编写的代码。
Java 文件目录为 frameworks/base/core/java/android/hardware/ :
//frameworks/base/core/java/android/hardware/
camera2/CaptureRequest.java camera2/impl/CameraMetadataNative.java
camera2/impl/CaptureResultExtras.java
camera2/params/OutputConfiguration.java
camera2/params/VendorTagDescriptor.java
camera2/params/VendorTagDescriptorCache.java
camera2/utils/SubmitInfo.java CameraInfo.java CameraStatus.java
.h, .cpp 文件并不一定是和 aidl 文件名称一一对应的,而是在 aidl 文件中定义的,比如 CameraStatus.aidl 定义如下:
packageandroid.hardware;
/** @hide */
parcelable CameraStatus cpp_header “camera/CameraBase.h”;
parcelable 类型的 aidl 文件对应的 .h, .cpp 文件目录为 frameworks/av/camera ,对应关系整理如下:
// .h, .cpp 文件目录
frameworks/av/camera//CaptureRequest.aidlinclude/camera/camera2/CaptureRequest.h
camera2/CaptureRequest.cpp//CameraMetadataNative.aidlinclude/camera/CameraMetadata.h
CameraMetadata.cpp//CaptureResultExtras.aidlinclude/camera/CaptureResult.h
CaptureResult.cpp//OutputConfiguration.aidlinclude/camera/camera2/OutputConfiguration.h
camera2/OutputConfiguration.cpp//VendorTagDescriptor.aidl
和VendorTagDescriptorCache.aidlinclude/camera/VendorTagDescriptor.h
VendorTagDescriptor.cpp//SubmitInfo.aidlinclude/camera/camera2/SubmitInfo.h
camera2/SubmitInfo.cpp//CameraInfo.aidl 和 CameraStatus.aidlinclude/camera/CameraBase.h
CameraBase.cpp
6. ICameraService 相关
分为客户端向服务端的请求 ICameraService.aidl 和客户端监听服务端的变化 ICameraServiceListener.aidl 。这两个 AIDL 是在 CameraService.cpp 中实现对应功能的。
interface {
…
constintCAMERA_TYPE_BACKWARD_COMPATIBLE = 0;
constint CAMERA_TYPE_ALL= 1;// 返回指定类型的相机设备数量 intgetNumberOfCameras(int type); // 根据 id 返回当前相机设备信息 CameraInfo getCameraInfo(intcameraId);... constintCAMERA_HAL_API_VERSION_UNSPECIFIED = -1; // api1 + hal1 ICamera connect(ICameraClientclient,int cameraId,String opPackageName,intclientUid, intclientPid);// api2 + hal3 ICameraDeviceUser connectDevice(ICameraDeviceCallbackscallbacks,String cameraId,String opPackageName,intclientUid);// api1 + 指定 hal 版本(通常为 hal1) ICamera connectLegacy(ICameraClientclient,int cameraId,inthalVersion,String opPackageName,intclientUid);// 添加和移除 ICameraServiceListener 监听 CameraStatus[] addListener(ICameraServiceListenerlistener); voidremoveListener(ICameraServiceListenerlistener);// 根据 id 返回相机支持的属性 CameraMetadataNative getCameraCharacteristics(StringcameraId);// 获取 vendor tag VendorTagDescriptor getCameraVendorTagDescriptor(); VendorTagDescriptorCache getCameraVendorTagCache();// camera api 1 获取参数信息 String getLegacyParameters(intcameraId);constintAPI_VERSION_1 = 1; constintAPI_VERSION_2 = 2; // 指定 id 支持的 API 版本 booleansupportsCameraApi(StringcameraId, intapiVersion); // 指定 id 设置手电筒模式 voidsetTorchMode(StringcameraId, boolean enabled, IBinder clientBinder);// 服务端向系统打印系统消息 constintEVENT_NONE = 0; constintEVENT_USER_SWITCHED = 1; oneway voidnotifySystemEvent(int eventId,in int[] args); }
// 2.ICameraServiceListener.aidlinterfaceICameraServiceListener {
constintSTATUS_NOT_PRESENT = 0;
constintSTATUS_PRESENT = 1;
constintSTATUS_ENUMERATING = 2;
constintSTATUS_NOT_AVAILABLE = -2;
constintSTATUS_UNKNOWN = -1;
// 相机设备状态变化事件
oneway voidonStatusChanged(int status,String cameraId);constintTORCH_STATUS_NOT_AVAILABLE = 0; constintTORCH_STATUS_AVAILABLE_OFF = 1; constintTORCH_STATUS_AVAILABLE_ON = 2; constintTORCH_STATUS_UNKNOWN = -1; // 手电筒状态变化事件 oneway voidonTorchStatusChanged(int status,String cameraId); }
7. ICameraServiceProxy.aidl 文件
CameraServiceProxy 服务是在 Java 层注册的
interfaceICameraServiceProxy {
// CameraService 向代理服务发送消息,通知用户更新
onewayvoidpingForUserUpdate();constintCAMERA_STATE_OPEN = 0; constintCAMERA_STATE_ACTIVE = 1; constintCAMERA_STATE_IDLE = 2; constintCAMERA_STATE_CLOSED = 3; constintCAMERA_FACING_BACK = 0; constintCAMERA_FACING_FRONT = 1; constintCAMERA_FACING_EXTERNAL = 2;// CameraService 向代理服务发送消息,通知相机设备状态更新 onewayvoidnotifyCameraState(String cameraId, int facing, intnewCameraState, String clientName); }
8. ICamera 相关
Camera API1 才会使用到,分为 ICamera.aidl, ICameraClient.aidl
它们的代码是手动实现的,参考:CameraClient.h/cpp, Camera.h/cpp
9.ICameraDevice 相关
Camera API2 才会使用到,分为客户端向服务端的请求 ICameraDeviceUser.aidl 和服务端发给客户端的回调 ICameraDeviceCallbacks.aidl 。
表示相机设备具备的能力,能够提供的函数;这两个 AIDL 是在 CameraDeviceClient 中实现对应功能的
// 1.ICameraDeviceUser.aidl interfaceICameraDeviceUser {
voiddisconnect();constintNO_IN_FLIGHT_REPEATING_FRAMES = -1; // 向设备提交捕获请求 SubmitInfo submitRequest(inCaptureRequest request, boolean streaming); SubmitInfo submitRequestList(inCaptureRequest[] requestList, boolean streaming); // 取消置顶 id 的重复请求,并返回上次请求的帧 id longcancelRequest(intrequestId);constintNORMAL_MODE = 0; constintCONSTRAINED_HIGH_SPEED_MODE = 1; constintVENDOR_MODE_START = 0x8000;// 在流处理前执行配置请求 voidbeginConfigure(); // 根据指定输出配置,创建流 intcreateStream(inOutputConfiguration outputConfiguration); voidendConfigure(intoperatingMode); voiddeleteStream(intstreamId);// 创建输入流,返回流 id intcreateInputStream(int width, int height, int format); // 返回输入流的 Surface Surface getInputSurface();// Keep in sync withpublic API in //frameworks/base/core/java/android/hardware/camera2/CameraDevice.java constintTEMPLATE_PREVIEW = 1; constintTEMPLATE_STILL_CAPTURE = 2; constintTEMPLATE_RECORD = 3; constintTEMPLATE_VIDEO_SNAPSHOT = 4; constintTEMPLATE_ZERO_SHUTTER_LAG = 5; constintTEMPLATE_MANUAL = 6; // 根据模板创建默认请求,返回相机参数信息 CameraMetadataNative createDefaultRequest(inttemplateId); // 获取相机参数信息 CameraMetadataNative getCameraInfo(); voidwaitUntilIdle(); longflush(); voidprepare(intstreamId); voidtearDown(intstreamId); voidprepare2(int maxCount,intstreamId); voidfinalizeOutputConfigurations(int streamId,in OutputConfigurationoutputConfiguration); }
// 2.ICameraDeviceCallbacks.aidlinterfaceICameraDeviceCallbacks {
…
oneway voidonDeviceError(interrorCode,
in CaptureResultExtrasresultExtras);
oneway voidonDeviceIdle();
oneway voidonCaptureStarted(inCaptureResultExtras resultExtras,
longtimestamp);
oneway voidonResultReceived(inCameraMetadataNative result,
inCaptureResultExtras resultExtras);
oneway voidonPrepared(intstreamId);
// 重复请求引起的错误回调
oneway voidonRepeatingRequestError(in longlastFrameNumber,
in intrepeatingRequestId);
oneway voidonRequestQueueEmpty(); }
10.Services 目录下的文件介绍
frameworks/av/services/camera/libcameraservice AOSP 中这个目录下是 87 个文件,而 Qcom 的基线中增加了 27 个文件,分别为 api1/qticlient2 目录下的 25 个文件,以及 QTICamera2Client.cpp, QTICamera2Client.h 两个文件。
.
├—— Android.mk
├—— api1
│ ├—— client2
│ └—— qticlient2
├—— api2
├—— CameraFlashlight.cpp
├—— CameraFlashlight.h
├—— CameraService.cpp
├—— CameraService.h
├—— common
├—— device1
├—— device3
├—— gui
├—— MODULE_LICENSE_APACHE2
├—— NOTICE
├—— tests
└—— utils
从目录结构上可以看出,API1/2 和 HAL1/3 就是在这一层体现的。
11. API1/API2
APP Java 客户端调用服务端方法时,Camera API1/2 接口对应功能都是在 CameraService 中实现的,而这里的 API1/2 目录对应的就是对上层不同版本接口的处理
api1
├—— Camera2Client.cpp
├—— Camera2Client.h
├—— CameraClient.cpp
├—— CameraClient.h
├—— client2
│ ├—— CallbackProcessor.cpp
│ ├—— CallbackProcessor.h
│ ├—— Camera2Heap.h
│ ├—— CaptureSequencer.cpp
│ ├—— CaptureSequencer.h
│ ├—— FrameProcessor.cpp
│ ├—— FrameProcessor.h
│ ├—— JpegCompressor.cpp
│ ├—— JpegCompressor.h
│ ├—— JpegProcessor.cpp
│ ├—— JpegProcessor.h
│ ├—— Parameters.cpp
│ ├—— Parameters.h
│ ├—— StreamingProcessor.cpp
│ ├—— StreamingProcessor.h
│ ├—— ZslProcessor.cpp
│ └—— ZslProcessor.h
├—— QTICamera2Client.cpp
├—— QTICamera2Client.h
└—— qticlient2
├—— CallbackProcessor.cpp
├—— CallbackProcessor.h
├—— Camera2Heap.h
├—— CaptureSequencer.cpp
├—— CaptureSequencer.h
├—— FrameProcessor.cpp
├—— FrameProcessor.h
├—— JpegCompressor.cpp
├—— JpegCompressor.h
├—— JpegProcessor.cpp
├—— JpegProcessor.h
├—— Parameters.cpp
├—— Parameters.h
├—— QTICaptureSequencer.cpp
├—— QTICaptureSequencer.h
├—— QTIFrameProcessor.cpp
├—— QTIFrameProcessor.h
├—— QTIParameters.cpp
├—— QTIParameters.h
├—— RawProcessor.cpp
├—— RawProcessor.h
├—— StreamingProcessor.cpp
├—— StreamingProcessor.h
├—— ZslProcessor.cpp
└—— ZslProcessor.hapi2
├—— CameraDeviceClient.cpp
└—— CameraDeviceClient.h
BasicClient 有三个重要的子类:
- CameraClient
如果平台仅支持 HAL 1,即 CAMERA_DEVICE_API_VERSION_1_0 ;使用 API 1/2 + HAL 1 都会对应该客户端。 - Camera2Client
如果平台支持 HAL 3 ,即 CAMERA_DEVICE_API_VERSION_3_0 及以上版本;使用 API 1 + HAL 3 对应的客户端。Camera2Client 会将 API1 中的接口转换为 API2 中对应的功能。 - CameraDeviceClient
如果平台支持 HAL 3 ,使用 API 2 + HAL 3 对应的客户端。平台仅支持 HAL 1 时,API 2 在 openCamera 时,通过 CameraDeviceUserShim 将 API 2 转换为 API 1 ,即 HAL 1 + API 1 向下发起请求。LegacyCameraDevice 会将 CAMERA API2 转换为 CAMERA API1 ,而 CameraDeviceUserShim 封装了 LegacyCameraDevice 。
12. QTICamera2Client
Qcom 的基线中增加了 27 个文件,分别为 api1/qticlient2 目录下的 25 个文件,以及 QTICamera2Client.cpp, QTICamera2Client.h 两个文件。
而 QTICamera2Client 是高通针对 API1 做的优化?在什么情况下会转换为 QTICamera2Client 呢?看如下源码
classCamera2Client :
publicCamera2ClientBaseCameraService::Client {friendclassQTICamera2Client;
#endif …sp<camera2::RawProcessor>mRawProcessor;
#endif …
sp<QTICamera2Client>mQTICamera2Client;
#endif … }
// 2.Camera2Client.cpptemplate
status_tCamera2Client::initializeImpl(TProviderPtr providerPtr) { …mQTICamera2Client = newQTICamera2Client(this);
#endif …
mRawProcessor = newRawProcessor(this,mCaptureSequencer); threadName = String8::format("C2-%d-RawProc",mCameraId); mRawProcessor->run(threadName.string());
#endif … }
QTICamera2Client 是高通对 API 1 中 Camera2Client 做的一层封装,添加了部分功能,主要是向上提供 raw
数据。// 1. QTICamera2Client.hclassQTICamera2Client: publicvirtual RefBase{
private:
wpmParentClient;
status_tstopPreviewExtn();public: QTICamera2Client(sp client);
~QTICamera2Client();
… }// 2.QTICamera2Client.cpp
QTICamera2Client::QTICamera2Client(sp client):
mParentClient(client) { }
13.device1/device3
device1/device3 可以理解为 Framework 层对应 HAL 层的 HAL 1/3 。
device1
├—— CameraHardwareInterface.cpp
└—— CameraHardwareInterface.hdevice3
├—— Camera3BufferManager.cpp
├—— Camera3BufferManager.h
├—— Camera3Device.cpp
├—— Camera3Device.h
├—— Camera3DummyStream.cpp
├—— Camera3DummyStream.h
├—— Camera3InputStream.cpp
├—— Camera3InputStream.h
├—— Camera3IOStreamBase.cpp
├—— Camera3IOStreamBase.h
├—— Camera3OutputStream.cpp
├—— Camera3OutputStream.h
├—— Camera3OutputStreamInterface.h
├—— Camera3SharedOutputStream.cpp
├—— Camera3SharedOutputStream.h
├—— Camera3StreamBufferFreedListener.h
├—— Camera3StreamBufferListener.h
├—— Camera3Stream.cpp
├—— Camera3Stream.h
├—— Camera3StreamInterface.h
├—— Camera3StreamSplitter.cpp
├—— Camera3StreamSplitter.h
├—— StatusTracker.cpp
└—— StatusTracker.h
API1/device1/HAL1 的连接过程
// API1: CameraClient.h sp mHardware;
//device1: CameraHardwareInterface.h
sphardware::camera::device::V1_0::ICameraDevice mHidlDevice; // 这里的
ICameraDevice 即为 HAL1API1 的客户端 CameraClient 对应的 device1:
CameraHardwareInterface,而它直接包含了 HAL1 中 ICameraDevice
API1/3/device3/HAL3 的连接过程
// API1: Camera2Client.hclassCamera2Client :
publicCamera2ClientBaseCameraService::Client{…}// API2:CameraDeviceClient.hclassCameraDeviceClient :
publicCamera2ClientBase,
publiccamera2::FrameProcessorBase::FilteredListener{…}//Camera2ClientBase.h sp mDevice;
//Camera2ClientBase.cpptemplate
Camera2ClientBase::Camera2ClientBase(
constsp& cameraService,
constsp& remoteCallback,
constString16& clientPackageName,
constString8& cameraId,
intcameraFacing,
intclientPid,
uid_tclientUid,
intservicePid):
TClientBase(cameraService,remoteCallback, clientPackageName,
cameraId, cameraFacing,clientPid, clientUid, servicePid), mSharedCameraCallbacks(remoteCallback),
mDeviceVersion(cameraService->getDeviceVersion(
TClientBase::mCameraIdStr)),
mDeviceActive(false) {
…
mInitialClientPid = clientPid;
// 只要是 HAL3 ,则 device 都是对应的 Camera3Device
mDevice = newCamera3Device(cameraId);
… }
从源码可以看出,不管是 API1/2 ,只要是 HAL 3 ,Camera2Client, CameraDeviceClient 两个客户端对应的都是 device3: Camera3Device 。
Camera3Device::HalInterface 内部类,用于和 HAL 层通信,实现了 HAL 层 ICameraDeviceSession.hal 部分代码:
// Camera3Device.hclassCamera3Device :
…
classHalInterface : publiccamera3::Camera3StreamBufferFreedListener {
public:
…
// Calls into the HALinterface// Caller takes ownershipof requestTemplatestatus_tconstructDefaultRequestSettings(camera3_request_template_ttemplateId,/*out*/camera_metadata_t**requestTemplate);status_tconfigureStreams(/*inout*/camera3_stream_configuration *config);status_tprocessCaptureRequest(camera3_capture_request_t*request);status_t flush();status_t close();... } ... }