Android 高通Camx架構學習 - 第1章

小馳嘻嘻發表於2021-09-11

關於高通Camx架構介紹的文章目前還是鳳毛麟角,我會盡自己能力盡可能講多點,講的通俗明白點~

這篇文章分下面幾點來展開:

1)Camx整體架構圖;

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

3)Camx程式碼目錄結構;

一、Camx整體架構圖

目前Android主流的機型,採用高通晶片的,使用的基本都是camx架構。

之前舊的架構叫做mm-camera,camx架構和之前架構的主要區別是晶片介面層的程式碼從 hardware/qcom遷移到  vendor/qcom/proprietary/下面。

我們先來看下camx整體的架構圖:

高通camx架構圖
從上圖我們可以看到,在hal層,高通是結合自己的晶片硬體,新增了一層邏輯,這層邏輯高通內部命名為camx架構。

下面我們來看下高通camx架構上,camera資料流向大體上是怎樣的? 高通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。

UseCase衍生類

2)Feature

代表一個特定的功能。高通上的feature有HDR(高動態範圍)、SuperNight(超級夜景)、MFNR(多幀降噪)等等,usecase選擇相應的feature,然後關聯一組pipeline,上層下發request請求,hal層會根據request去選擇對應的feature。
Feature類圖

3)Node

Node是單個具有獨立處理功能的抽象模組,可以是軟體單元也可以是硬體單元。Node是camx中非常重要的一個父類,是處理camera 請求的一箇中間節點,用於處理pipeline下發的請求。

Node 節點在camx chi架構中至關重要,資料的處理都是透過封裝好的Node節點來進行的。

node節點

4) pipeline

一連串node的集合。pipeline提供單一特定功能的所有資源集合,維護著所有硬體資源以及資料的流轉。

5)session

若干個有關聯的pipeline的集合,用於管理pipeline的抽象控制單元,其中至少包含一個pipeline,並控制著所有的硬體資源,管控著每個pipeline內部的request流轉以及資料的輸入輸出。

6)Link

定義不同的Port的連線埠(輸入埠和輸出埠)。

7) Port

作為Node的輸入輸出埠,使用SrcPort以及DstPort結構定義XML檔案。

image.png

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中的目錄

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中的目錄

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006715/viewspace-2791617/,如需轉載,請註明出處,否則將追究法律責任。

相關文章