相機 HAL

Android 的相機硬件抽象層 (HAL) 將android.hardware.camera2中更高級別的相機框架 API 連接到您的底層相機驅動程序和硬件。從 Android 13 開始,相機 HAL 接口開發使用AIDL 。 Android 8.0 引入了Treble ,將 Camera HAL API 切換為由 HAL 接口描述語言 (HIDL) 定義的穩定接口。如果您之前為 Android 7.0 及更低版本開發過相機 HAL 模塊和驅動程序,請注意相機管道中的重大變化。

AIDL 相機 HAL

對於運行 Android 13 或更高版本的設備,相機框架包括對 AIDL 相機 HAL 的支持。相機框架還支持 HIDL 相機 HAL,但在 Android 13 或更高版本中添加的相機功能只能通過 AIDL 相機 HAL 接口使用。要在升級到 Android 13 或更高版本的設備上實現此類功能,設備製造商必須將其 HAL 流程從使用 HIDL 攝像頭接口遷移到 AIDL 攝像頭接口。

要了解 AIDL 的優勢,請參閱用於 HAL 的 AIDL

實現 AIDL 相機 HAL

有關 AIDL 相機 HAL 的參考實現,請參閱hardware/google/camera/common/hal/aidl_service/

AIDL 相機 HAL 規範位於以下位置:

對於遷移到 AIDL 的設備,設備製造商可能需要根據代碼結構修改Android SELinux 策略 (sepolicy)和 RC 文件。

驗證 AIDL 相機 HAL

要測試您的 AIDL 相機 HAL 實施,請確保設備通過所有 CTS 和 VTS 測試。 Android 13 引入了 AIDL VTS 測試VtsAidlHalCameraProvider_TargetTest.cpp

相機 HAL3 功能

Android Camera API 重新設計的目的是大幅提高應用程序控制 Android 設備上的相機子系統的能力,同時重新組織 API 以使其更高效和可維護。額外的控制使得在 Android 設備上構建高質量的相機應用程序變得更加容易,這些應用程序可以在多個產品上可靠地運行,同時仍然盡可能使用設備特定的算法來最大限度地提高質量和性能。

相機子系統版本 3 將操作模式構建為一個統一的視圖,可用於實現之前的任何模式和其他幾種模式,例如連拍模式。這可以讓用戶更好地控制對焦和曝光以及更多的後期處理,例如降噪、對比度和銳化。此外,這種簡化的視圖使應用程序開發人員更容易使用相機的各種功能。

API 將相機子系統建模為一個管道,將傳入的幀捕獲請求以 1:1 的比例轉換為幀。這些請求封裝了有關幀捕獲和處理的所有配置信息。這包括分辨率和像素格式;手動傳感器、鏡頭和閃光燈控制; 3A工作模式; RAW->YUV處理控制;統計數據生成;等等。

簡單來說,應用程序框架向攝像頭子系統請求一幀,攝像頭子系統將結果返回到輸出流。此外,還會為每組結果生成包含色彩空間和鏡頭陰影等信息的元數據。您可以將相機版本 3 視為相機版本 1 的單向流的管道。它將每個捕獲請求轉換為傳感器捕獲的一個圖像,該圖像被處理為:

  • 帶有關於捕獲的元數據的結果對象。
  • 一到 N 個圖像數據緩衝區,每個緩衝區都有自己的目標表面。

一組可能的輸出表面是預先配置好的:

  • 每個表面都是固定分辨率的圖像緩衝區流的目的地。
  • 一次只能將少量表面配置為輸出 (~3)。

請求包含所有所需的捕獲設置和輸出表面列表,以便為該請求將圖像緩衝區推入(在總配置集之外)。請求可以是一次性的(使用capture() ),也可以無限重複(使用setRepeatingRequest() )。捕獲優先於重複請求。

相機數據模型

圖 1.相機核心運行模型

相機 HAL1 概述

相機子系統的版本 1 設計為具有高級控件和以下三種操作模式的黑盒:

  • 預習
  • 錄像
  • 仍然捕獲

每種模式都有略微不同和重疊的功能。這使得難以實現新功能,例如介於兩種操作模式之間的突發模式。

相機框圖

圖 2.相機組件

Android 7.0 繼續支持相機 HAL1,因為許多設備仍然依賴它。此外,Android 攝像頭服務支持同時實現 HAL(1 和 3),這在您希望使用攝像頭 HAL1 支持功能較弱的前置攝像頭和使用攝像頭 HAL3 的更高級的後置攝像頭時非常有用。

有一個單獨的相機 HAL模塊(有自己的版本號),其中列出了多個獨立的相機設備,每個設備都有自己的版本號。攝像頭模塊 2 或更新版本需要支持設備 2 或更新版本,並且此類攝像頭模塊可以有多種攝像頭設備版本(這就是我們所說的 Android 支持實現這兩種 HAL 的意思)。