关于高通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 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才能实现的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. 高通 Camx 架构了解下(二)

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.Android Hal3回顾 二.Qcom Hal3 CamX架构 三.Qcom Hal3 Camx ...

  2. 关于高通CAMX架构下的AE调试的总结

    我于2021年夏开始学习camera tuning,至今大半年的时间了,做了一个8M的前置摄像头的调试.有些简单的调试心得与君分享,随着学习和工作的深入,还会持续更新这篇博文.若发现描述的不对的地方, ...

  3. linux驱动由浅入深系列:高通sensor架构实例分析之一

    点击打开链接 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构 ...

  4. 高通audio offload学习

    高通audio offload学习| http://thinks.me/2016/09/13/audio_qcom_offload/ 简述 offload在音频系统里面,就是将对于音频文件的解码操作过 ...

  5. 高通 Camx debug log控制

    某天,在某网站上看到一句话,"log开的好,问题都能搞". 问题能不能都搞好不知道,不过log开的好,对分析问题的确有很大的帮助. 高通camx的日志主要分2大模块,UMD (us ...

  6. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)

    本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构)

  7. 高通WLAN框架学习(31)-- Power save

    前面的章节已经介绍了高通WLAN框架学习(18)-- QPower 3.0_专业开发者的博客-CSDN博客 接下来这一章节继续深入下 高通Power save算法根据无线网络的流量和拥塞情况,在不影响 ...

  8. 高通WLAN框架学习

    下面是针对高通WLAN Power相关的分析介绍 高通WLAN稳定和功耗分析--WLAN power体系结构 高通WLAN稳定和功耗分析--WLAN功率测量 高通WLAN稳定和功耗分析--Debug ...

  9. android高通i2c/cci控制没有寄存器地址的马达/设备

    android高通i2c/cci控制没有寄存器地址的马达/设备 如何控制没有寄存器地址的i2c/cci马达. 控制原理很简单,两种情况, 其一,如果是i2c就不发送地址只发送数据. 其二,如果是cci ...

  10. 高通ims架构android,深度揭密高通4/5G移动基带消息系统和状态机

    背景 本技术分析文章通过对高通的4/5G移动基带系统进行深入逆向工程提示其内部消息通信机制以及核心架构设计逻辑,本文的研究基于高通的4G基带MDM9707以及5G基带模块sdx55的固件之上分析完成, ...

最新文章

  1. 009-Joran配置框架
  2. 全国计算机等级二级证书foxbase,2002年4月全国计算机等级考试二级FOXBASE笔试试题...
  3. SpringBoot整合阿里云OSS文件上传、下载、查看、删除
  4. 网站页面增加一个简单的密码登录访问php网站源码
  5. android里R.layout.的问题
  6. 解决不同浏览器下载excel文件中文名称乱码问题
  7. 【[POI2012]PRE-Prefixuffix】
  8. 大数据在电力行业的应用前景有哪些?
  9. 编程语言 - PHP
  10. Python教学视频(六)关系及逻辑运算
  11. php 签名 bom,PHP与Unicode签名(BOM)
  12. ADS2017用分立电容电感匹配实例
  13. 计算机辅助教育题库和答案,计算机考试题库及参考答案.docx
  14. 用AVX2指令集优化整形数组求和
  15. ktv点歌系统服务器破解,欧凯KTV卡拉OK点歌系统
  16. ie窗口如何最大化设置
  17. 【机器学习】(十)核支持向量机SVM:make_blobs方法,hstack() 函数
  18. 盘点2017 CES展会所有亮眼黑科技 (上)
  19. OpenCV钢铁平面焊接的缺陷检测案例
  20. Scrapy爬取新浪微博用户信息、用户微博及其微博评论转发

热门文章

  1. 微服务的技术架构路线
  2. ubuntu16.04火狐浏览器B站提示下载flash插件
  3. Python画熊头像
  4. 原生js 实现大鱼吃小鱼效果
  5. python基础螺旋线
  6. 俄罗斯无线认证-FAC认证
  7. flutter 轮播组件 Swiper
  8. qt实现视频播放器,基本功能都有,可以当毕设用
  9. strtolower() 把字符串转换为小写字母
  10. 云中取物--app端的日志采集系统