在相机系统中,CameraProvider是一个至关重要的组件。以下是对CameraProvider的详细解释:
一、定义与位置
CameraProvider是相机系统的下层组件,位于CameraService以下和Camera HAL(硬件抽象层)以上。它作为一个独立进程存在于Android系统中,并承担起了对Camera HAL的封装工作。
$ ps -A | grep camera
cameraserver 254 1 58152 3512 0 0 S android.hardware.camera.provider@2.4-service
cameraserver 372 1 29892 13192 0 0 S cameraserver
二、功能与作用
跨进程通信:
CameraProvider通过HIDL(HAL接口定义语言)接口与CameraService进行跨进程通信。这允许CameraService进行相机操作,如获取相机设备列表、打开特定相机设备等。
封装复杂性:
CameraProvider封装了与相机硬件交互的复杂性,为CameraService提供简化的接口。这使得CameraService能够更容易地与相机硬件进行交互,而无需直接处理底层的硬件细节。
加载与管理HAL模块:
CameraProvider负责加载和管理系统的Camera HAL Module,并提供标准的接口供CameraService调用。这确保了CameraService能够与不同厂商的相机硬件进行兼容和交互。
三、CameraProvider的启动与注册
启动流程:
在系统初始化时,系统会运行android.hardware.camera.provider@2.4-service.rc程序,启动CameraProvider进程,并将其加入HW Service Manager中接受统一管理。
在启动过程中,会实例化一个CameraProvider对象(如LegacyCameraProviderImpl_2_4),并通过hw_get_module标准方法获取HAL的camera_module_t结构体,存入CameraModule对象中。
接着,调用camera_module_t结构体的init方法初始化HAL Module,然后调用其get_number_of_camera方法获取当前HAL支持的Camera数量。
最后,通过调用set_callbacks方法将CameraProvider(继承了camera_module_callback_t)作为参数传入HAL中,接受来自HAL中的数据以及事件。
注册流程:
CameraProvider进程启动后,会通过HAL3Module::GetInstance()静态方法实例化HAL3Module对象。
在HAL3Module的构造方法中,会通过HwEnvironment::GetInstance()静态方法实例化HwEnvironment对象。
HwEnvironment对象在构造过程中会实例化SettingsManager对象,并通过OverrideSettingsFile对象获取位于/vendor/etc/camera/camoverridesettings.txt文件中的平台相关的配置信息。
同时,在HwEnvironment的构造方法中还会调用其Initialize方法,实例化CSLModeManager对象,并通过该对象提供的接口获取所有底层支持的硬件设备信息,包括CameraRequestManager、CAPS模块、Sensor/IPE/Flash等硬件模块。
四、CameraProvider的工作流程
接口提供:
CameraProvider通过提供标准的HIDL接口给Camera Service进行调用,保持与Service的正常通信。这些接口包括用于获取相机设备列表、打开相机设备、设置回调等功能的接口。
跨进程通信:
CameraProvider与Camera Service之间的通信是通过HIDL接口实现的跨进程通信。Camera Service通过HIDL接口获取CameraProvider提供的对象和服务,并下发相机操作请求。
HAL接口调用:
CameraProvider通过标准的HAL3接口向下控制着具体的Camera HAL Module。这个接口的实现交由平台厂商负责。CameraProvider将Camera Service下发的请求通过HAL3接口传递给HAL Module,由HAL Module执行具体的相机操作。
事件回调:
CameraProvider还负责将相机设备的状态变化、闪光灯状态变化等事件通过回调接口上传给Camera Service。这样,Camera Service就能及时了解相机设备的状态,并做出相应的处理。
五、CameraProvider的优化与管理
为了优化CameraProvider的性能和管理相机资源,可以采取以下措施:
优化相机请求队列:合理设置相机请求队列的大小,避免过多的请求导致性能下降。
选择合适的对焦模式:提高对焦速度和准确性,例如使用自动对焦模式。
避免不必要的图像处理:在处理图像时,尽量避免不必要的操作,如不必要的裁剪、旋转等。
优化相机生命周期管理:确保在Activity或Fragment的生命周期内正确管理相机资源,例如在onPause()方法中暂停相机预览,在onResume()方法中恢复相机预览。
六、 接口
1 camera3.ICameraProvider接口:
这是Camera Provider提供给Camera Service的接口,允许Service进行相机操作,如获取相机设备列表、打开特定相机设备等。
作为Camera Service和Camera Driver之间的中间层,提供跨进程通信的能力。
封装了与相机硬件交互的复杂性,为Camera Service提供简化的接口。
2 相机设备管理接口:
提供管理相机设备的生命周期的接口,包括打开、配置和关闭相机设备。
允许上层应用或系统服务查询当前可用的相机设备列表,并获取特定相机设备的详细信息。
3 相机参数配置接口:
提供配置相机参数的接口,如曝光、白平衡、对焦模式等。
允许上层应用或系统服务根据需求调整相机参数,以获得最佳的拍摄效果。
4 相机事件回调接口:
提供相机事件回调的接口,如相机设备状态变化、闪光灯状态变化等。
允许上层应用或系统服务及时响应相机事件,进行相应的处理。
5 其他辅助接口:
可能还包括一些其他辅助接口,如相机预览数据的回调接口、相机拍照结果的回调接口等。
这些接口有助于上层应用或系统服务实现更复杂的相机功能,如实时预览、拍照、录像等。
七、与cam_board.xml 的关系
1. cam_board.xml 的作用
配置文件性质:XML 文件用于定义硬件板级(Board-Specific)的相机配置,通常由设备厂商提供,位于 /vendor/etc/camera/ 或类似路径。
典型内容:
传感器信息(如型号、接口类型、I²C 地址)。
支持的图像格式(如 YUV、RAW、JPEG)。
镜头校准参数(畸变校正、对焦表)。
电源管理配置(上电/断电时序)。
物理安装信息(如摄像头方向、视野角度)。
2. 二者的交互关系
初始化阶段:
Camera Provider 启动时,会解析 cam_board.xml,加载硬件参数。
例如:根据 XML 中的传感器地址,初始化对应的 I²C 通信。
运行时配置:
当上层请求打开摄像头时,Provider 参考 XML 中的分辨率列表,返回支持的模式。
校准数据(如镜头畸变参数)可能从 XML 中读取,用于实时图像处理。
动态适配:
针对多摄像头系统,XML 可能定义多个 节点,Provider 依此创建多个逻辑设备。