RoI 実装に関する OEM ガイダンス

Android 15 では、関心領域(RoI)のユーザー構成を Android 動画エンコーディング フレームワークに統合するための、標準化されたプロセスが導入されています。この機能により、ユーザー構成を動画エンコーダに統合して分析するための公開 API が提供され、RoI の圧縮品質が向上します。

実装

SoC ベンダーと OEM は FEATURE_Roi フラグで、動画エンコーディングにおける RoI のサポートを制御できます。FEATURE_Roi が有効でない場合、動画エンコーダの動作に変更は発生しません。

動画フレームワークの変更点

このセクションでは、この機能を実装するために必要な動画フレームワークの変更について詳しく説明します。

Codec2 のキー

Android 15 では、量子化パラメータ マップ(QP_map)と長方形構成(rect)が RoI 構成のタイプとして定義されています。さらに、この新しいタイプをサポートするため、Codec2(C2)に 2 つのキーが導入されました。どちらのキーも、使用方法は公開 API と同じです。エンコーダのフレームループ内で、構成は、入力バッファがキューに入れられる前の実行段階で以下のように動的に調整されます。

  • 固定的なシナリオでは、現在のフレームに RoI 構成が指定されていない場合、エンコーダは前のフレームと同じ構成を使用します。

  • 動的なシナリオでは、RoI 構成のタイプは動的に変化します。

C2 の新しいキーについては、以降のセクションで説明します。

kParamIndexQpOffsetMapBuffer

kParamIndexQpOffsetMapBuffer キーは、フレームの qp-offset マップを示します。この値は setParameters の入力パラメータ PARAMETER_KEY_QP_OFFSET_MAP を使用して設定します。

kParamIndexQpOffsetMapBufferC2InfoBuffer のバイト配列で、以下の属性を持ちます。

  • 長さ: 1 フレームに含まれる 16x16 ブロックの数。

  • 値: 配列の各値は 16x16 ブロックの QP オフセットで、範囲は -51~51 です。目標最大符号化単位(LCU)の QP は、エンコーダ レート制御にオフセットを加えて計算します。計算結果が 0~51 の範囲を超える場合、値は 0~51 になるよう切り捨てられます。

    • 0 の場合: QP オフセットなし。QP は元のレート制御によって決まります。
    • 0 以外の場合: QP は元のレート制御 + オフセットです。
    • 負の場合: 目標 LCU で動画の品質が上がります。
    • 正の場合: 目標 LCU で動画の品質が下がります。
  • 使用方法: ユーザーは、このキーを 16x16 ブロックとして構成しなければなりません。エンコーダは、LCU の 16x16 ブロックの値を平均化することで、構成を実際の LCU サイズに調整します。

C2_PARAMKEY_QP_OFFSET_RECTS

C2_PARAMKEY_QP_OFFSET_RECTS キー(coding.qp-offset-rects に設定)は、RoI を QpOffset-Rects として設定します。この値は setParameters の入力パラメータ PARAMETER_KEY_QP_OFFSET_RECTS を使用して設定します。

このキーをサポートするために、以下の構造体 C2QpOffsetRectStruct が導入されています。

struct C2QpOffsetRectStruct : C2Rect {
  int32_t qpOffset;

  DEFINE_AND_DESCRIBE_C2STRUCT(QpOffsetRect)
  C2FIELD(width, "width")
  C2FIELD(height, "height")
  C2FIELD(left, "left")
  C2FIELD(top, "top")
  C2FIELD(qpOffset, "qp-offset")
}

ここで、

  • topleft: RoI の座標(長方形)。RoI は LCU の境界に合わせて引き伸ばされます。この値は各ピクセルの左上隅を表すため、((0,0), (16, 16)) で 16x16 ブロック全体が定義されます。

  • qpOffset: 配列の各値は、目標 rect 領域の QP オフセットを表します。定義と使用方法は kParamIndexQpOffsetMapBuffer 値と同じです。

マッピング アルゴリズム

下表に、公開キーから動画フレームワークへのマッピングを示します。

公開キーまたは API 動画フレームワークにおけるマッピング
PARAMETER_KEY_QP_OFFSET_MAP 値は C2InfoBuffer インスタンスとして kParamIndexQpOffsetMapBuffer に渡されます。
PARAMETER_KEY_QP_OFFSET_RECTS 値は String から Struct C2QpOffsetRectStruct に変換されて C2_PARAMKEY_QP_OFFSET_RECTS に渡されます。

エラー処理

OEM 実装は以下のエラーケースを処理しなければなりません。

エラーケース 処理
ベンダーキーと標準化されたキーの両方が、RoI をオンにするために使用される。 ユーザーが setFeatureEnabled(FEATURE_ROI) とベンダーキーの両方を呼び出して RoI をオンにする。 RoI をオンにしなければなりません。
QP オフセットが範囲内でも、SoC ベンダーにサポートされていない。 ユーザーが QP オフセットを 12 に設定しても、SoC は QP オフセットを 10 までしかサポートしていない。 サポートされる QP オフセットの範囲はベスト エフォートとして残されます。値は SoC のサポート範囲に固定されます。
複数の RoI 構成が(標準化されたキーかベンダー固有のキーかに関係なく)1 つのフレームに設定される。 ユーザーが標準化されたキーとベンダーキーの両方をフレーム 1 に使用する。 利用可能な場合、フレームワークは最初の標準化された rect 構成、最初の標準化された QP_map 構成、またはその両方を保持します。各カテゴリで、フレームワークは標準化された構成を 1 つだけ SoC に送信します。標準化された構成が利用可能な場合、SoC 実装はベンダー構成を無視しなければなりません。複数の構成が SoC に送信された場合、SoC ベンダーは RoI 構成を 1 つだけ保持し、残りの構成を無視しなければなりません。

構成は以下に示す優先順位で保持されます。

  1. 標準化された rect
  2. 標準化された QP_map
  3. ベンダー rect
  4. ベンダー QP_map