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、机器学习和游戏流式传输。

在 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 视频编码。

测试

以下测试包含在 Windows Hardware Lab Kit (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(10bit) 使用不同的分辨率、GOP 模式、切片模式和其他编解码器配置对输入视频进行转码,并针对输入视频流差异验证输出编码视频是否可接受。 此比较可使用峰值信噪比 (PSNR) 完成。
EncodeSubregions/ResolutionReconfiguration 验证实时重新配置。
EncodeH264LongTermReferences 验证长期图片引用的使用。
EncodeIntraRefresh 使用打开的 IPP...P...P... GOP 验证帧内刷新的简单方案。
VideoEncodeCommandListFeatures 验证视频编码命令列表的预测和标记。
VideoEncodeTimestamps 验证视频编码命令列表的时间戳。

视频编码方案

OneCore

D3D12 视频编码支持会在仅 D3D12 可用的平台上启用可移植硬件加速视频编码。 这包括云计算和 IoT 平台使用的各种 OneCore SKU。 这些方案中提供了视频编码加速,而无需使用平台特定解决方案。

媒体 API

所有硬件供应商都可以以低级别和可移植方式访问视频编码功能。 这允许更高级别的媒体 API(如媒体基础)在此 API 的基础上构建其媒体层,这些层负责抽象化不同的硬件平台。 鉴于 API 的低级别设计,这些更高级别的媒体层可以针对其方案进行优化,方法是精细控制视频编码会话的同步和内存分配/驻留方面,例如完全控制参考图片管理和位流标头写入职责。 通过将这种将职责转移到位于此 API 上的层的转化,还允许硬件供应商在媒体层中拥有一组一致的编码策略(例如自适应 GOP 等 DPB 启发),可在不同的硬件平台上重复使用这些策略。

与 D3D 图形、计算和机器学习的互操作性

D3D12 视频编码 API 可在 D3D12 视频编码和 D3D12 图形、计算和机器学习方案之间实现高效互操作性,这与通过相机流运行机器学习推理等方案相关。

游戏流式传输方案

D3D12 视频编码 API 支持需要高性能低级别 API 的游戏流式传输方案。