本文基于Android P的Camera HAL3架构,以MTK平台为例,分析Camera HAL3的体系结构和调用流程。本文是描述关于MTK平台如何重写Android所定义的ICameraProvider, ICameraDevice, ICameraDeviceSession HIDL interfaces并实现Camera HAL3。
这篇文章只是帮助了解HAL层的结构,不涉及具体的代码。
Camera整体架构
下图是Android Camera的整个架构。
首先上层的APK应用通过Activity或Service来调用相机功能,分别获取APIv2中的CameraDevice和CameraManager。翻译成大白话就是获取相机设备和相机管理器,有了相机设备(CameraDevice)才能拍照,而相机管理器(CameraManager)就是用来管理预览,拍照,存储等命令的。
然后怎样才能获得这两个东西呢,通过Binder的方式来获取,图中蓝色部分可以看成客户端,灰色部分也就是图中的CameraService是服务端,他们之间属于进程间通信。
最后CameraService再通过HIDL接口调用到HAL(Hardware Abstract Layer)层,HAL继续往下一次是Driver层和HW(HardWare)层,就不赘述了,在获取到该相机设备或管理器后调用Callback接口。
如果你不懂Binder和HIDL是什么,请看HIDL是什么,Binder是什么?
总结一下:APK应用–>CameraAPI2(客户端)–>CameraService(服务端)–>HAL
HAL3的内部架构
大概介绍完了Android Camera的整体结构,接下来是HAL结构的具体内容。
HAL(Hardware Abstract Layer)硬件抽象层,顾名思义,是用来抽象硬件的。HAL是硬件依赖的,不同的 CPU(例如MTK和Qualcomm) 的 HAL 是不同的,但HAL 也有相同的地方,那就是 HAL 的目的——为上层软件提供一致的 API。
有了HAL层,上层软件就可以做到硬件无关。应用程序可以直接使用 HAL 提供的 API 来操作硬件,而不用管硬件的上电方式,更新组件等差异问题。
下图是MTK平台的HAL结构。
MTK HAL分为Middleware和Pipeline(含HWNode,FeaturePipe)。
Middleware
其中Middleware主要包括一些接口:ICameraProvider,ICameraDevice,ICameraDeviceSession
- ICameraProvider
ICameraProvider会枚举可用的Camera Device,并提供有关设备状态更改(例如连接,断开连接等)的更新。ICameraProvider负责生成相机设备服务名称列表,然后可以在以后打开。 - ICameraDevice
ICameraDevice是Android框架中的CameraService用来操作相机设备的。 ICameraDevice接口的实例可以通过ICameraProvider :: getCameraDeviceInterface_vN_x()方法获取,其中N是ICameraDevice接口的版本。 - ICameraDeviceSession
ICameraDeviceSession翻译过来就是相机设备会话,它由ICameraDevice创建,顾名思义,它的作用是建立相机设备与上层的会话。
总结:
ICameraProvider通过getCameraDeviceInterface_v3_x()来获取ICameraDevice实例,此时还没有对设备进行上电操作,当上层应用获得相机设备实例后,通过ICameraDevice的open函数来对设备进行上电,然后再create一个ICameraSession的实例来让应用操作Device实例。
Pipeline结构
Pipeline由PipeModel, HWNode, FeaturePipe组成,其中PipeModel会针对不同的用户场景来创建对应的HWNode,而不同的HWNode又需要不同的FeatureNode来响应。
PipeModel在后续的文章会讲到,应当先了解PipeModel的输入和输出是:
- input:应用请求
- output:图像流和原始数据
HWNode负责整合硬件功能,软件算法和第三方算法,其中各个Node的作用如下:
-
P1Node
它是pipeline的根节点
输入数据来自上一层
输出是接下来的P2CaptureNode和P2StreamingNode
使用ISP-P1 -
P2CaptureNode
将RAW数据转化为YUV
支持裁剪
使用ISP-P2
处理所有第三方算法(通过CaptureFeaturePipe) -
P2StreamingNode
将RAW数据转化为YUV
支持裁剪
使用ISP-P2
处理所用第三方算法(通过StreamingFeaturePipe) -
JPEGNode
将YUV转化为JPEG
输入数据为P2StreamingNode或者P2CaptureNode
输出数据给应用
下一篇文章是Camera HAL的调用流程,微信公众号将同步更新该系列文章。