3A モードと状態遷移

実際の 3A アルゴリズムは HAL の実装次第ですが、HAL デバイスとフレームワークが 3A の現在の状態について通信し、3A イベントをトリガーできるように、HAL インターフェースによって高レベルのステートマシン記述が定義されています。

デバイスを開く場合、個々の 3A の状態がすべて STATE_INACTIVE である必要があります。3A はストリーム構成によってリセットされません。たとえば、ロックされたフォーカスは configure() の呼び出しの間も保持される必要があります。

3A アクションをトリガーするには、次に続くリクエストの設定で関連するトリガー エントリを設定し、トリガーの開始を示す方法があります。たとえば、あるリクエストで ANDROID_CONTROL_AF_TRIGGER のエントリを ANDROID_CONTROL_AF_TRIGGER_START に設定すると、オートフォーカス スキャンの開始がトリガーされます。ANDROID_CONTROL_AF_TRIGGER を ANDROID_CONTRL_AF_TRIGGER_CANCEL に設定すると、オートフォーカス スキャンのキャンセルがトリガーされます。これ以外の場合は、エントリは存在しないか、ANDROID_CONTROL_AF_TRIGGER_IDLE に設定されます。トリガー エントリが IDLE 以外の値に設定されたリクエストは、独立したトリガー イベントとして処理されます。

トップレベルでは、3A は ANDROID_CONTROL_MODE の設定により制御されます。この設定では、非 3A(ANDROID_CONTROL_MODE_OFF)、通常の AUTO モード(ANDROID_CONTROL_MODE_AUTO)、撮影モードの設定(ANDROID_CONTROL_USE_SCENE_MODE)の使用のいずれかを選択します。

  • OFF モードでは、オートフォーカス(AF)、自動露出(AE)、自動ホワイトバランス(AWB)モードが実質的にそれぞれ OFF になり、キャプチャ コントロールが 3A ルーティンによってオーバーライドされることはありません。
  • AUTO モードでは、AF、AE、AWB の各モードがそれぞれ独自のアルゴリズムを実行し、次のセクションで示す独自のモード、状態、トリガーのメタデータ エントリを持ちます。
  • USE_SCENE_MODE では、3A ルーティンの動作を決定するために ANDROID_CONTROL_SCENE_MODE エントリの値を使用する必要があります。FALSE_PRIORITY 以外の SCENE_MODE では、HAL は ANDROID_CONTROL_AE/AWB/AF_MODE の値を、選択した SCENE_MODE で優先するモードにオーバーライドする必要があります。たとえば、HAL は CONTINUOUS_FOCUS AF モードを使用する場合は SCENE_MODE_NIGHT を優先します。これらの撮影モードでは、ユーザーによる撮影時の AE/AWB/AF_MODE の選択は無視されます。
  • SCENE_MODE_FACE_PRIORITY の場合、AE/AWB/AFMODE コントロールは ANDROID_CONTROL_MODE_AUTO と同様に動作しますが、3A ルーティンではシーン内で検出された顔の測光を行い、焦点を合わせる必要があります。

オート フォーカス設定と結果エントリ

メインのメタデータ エントリ
ANDROID_CONTROL_AF_MODE 現在のオートフォーカス モードの選択を制御します。リクエスト設定でフレームワークにより設定されます。
AF_MODE_OFF AF は無効です。framework/app でレンズの位置を直接制御します。
AF_MODE_AUTO シングル スイープ オートフォーカス。AF がトリガーされない限り、レンズは動きません。
AF_MODE_MACRO シングル スイープ クローズアップ オート フォーカス。AF がトリガーされない限り、レンズは動きません
AF_MODE_CONTINUOUS_VIDEO 動画撮影用のスムーズな連続フォーカス。トリガーすると、すぐにフォーカスが現在の位置にロックされます。キャンセルすると、連続フォーカスが再開されます。
AF_MODE_CONTINUOUS_PICTURE ゼロシャッター ラグでの静止画撮影のための高速連続フォーカス。トリガーすると、現在アクティブなスイープが終わり次第、フォーカスがロックされます。キャンセルすると、連続フォーカスが再開されます。
AF_MODE_EDOF 高度に拡張された被写界深度のフォーカスオートフォーカス スキャンがないため、トリガーまたはキャンセルしても影響はありません。画像は HAL によって自動的にフォーカスされます。
ANDROID_CONTROL_AF_STATE 現在の AF アルゴリズム状態を記述する動的メタデータ。HAL によって結果メタデータでレポートされます。
AF_STATE_INACTIVE フォーカスが合わなかったか、アルゴリズムがリセットされました。レンズは動きません。常に MODE_OFF または MODE_EDOF の状態になります。デバイスが開かれるときには、この状態で起動する必要があります。
AF_STATE_PASSIVE_SCAN 連続フォーカス アルゴリズムが現在、良好なフォーカスをスキャンしています。レンズが動いています。
AF_STATE_PASSIVE_FOCUSED 連続フォーカス アルゴリズムにより、フォーカスが合っていると判断されています。レンズは動いていません。HAL は自発的にこの状態を終了することもできます。
AF_STATE_PASSIVE_UNFOCUSED 連続フォーカス アルゴリズムにより、フォーカスが合っていないと判断されています。レンズは動いていません。HAL は自発的にこの状態を終了することもできます。
AF_STATE_ACTIVE_SCAN ユーザーがトリガーしたスキャンが実行されています。
AF_STATE_FOCUSED_LOCKED AF アルゴリズムにより、フォーカスが合っていると判断されています。レンズは動いていません。
AF_STATE_NOT_FOCUSED_LOCKED AF アルゴリズムによるフォーカス合わせができませんでした。レンズは動いていません。
ANDROID_CONTROL_AFTRIGGER オートフォーカス スキャンを開始するためのコントロール。モードと状態によって意味が異なります。リクエスト設定でフレームワークにより設定されます。
AF_TRIGGER_IDLE 現時点でトリガーはありません。
AF_TRIGGER_START AF スキャンの開始をトリガーします。モードと状態によって効果が異なります。
AF_TRIGGER_CANCEL 現在の AF スキャンをキャンセルし、アルゴリズムをデフォルトにリセットします。
追加のメタデータ エントリ
ANDROID_CONTROL_AF_REGIONS 視野(FOV)の領域を選択するためのコントロール。フォーカスを適切に決定するために使用します。これは、フォーカスをスキャンするすべての AF モードに適用されます。リクエスト設定でフレームワークにより設定されます。

自動露出設定と結果エントリ

メインのメタデータ エントリ
ANDROID_CONTROL_AE_MODE 現在の自動露出モードを選択するためのコントロール。リクエスト設定でフレームワークにより設定されます。
AE_MODE_OFF 自動露出は無効です。ユーザーが露出、ゲイン、フレーム間隔、フラッシュを制御します。
AE_MODE_ON 標準の自動露出。フラッシュ制御は無効です。ユーザーはフラッシュ モード、またはトーチモードに設定できます。
AE_MODE_ON_AUTO_FLASH 標準的な自動露出。プリキャプチャと静止画撮影の際には HAL の判定によりフラッシュがオンになります。ユーザーによるフラッシュの制御は無効です。
AE_MODE_ON_ALWAYS_FLASH 標準的な自動露出。フラッシュは、キャプチャでは常に発光され、プリキャプチャでは HAL の判定により発光されます。ユーザーによるフラッシュの制御は無効です。
AE_MODE_ON_AUTO_FLASH_REDEYE 標準的な自動露出。プリキャプチャと静止画撮影の際には HAL の判定によりフラッシュがオンになります。最終的に画像が赤目になることを減らすために、プリキャプチャ シーケンスの最後にフラッシュ バーストを使用します。ユーザーによるフラッシュの制御は無効です。
ANDROID_CONTROL_AE_STATE 現在の AE アルゴリズム状態を記述する動的メタデータ。結果メタデータで HAL により報告されます。
AE_STATE_INACTIVE モード切り替え後の初期 AE 状態。デバイスが開かれたときには、この状態で起動する必要があります。
AE_STATE_SEARCHING AE が適切な値に収束せず、露出パラメータを調整しています。
AE_STATE_CONVERGED AE が現在のシーンに適切な露出値を検出したため、露出パラメータは変更されません。HAL が自動的にこの状態よりも適切な状態を探す場合があります。
AE_STATE_LOCKED AE が AE_LOCK コントロールでロックされています。露出値は変更されません。
AE_STATE_FLASH_REQUIRED HAL では露出の収束が完了していますが、明るさの十分な写真を撮影するにはフラッシュが必要だと判断しています。ゼロシャッターラグ フレームの使用が可能かを判断するために使用されます。
AE_STATE_PRECAPTURE HAL でプリキャプチャ シーケンスの途中です。AE モードに応じて、このモードでは測光のためにフラッシュを発光させたり、赤目の軽減のためにフラッシュ パルスを発光させたりします。
ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER 高品質の画像を撮影する前に測光シーケンスを開始するためのコントロール。リクエスト設定でフレームワークにより設定されます。
PRECAPTURE_TRIGGER_IDLE 現時点でトリガーはありません。
PRECAPTURE_TRIGGER_START プリキャプチャ シーケンスを開始します。今後の高解像度撮影のために良好な露出とホワイトバランスを測定するには、HAL で後続のリクエストを使用する必要があります。
追加のメタデータ エントリ
ANDROID_CONTROL_AE_LOCK AE コントロールを現在の値にロックするためのコントロール。
ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION AE アルゴリズムのターゲット輝度ポイントを調整するためのコントロール。
ANDROID_CONTROL_AE_TARGET_FPS_RANGE AE アルゴリズムのターゲット フレームレート範囲を選択するためのコントロール。AE ルーティンではフレームレートをこれらの範囲外に変更することはできません。
ANDROID_CONTROL_AE_REGIONS 適切な露出レベルの決定に使用する FOV の領域を選択するためのコントロール。これは、OFF およびすべての AE モードに適用されます。

自動ホワイトバランス設定と結果エントリ

メインのメタデータ エントリ
ANDROID_CONTROL_AWB_MODE 現在のホワイトバランス モードを選択するためのコントロール。
AWB_MODE_OFF 自動ホワイトバランスは無効です。ユーザーがカラー マトリックスを制御します。
AWB_MODE_AUTO 自動ホワイトバランスが有効です。3A は色変換を制御しますが、単純なマトリックスより複雑な変換を使用する可能性があります。
AWB_MODE_INCANDESCENT 屋内の白熱灯(約 2,700K)に適した固定ホワイトバランス設定。
AWB_MODE_FLUORESCENT 蛍光灯(約 5,000K)に適した固定ホワイトバランス設定。
AWB_MODE_WARM_FLUORESCENT 蛍光灯(約 3,000K)に適した固定ホワイトバランス設定。
AWB_MODE_DAYLIGHT 昼光(約 5,500K)に適した固定ホワイトバランス設定。
AWB_MODE_CLOUDY_DAYLIGHT 曇りの昼光(約 6,500K)に適した固定ホワイトバランス設定。
AWB_MODE_TWILIGHT 日没または日の出間近(約 15,000K)に適した固定ホワイトバランス設定。
AWB_MODE_SHADE 日光が間接的に当たる場所(約 7,500K)に適した固定ホワイトバランス設定。
ANDROID_CONTROL_AWB_STATE 現在の AWB アルゴリズム状態を記述する動的メタデータ。HAL により結果メタデータでレポートされます。
AWB_STATE_INACTIVE モードの切り替え後の初期 AWB 状態。デバイスが開かれたときには、この状態で起動する必要があります。
AWB_STATE_SEARCHING AWB が適切な値に収束せず、色調整パラメータが変更されています。
AWB_STATE_CONVERGED AWB で現在のシーンに適した色調整値が見つかったため、パラメータは変更されません。HAL が自動的にこの状態ではなく、より適切な状態を探す場合があります。
AWB_STATE_LOCKED AWB は AWB_LOCK コントロールでロックされています。色調整値は変更されません。
追加のメタデータ エントリ
ANDROID_CONTROL_AWB_LOCK AWB の色調整を現在の値にロックするためのコントロール。
ANDROID_CONTROL_AWB_REGIONS 適切な色のバランスの決定に使用される FOV の領域を選択するためのコントロール。オート ホワイトバランス モードにのみ適用されます。

一般的なステートマシン移行における注意事項

AF、AE、AWB の各モードを切り替えると、アルゴリズムの状態は常に INACTIVE にリセットされます。同様に、CONTROL_MODE == USE_SCENE_MODE の場合に CONTROL_MODE と CONTROL_SCENE_MODE のどちらかに切り替えると、すべてのアルゴリズムの状態が INACTIVE にリセットされます。

以下に、モードごとの表を示します。

AF ステートマシン

モード = AF_MODE_OFF または AF_MODE_EDOF
状態 変換の起因 新しい状態 説明
INACTIVE AF が無効
モード = AF_MODE_AUTO または AF_MODE_MACRO
状態 変換の起因 新しい状態 説明
INACTIVE AF_TRIGGER ACTIVE_SCAN

AF スイープを開始

レンズが動作中

ACTIVE_SCAN AF スイープ完了 FOCUSED_LOCKED

AF に成功した場合

レンズがロック中

ACTIVE_SCAN AF スイープ完了 NOT_FOCUSED_LOCKED

AF に成功した場合

レンズがロック中

ACTIVE_SCAN AF_CANCEL INACTIVE

AF のキャンセルとリセット

レンズがロック中

FOCUSED_LOCKED AF_CANCEL INACTIVE AF のキャンセルとリセット
FOCUSED_LOCKED AF_TRIGGER ACTIVE_SCAN

新しいスイープを開始

レンズが動作中

NOT_FOCUSED_LOCKED AF_CANCEL INACTIVE AF のキャンセルとリセット
NOT_FOCUSED_LOCKED AF_TRIGGER ACTIVE_SCAN

新しいスイープを開始

レンズが動作中

すべての状態 モード変更 INACTIVE
モード = AF_MODE_CONTINUOUS_VIDEO
状態 変換の起因 新しい状態 説明
INACTIVE HAL が新しいスキャンを開始 PASSIVE_SCAN

AF スイープを開始

レンズが動作中

INACTIVE AF_TRIGGER NOT_FOCUSED_LOCKED

AF 状態のクエリ

レンズがロック中

PASSIVE_SCAN HAL が現在のスキャンを完了 PASSIVE_FOCUSED

AF スキャンを終了

レンズがロック中

PASSIVE_SCAN AF_TRIGGER FOCUSED_LOCKED

フォーカスが適切な場合は即時変換

レンズがロック中

PASSIVE_SCAN AF_TRIGGER NOT_FOCUSED_LOCKED

フォーカスが不適切な場合は即時変換

レンズがロック中

PASSIVE_SCAN AF_CANCEL INACTIVE

レンズの位置をリセット

レンズがロック中

PASSIVE_FOCUSED HAL が新しいスキャンを開始 PASSIVE_SCAN

AF スキャンを開始

レンズが動作中

PASSIVE_FOCUSED AF_TRIGGER FOCUSED_LOCKED

フォーカスが適切な場合は即時変換

レンズがロック中

PASSIVE_FOCUSED AF_TRIGGER NOT_FOCUSED_LOCKED フォーカスが不適切な場合は即時変換

レンズがロック中

FOCUSED_LOCKED AF_TRIGGER FOCUSED_LOCKED 影響なし
FOCUSED_LOCKED AF_CANCEL INACTIVE AF スキャンを再開
NOT_FOCUSED_LOCKED AF_TRIGGER NOT_FOCUSED_LOCKED 影響なし
NOT_FOCUSED_LOCKED AF_CANCEL INACTIVE AF スキャンを再開
モード = AF_MODE_CONTINUOUS_PICTURE
状態 変換の起因 新しい状態 説明
INACTIVE HAL が新しいスキャンを開始 PASSIVE_SCAN

AF スキャンを開始

レンズが動作中

INACTIVE AF_TRIGGER NOT_FOCUSED_LOCKED

AF 状態のクエリ

レンズがロック中

PASSIVE_SCAN HAL が現在のスキャンを完了 PASSIVE_FOCUSED AF スキャンを終了

レンズがロック中

PASSIVE_SCAN AF_TRIGGER FOCUSED_LOCKED

フォーカスが合った後の最終的な変換

レンズがロック中

PASSIVE_SCAN AF_TRIGGER NOT_FOCUSED_LOCKED

フォーカスが合わない場合の最終的な変換

レンズがロック中

PASSIVE_SCAN AF_CANCEL INACTIVE

レンズの位置をリセット

レンズがロック中

PASSIVE_FOCUSED HAL が新しいスキャンを開始 PASSIVE_SCAN

AF スキャンを開始

レンズが動作中

PASSIVE_FOCUSED AF_TRIGGER FOCUSED_LOCKED

フォーカスが適切な場合は即時変換

レンズがロック中

PASSIVE_FOCUSED AF_TRIGGER NOT_FOCUSED_LOCKED

フォーカスが不適切な場合は即時変換

レンズがロック中

FOCUSED_LOCKED AF_TRIGGER FOCUSED_LOCKED 影響なし
FOCUSED_LOCKED AF_CANCEL INACTIVE AF スキャンを再開
NOT_FOCUSED_LOCKED AF_TRIGGER NOT_FOCUSED_LOCKED 影響なし
NOT_FOCUSED_LOCKED AF_CANCEL INACTIVE AF スキャンを再開

AE と AWB のステートマシン

AE と AWB のステートマシンはほぼ同じです。AE には、FLASH_REQUIRED と PRECAPTURE の状態が追加されています。したがって、これらの 2 つの状態を指す以下の行は、AWB ステートマシンでは無視する必要があります。

モード = AE_MODE_OFF / AWB モードが AUTO ではない
状態 変換の起因 新しい状態 説明
INACTIVE AE または AWB が無効
モード = AE_MODE_ON_* / AWB_MODE_AUTO
状態 変換の起因 新しい状態 説明
INACTIVE HAL で AE または AWB スキャンを開始 SEARCHING
INACTIVE AE/AWB_LOCK オン LOCKED 値がロックされる
SEARCHING HAL で AE または AWB スキャンを終了 CONVERGED 良好な値、変更なし
SEARCHING HAL が AE スキャンを終了 FLASH_REQUIRED 収束済み、ただしフラッシュなしでは暗すぎる
SEARCHING AE/AWB_LOCK オン LOCKED 値がロックされる
CONVERGED HAL で AE または AWB スキャンを開始 SEARCHING 値がロックされる
CONVERGED AE/AWB_LOCK オン LOCKED 値がロックされる
FLASH_REQUIRED HAL で AE または AWB スキャンを開始 SEARCHING 値がロックされる
FLASH_REQUIRED AE/AWB_LOCK オン LOCKED 値がロックされる
LOCKED AE/AWB_LOCK オフ SEARCHING ロック解除後の値が不適切
LOCKED AE/AWB_LOCK オフ CONVERGED ロック解除後の値が適切
LOCKED AE_LOCK オフ FLASH_REQUIRED 露出は良好だが暗すぎる
すべての AE の状態 PRECAPTURE_START PRECAPTURE プリキャプチャ シーケンスを開始
PRECAPTURE シーケンス完了、AE_LOCK オフ CONVERGED 高品質の撮影が可能
PRECAPTURE シーケンス終了、AE_LOCK オン LOCKED 高品質の撮影が可能

手動制御を有効にする

いくつかのコントロールでは、デバイスの 3A ブロックを構成してアプリを直接制御することもできます。

3A コントロールの HAL モデルでは、各リクエストに対して、HAL で 3A のコントロール フィールドの状態を検査します。3A ルーティンのいずれかが有効になっている場合、ルーティンはそのルーティンに関連する制御変数をオーバーライドします。その後、オーバーライドした値をキャプチャの結果メタデータで利用できます。たとえば、リクエストで自動露出が有効になっている場合、HAL では、露出、ゲイン、フレーム間隔の各フィールドを(AE モードによってはフラッシュ フィールドも)上書きします。関連するコントロールのリストは次のとおりです。

コントロール名 ユニット 説明
android.control.mode 列挙型: OFF、AUTO、USE_SCENE_MODE 高レベルの 3A コントロール。OFF に設定すると、HAL による 3A コントロールがすべて無効になります。アプリでは、キャプチャ パラメータ自体のフィールドを設定する必要があります。AUTO に設定すると、android.control.afMode などの android.control.* の個々のアルゴリズム コントロールが有効になります。USE_SCENE_MODE に設定した場合、android.control.* の個々のコントロールはほぼ無効になります。HAL では撮影モード設定の 1 つ(ACTION、SUNSET、PARTY など)が必要に応じて実装されます。
android.control.afMode 列挙型 OFF は、android.lens.focusDistance を使用して、レンズのフォーカスを手動で制御することを意味します。
android.control.aeMode 列挙型 OFF は、android.sensor.exposureTime / .sensitivity / .frameDuration を使用して、露出、ゲイン、フレームの長さを手動で制御することを意味します。
android.control.awbMode 列挙型 OFF は、ホワイトバランスを手動で制御することを意味します。