写点什么

Android 高通 Camx 架构学习 - 第 1 章

用户头像
小驰嘻嘻
关注
发布于: 2021 年 03 月 31 日

关于高通 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 staticproperties 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才能实现的nodecsl/:负责camx与camera driver的通讯模块, 为camx提供了统一的Camera driver控制接口
复制代码

2) chi-cdk 中的目录



core/:存放CHI实现的核心模块,负责与Camx进行交互并且实现了CHI的总体框架以及业务处理。
oem/qcom/topolog/:存放用户自定义的Usecase xml配置信息oem/qcom/node/:存放用户自定义功能的nodeoem/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://mp.weixin.qq.com/s?_biz=MzA3ODMzMTM1NA==&mid=2247484408&idx=1&sn=6e69e6b328aed5af34949be58b2aee52&chksm=9f452f4da832a65b772ffeca053f06d8ae1e39f4f507ce8d89b2186b3eb573b4dcbae5bed205&token=522091552&lang=zhCN#rd


发布于: 2021 年 03 月 31 日阅读数: 10
用户头像

小驰嘻嘻

关注

公众号: 小驰笔记 2021.03.30 加入

14年开始从事Android Camera相关软件开发 做过车载、手机、执法记录仪~

评论

发布
暂无评论
Android 高通Camx架构学习 - 第1章