草庐IT

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

小驰笔记 2023-03-28 原文
关于高通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/blogs/225097

https://www.jianshu.com/p/cfb1da9d4217


有关Android 高通Camx架构学习 - 第1章的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  6. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  7. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  8. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  9. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  10. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

随机推荐