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 特定解析缓冲区布局。

相关推荐
忧虑的乌龟蛋3 分钟前
嵌入式Linux I2C驱动开发详解
linux·驱动开发·嵌入式·iic·i2c·读数据·写数据
伐尘1 小时前
【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64
windows·qt·visual studio
专注代码七年1 小时前
在Windows 境下,将Redis和Nginx注册为服务。
windows·redis·nginx
simple_whu7 小时前
开启WSL的镜像网络模式
windows·wsl
月上柳青8 小时前
linux-驱动开发之设备树详解(RK平台为例)
linux·驱动开发·dsp开发
modest —YBW11 小时前
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
人工智能·windows·docker·语言模型·llama
code在飞11 小时前
windows 部署 Kafka3.x KRaft 模式 不依赖 ZooKeeper
windows·分布式·zookeeper·kafka
不会飞的鲨鱼13 小时前
Windows系统下使用Kafka和Zookeeper,Python运行kafka(二)
windows·zookeeper·kafka
2501_915373881 天前
Electron 打包与发布指南:让你的应用运行在 Windows、macOS、Linux
windows·macos·electron
程序员JerrySUN1 天前
驱动开发硬核特训 · Day 30(下篇): 深入解析 lm48100q I2C 音频编解码器驱动模型(基于 i.MX8MP)
linux·驱动开发·架构·音视频