D3D12 AV1 視訊編碼
Direct3D12 視訊編碼功能已擴充,以支援從 Windows 11 版本 24H2 (WDDM 3.2) 開始的 AV1 編碼。 本文說明現有 D3D12 視訊編碼 DDI 需要修改和新結構以支援 AV1 編碼的延伸點。 如需包括應用層級特定數據的詳細資訊,請參閱 AV1 D3D12視訊編碼規格。
速率控制的延伸模組
下列現有的列舉會使用速率控制及速率控制支援的擴充功能來更新:
速率控制支援旗標會新增至 D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAGS_0083_0
會新增下列擴充式 (延伸模組 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
已 新增D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 列舉,以定義驅動程序支援的AV1配置檔。 驅動程式會使用 D3D12DDICAPS_VIDEO_ENCODER_INPUT_FORMAT_DATA_0080_2 來報告查詢指定 D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 輸入的選擇性支援格式。
D3D12DDI_VIDEO_ENCODER_PROFILE_DESC_0080_2更新為包含AV1設定檔 (pAV1Profile)。
新增或擴充下列結構和列舉以支援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語意完全相同。
AV1 的 MaxSubregionsNumber、子域BlockPixelsSize 和 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 的預期 bitstream 標頭值
驅動程式/主機標頭編碼責任
假設具有 K 圖格的編碼框架,驅動程式會在壓縮的位數據流中寫入 K decode_tile() AV1 語法元素,以對應至 EncodeFrame 自變數中要求的磚。
然後,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 用戶端負責推斷目前框架的obu_extension_flag !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1)
,並在open_bitstream_unit() 中視需要temporal_id和spatial_id程序代碼。
EncodeFrame 提交會依編碼順序排列,就像 D3D12 編碼 API 中實作的其他編解碼器一樣。
解決變更和空間延展性
如果驅動程式報告 D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE,它仍然只適用於主要畫面格上的解析度變更。
使用中序列標頭的 max_frame_*_minus_1 語法必須設定為所使用相關聯 ID3D12VideoEncoderHeap 中的最大解析度。 使用解析度的不同畫面格也會出現在相關聯的 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特定已解析緩衝區配置。