对于高通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 topologiesFor 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://bbs.huaweicloud.com/b...
https://www.jianshu.com/p/cfb...