Android 13 以降では、アプリ クライアントは動画エンコーダに、エンコードされた動画フレームごとにエンコード統計情報をエクスポートするようリクエストできます。動画エンコーダから取得した統計情報により、アプリは、マルチパス エンコードやエンコード前のフレーム前処理などの動画エンコード タスクを最適化できます。
動画エンコード統計情報をエクスポートするには、SoC ベンダーは動画エンコーダ ドライバの更新の説明に沿って、動画エンコーダ ドライバを変更する必要があります。
動画エンコード統計情報のデータ
Android 13 では、次の表に示すように、動画エンコーダによって統計データがエクスポートされます。
| エンコーダ統計情報の名前 | 説明 |
|---|---|
| 1 フレームあたりの平均ブロック QP | ビットストリームにエンコードされた動画フレーム内のすべてのブロック QP の平均 |
| 画像のタイプ | タイプ I、P、または B |
デベロッパーは、MediaFormat デベロッパー クラスを使用して、各フレームの統計情報を取得できます。
動画エンコーダ ドライバの更新
動画エンコード統計情報のエクスポートをサポートするには、SoC ベンダーは動画エンコーダ ドライバを変更する必要があります。Android 13 の Codec 2.0 ベースでは、以下のキーが追加されました。
KEY_VIDEO_QP_AVERAGEは、フレームごとの平均ブロック QP を表します。KEY_VIDEO_QP_AVERAGEキーの実装には、以下のルールが適用されます。SoC エンコーダは、Codec 2.0 に出力する前に、ブロック QP の平均を最も近い整数に丸める必要があります。
平均値は輝度レベルからのみ計算されます。
現在のフレーム内のすべてのブロックがスキップモードの場合、SoC エンコーダは
INT_MAXを返す必要があります。この条件は、係数がエンコードされておらず、フレーム内で重要な QP 情報がエンコードされていない場合に発生します。
KEY_PICTURE_TYPEは、エンコードされたフレームの画像タイプをPICTURE_TYPE_I、PICTURE_TYPE_P、PICTURE_TYPE_BまたはPICTURE_TYPE_UNKNOWNで記述します。KEY_VIDEO_ENCODING_STATISTICS_LEVELは、動画エンコーダから出力されるエンコード統計情報のレベルを次のように記述します。エンコーダがエンコード統計情報を生成しない場合、このキーは
VIDEO_ENCODING_STATISTICS_LEVEL_NONEに設定されます。エンコーダがフレームごとに
KEY_VIDEO_QP_AVERAGEとKEY_PICTURE_TYPEを生成する場合、このキーはVIDEO_ENCODING_STATISTICS_LEVEL_1に設定されます。
リファレンス実装については、VideoEncodingStatisticsTest をご覧ください。
検証
VideoEncodingStatisticsTest CTS テストを実行し、動画エンコード統計情報の平均 QP 部分が正しく動作することを検証します。CTS では、同じ入力動画に対して 2 つのエンコード(1 つは高いビットレート、もう 1 つは低いビットレート)を実行します。次に、CTS で 2 つのエンコードからエクスポートされた 2 つの平均 QP 値を比較します。低いビットレートのエンコードの平均 QP が、高いビットレートのエンコードの平均 QP よりも大きい場合、CTS で合格します。
動画エンコード統計情報のエクスポート機能が有効な場合に、この機能をオフにすることを検証するには、次のように VIDEO_ENCODING_STATISTICS_LEVEL_NONE キーを使用します。
format.setInteger(MediaFormat.KEY_VIDEO_ENCODING_STATISTICS_LEVEL, MediaFormat.VIDEO_ENCODING_STATISTICS_LEVEL_NONE);