D3D12 视频编码
本文为驱动程序开发人员提供有关 Direct3D12 视频编码功能的一般信息。 有关详细信息(包括应用程序级细节),请参阅 D3D 视频编码规范。
关于 Direct3D 12 视频编码
在 Windows 11(WDDM 3.0)之前,DirectX 12 提供了应用程序和驱动程序级接口(API 和 DDI),以支持多个视频应用程序的 GPU 加速,包括视频解码、视频处理和运动估计。
从 Windows 11 开始,D3D12 向现有视频 API/DDI 系列添加了视频编码功能。 此功能提供一组一致的编码 API/DDI,这些 API/DDI 与现有的 D3D12 框架一致,并允许开发人员使用 GPU 加速的视频引擎执行视频编码。
视频编码框架提供对视频编码器硬件加速功能的访问权限。 它可用于不同的方案,例如物联网(IoT)、云、媒体 API、机器学习(ML)和游戏流式处理。
Windows 11 版本 24H2(WDDM 3.2)中添加了对 AV1 编码的支持。 有关详细信息,请参阅 D3D12 AV1 视频编码。
支持的编解码器
从 Windows 11 开始,支持的编解码器为 H.264 和 HEVC,尽管 D3D12 视频编码框架为新的编解码器(如 AV1)提供了开放扩展性。
框架接口的编解码器特定方面将委托给编解码器特定结构及其对联合类型的访问权限。 例如,D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 结构包含一个联合,其中包含指向编解码器特定 D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_0082_0 的指针,以及包含编解码器特定配置信息的 D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_0082_0 结构。
为了在扩展性上保留二进制接口兼容性,联合类型始终包含指向编解码器特定结构的指针。 根据主机体系结构的指针大小,联合类型具有固定大小。 此决定还阻止包含联合类型成员(或含有匿名成员)的结构在扩展接口时更改其类型大小。 某些联合仅包含指向枚举类型的指针;为了保持一致,这些枚举类型也作为指针引用,在这种情况下,新编解码器需要一些比枚举更复杂的类型,以便表示这些概念。
报告视频编码支持和功能
扩展了与视频相关的现有框架,以允许驱动程序报告视频编码支持和功能。
D3D12DDI_FEATURE_VERSION_VIDEO_0083_0 是版本号,用于定义 Windows 11 中引入的所有 D3D12 视频编码里程碑的第一个完整实施。
D3D12DDICAPS_TYPE_VIDEO_0020 枚举已扩展为包括以下视频编码支持值:
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC = 31,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_PROFILE_LEVEL = 32,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION_RATIOS_COUNT = 33,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION = 34,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INPUT_FORMAT = 35,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RATE_CONTROL_MODE = 36,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INTRA_REFRESH_MODE = 37,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_FRAME_SUBREGION_LAYOUT_MODE = 38,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_HEAP_SIZE = 39,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_CONFIGURATION_SUPPORT = 40,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_SUPPORT = 41,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT = 42,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RESOURCE_REQUIREMENTS = 43
D3D 运行时会调用驱动程序的 PFND3D12DDI_VIDEO_GETCAPS 回调来查询视频编码支持。
支持视频编码的驱动程序为 D3D 运行时提供了指向 D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0 结构中的视频编码回调函数的指针。
D3D12 视频编码回调函数
驱动程序实现以下回调函数以支持 D3D12 视频编码。
创建表示视频编码器的驱动程序对象:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERSIZE_0082_0 会计算 D3D 运行时需要为驱动程序对象分配的内存量。
PFND3D12DDI_CREATEVIDEOENCODER_0082_0 创建保存视频编码会话状态的实际视频编码器对象。
创建表示视频编码器堆的驱动程序对象:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERHEAPSIZE_0080_2 会计算 D3D 运行时需要为驱动程序对象分配的内存量。
PFND3D12DDI_CREATEVIDEOENCODERHEAP_0080_2 创建包含依赖于分辨率的驱动程序资源和状态的视频编码器堆对象。
对帧进行编码:
PFND3D12DDI_VIDEO_ENCODE_FRAME_0082_0 将编码帧操作记录到命令列表。
编码操作后,还必须调用 PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 才能将编码操作的输出元数据解析为可读格式。 驱动程序解析的元数据的布局类似于规范中图表
所示的示例。
销毁视频编码器和关联堆:
测试
以下测试包含在 Windows 硬件实验室工具包(WHLK)的一部分。 有关详细信息,请参阅 WHLK。
测试名称 | 描述 |
---|---|
CreateVideoEncoder | 根据报告的 CheckFeatureSupport 相关案例验证 VideoEncoder/VideoEncoderHeap 的创建。 |
SingleEncodeH264/HEVC | 用于结构图像基本检查的基于 QR 码的测试。 输入图像序列使用预定义的 QR 内容进行标记,然后进行编码和解码。 最后,会检查输出值(并在一定程度上检查质量),以确保与预期一致。 |
EncodeProfileLevelSuggestionsH264/HEVC | 验证根据 H.264/HEVC 规范和作为输入传递给 D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT 的配置,D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.SuggestedProfile/Level 值是预期值。 |
EncodeHeapSizeCap | 使用不同增加的输入参数验证增加的内存占用量。 |
SimpleGOPEncodeH264/HEVC(10 位) | 使用不同的分辨率、GOP 模式、切片模式和其他编解码器配置对输入视频进行转码,并针对输入视频流差异验证输出编码的视频是否可接受。 此比较是使用峰值信号与噪音比率(PSNR)完成的。 |
EncodeSubregions/ResolutionReconfiguration | 验证实时重新配置。 |
EncodeH264LongTermReferences | 验证长期图片引用的使用。 |
EncodeIntraRefresh | 使用打开的 IPP...P...P... GOP 验证帧内刷新的简单方案。 |
VideoEncodeCommandListFeatures | 验证视频编码命令列表的预测和标记。 |
VideoEncodeTimestamps | 验证视频编码命令列表的时间戳。 |
视频编码场景
OneCore
D3D12 视频编码支持会在仅 D3D12 可用的平台上启用可移植硬件加速视频编码。 这些模式包括云计算和 IoT 平台使用的各种 OneCore SKU。 这些方案中提供了视频编码加速,无需使用特定于平台的解决方案。
媒体 API
所有硬件供应商都可以以低级别和可移植的方式访问视频编码功能。 这种可访问性允许更高级别的媒体 API(如媒体基础架构)在此 API 的基础上构建其媒体层,该 API 负责抽象化处理不同的硬件平台。 鉴于 API 的低级别设计,这些更高级别的媒体层可以针对其方案进行优化,方法是精细控制视频编码会话的同步和内存分配/驻留方面,例如完全控制参考图片管理和位流标头写入职责。 这种责任转移到位于此 API 之上的层也允许硬件供应商在媒体层中具有一组一致的编码策略(例如 DPB 启发式策略,如自适应 GOP),这些策略可以跨不同的硬件平台重复使用。
与 D3D 图形、计算和机器学习的互操作性
D3D12 视频编码 API 可实现 D3D12 视频编码和 D3D12 图形、计算和 ML 方案之间的高效互操作性。 对于通过相机流运行 ML 推理等方案,这种互操作性很有趣。
游戏直播场景
D3D12 视频编码 API 支持需要高性能低级别 API 的游戏流式处理方案。