Camera HAL

Android のカメラ ハードウェア抽象化レイヤ(HAL)は、android.hardware.camera2 の上位レベルのカメラ フレームワーク API を、基盤となるカメラドライバおよびハードウェアに接続します。Android 13 以降、カメラ HAL インターフェースの開発では AIDL が使用されます。Android 8.0 では Treble が導入され、CameraHal API から HAL Interface Description Language(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 の片方向ストリームへのパイプラインとみなすことができます。各キャプチャ リクエストは、センサーでキャプチャした 1 つの画像に変換され、次のように処理されます。

  • キャプチャに関するメタデータを含む結果オブジェクト。
  • 画像データの 1~N 個のバッファ(それぞれが独自の転送先サーフェスに格納されます)。

使用が見込まれる出力サーフェスは、セットとして次のように事前に構成されています。

  • それぞれのサーフェスが、固定解像度の画像バッファのストリームの転送先です。
  • 出力サーフェスとして同時に設定できるのは少数のサーフェス(およそ 3 個)のみです。

リクエストには、必要なすべてのキャプチャ設定と、このリクエスト用にイメージ バッファを push するための出力サーフェスの(構成されたセット全体の)一覧が含まれます。リクエストは、(capture() を使用して)ワンショットにするか、(setRepeatingRequest() を使用して)無制限に繰り返すことが可能です。なお、キャプチャはリクエストの繰り返しよりも優先されます。

カメラ データモデル

図 1. Camera Core オペレーション モデル

カメラ HAL1 の概要

カメラ サブシステム バージョン 1 は、高度な制御と次の 3 つの動作モードを備えたブラック ボックスとして設計されました。

  • プレビュー
  • 動画の録画
  • 静止画の撮影

それぞれのモードの機能は若干異なり、重複する機能もあります。これにより、2 つの動作モードの中間に位置するバーストモードなどの新機能の実装が困難になりました。

カメラブロック図

図 2. カメラ コンポーネント

カメラ HAL1 を使用しているデバイスは依然として多く存在するため、Android 7.0 ではカメラ HAL1 を引き続きサポートしています。さらに、Android カメラサービスは HAL1 および HAL3 の実装をサポートしており、これは、カメラ HAL1 を備えた性能の低い前面カメラとカメラ HAL3 を備えたより高度な背面カメラをサポートする必要がある場合に有用です。

(独自の「バージョン番号」を持つ)単一のカメラ HAL モジュールには、それぞれ独自のバージョン番号を持つ複数の独立したカメラデバイスがあります。デバイス 2 以降をサポートするにはカメラ モジュール 2 以降が必要です。また、このようなカメラ モジュールには、カメラデバイスのバージョンを混在させることができます(つまり、Android がそれぞれの HAL の実装をサポートする場合)。