关于高通Camx架构介绍的文章目前仍是百里挑一,我会尽本身能力尽量讲多点,讲的通俗明白点~前端
这篇文章分下面几点来展开:node
1)Camx总体架构图;算法
2)Camx基本组件及其概念;微信
3)Camx代码目录结构;session
目前Android主流的机型,采用高通芯片的,使用的基本都是camx架构。架构
以前旧的架构叫作mm-camera,camx架构和以前架构的主要区别是芯片接口层的代码从hardware/qcom迁移到 vendor/qcom/proprietary/下面。框架
咱们先来看下camx总体的架构图:ide
从上图咱们能够看到,在hal层,高通是结合本身的芯片硬件,添加了一层逻辑,这层逻辑高通内部命名为camx架构。学习
下面咱们来看下高通camx架构上,camera数据流向大致上是怎样的?ui
从上图咱们能够清晰的看到,Camera数据从sensor出来,首先会通过IFE,而后分预览/视频和拍照2种状况。若是是预览或者录像,是先通过IPE处理,最后输出到显示。若是是拍照,则是先通过BSP处理,而后再通过JPEG编码器,最后保存为图片输出。
IFE、IPE、BPS、JPEG,它们表示的是芯片内部的一个硬件处理单元,数据在这些单元内部的处理仍是比较复杂的,在不一样的处理单元里面,会进行一些复杂的算法处理,这里你们先有个认识,有个基本概念。
IFE:图像前端 IPE:图像处理引擎 BPS:Bayer 处理区段复制代码
一个架构老是由一些基本组件构成的,接下来咱们来了解下构成camx架构的基本组件有那些。
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。
表明一个特定的功能。高通上的feature有HDR(高动态范围)、SuperNight(超级夜景)、MFNR(多帧降噪)等等,usecase选择相应的feature,而后关联一组pipeline,上层下发request请求,hal层会根据request去选择对应的feature。
Node是单个具备独立处理功能的抽象模块,能够是软件单元也能够是硬件单元。Node是camx中很是重要的一个父类,是处理camera 请求的一个中间节点,用于处理pipeline下发的请求。
Node 节点在camx chi架构中相当重要,数据的处理都是经过封装好的Node节点来进行的。
一连串node的集合。pipeline提供单一特定功能的全部资源集合,维护着全部硬件资源以及数据的流转。
若干个有关联的pipeline的集合,用于管理pipeline的抽象控制单元,其中至少包含一个pipeline,并控制着全部的硬件资源,管控着每一个pipeline内部的request流转以及数据的输入输出。
定义不一样的Port的链接端口(输入端口和输出端口)。
做为Node的输入输出端口,使用SrcPort以及DstPort结构定义XML文件。
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俩大目录。
core分为hal与chi目录:存放CamX的核心实现模块 hal/:实现hal3接口的hal/目录 chi/:负责CHI进行交互的chi/目录 hwl/:存放自身算法具备独立运算能力的硬件node---受到csl管理 swl/:存放并不具备独立运算能力,必须依靠CPU才能实现的node csl/:负责camx与camera driver的通信模块, 为camx提供了统一的Camera driver控制接口复制代码
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