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

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

tags: android 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启动过程所要完成的最核心的内容。

cameraservice_boot.jpg-779.3kB

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

cameraservice overview.jpg-103.8kB

2 打开一个Camera

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

CameraDeviceClient.jpg-62.7kB

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

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

cameraserver_open.jpg-69.3kB

cameraserver_open2.jpg-883.4kB

3 为Camera创建stream

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

Camera3OutputStream.jpg-51.8kB

其创建过程如下图所示:

cameraserver_createStream.jpg-520.5kB

4 向Camera添加request

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

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

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

cameraserver_request.jpg-71.2kB

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

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

Cameraserver_running.jpg-539.5kB

  • 14
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值