D3D12 AV1 ビデオ エンコード

Direct3D12 ビデオ エンコード機能は、Windows 11 バージョン 24H2 (WDDM 3.2) 以降の AV1 エンコードをサポートするよう拡張されています。 この記事では、AV1 エンコードをサポートするために既存の D3D12 ビデオ エンコード DDI に変更と新しい構造が必要となる拡張ポイントについて説明します。 アプリケーション レベルの仕様を含む詳細については、「AV1 D3D12 ビデオ エンコード仕様」を参照してください。

レート制御の拡張機能

次の既存の列挙型は、レート制御とレート制御のサポートの拡張機能によって更新されます。

D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAG_0096_ENABLE_EXTENSION1_SUPPORT が有効になっている場合、拡張レート制御の構造体が D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS_0080_2.pConfiguration_XXX で使用されます。それ以外の場合、D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080 リファレンス ページに記載されている表に従って無効になっているときにレガシ構造体が使用されます。

ビデオ エンコードのサポート拡張機能

AV1 ビデオ エンコードのサポートと機能をドライバーが報告できるようにするために、既存のビデオ関連フレームワークが拡張されました。 このセクションでは、AV1 ビデオ エンコードのサポートのクエリとレポートに使用される、追加または更新された構造体と列挙型の一覧を示します。

エンコード操作

AV1 に期待されるビットストリーム ヘッダー値

ドライバー/ホスト ヘッダーのコーディングの役割

エンコードされたフレームに K タイルがある場合、ドライバーは、EncodeFrame 引数の要求されたタイルに対応する K decode_tile() AV1 構文要素を圧縮ビットストリームに書き込みます。

次に、API クライアントは、tile_start_and_end_present_flag/tg_start/tg_end 要素を含む tile_group_obu() AV1 構文要素を構築し、タイルが順番に配置される条件に合わせてタイルをタイル グループに配置します。 tile_size_minus_1 要素は、関連するタイル D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA 情報からコード化され、decode_tile() 要素が圧縮されたビットストリーム バッファーからコピーされます。 最後に、各 tile_group_obu() は OBU_TILE_GROUP 型の open_bitstream_unit() 要素の周りにラップされ、OBU_FRAME_HEADER が先頭に付加されます。 単一のタイル グループの場合、代わりに OBU_FRAME 型を使用できます。

API クライアントは、現在のフレームの !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1) としてobu_extension_flag を推論し、必要に応じて、open_bitstream_unit() で temporal_id と spatial_id をコード化します。

EncodeFrame 送信は、D3D12 エンコード API に実装されている他のコーデックと同様にエンコード順です。

解決の変更と空間スケーラビリティ

ドライバーが D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE を報告した場合でも、キー フレームの解像度の変更にのみ適用されます。

アクティブなシーケンス ヘッダーには、使用されている関連する ID3D12VideoEncoderHeap に存在する最大解像度に max_frame_*_minus_1 構文が設定されている必要があります。 関連する ID3D12VideoEncoderHeap にも存在する解像度を使用する各種フレームでは、frame_size() で AV1 構文 frame_size_override_flag を使用して、解像度の変更を伝えることができます。

D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME がサポートされている場合、参照フレームは、エンコードされている現在のスイッチ フレーム以上の解像度をポイントする必要があり、使用されている関連する ID3D12VideoEncoderHeap に各種の解像度がすべて存在している必要があります。

同様に、空間スケーラビリティがサポートされている場合、参照フレームの各種解像度がすべて、使用されている関連する ID3D12VideoEncoderHeap に存在している必要があります。

レート制御に関するメモ

D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_QVBR1_0096.ConstantQualityTarget の許容範囲は [0..63] です。 最も低い値を指定すると、品質が最高になります。

一般に、D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE は、速度に対する品質の調整、および各種レート制御モードのレート制御パラメーター (一定の QP における QP、CBR、VBR、QVBR における品質レベル) に適用されます。 ドライバーは、サポートされていない他のレート制御パラメーターの再構成の D3D12DDI_VIDEO_ENCODER_OUTPUT_METADATA_0083_0.EncodeErrorFlags で、D3D12DDI_VIDEO_ENCODER_ENCODE_ERROR_FLAG_0082_0_RECONFIGURATION_REQUEST_NOT_SUPPORTED を返すことができます。

エンコード操作 API

AV1 エンコード操作をサポートするため、次の構造体と列挙型が拡張機能で追加または更新されます。

さらに、ドライバーの既存の PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 コールバックを更新し、AV1 エンコード用に追加された AV1 固有の解決済みバッファー レイアウトを処理する必要があります。