在Windows 8.1之前,Media Foundation 仅支持工作室亮度范围,因此对扩展范围图像的解释会导致对比度增加,如上面的第一张图像所示。 从Windows 8.1开始,Media Foundation 管道使用这些结构和枚举向 Windows 显示驱动程序模型 (WDDM) 1.3 及更高版本的用户模式显示驱动程序指示是否正在播放或捕获扩展范围或工作室范围的 YUV 内容:
新枚举
- D3D11_1DDI_VIDEO_PROCESSOR_NOMINAL_RANGE
- DXVAHDDDI_NOMINAL_RANGE
更改了结构和枚举
- D3D11_1DDI_VIDEO_PROCESSOR_COLOR_SPACE
- D3D11_1DDI_VIDEO_PROCESSOR_DEVICE_CAPS
- DXVAHDDDI_BLT_STATE_OUTPUT_COLOR_SPACE_DATA
- DXVAHDDDI_STREAM_STATE_INPUT_COLOR_SPACE_DATA
- DXVAHDDDI_VPDEVCAPS
WDDM 1.3 及更高版本的用户模式显示驱动程序必须支持所有这些新的和更改的结构和枚举。
1. 核心枚举与结构的作用
(1) 新增枚举
枚举名称 | 用途 |
---|---|
D3D11_1DDI_VIDEO_PROCESSOR_NOMINAL_RANGE | 定义视频处理器的动态范围模式(扩展/工作室范围),供驱动识别输入数据的YUV范围。 |
DXVAHDDDI_NOMINAL_RANGE | 用于DXVA-HD(高清视频加速)的相同功能,兼容旧硬件加速方案。 |
(2) 修改的结构
结构名称 | 关键改动 |
---|---|
D3D11_1DDI_VIDEO_PROCESSOR_COLOR_SPACE | 新增字段指示动态范围(NominalRange ),并扩展色彩空间支持(如BT.2020)。 |
D3D11_1DDI_VIDEO_PROCESSOR_DEVICE_CAPS | 增加驱动能力查询,如是否支持扩展范围处理。 |
DXVAHDDDI_BLT_STATE_OUTPUT_COLOR_SPACE_DATA | 输出色彩空间配置,包含动态范围标记。 |
DXVAHDDDI_STREAM_STATE_INPUT_COLOR_SPACE_DATA | 输入流的色彩空间配置,支持动态范围声明。 |
DXVAHDDDI_VPDEVCAPS | 报告驱动支持的视频处理能力,包括动态范围处理支持。 |
2. 数据流与驱动交互流程
(1) 应用层到驱动层的通知
- Media Foundation 设置媒体类型:应用通过 MF_MT_VIDEO_NOMINAL_RANGE 标记输入为 MFNominalRange_0_255(扩展范围)。
pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255);
- Direct3D 视频处理器初始化:Media Foundation 调用 Direct3D 11.1 API,将范围信息传递到驱动:
D3D11_1DDI_VIDEO_PROCESSOR_COLOR_SPACE colorSpace = {}; colorSpace.NominalRange = D3D11_1DDI_VIDEO_PROCESSOR_NOMINAL_RANGE_0_255; // 扩展范围
- 驱动处理:WDDM 1.3+ 驱动读取 NominalRange 字段,避免对扩展范围内容进行错误的范围转换。
(2) 硬件加速路径
- DXVA-HD 路径:通过 DXVAHDDDI_STREAM_STATE_INPUT_COLOR_SPACE_DATA 传递范围信息,驱动直接处理 YUV 数据。
- D3D11 视频API路径:使用 D3D11_1DDI_VIDEO_PROCESSOR_NOMINAL_RANGE 确保着色器或固定功能单元正确处理动态范围。
3. WDDM 1.3 驱动的强制要求
从 Windows 8.1 开始,用户模式显示驱动必须支持以下功能:
动态范围识别:解析 D3D11_1DDI_VIDEO_PROCESSOR_NOMINAL_RANGE 和 DXVAHDDDI_NOMINAL_RANGE,区分扩展/工作室范围。
色彩空间一致性:在混合不同范围的视频流时(如叠加字幕),需正确处理动态范围转换。
能力上报:通过 DXVAHDDDI_VPDEVCAPS 的 DevCaps 字段声明是否支持扩展范围处理
4. 开发者注意事项
(1) 兼容性检查
在初始化视频处理器时,应检查驱动能力:
DXVAHDDDI_BLT_STATE_OUTPUT_COLOR_SPACE_DATA outputColorSpace = {};
outputColorSpace.NominalRange = DXVAHDDDI_NOMINAL_RANGE_16_235; // 输出为工作室范围
(2) 多范围混合场景
当同时处理工作室范围和扩展范围内容时(如视频+字幕),需显式配置输出范围:
DXVAHDDDI_BLT_STATE_OUTPUT_COLOR_SPACE_DATA outputColorSpace = {};
outputColorSpace.NominalRange = DXVAHDDDI_NOMINAL_RANGE_16_235; // 输出为工作室范围
5. 故障排查与调试
常见问题:
驱动未正确处理 NominalRange 会导致画面发灰(扩展范围被当作工作室范围压缩)。
调试工具:
Windows Performance Analyzer (WPA):检查 Media Foundation 管道的范围标记传递。
GPUView:验证驱动是否收到正确的 D3D11_1DDI_VIDEO_PROCESSOR_COLOR_SPACE。
6. 向后兼容性
- 旧驱动(WDDM 1.2及以下):忽略动态范围标记,强制按工作室范围处理,需应用层手动转换。
- HDR扩展(Windows 10+):动态范围标记与HDR元数据(如 DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020)协同工作。