セッション パラメータ

セッション パラメータ機能によって、キャプチャ セッションの初期化フェーズの一環として、カメラ クライアントがコストのかかるリクエスト パラメータ(つまりセッション パラメータ)のサブセットをアクティブに構成できるようにすることで遅延が軽減されます。この機能を使用すると、HAL 実装で最初のキャプチャ リクエストではなくストリーム構成の段階でクライアント パラメータを受け取り、その値に応じて効率的に内部パイプラインを準備してビルドできます。

Android 10 では、オプションのセッション再構成クエリ機能を使用してパフォーマンスを改善し、内部セッション パラメータ再構成ロジックを詳細に制御できます。詳しくは、セッション再構成クエリをご覧ください。

例とソース

セッション パラメータのリファレンス実装は、CameraHal にすでに含まれています。この HAL では、従来の HAL API が使用されます。 カメラの HIDL API を実装するバインドされた CameraHal で、ストリーム構成時に新しく追加されたセッション パラメータにアクセスするには、それぞれの HIDL sessionParams エントリを使用する必要があります。

カメラ クライアントは、getAvailableSessionKeys() を呼び出してすべてのサポート対象セッション パラメータのキーを照会し、最終的に setSessionParameters() を使用して初期値を設定できます。

実装

CameraHal 実装では、ANDROID_REQUEST_AVAILABLE_SESSION_KEYS をそれぞれの静的カメラ メタデータに追加して、ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS のサブセット(フレームごとに適用するのが難しく、キャプチャ セッションの期間中に変更すると予期しない遅延が発生する可能性があるキーのリストを含む)を提供する必要があります。

一般的な例として、時間がかかるハードウェアの再構成や内部カメラ パイプラインの変更が必要なパラメータがあります。キャプチャ リクエストで引き続きセッション パラメータを制御できますが、クライアントはアプリの遅延を認識し、想定しておく必要があります。

フレームワークはすべての受信リクエストを監視し、セッション パラメータの値が変わったことを検出すると、内部でカメラを再構成します。CameraHal に渡される新しいストリーム構成には、更新されたセッション パラメータ値が含まれており、カメラ パイプラインを効率的に構成するために使用されます。

カスタマイズ

CameraHal 側に設定された使用可能なセッション パラメータ リストでタグを定義できます。CameraHal で使用可能なセッション パラメータ リストが空になっている場合、この機能は有効になりません。

検証

CTS には、セッション パラメータをテストする次の新しいケースが含まれています。

パラメータがセッションキー リストに追加された後は、一般的に HAL レイヤのストリーム構成時に渡されるセッション パラメータの一部として現在の値が含まれます。

セッション パラメータは慎重に選択する必要があります。ストリーム構成時に値を頻繁に変更することはできません。キャプチャ インテントなどの頻繁に変更されるパラメータは適していません。このようなパラメータをセッション パラメータ リストに追加すると、過度の内部再構成が原因で CTS エラーが発生する可能性があります。

セッション再構成クエリ

Android 10 では、パフォーマンスの向上を目的としてオプションのセッション再構成クエリ機能が用意されていますが、セッション パラメータ値の変更に起因する内部ストリームの再構成によってパフォーマンスが低下する可能性があります。この問題に対処するために、HIDL ICameraDeviceSession バージョン 3.5 以降では、内部セッション パラメータ再構成ロジックを詳細に制御できる isReconfigurationRequired メソッドがサポートされています。このメソッドを使用すると、必要に応じてストリームの再構成が厳密に行われます。

isReconfigurationRequired の引数によって、保留中の各セッション パラメータの変更に必要な情報が提供されるため、デバイス固有のさまざまなカスタマイズが可能になります。

この機能は、カメラサービスとカメラ HAL にのみ実装されます。公開 API はありません。この機能を実装すると、カメラ クライアントでセッション パラメータを使用するときのパフォーマンスが向上します。

実装

セッション再構成クエリをサポートするには、新しいセッション パラメータ値に対して完全なストリーム再構成が必要かどうかを確認する、isReconfigurationRequired メソッドを実装する必要があります。

アドバタイズ済みのセッション パラメータの値がクライアントによって変更されると、カメラ フレームワークでは isReconfigurationRequired メソッドが呼び出されます。その値に応じて、完全なストリーム再構成が必要かどうかが HAL で決定されます。HAL から false が返された場合、カメラ フレームワークは内部再構成をスキップします。HAL から true が返された場合、フレームワークはストリームを再構成し、それに応じた新しいセッション パラメータ値を渡します。

新しいパラメータを含むリクエストが HAL に送信される前にフレームワークによって isReconfigurationRequired メソッドが呼び出され、送信前にリクエストがキャンセルされる場合があります。したがって、このメソッド呼び出しを使用して HAL の動作を変更することはできません。

HAL 実装は次の要件を満たす必要があります。

  • アクティブなセッションの構成後、フレームワークはいつでも isReconfigurationRequired メソッドを呼び出せる必要があります。
  • 保留中のカメラ リクエストのパフォーマンスに影響しないようにする必要があります。特に、通常のカメラ ストリーミングで不具合や遅延が発生しないようにしてください。

デバイスと HAL 実装は、次のパフォーマンス要件を満たす必要があります。

  • ハードウェアとソフトウェアのカメラ設定は変更できません。
  • カメラのパフォーマンスにユーザーが認識できる影響が及ばないようにする必要があります。

isReconfigurationRequired メソッドは次の引数を取ります。

  • oldSessionParams: 前のセッションのセッション パラメータ。 通常は既存のセッション パラメータです。
  • newSessionParams: クライアントによって設定される新しいセッション パラメータ。

返されるステータス コードとして、以下が想定されます。

  • OK: 再構成を要求するクエリが正常に実行されました。
  • METHOD_NOT_SUPPORTED: カメラデバイスは、再構成クエリをサポートしていません。
  • INTERNAL_ERROR: 内部エラーが発生したため、再構成クエリを完了できませんでした。

戻り値は次のとおりです。

  • true: ストリームの再構成が必要です。
  • false: ストリームの再構成は必要ありません。

セッション再構成クエリを無視する場合、HAL は METHOD_NOT_SUPPORTED または false を返します。この結果、各セッション パラメータの変更時にストリームの再構成がトリガーされると、カメラサービスのデフォルトの動作が実行されます。

検証

セッション再構成クエリ機能は、CameraHidlTest#configureStreamsWithSessionParameters の VTS テストケースを使用して検証できます。