2. Camera Provider HAL 和 Camera Device HAL3
2.1 谷歌的Framework层定义了四个接口来与Hal3进行交互:ICameraProvider , ICameraDevice, ICameraDeviceSession, ICameraDeviceCallback
MTK的Hal3当中定义了四个接口的实例: CameraProviderImpl, CameraDevice3Impl, CameraDeviceSession3Impl, CameraDeviceManager
图片如下:
在open流程中这四个接口是如下的关系:
(frameworks\av\services\camera\libcameraservice\device3\Camera3Device.cpp) Camera3Device::initialize (frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp) CameraProviderManager->openSession() deviceInfo3->cameradevice->open() (hardware\interfaces\camera\device\3.2\default\CameraDevice.cpp) cameraModule->open() CameraDeviceSession = createSession(ICameraDeviceCallback) new CameraDeviceSession(ICameraDeviceCallback) QCamera3HardwareInterface::initlize(ICameraDeviceCallback) camera3_callback_ops = ICameraDeviceCallback
2.2 CameraProvider Hal 与CameraDevice Hal3的组成
CameraProvider Hal 是ICameraProvider在HAL3中的实例,本质上是包装了CameraDeviceManager 的一个适配器。其作用是让CameraService通过ICameraProvider这个接口来获取ICameraDevice。API:getCameraDeviceInterface()
CameraDevice Hal3 是ICameraDevice 和ICameraDeviceSession在Hal3中的实例,用于给CameraService来操作每个摄像过头。本质是给予CameraDeviceManager和摄像头设备交互的 一个IVirtualDevice类型的接口。
这两个接口的图如下:
2.3 CameraService 和 CameraHalService如何通过四个接口进行交互
首先,CameraService通过在Framework层的 ICameraProvider 接口访问到Hal3的CameraProvider实例,而 CameraProvider 只是 ICameraDeviceManager的一层包装,因而继续访问到CameraDeviceManager。
其次,再通过Manager来枚举设备的映射图(物理设备映射图(Physic Device Map),虚拟设备映射图(Virtual Device Map)),通过虚拟设备映射图找到虚拟设备(Virtual Device),虚拟设备中包含的摄像头设备列表
也就是在APP获取camera list时得到的摄像头设备列表,这些Virtual Device就变成Camera Service与Hal3交互的接口。
通过Manager中的open device map 中可以获得所有已经打开的物理设备和虚拟设备的信息。
2.4 Camera Device Manager
其是ICameraDeviceManager在HAL3的实例,通过枚举设备,打开,关闭设备来管理Camera设备。
枚举设备会枚举物理设备和虚拟设备,物理设备又包含了(sensor name, device id, facing direction),虚拟设备又包含了(virtual device id, torch mode)。
打开设备会包含虚拟设备,物理设备,主设备版本,次设备版本。
2.5 Logic Device
逻辑上的设备包含了ICameraDevice 和 IVirtualDevice接口,前者属于安卓的camera设备的HAL接口(被android camera service调用),以后则属于MTK的虚拟设备HAL接口(被camera device manager调用)。
2.6 Logic Device 如何映射到 Physic Device。
Logic Sensor 与Physic Sensor可以一对多(用一个Logic Sensor来表示双摄就有两个摄像头,就包含了两个Physic Sensor),可以多对一(一个Physic Sensor有不同的运行模式,一个模式代表用一个Logic Sensor来表示)
映射时采用HalLogicSensorList,LogicSensorStruct来映射。
具体映射关系看源码:/vendor/mediatek/proprietary/custom/mtk3/hal/inc/camera_custom_logicldevice.h ( get_LogicDevice_CustomizeData() )
/vendor/mediatek/proprietary/hardware/mtkcam/utils/LogicCam/HalLogicDeviceList.cpp ( CreateDeviceDap(), AddLogicDevice())
映射关系图:
2.7 Provider HAL 和 Device HAL3的初始化
最开始把HAL Service注册到Framework中的ProviderManager中,初始化时Camera Service会在ProviderManager获取HAL Service并通过ICameraProvider接口调用HIDL_FETCH_ICameraProvider来创建一个ICameraProvider的实例,
再调用getCameraDeviceManager创建一个 Camera Device Manager,并调用其初始化函数来枚举设备,
在枚举时会做六件事情 1.寻找sensor。2.创建HAL3的模块之IMetadataProvider。3.创建虚拟摄像头设备会创建两个实例(CameraDevice3Impl 和 CameraDevice3SessionImpl)。4.将虚拟设备,物理设备添加到相应的设备映射表中。
2.8 Device HAL3 和 Provider HAL的接口
Provider HAL API主要是:
ICameraProvider API主要是:getCameraDeviceInterface() //通过设备名来获取ICameraDevice接口
Device HAL3 API主要是:ICameraDevice 和 ICameraDeviceSession 的API
ICameraDevice API主要是:open() //上电,创建管道管理者,APP流管理者,建立摄像头映射
setTorchMode() //打开关闭闪光灯的模式
getCameraCharaterisLists() //得到摄像头设备的属性
ICameraDeviceSession API主要是:close() //去使能captureRequest,关闭管道,下电,删除摄像头映射
ConfigStreams() //camera service通过CameraDeviceSession接口调用下来。建立新的输入输出流到APPStreamManager,并创建管道Pipeline Model。最后通过CameraDeviceSession回调到camera service
ProcessCaptureResult() //camera service通过CameraDeviceSession接口调用下来。把提交请求到APPStreamManager,创建pipeline frame后添加到Pipeline Model。最后通过CameraDeviceSession回调到camera service
标签:HAL3,HAL,映射,接口,camera,Device,设备 From: https://www.cnblogs.com/zsy12138/p/11387776.html