このページでは、Android デバイスの 3A モードとステートマシンについて説明します。ステートマシンを高レベルで定義するカメラ HAL インターフェースにより、HAL 実装と Android フレームワークが 3A の現在の状態について通信し、3A イベントをトリガーできます。HAL 実装では、3A モード設定と状態遷移を制御する 3A アルゴリズムが行われます。
デバイスを開く場合、個々の 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_AF_TRIGGER | オートフォーカス スキャンを開始するためのコントロール。モードと状態によって意味が異なります。リクエスト設定でフレームワークにより設定されます。 |
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 の判定によりフラッシュがオンになります。最終的に画像が赤目になることを減らすために、プリキャプチャ シーケンスの最後にフラッシュ バーストを使用します。ユーザーによるフラッシュの制御は無効です。 |
AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY | Low Light Boost は、暗い場所でプレビュー ストリームの明るさを自動調整するモードです。これにより、暗い場所では手ぶれやノイズが増える可能性があります。デバイス メーカーは、フレームレートが 10 fps を下回らないようにする必要があります。 |
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 は、ホワイトバランスを手動で制御することを意味します。 |