次の方法で共有


D3D12 AV1 ビデオ エンコード

Direct3D12 ビデオ エンコード機能は、Windows 11 バージョン 24H2 (WDDM 3.2) 以降の AV1 エンコードをサポートするように拡張されています。 この記事では、既存の D3D12 ビデオ エンコード DDI で AV1 エンコード をサポートするための変更と新しい構造が必要な拡張機能のポイントについて説明します。 アプリケーション レベルの詳細を含む詳細については、 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が先頭に付加されます。 1 つのタイル グループの場合は、代わりにOBU_FRAMEの種類を使用できます。

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

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 固有の解決済みバッファー レイアウトを処理する必要があります。