Android 高通Camx架構學習 - 第1章
關于高通Camx架構介紹的文章目前還是鳳毛麟角,我會盡自己能力盡可能講多點,講的通俗明白點~
這篇文章分下面幾點來展開:
1)Camx整體架構圖;
2)Camx基本組件及其概念;
3)Camx代碼目錄結構;
一、Camx整體架構圖
目前Android主流的機型,采用高通芯片的,使用的基本都是camx架構。
之前舊的架構叫做mm-camera,camx架構和之前架構的主要區(qū)別是芯片接口層的代碼從hardware/qcom遷移到?vendor/qcom/proprietary/下面。
我們先來看下camx整體的架構圖:

從上圖我們可以看到,在hal層,高通是結合自己的芯片硬件,添加了一層邏輯,這層邏輯高通內(nèi)部命名為camx架構。
下面我們來看下高通camx架構上,camera數(shù)據(jù)流向大體上是怎樣的?

從上圖我們可以清晰的看到,Camera數(shù)據(jù)從sensor出來,首先會經(jīng)過IFE,然后分預覽/視頻和拍照2種情況。如果是預覽或者錄像,是先經(jīng)過IPE處理,最后輸出到顯示。如果是拍照,則是先經(jīng)過BSP處理,然后再經(jīng)過JPEG編碼器,最后保存為圖片輸出。
IFE、IPE、BPS、JPEG,它們表示的是芯片內(nèi)部的一個硬件處理單元,數(shù)據(jù)在這些單元內(nèi)部的處理還是比較復雜的,在不同的處理單元里面,會進行一些復雜的算法處理,這里大家先有個認識,有個基本概念。
IFE:圖像前端
IPE:圖像處理引擎
BPS:Bayer 處理區(qū)段復制代碼
二、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
(由客戶端配置的一組流,這組流是有著一系列靜態(tài)屬性相結合描述的流。)
See? createCaptureSession in the Android CameraDevice documentation復制代碼
See? createCaptureSession in the Android CameraDevice
那我們結合下面這段代碼來好好理解下。
熟悉Camera2 API的小伙伴(不熟悉也沒關系,我會講的明白點)應該知道,下面的這段代碼,是把預覽的surface和錄像的surface都設進去,然后去創(chuàng)建session,就是表示我預覽和錄像都需要拿到camera數(shù)據(jù)。假設我預覽設置的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,并且創(chuàng)建 pipeline以及session。

2)Feature
代表一個特定的功能。高通上的feature有HDR(高動態(tài)范圍)、SuperNight(超級夜景)、MFNR(多幀降噪)等等,usecase選擇相應的feature,然后關聯(lián)一組pipeline,上層下發(fā)request請求,hal層會根據(jù)request去選擇對應的feature。

3)Node
Node是單個具有獨立處理功能的抽象模塊,可以是軟件單元也可以是硬件單元。Node是camx中非常重要的一個父類,是處理camera 請求的一個中間節(jié)點,用于處理pipeline下發(fā)的請求。
?Node 節(jié)點在camx chi架構中至關重要,數(shù)據(jù)的處理都是通過封裝好的Node節(jié)點來進行的。

4) pipeline
一連串node的集合。pipeline提供單一特定功能的所有資源集合,維護著所有硬件資源以及數(shù)據(jù)的流轉。
5)session
若干個有關聯(lián)的pipeline的集合,用于管理pipeline的抽象控制單元,其中至少包含一個pipeline,并控制著所有的硬件資源,管控著每個pipeline內(nèi)部的request流轉以及數(shù)據(jù)的輸入輸出。
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
(拓撲是一個指定用例實例化的有向無環(huán)圖(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復制代碼
組件之間的關系
最后來總結下各個基本組件之間的關系。上層根據(jù)需求,config對應的stream下來,下面會根據(jù)申請的stream來選擇對應的usecase,usecase選擇完成后,又會去選擇需要的feature,然后不同的feature會去關聯(lián)對應的pipeline。我們知道pipeline是由一系列node組成的,那最終上層config的stream,就會交由各個node去處理。

三、代碼目錄結構
camx的代碼是在vendor/qcom/proprietary/目錄下,分camx和chi-cdk倆大目錄。
1)CamX中的目錄

core分為hal與chi目錄:存放CamX的核心實現(xiàn)模塊
hal/:實現(xiàn)hal3接口的hal/目錄
chi/:負責CHI進行交互的chi/目錄
hwl/:存放自身算法具有獨立運算能力的硬件node---受到csl管理
swl/:存放并不具有獨立運算能力,必須依靠CPU才能實現(xiàn)的node
csl/:負責camx與camera driver的通訊模塊,
? ? ?為camx提供了統(tǒng)一的Camera driver控制接口復制代碼
2) chi-cdk中的目錄

core/:存放CHI實現(xiàn)的核心模塊,負責與Camx進行交互并且實現(xiàn)了CHI的總體框架
以及業(yè)務處理。
oem/qcom/topolog/:存放用戶自定義的Usecase xml配置信息
oem/qcom/node/:存放用戶自定義功能的node
oem/qcom/module/:存放不同的sensor的配置文件,在初始化sensor時候需要用到。
oem/qcom/tuning/:存放不同場景下的效果參數(shù)的配置文件。
oem/qcom/sensor/:存放不同sensor的只有信息以及寄存器配置參數(shù)
oem/qcom/actuator/:存放不同對焦模塊的配置信息。
oem/qcom/ois/:存放防抖模塊的配置信息。
oem/qcom/flash/:存放閃光燈模塊的配置信息。
oem/qcom/eeprom/:存放eeprom外部存儲模塊的配置信息。
oem/qcom/fd/:存放人臉識別模塊的配置信息。
復制代碼
*本人從事Android Camera相關開發(fā)已有5年,
*目前在深圳上班,
*歡迎關注我的微信公眾號 ?小馳筆記
*希望和更多的小伙伴一起交流學習~
-------- ?2021.03.27 深圳 ?23:54
參考文章:
bbs.huaweicloud.com/blogs/22509…
www.jianshu.com/p/cfb1da9d4…
