微信android架构图,Android 高通Camx架构学习 - 第1章

关于高通Camx架构介绍的文章目前还是凤毛麟角,我会尽自己能力尽可能讲多点,讲的通俗明白点~

这篇文章分下面几点来展开:

1)Camx整体架构图;

2)Camx基本组件及其概念;

3)Camx代码目录结构;

一、Camx整体架构图

目前Android主流的机型,采用高通芯片的,使用的基本都是camx架构。

之前旧的架构叫做mm-camera,camx架构和之前架构的主要区别是芯片接口层的代码从hardware/qcom迁移到vendor/qcom/proprietary/下面。

我们先来看下camx整体的架构图:

8cb914f7ed471bcd3d7491530f88e99d.png从上图我们可以看到,在hal层,高通是结合自己的芯片硬件,添加了一层逻辑,这层逻辑高通内部命名为camx架构。

下面我们来看下高通camx架构上,camera数据流向大体上是怎样的?

303d2647f01dea3ce56554aa6b11128b.png从上图我们可以清晰的看到,Camera数据从sensor出来,首先会经过IFE,然后分预览/视频和拍照2种情况。如果是预览或者录像,是先经过IPE处理,最后输出到显示。如果是拍照,则是先经过BSP处理,然后再经过JPEG编码器,最后保存为图片输出。

IFE、IPE、BPS、JPEG,它们表示的是芯片内部的一个硬件处理单元,数据在这些单元内部的处理还是比较复杂的,在不同的处理单元里面,会进行一些复杂的算法处理,这里大家先有个认识,有个基本概念。IFE:图像前端

IPE:图像处理引擎

BPS:Bayer处理区段复制代码

二、Camx基本组件及其概念

一个架构总是由一些基本组件构成的,接下来我们来了解下构成camx架构的基本组件有那些。

1) UseCaseAsetofstreamsconfiguredbytheclientcombinedwithasetofstatic

propertiesspecifyingtheprocessingofthosestreams

(由客户端配置的一组流,这组流是有着一系列静态属性相结合描述的流。)

SeecreateCaptureSessionintheAndroidCameraDevicedocumentation复制代码

See createCaptureSession in the Android CameraDevice

那我们结合下面这段代码来好好理解下。

熟悉Camera2 API的小伙伴(不熟悉也没关系,我会讲的明白点)应该知道,下面的这段代码,是把预览的surface和录像的surface都设进去,然后去创建session,就是表示我预览和录像都需要拿到camera数据。假设我预览设置的size是1080 x 720,录像是1080p的,那这个1080 x 720预览+1080p录像就是一个usecase(用例)。其它类推。//UseCase:预览+录像

Listsurfaces=newArrayList<>();

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。

c2c3fb2f6c143a0d5c146a699ae6b330.png

2)Feature

代表一个特定的功能。高通上的feature有HDR(高动态范围)、SuperNight(超级夜景)、MFNR(多帧降噪)等等,usecase选择相应的feature,然后关联一组pipeline,上层下发request请求,hal层会根据request去选择对应的feature。

289574aed7375182806ffe549aa9c11b.png

3)Node

Node是单个具有独立处理功能的抽象模块,可以是软件单元也可以是硬件单元。Node是camx中非常重要的一个父类,是处理camera 请求的一个中间节点,用于处理pipeline下发的请求。

Node 节点在camx chi架构中至关重要,数据的处理都是通过封装好的Node节点来进行的。

b1001edc6befbd174732d2978ac3f0e3.png

4) pipeline

一连串node的集合。pipeline提供单一特定功能的所有资源集合,维护着所有硬件资源以及数据的流转。

5)session

若干个有关联的pipeline的集合,用于管理pipeline的抽象控制单元,其中至少包含一个pipeline,并控制着所有的硬件资源,管控着每个pipeline内部的request流转以及数据的输入输出。

6)Link

定义不同的Port的连接端口(输入端口和输出端口)。

7) Port

作为Node的输入输出端口,使用SrcPort以及DstPort结构定义XML文件。

4114faa371dde59caadf99bce9cc1670.png

8)TopologiesAtopologyisadirectedacyclicgraph(DAG)specifyinganinstantiationof

ausecase

(拓扑是一个指定用例实例化的有向无环图(DAG))

XMLdefinitionofusecasesandassociatedtopologies

ForCamX,thisgraphdefinestheHW,SW,andnon-Qualcommprocessingnodes,

andthedataflowbetweenthenodes复制代码

组件之间的关系

最后来总结下各个基本组件之间的关系。上层根据需求,config对应的stream下来,下面会根据申请的stream来选择对应的usecase,usecase选择完成后,又会去选择需要的feature,然后不同的feature会去关联对应的pipeline。我们知道pipeline是由一系列node组成的,那最终上层config的stream,就会交由各个node去处理。

7fbe4b1ed4c47817b4f34ffcce8716fa.png

三、代码目录结构

camx的代码是在vendor/qcom/proprietary/目录下,分camx和chi-cdk俩大目录。

1)CamX中的目录

f342ee65d70c605f8e7ca0c8f5b98e5f.pngcore分为hal与chi目录:存放CamX的核心实现模块

hal/:实现hal3接口的hal/目录

chi/:负责CHI进行交互的chi/目录

hwl/:存放自身算法具有独立运算能力的硬件node---受到csl管理

swl/:存放并不具有独立运算能力,必须依靠CPU才能实现的node

csl/:负责camx与cameradriver的通讯模块,

为camx提供了统一的Cameradriver控制接口复制代码

2) chi-cdk中的目录

acbd9508f23c473afacaee748c7f0694.pngcore/:存放CHI实现的核心模块,负责与Camx进行交互并且实现了CHI的总体框架

以及业务处理。

oem/qcom/topolog/:存放用户自定义的Usecasexml配置信息

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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值