Android O 的camera framework-hal层框架笔记(基于高通845平台)

Android O 的camera framework/hal层框架笔记(基于高通845平台)

tags: android camera


文章目录

  • Android O 的camera framework/hal层框架笔记(基于高通845平台)
    • @[toc]
    • **0 前言**

    • **1 CameraServer的启动**

    • **2 打开一个Camera**

    • **3 为Camera创建stream**

    • **4 向Camera添加request**

    • **5 Camera捕获数据的过程**

0 前言

androidO上面的版本高通把他的HAL层给全部闭源了,这点不太友好,只能先把android开源的部分给分析清楚了再说。
关于androidO的hal层与以往的版本比,最大的差别可能就在于google搞的treble架构了。除此之外,我手上的新板子用上了CameraDeviceClient这个camera client类了,也就是CAMERA_DEVICE_API_VERSION_3_xAPI_2,就目前而言算是比较新的了,就我目前所知,更新的API版本在buffer管理上是使用的bufferManagement类,而这个是直接通过IGraphicBufferProducer(最终应该是BufferQueueProducer)来实现的申请及回收,其余的更新暂时不太清楚,但是整体框架基本一样,不像1.0那样与3.x有巨大差别。

关于treble和binder通信方面,请参见《Android O Treble框架笔记(基于高通845平台)》这篇笔记。

1 CameraServer的启动

cameraserver的启动过程如下图所示,由于很多细节已经在图上做了说明,所以这里就不在详细记录。
总结起来,启动的时候主要做了两件事:
1、找到所有的provider,分别为每个provider创建providerInfo
2、通过provider查询该provider底下的device,并为每个device创建deviceInfo

在创建device时,是通过provider真正在hal层创建的,这里是通过binder的方式拿到一个ICameraDevice类型的对象,作为真正的hal层CameraDevice的操作接口。

这样cameraserver就拥有了所有camera的管控权。这也是Cameraserver启动过程所要完成的最核心的内容。

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第1张图片

cameraserver对于camera的管理结构如下图所示。

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第2张图片

2 打开一个Camera

打开一个camera在当前平台上会创建一个camera client,其类型为CameraDeviceClient,如下图所示:

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第3张图片

在创建client时分为两步:
1、创建一个Camera3Device对象;
2、初始化client

在这些过程里面每个device都创建了一个session,这个session是通过ICameraDevice创建的,这里利用了Binder的方式创建了一个ICameraDeviceSession的对象,该对象通过binder的方式作为此session对hal层的操作接口。

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第4张图片

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第5张图片

3 为Camera创建stream

接下来就是为session创建stream,这里stream的意义我觉得更像是对数据流内存的操作接口以及流的参数配置。
stream的定义如下图所示:

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第6张图片

其创建过程如下图所示:

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第7张图片

4 向Camera添加request

现在版本的android Camera与各厂商的hal层都是用request的方式进行交互,简单来说就是android已经定义了若干标准的消息标识,然后根据不同的应用需求发送不同标识的消息给厂商的hal层,然后厂商的hal层执行完后把结果通过定义好的标识再还回android中。

就我的理解request分为重复请求和一次性请求,如果是重复请求,则应用层发一次请求,android就会一直循环给厂商的hal层发送该请求,比如说preview场景下,应用层只会在一开始发送一条摄像头捕获数据的请求,这时android就会一直给厂商的hal层发送数据捕获的请求,于是android侧就会不停的收到厂商hal传回来的摄像头数据,于是就形成了动画……
一次性请求应该比较好理解,就是发一次执行一次,比如按快门,拍一张照片,那么该请求只被执行一次就行了。

应用层发送request的过程如下图所示:

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第8张图片

5 Camera捕获数据的过程

当所有配置完成之后,camera系统就开始运行了,其主要就是Camera3Device里面RequestThread类,该类起了一个循环线程,不停的去执行request。当一个request执行完毕后厂商的hal层会自动调用创建时注册给厂商的回调接口 camera3_callback_ops来通知android这边接收处理完成的request。该回调函数的注册过程如下:

bool CameraDeviceSession::initialize() {
    /** Initialize device with callback functions */
    ATRACE_BEGIN("camera3->initialize");
    status_t res = mDevice->ops->initialize(mDevice, this);
    ATRACE_END();
    ……
}

上面的initialize中传入的this便是camera3_callback_ops类型的数据,因为this为CameraDeviceSession类,CameraDeviceSession继承自camera3_callback_ops

具体的工作过程如下图所示:

Android O 的camera framework-hal层框架笔记(基于高通845平台)_第9张图片

你可能感兴趣的:(android,camera)