ストリーム構成

Android 10 では、カメラ クライアントが特定のユースケースに最適なカメラ ストリームを選択し、特定のストリームの組み合わせがカメラデバイスによってサポートされるようにする機能が導入されています。ストリーム構成はカメラデバイス内で構成された単一のカメラ ストリームのことを指し、ストリームの組み合わせはカメラデバイス内で構成された 1 つ以上のストリームのセットを指します。これらの機能の詳細については、推奨されるストリーム構成ストリームの組み合わせをクエリするための API をご覧ください。

リファレンス実装

推奨されるストリーム構成とストリームの組み合わせをクエリするための API に関して、ベンダー向けリファレンス実装が用意されています。この実装は、QCamera3HWI.cpp にあります。

カメラベンダーは、特定のユースケースに対する推奨ストリーム構成をカメラ クライアントにアドバタイズできます。StreamConfigurationMap のサブセットであるこの推奨ストリーム構成は、カメラ クライアントが最適な構成を選択する際に有用です。

StreamConfigurationMap は、完全なストリーム構成情報をカメラ クライアントに提供しますが、どのストリームを選択するかで効率、電力、パフォーマンスにどう影響するかといった情報は提供されません。カメラ クライアントは、あらゆるストリーム構成から自由に選択することが可能ですが、多くの場合、クライアントが使用するカメラ構成が最適ではない、アプリによる検索処理に時間がかかる、といった結果につながります。

たとえば、処理済みの YUV 形式のいくつかは必須であり、サポートされている必要がありますが、形式によってはカメラデバイスでネイティブ サポートされていない場合もあります。このため、形式変換の処理パスが追加され、効率が低下してしまいます。サイズと対応するアスペクト比でも同じような影響が発生する可能性があり、電力とパフォーマンスの点で特定のディメンションが有利となる場合もあります。

推奨ストリーム構成マップは、StreamConfigurationMap ほど網羅的である必要はありません。提案するストリーム構成マップは、実装セクションの要件を満たす必要があります。また、StreamConfigurationMap にある使用可能な形式、サイズ、またはその他の値を含めることができます。StreamConfigurationMap にない隠しフォーマット、サイズ、その他の値は、推奨ストリーム構成マップに含めることはできません。

推奨ストリーム構成によっては、すべてのテストは変更されず緩和もされません。

カメラ実装によって提供される推奨ストリーム構成はオプションであり、カメラ クライアントは無視することもできます。

実装

この機能を実装する手順は次のとおりです。

メタデータ エントリ

この機能を有効にするには、Camera HAL が次の静的メタデータ エントリを入力する必要があります。

  • android.scaler.availableRecommendedStreamConfigurations: 特定のユースケースで使用するストリーム構成の推奨サブセット宣言では、提案するユースケースを [1 << PREVIEW | 1 << RECORD..] の形式で示す単純なビットマップが使用されます。ユースケースでは、標準的な(形式、幅、高さ、入力)タプルを拡張して、エントリを追加できます。存在しない公開ユースケースまたは [PUBLIC_END, VENDOR_START] 範囲内のその他のビットセットは禁止されています。

    この情報は、availableRecommendedStreamConfigurations メタデータタグに保存されています。

    次の例は、4K と 1080p のみをサポートするカメラデバイスの推奨ストリーム構成の配列を示しています。録画ではどちらの解像度も推奨されますが、プレビューでは 1080p のみが提案されます。

    [3840, 2160, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
    (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT),
    1920, 1080, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
    (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PREVIEW |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT)]
    
  • android.depth.availableRecommendedDepthStreamConfigurations(デバイスでサポートされている場合にのみ使用可能): このカメラデバイスに提案される推奨深度データ空間ストリーム構成。上記のメタデータ エントリと同様に、ユースケース ビットマップを追加して提案するユースケースを示します。

    この情報は、availableRecommendedInputOutputFormatsMap メタデータタグに保存されています。

  • android.scaler.availableRecommendedInputOutputFormatsMap(デバイスでサポートされている場合にのみ使用可能): 入力ストリームから対応する出力形式への、このカメラデバイスに提案される推奨画像形式のマッピング。

    この情報は、availableRecommendedDepthStreamConfigurations メタデータタグに保存されています。

カメラ クライアントは RecommendedStreamConfigurationMap API を通じてこの情報を取得できます。

必須ユースケース

次のユースケースに対して推奨ストリーム構成を提供する必要があります。推奨ストリーム構成はユースケースの要件を満たす必要があります。

ユースケース 要件
PREVIEW プレビューには、YUV_420_888IMPLEMENTATION_DEFINED のような出力形式を持つ非ストール形式の処理済みストリーム構成以外は含めることができません。
RECORD 動画の録画には、アドバタイズされたサポート対象のメディア プロファイルと一致するストリーム構成を IMPLEMENTATION_DEFINED 形式で含める必要があります。
VIDEO_SNAPSHOT 動画スナップ ショットには、少なくとも最高の RECORD 解像度と同じ解像度を持ち、BLOB + DATASPACE_JFIF 形式/データベースの組み合わせ(JPEG)のみを持つストリーム構成を含める必要があります。この構成を使用することで、プレビューでの不具合を防ぎ、30 fps でプレビューを実行できるようになります。
SNAPSHOT スナップショット ストリーム構成には、BLOB + DATASPACE_JFIF 形式/データベースの組み合わせ(JPEG)を持つ android.sensor.info.activeArraySize に近いサイズの構成を 1 つ以上含める必要があります。アスペクト比、アライメント、その他のベンダー固有の制約を考慮して、提案する最大サイズ領域はセンサー配列サイズ領域の 97% 以上にする必要があります。
ZSL(サポートされている場合) カメラデバイスでサポートされている場合、推奨入力ストリーム構成は他の処理済みまたはストール出力形式と一緒の場合にのみアドバタイズする必要があります。
RAW(サポートされている場合) カメラデバイスでサポートされている場合、推奨 Raw ストリーム構成は RAW ベース出力形式のみを含める必要があります。

その他のユースケース

各実装に固有のユースケースに応じて、推奨構成ストリームを追加できます。

検証

推奨構成ストリームの実装をテストするには、次の CTS および VTS テストを実行します。

ストリームの組み合わせをクエリするための API

Android プラットフォームでは、ストリームの組み合わせをクエリするための API をサポートしています。この API を実装すると、カメラ クライアントは有効な CameraDevice インスタンスを受信した後、いつでもストリームの組み合わせを安全にクエリできるようになります。これにより、カメラ キャプチャ セッションの初期化時に発生するオーバーヘッドや、初期化後にカメラの例外が発生する可能性(カメラの破損エラーなど)を排除し、クエリの高速化を実現します。

また、この機能により、カメラ クライアントは CameraDevice およびサポート対象 HW レベルのガイドラインを遵守してコンパイルされたストリームの組み合わせのリストを受信できます。CTS テストも利用できます。このテストにより、最も一般的なストリーム組み合わせのマイナー サブセットを対象として、可能な限りクエリ結果の正確性を保証できます。

この機能をサポートするには、Camera HAL で HIDL API 呼び出しを 1 つ追加します。

実装

ストリームの組み合わせをクエリするための API をサポートするには、Camera HAL で isStreamCombinationSupported HIDL API インターフェースの実装を提供する必要があります。このインターフェースは、カメラデバイスが指定されたカメラ ストリームの組み合わせをサポートしているかどうかを確認します。

API を呼び出すと、次のいずれかのステータス コードが返されます。

  • OK: ストリームの組み合わせのクエリが正常に完了しました。
  • METHOD_NOT_SUPPORTED: カメラデバイスはストリームの組み合わせのクエリをサポートしていません。
  • INTERNAL_ERROR: 内部エラーのため、ストリームの組み合わせのクエリを完了できません。

ストリームの組み合わせがサポートされている場合、API は true を返します。それ以外の場合は false を返します。

フレームワークは公開 API isSessionConfigurationSupported を使用して、カメラデバイスが特定のセッション構成をサポートしているかどうかを確認します。

API の呼び出しによって通常のカメラ操作に副次的影響が発生しないようにする必要があります。また、API の呼び出しによって内部状態が変更される、またはカメラのパフォーマンスが低下することがないようにする必要があります。Camera HAL がストリームの組み合わせの検証を正常に終了した後、カメラ クライアントは確実にストリームの組み合わせを正常に構成できる必要があります。問題を回避するには、実装によって、ストリームの組み合わせのクエリ中に情報が保存されないようにすること、内部状態が変更されないようにすること、時間がかかる操作が実行されないようにすることを確認する必要があります。

検証

この機能を検証するには、次のカメラ CTS テストと VTS テストケースを実行します。

カメラ CTS モジュール:

カメラ VTS:

VtsHalCameraProviderV2_4TargetTest.cpp