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

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

2 打开一个Camera

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

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

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

3 为Camera创建stream

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

其创建过程如下图所示:

4 向Camera添加request

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

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

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

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平台)相关推荐

  1. Android O Treble框架笔记(基于高通845平台)

    Android O Treble框架笔记(基于高通845平台) tags: android 文章目录 Android O Treble框架笔记(基于高通845平台) @[toc] **0 前言** * ...

  2. 【高通SDM660平台 Android 10.0】(10) --- Camera Sensor lib 与 Kernel Camera Probe 代码分析

    [高通SDM660平台 Android 10.0]Camera Sensor lib 与 Kernel Camera Probe 代码分析 一.libmmcamera_imx258.so 代码分析 1 ...

  3. 【高通SDM660平台 Android 10.0】(12) --- Camera Chromatix 代码分析

    [高通SDM660平台 Android 10.0]Qcom Camera Daemon 代码分析 一.chromatix_imx258_lc898217xc 目录 1.1 例:imx258_lc898 ...

  4. android_驱动_qcom_【高通SDM660平台】(4) --- Camera Init 初始化流程

    [高通SDM660平台]Camera Init 初始化流程 一.Camera 系统架构 二.Camera Init 初始化流程 2.1 CameraService 启动 2.2 CameraServi ...

  5. 【高通SDM660平台 Android 10.0】(19) --- Camera_focus、Camera_snapshot、volume_up 按键工作原理分析

    [高通SDM660平台 Android 10.0]19 --- Camera_focus.Camera_snapshot.volume_up 按键工作原理分析 一. DTS代码配置 二. Kernel ...

  6. 【高通SDM660平台】(1) --- Camera 驱动 Bringup Guide

    [高通SDM660平台]Camera 驱动 Bringup Guide 一.Kernel 代码移植 1. DTS 文件配置 1.1 sdm660.dtsi 1.2 sdm660-camera.dtsi ...

  7. android调频收音机代码,android 收音机 FM 驱动 hal层 框架层以及应用层代码

    [实例简介] android 收音机 FM 驱动 hal层 框架层以及应用层代码 方法一 不需要framework部分 1.fm放到 \hardware\rk2x 2.FmRadio 放到 packa ...

  8. 51全志R58平台Android4.4下Camera的HAL层修改

    51全志R58平台Android4.4下Camera的HAL层修改 2018/11/7 15:20 版本:V1.0 开发板:SC5806 1.系统编译: (略) 2.全志R58平台Android4.4 ...

  9. 【高通SDM660平台 Android 10.0】(14) --- Camera ISP

    [高通SDM660平台 Android 10.0]--- Camera ISP 一.Camera ISP 与 DSP 区别 1.1 名词解释 1.2 功能解释 1.3 手机摄像头ISP是独立好还是内置 ...

最新文章

  1. Oracle 分组统计,抽取每组前十
  2. c语言font6x8,爱字体下载安卓版-iFont爱字体下载V5.9.8.6 安卓手机版-全新的手机字体软体西西软件下载...
  3. 《面向对象程序设计》第一次作业
  4. python爬取mysql_Python如何爬取51cto数据并存入MySQL
  5. oracle正则匹配全部,sql – 返回Oracle中正则表达式的所有匹配项
  6. oracle 31640,导数据时ora-31640报错
  7. 7-174 两个有序链表序列的合并 (20 分)
  8. 95-290-340-源码-内存管理-Buffer-ByteBuffer简介
  9. Win11系统Windows更新疑难解答出现问题怎么办?
  10. steam加速_追梦加速器:Steam一周销量前十榜单,你的游戏排第几?
  11. 手把手教你php调用短信接口(smsapi)实现发送短信验证码
  12. kettle同步数据 (SAP hana到 Mysql)
  13. 霸榜11个月,神车MINI EV进退两难!
  14. podman加速器Harbor
  15. html js开发课程表,利用JS实现手机移动端课程表代码
  16. 为什么中介哄抢租赁房源,你应该知道的真相?
  17. exchange创建邮箱组_Exchange批量创建用户组及启用通讯组邮箱
  18. Detecting Novel Associations in Large Data Sets(检测 大型数据集中的信息关联性,数据相关性)
  19. 聊聊各种“上门”能不能做起来
  20. python header是啥_Python爬虫之Header

热门文章

  1. java 错误 找不到符号_Java错误:找不到符号,也找不到原因
  2. 第六章 存储器层次结构 第四节 高速缓存存储器
  3. 如何在CAD中绘制长方体?
  4. CSS动态能量加载水球
  5. 升级xcode7之后原有项目无法连网的解决方案
  6. java全景图片生成_[Java教程]使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果...
  7. 离心泵级间导叶的设计计算
  8. MCD19A2 MAIAC AOD 数据处理(二)质量控制+均值计算
  9. 国防科大计算机学院王学慧,计算机科学与软件工程学院教师赴国防科技大学计算机学院进行教学调研...
  10. 基于Proteus的一位数码管显示实验