Windows 图形显示驱动开发-WDDM 3.2- D3D12 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 元素是从相关磁贴 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 Encode API 中实现的其他编解码器类似。

分辨率更改和空间可伸缩性

如果驱动程序报告 D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE,,它仍仅适用于关键帧上的分辨率更改。

活动序列标头的 max_frame_*_minus_1 语法必须设置为所使用的相关 ID3D12VideoEncoderHeap 中存在的最大分辨率。 使用分辨率的不同帧也存在于关联的 ID3D12VideoEncoderHeap 中,可以使用 AV1 语法frame_size_override_flag in frame_size() 来传达分辨率更改。

如果支持 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
  • D3D12DD1_VIDEO_ENCODER_AV1_PICTURE_CONTROL_0095_FLAGS
  • D3D12DDI_VIDEO_ENCODER_AV1_RESTORATION_CONFIG_0095
  • D3D12DDI_VIDEO_ENCODER_AV1_SEGMENT_DATA_0095
  • D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_CONFIG_0095
  • D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MAP_0095
  • D3D12DDI_VIDEO_ENCODER_CODEC_AV1_LOOP_FILTER_CONFIG_0095
  • D3D12DDI_VIDEO_ENCODER_CODEC_AV1_LOOP_FILTER_DELTA_CONFIG_0095
  • D3D12DDI_VIDEO_ENCODER_CODEC_AV1_QUANTIZATION_CONFIG_0095
  • D3D12DDI_VIDEO_ENCODER_CODEC_AV1_QUANTIZATION_DELTA_CONFIG_0095
  • D3D12DDI_VIDEO_ENCODER_AV1_CDEF_CONFIG_0095
  • D3D12DDI_VIDEO_ENCODER_AV1_PICTURE_CONTROL_CODEC_DATA_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
  • D3D12DDI_VIDEO_ENCODER_AV1_POST_ENCODE_VALUES_0095

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

相关推荐
lucky67072 小时前
Windows 上彻底卸载 Node.js
windows·node.js
编程小白20263 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
凯子坚持 c4 小时前
CANN 性能剖析实战:从原始事件到交互式火焰图
windows·microsoft
开开心心就好5 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
獨枭5 小时前
PyCharm 跑通 SAM 全流程实战
windows
仙剑魔尊重楼6 小时前
音乐制作电子软件FL Studio2025.2.4.5242中文版新功能介绍
windows·音频·录屏·音乐·fl studio
PHP小志6 小时前
Windows 服务器怎么修改密码和用户名?账户被系统锁定如何解锁
windows
专注VB编程开发20年8 小时前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
仙剑魔尊重楼8 小时前
专业音乐制作软件fl Studio 2025.2.4.5242中文版新功能
windows·音乐·fl studio
rjc_lihui9 小时前
Windows 运程共享linux系统的方法
windows