对于高通 Camx 架构介绍的文章目前还是百里挑一,我会尽本人能力尽可能讲多点,讲的艰深明确点~
这篇文章分上面几点来开展:
1)Camx 整体架构图;
2)Camx 根本组件及其概念;
3)Camx 代码目录构造;
一、Camx 整体架构图
目前 Android 支流的机型, 采纳高通芯片的,应用的根本都是 camx 架构。
之前旧的架构叫做 mm-camera,camx 架构和之前架构的次要区别是芯片接口层的代码从 hardware/qcom 迁徙到 vendor/qcom/proprietary/ 上面。
咱们先来看下 camx 整体的架构图:
从上图咱们能够看到,在 hal 层,高通是联合本人的芯片硬件,增加了一层逻辑,这层逻辑高通外部命名为 camx 架构。
上面咱们来看下高通 camx 架构上,camera 数据流向大体上是怎么的?
1) 从上图咱们能够清晰的看到,Camera 数据从 sensor 进去,首先会通过 IFE, 而后分预览 / 视频和拍照 2 种状况。如果是预览或者录像,是先通过 IPE 解决,最初输入到显示。如果是拍照,则是先通过 BSP 解决,而后再通过 JPEG 编码器, 最初保留为图片输入。
2) IFE、IPE、BPS、JPEG, 它们示意的是芯片外部的一个硬件处理单元,数据在这些单元外部的解决还是比较复杂的,在不同的处理单元外面,会进行一些简单的算法解决,这里大家先有个意识,有个基本概念。
IFE:图像前端
IPE:图像处理引擎
BPS:Bayer 解决区段
二、Camx 根本组件及其概念
一个架构总是由一些根本组件形成的,接下来咱们来理解下形成 camx 架构的根本组件有那些。
1) UseCase
A set of streams configured by the client combined with a set of static
properties specifying the processing of those streams
(由客户端配置的一组流,这组流是有着一系列动态属性相结合形容的流。)
See createCaptureSession in the Android CameraDevice documentation
See createCaptureSession in the Android CameraDevice
那咱们联合上面这段代码来好好了解下。
相熟 Camera2 API 的小伙伴(不相熟也没关系,我会讲的明确点)应该晓得,上面的这段代码,是把预览的 surface 和录像的 surface 都设进去,而后去创立 session,就是示意我预览和录像都须要拿到 camera 数据。假如我预览设置的 size 是 1080 x 720,录像是 1080p 的,那这个 1080 x 720 预览 +1080p 录像就是一个 usecase(用例)。其它类推。
//UseCase: 预览 + 录像
List<Surface> surfaces = new ArrayList<>();
if(previewSurface != null && previewSurface.isValid()){surfaces.add(previewSurface);
mPreviewBuilder.addTarget(previewSurface);
}
if(mMediaRecorder != null && mMediaRecorderSurface != null
&& mMediaRecorderSurface.isValid()){surfaces.add(mMediaRecorderSurface);
mPreviewBuilder.addTarget(mMediaRecorderSurface);
}
mCameraDevice.createCaptureSession(surfaces,...,...);
UseCase 在 camx 中很有很多衍生类,这是 camx 针对不同的 stream 来建设不同的 usecase 对象,用来治理抉择 feature,并且创立 pipeline 以及 session。
2)Feature
代表一个特定的性能。高通上的 feature 有 HDR(高动静范畴)、SuperNight(超级夜景)、MFNR(多帧降噪)等等,usecase 抉择相应的 feature,而后关联一组 pipeline,下层下发 request 申请,hal 层会依据 request 去抉择对应的 feature。
3)Node
Node 是单个具备独立解决性能的形象模块,能够是软件单元也能够是硬件单元。Node 是 camx 中十分重要的一个父类,是解决 camera 申请的一个两头节点,用于解决 pipeline 下发的申请。
Node 节点在 camx chi 架构中至关重要,数据的解决都是通过封装好的 Node 节点来进行的。
4) pipeline
一连串 node 的汇合。pipeline 提供繁多特定性能的所有资源汇合,保护着所有硬件资源以及数据的流转。
5)session
若干个有关联的 pipeline 的汇合,用于治理 pipeline 的形象管制单元,其中至多蕴含一个 pipeline,并管制着所有的硬件资源,管控着每个 pipeline 外部的 request 流转以及数据的输入输出。
6)Link
定义不同的 Port 的连贯端口(输出端口和输入端口)。
7) Port
作为 Node 的输入输出端口,应用 SrcPort 以及 DstPort 构造定义 XML 文件。
8)Topologies
A topology is a directed acyclic graph (DAG) specifying an instantiation of
a use case
(拓扑是一个指定用例实例化的有向无环图(DAG))
XML definition of use cases and associated topologies
For CamX, this graph defines the HW, SW, and non-Qualcomm processing nodes,
and the data flow between the nodes
组件之间的关系
最初来总结下各个根本组件之间的关系。下层依据需要,config 对应的 stream 下来,上面会依据申请的 stream 来抉择对应的 usecase,usecase 抉择实现后,又会去抉择须要的 feature,而后不同的 feature 会去关联对应的 pipeline。咱们晓得 pipeline 是由一系列 node 组成的,那最终下层 config 的 stream,就会交由各个 node 去解决。
三、代码目录构造
camx 的代码是在 vendor/qcom/proprietary/ 目录下,分 camx 和 chi-cdk 俩大目录。
1)CamX 中的目录
core 分为 hal 与 chi 目录:寄存 CamX 的外围实现模块
hal/:实现 hal3 接口的 hal/ 目录
chi/:负责 CHI 进行交互的 chi/ 目录
hwl/:寄存本身算法具备独立运算能力的硬件 node--- 受到 csl 治理
swl/:寄存并不具备独立运算能力,必须依附 CPU 能力实现的 node
csl/:负责 camx 与 camera driver 的通信模块,为 camx 提供了对立的 Camera driver 管制接口
2) chi-cdk 中的目录
core/:寄存 CHI 实现的外围模块,负责与 Camx 进行交互并且实现了 CHI 的总体框架
以及业务解决。oem/qcom/topolog/: 寄存用户自定义的 Usecase xml 配置信息
oem/qcom/node/: 寄存用户自定义性能的 node
oem/qcom/module/: 寄存不同的 sensor 的配置文件,在初始化 sensor 时候须要用到。oem/qcom/tuning/: 寄存不同场景下的成果参数的配置文件。oem/qcom/sensor/: 寄存不同 sensor 的只有信息以及寄存器配置参数
oem/qcom/actuator/: 寄存不同对焦模块的配置信息。oem/qcom/ois/: 寄存防抖模块的配置信息。oem/qcom/flash/: 寄存闪光灯模块的配置信息。oem/qcom/eeprom/: 寄存 eeprom 内部存储模块的配置信息。oem/qcom/fd/: 寄存人脸识别模块的配置信息。
* 自己从事 Android Camera 相干开发已有 5 年,
* 目前在深圳下班,
* 欢送关注我的微信公众号 小驰笔记
* 心愿和更多的小伙伴一起交流学习~
——– 2021.03.27 深圳 23:54
参考文章:
https://bbs.huaweicloud.com/b…
https://www.jianshu.com/p/cfb…