Android camera架構

Android官方文檔

https://source.android.google.cn/devices/camera

隨着Android系統的不斷升級,相機子系統框架也在不斷進化,由最初的API1和HAL1到現在的API2和HAL3,由最初簡單的拍照,錄製到現在的連拍,AI人像;可以說是架構上變動最大最頻繁的子系統。很多設備仍然依賴相機 HAL1,因此 Android 7.0 繼續支持該模塊。此外,Android 相機服務還支持同時實現兩種 HAL(1 和 3),如果您希望通過相機 HAL1 支持性能略低的前置攝像頭,並通過相機 HAL3 支持更爲高級的後置攝像頭。Android 的相機硬件抽象層 (HAL) 可將 Camera 2 中較高級別的相機框架 API 連接到底層的相機驅動程序和硬件。相機子系統包括相機管道組件的實現,而相機 HAL 則可提供用於實現您的這些組件版本的接口。從 Android 8.0 開始,相機 HAL 接口是 Project Treble 的一部分,相應的 HIDL 接口在硬件/接口/相機中定義。該實現會封裝仍在使用舊版 API 的舊 HAL。從 Android 8.0 開始,相機 HAL 實現必須使用 HIDL API;不支持使用舊版接口。Android8.0下最新的相機架構具有更高的靈活性。架構如下:

Android 相機架構

重新設計 Android Camera API 的目的在於大幅提高應用對於 Android 設備上的相機子系統的控制能力,同時重新組織 API,提高其效率和可維護性。藉助額外的控制能力,您可以更輕鬆地在 Android 設備上構建高品質的相機應用,這些應用可在多種產品上穩定運行,同時仍會盡可能使用設備專用算法來最大限度地提升質量和性能。版本 3 相機子系統將多個運行模式整合爲一個統一的視圖,您可以使用這種視圖實現之前的任何模式以及一些其他模式,例如連拍模式。這樣一來,便可以提高用戶對聚焦、曝光以及更多後期處理(例如降噪、對比度和銳化)效果的控制能力。此外,這種簡化的視圖還能夠使應用開發者更輕鬆地使用相機的各種功能。架構圖已經很清晰的描述了各層架構之間的關係,我們按圖索驥從最新的架構開始,再看完整的架構,最後我們回到應用層來看Camera子系統的設計。

代碼路徑:

(1)framework 層代碼
frameworks/base/core/java/android/hardware/camera2
 
(1.5)是camera framework和Camera service之間的IPC數據通信載體 /frameworks/av/camera
也就是說這就是一個binder通信載體
 
(2)camera service
frameworks/av/services/camera/libcameraservice$
 
(3)camera provider
hardware/interfaces/camera/provider/2.4
 
(4)hal層接口
hardware/interfaces/camera/common/1.0/
hardware/interfaces/camera/device/3.2
hardware/libhardware/include/hardware/camera3.h
hardware/libhardware/modules/camera/3_0
 
(5)hal層的實現
vendor/qcom/proprietary/camx/src/core/
 
(6)算法實現
vendor/qcom/proprietary/chi-cdk/vendor/node/

camera2包架構示意圖:

fig.1

這裏引用了管道的概念將安卓設備和攝像頭之間聯通起來,系統向攝像頭髮送 Capture 請求,而攝像頭會返回 CameraMetadata。這一切建立在一個叫作 CameraCaptureSession 的會話中。

Camera2 中主要的API類:

CameraManager類 : 攝像頭管理類,站在高處統管所有攝像投設備(CameraDevice)的管理者,用於檢測、打開系統攝像頭,通過getCameraCharacteristics(cameraId)可以獲取攝像頭特徵。

CameraCharacteristics類:相機特性類,是 CameraDevice 的屬性描述類,例如,是否支持自動調焦,是否支持zoom,是否支持閃光燈一系列特徵。

CameraDevice類: 相機設備,負責建立 CameraCaptureSession 以及建立 CaptureRequest,類似早期的camera類。

CameraCaptureSession類:用於創建預覽、拍照的Session類。通過它的setRepeatingRequest()方法控制預覽界面 , 通過它的capture()方法控制拍照動作或者錄像動作。

CameraRequest類:一次捕獲的請求,可以設置一系列的參數,用於控制預覽和拍照參數,例如:對焦模式,曝光模式,zoom參數等等。
 

CameraDevice類

CameraDevice的reateCaptureRequest(int templateType)方法創建CaptureRequest.Builder。

templateType參數有以下幾種:

TEMPLATE_PREVIEW :預覽

TEMPLATE_RECORD:拍攝視頻

TEMPLATE_STILL_CAPTURE:拍照

TEMPLATE_VIDEO_SNAPSHOT:創建視視頻錄製時截屏的請求

TEMPLATE_ZERO_SHUTTER_LAG:創建一個適用於零快門延遲的請求。在不影響預覽幀率的情況下最大化圖像質量。

TEMPLATE_MANUAL:創建一個基本捕獲請求,這種請求中所有的自動控制都是禁用的(自動曝光,自動白平衡、自動焦點)。
 

HAL子系統:

請求

應用框架會針對捕獲的結果向相機子系統發出請求。一個請求對應一組結果。請求包含有關捕獲和處理這些結果的所有配置信息。其中包括分辨率和像素格式;手動傳感器、鏡頭和閃光燈控件;3A 操作模式;RAW 到 YUV 處理控件;以及統計信息的生成等。這樣一來,便可更好地控制結果的輸出和處理。一次可發起多個請求,而且提交請求時不會出現阻塞。請求始終按照接收的順序進行處理。

相機模型:

相機請求模型

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章