Android 的相機硬件抽象層 (HAL) 將android.hardware.camera2中更高級別的相機框架 API 連接到您的底層相機驅動程序和硬件。 Android 8.0 引入了Treble ,將 CameraHal API 切換為由 HAL 接口描述語言 (HIDL) 定義的穩定接口。如果您之前為 Android 7.0 及更低版本開發過相機 HAL 模塊和驅動程序,請注意相機管道中的重大變化。
相機 HAL3 功能
Android Camera API 重新設計的目的是大幅提高應用程序控制 Android 設備上的相機子系統的能力,同時重新組織 API 以使其更高效和可維護。額外的控制使得在 Android 設備上構建高質量的相機應用程序變得更加容易,這些應用程序可以跨多個產品可靠地運行,同時仍然盡可能使用設備特定的算法來最大限度地提高質量和性能。
相機子系統版本 3 將操作模式構建為一個統一的視圖,可用於實現之前的任何模式和其他幾種模式,例如連拍模式。這可以讓用戶更好地控制對焦和曝光以及更多的後期處理,例如降噪、對比度和銳化。此外,這種簡化的視圖使應用程序開發人員更容易使用相機的各種功能。
API 將相機子系統建模為一個管道,將傳入的幀捕獲請求以 1:1 的比例轉換為幀。這些請求封裝了有關幀捕獲和處理的所有配置信息。這包括分辨率和像素格式;手動傳感器、鏡頭和閃光燈控制; 3A工作模式; RAW->YUV處理控制;統計數據生成;等等。
簡單來說,應用程序框架向攝像頭子系統請求一幀,攝像頭子系統將結果返回到輸出流。此外,還會為每組結果生成包含色彩空間和鏡頭陰影等信息的元數據。您可以將相機版本 3 視為相機版本 1 的單向流的管道。它將每個捕獲請求轉換為傳感器捕獲的一個圖像,該圖像被處理為:
- 帶有關於捕獲的元數據的 Result 對象。
- 一到 N 個圖像數據緩衝區,每個緩衝區都有自己的目標 Surface。
一組可能的輸出表面是預先配置好的:
- 每個 Surface 都是固定分辨率的圖像緩衝區流的目的地。
- 一次只能將少量 Surface 配置為輸出 (~3)。
一個請求包含所有所需的捕獲設置和輸出 Surfaces 列表,以便為該請求推送圖像緩衝區(在總配置集之外)。請求可以是一次性的(使用capture()
),也可以無限重複(使用setRepeatingRequest()
)。捕獲優先於重複請求。
圖 1.相機核心運行模型
相機 HAL1 概述
相機子系統的版本 1 設計為具有高級控件和以下三種操作模式的黑盒:
- 預習
- 錄像
- 仍然捕獲
每種模式都有略微不同和重疊的功能。這使得難以實現新功能,例如介於兩種操作模式之間的突發模式。
圖 2.相機組件
Android 7.0 繼續支持相機 HAL1,因為許多設備仍然依賴它。此外,Android 攝像頭服務支持同時實現 HAL(1 和 3),這在您希望使用攝像頭 HAL1 支持功能較弱的前置攝像頭和使用攝像頭 HAL3 的更高級的後置攝像頭時非常有用。
有一個單獨的相機 HAL模塊(有自己的版本號),其中列出了多個獨立的相機設備,每個設備都有自己的版本號。攝像頭模塊 2 或更新版本需要支持設備 2 或更新版本,並且此類攝像頭模塊可以有多種攝像頭設備版本(這就是我們所說的 Android 支持實現這兩種 HAL 的意思)。