D3D12 AV1 ビデオ エンコード
Direct3D12 ビデオ エンコード機能は、Windows 11 バージョン 24H2 (WDDM 3.2) 以降の AV1 エンコードをサポートするよう拡張されています。 この記事では、AV1 エンコードをサポートするために既存の D3D12 ビデオ エンコード DDI に変更と新しい構造が必要となる拡張ポイントについて説明します。 アプリケーション レベルの仕様を含む詳細については、「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 フラグが D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080 に追加され、拡張された D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1 クエリ上限と共に使用されます。
D3D12DDICAPS_VIDEO_ENCODER_SUPPORT1_DATA_0096 は、以前の D3D12DDICAPS_VIDEO_ENCODER_SUPPORT_DATA_0083_0 クエリを拡張するために追加され、構造体の下部にパラメーターが追加されています。 この拡張クエリは、すべての H264、HEVC、AV1 コーデックで使用でき、D3D12_FEATURE_VIDEO_ENCODER_SUPPORT セマンティクスとまったく同じように動作する必要があります。
D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2 の MaxSubregionsNumber、SubregionBlockPixelsSize、および QPMapRegionPixelsSize メンバーのセマンティクスが 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 が先頭に付加されます。 単一のタイル グループの場合、代わりに 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 エンコード操作をサポートするため、次の構造体と列挙型が拡張機能で追加または更新されます。
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 固有の解決済みバッファー レイアウトを処理する必要があります。