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
を使用して設定します。
kParamIndexQpOffsetMapBuffer
は C2InfoBuffer
のバイト配列で、以下の属性を持ちます。
長さ: 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")
}
ここで、
top
、left
: 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 つだけ保持し、残りの構成を無視しなければなりません。構成は以下に示す優先順位で保持されます。
|