Direct3D12 ビデオ エンコード機能は、Windows 11 バージョン 24H2 (WDDM 3.2) 以降の AV1 エンコードをサポートするように拡張されています。 この記事では、既存の D3D12 ビデオ エンコード DDI で AV1 エンコード をサポートするための変更と新しい構造が必要な拡張機能のポイントについて説明します。 アプリケーション レベルの詳細を含む詳細については、 AV1 D3D12 ビデオ エンコード仕様を参照してください。
レート制御の拡張機能
次の既存の列挙体には、レート制御およびそのサポートの拡張機能が追加され、更新されます。
レート制御のサポート フラグがD3D12DDI_VIDEO_ENCODER_SUPPORT_FLAGS_0083_0に追加される
レート制御フラグがD3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080に追加される
次のエクステンション (エクステンション 1) D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_XXX1 構造体が追加され、それらを含むように D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS も更新されます。 QualityVsSpeed はすべてのモードに追加され、 VBVCapacity と InitialVBVFullness も _QVBR1 に追加されます。
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 ビデオ エンコードのサポートのクエリとレポートに使用される、追加または更新された構造と列挙体の一覧を示します。
D3D12DDI_FEATURE_VERSION_VIDEO_0095_0 は、Windows 11 バージョン 24H2 (WDDM 3.2) で導入されたすべての D3D12 ビデオ エンコード マイルストーンの最小実装を定義するバージョン番号です。
D3D12DDICAPS_TYPE_VIDEO_0020列挙体は、次のビデオ エンコードサポート値を含むように拡張されました。
- D3D12DDICAPS_TYPE_VIDEO_0095_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG
- D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1
D3D12DDI_VIDEO_ENCODER_CODEC_0095_AV1がD3D12DDI_VIDEO_ENCODER_CODEC_0080に追加される
ドライバーでサポートされている AV1 プロファイルを定義するために、 D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 列挙体が追加されました。 ドライバーは 、D3D12DDICAPS_VIDEO_ENCODER_INPUT_FORMAT_DATA_0080_2 を使用して、指定された D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 入力に対して必要に応じてサポートされる形式をクエリに報告します。
av1 プロファイル (pAV1Profile) を含むようにD3D12DDI_VIDEO_ENCODER_PROFILE_DESC_0080_2が更新されます。
AV1 エンコードをサポートするために、次の構造体と列挙体が追加または拡張されます。
D3D12DDI_VIDEO_ENCODER_AV1_LEVEL_TIER_CONSTRAINTS_0095 (pAV1LevelSetting が D3D12DDI_VIDEO_ENCODER_LEVEL_SETTING_0080_2 に追加されます)
D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0080 は、D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_UNIFORM_GRID_PARTITIONとD3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_CONFIGURABLE_GRID_PARTITIONを含むように拡張されます。
D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_EIGHTH_PIXEL_0095がD3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_0080に追加される
D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095 と D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095 と D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095 と D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095 と D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_CODEC_CONFIGURATION_SUPPORT、pAV1Support が D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_0083_0 に追加されました
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095 と D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_PICTURE_CONTROL_SUPPORT_0095、pAV1Support が D3D12DDI_VIDEO_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT_0080_2 に追加されました
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095 と D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_VALIDATION_0095_FLAGS
D3D12DDI_FEATURE_DATA_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_0095 と D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095
pAV1Config が D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 に追加される
D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAG_0080_SUBREGION_LAYOUT_MODE_NOT_SUPPORTED フラグは、拡張されたD3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1 クエリキャップで使用するために D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080 に追加されます。
D3D12DDICAPS_VIDEO_ENCODER_SUPPORT1_DATA_0096 が追加され、前の D3D12DDICAPS_VIDEO_ENCODER_SUPPORT_DATA_0083_0 クエリが拡張され、パラメーターが構造体の下部に追加されます。 この拡張クエリは、すべての H264、HEVC、AV1 コーデックで使用でき、D3D12_FEATURE_VIDEO_ENCODER_SUPPORTセマンティクスとまったく同じように動作する必要があります。
MaxSubregionsNumber、SubregionBlockPixelsSize、およびQPMapRegionPixelsSizeのメンバーのセマンティクスが、D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2でAV1用に更新されます。
_D3D12DDI_VIDEO_ENCODER_AV1_SEQUENCE_STRUCTURE_0095 が追加され、 pAV1SequenceStructure が D3D12DDI_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_0082_0に追加されます。
エンコード操作
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 エンコード操作をサポートするために、次の構造体と列挙体が拡張機能で追加または更新されます。
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_WARPED_MOTION_INFO_0095
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_DESCRIPTOR_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_LOOP_FILTER_DELTA_CONFIG_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_QUANTIZATION_DELTA_CONFIG_0095
pAV1PicData が D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_0082_0 に追加される
D3D12DDI_VIDEO_ENCODER_AV1_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_TILES_0095
pTilesPartition_AV1がD3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_0080_2に追加される
さらに、ドライバーの既存の PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 コールバックを更新して、AV1 エンコード用に追加された AV1 固有の解決済みバッファー レイアウトを処理する必要があります。