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 磁贴的编码帧,驱动程序将在压缩位流中写入 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 编码操作:

此外,还需要更新现有驱动程序的 PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 回调,以处理专为 AV1 编码而添加的特定于 AV1 的已解析缓冲区布局。