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 已添加到所有模式,此外,还向 _QVBR1添加了 VBVCapacity 和 InitialVBVFullness。
启用 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,已更新 D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2 的成员 MaxSubregionsNumber、SubregionBlockPixelsSize 和 QPMapRegionPixelsSize 的语义。
添加了_D3D12DDI_VIDEO_ENCODER_AV1_SEQUENCE_STRUCTURE_0095 , 并将 pAV1SequenceStructure 添加到 D3D12DDI_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_0082_0。
编码操作
AV1 的预期比特流标头值
驱动程序/主机标头编码责任
给定具有 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 元素是根据相关的 tile 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 进行编码。
编码帧提交按编码顺序排列,就像 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 的已解析缓冲区布局。