關於高通Camx架構介紹的文章目前仍是百裏挑一,我會盡本身能力盡量講多點,講的通俗明白點~前端
這篇文章分下面幾點來展開:node
1)Camx總體架構圖;算法
2)Camx基本組件及其概念;微信
3)Camx代碼目錄結構;session
目前Android主流的機型,採用高通芯片的,使用的基本都是camx架構。架構
以前舊的架構叫作mm-camera,camx架構和以前架構的主要區別是芯片接口層的代碼從hardware/qcom遷移到 vendor/qcom/proprietary/下面。框架
咱們先來看下camx總體的架構圖:ide
從上圖咱們能夠看到,在hal層,高通是結合本身的芯片硬件,添加了一層邏輯,這層邏輯高通內部命名爲camx架構。學習
下面咱們來看下高通camx架構上,camera數據流向大致上是怎樣的?ui
從上圖咱們能夠清晰的看到,Camera數據從sensor出來,首先會通過IFE,而後分預覽/視頻和拍照2種狀況。若是是預覽或者錄像,是先通過IPE處理,最後輸出到顯示。若是是拍照,則是先通過BSP處理,而後再通過JPEG編碼器,最後保存爲圖片輸出。
IFE、IPE、BPS、JPEG,它們表示的是芯片內部的一個硬件處理單元,數據在這些單元內部的處理仍是比較複雜的,在不一樣的處理單元裏面,會進行一些複雜的算法處理,這裏你們先有個認識,有個基本概念。
IFE:圖像前端 IPE:圖像處理引擎 BPS:Bayer 處理區段複製代碼
一個架構老是由一些基本組件構成的,接下來咱們來了解下構成camx架構的基本組件有那些。
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。
表明一個特定的功能。高通上的feature有HDR(高動態範圍)、SuperNight(超級夜景)、MFNR(多幀降噪)等等,usecase選擇相應的feature,而後關聯一組pipeline,上層下發request請求,hal層會根據request去選擇對應的feature。
Node是單個具備獨立處理功能的抽象模塊,能夠是軟件單元也能夠是硬件單元。Node是camx中很是重要的一個父類,是處理camera 請求的一箇中間節點,用於處理pipeline下發的請求。
Node 節點在camx chi架構中相當重要,數據的處理都是經過封裝好的Node節點來進行的。
一連串node的集合。pipeline提供單一特定功能的全部資源集合,維護着全部硬件資源以及數據的流轉。
若干個有關聯的pipeline的集合,用於管理pipeline的抽象控制單元,其中至少包含一個pipeline,並控制着全部的硬件資源,管控着每一個pipeline內部的request流轉以及數據的輸入輸出。
定義不一樣的Port的鏈接端口(輸入端口和輸出端口)。
做爲Node的輸入輸出端口,使用SrcPort以及DstPort結構定義XML文件。
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倆大目錄。
core分爲hal與chi目錄:存放CamX的核心實現模塊 hal/:實現hal3接口的hal/目錄 chi/:負責CHI進行交互的chi/目錄 hwl/:存放自身算法具備獨立運算能力的硬件node---受到csl管理 swl/:存放並不具備獨立運算能力,必須依靠CPU才能實現的node csl/:負責camx與camera driver的通信模塊, 爲camx提供了統一的Camera driver控制接口複製代碼
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
參考文章: