D3DDDICAPS_FILTERPROPERTYRANGE请求类型
UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含传递D3DDDICAPS_FILTERPROPERTYRANGE请求类型时特定视频流上特定筛选器设置允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的筛选器设置指定DXVADDI_QUERYFILTERPROPERTYRANGEINPUT结构。
功能概述
D3DDDICAPS_FILTERPROPERTYRANGE请求类型允许应用程序查询视频处理器支持的过滤器属性(如降噪强度、边缘增强等)的有效参数范围,用于精细控制视频后处理效果。
关键数据结构
输入结构 (DXVADDI_QUERYFILTERPROPERTYRANGEINPUT)
typedef struct _DXVADDI_QUERYFILTERPROPERTYRANGEINPUT {GUID VPGuid; // 视频处理器GUIDDXVADDI_VIDEODESC VideoDesc; // 视频流描述DXVA2_FilterProperty Prop; // 过滤器属性类型
} DXVADDI_QUERYFILTERPROPERTYRANGEINPUT;
输出结构 (DXVADDI_VALUERANGE)
typedef struct _DXVADDI_VALUERANGE {DXVA2_Fixed32 MinValue; // 最小值(Fixed32格式)DXVA2_Fixed32 MaxValue; // 最大值DXVA2_Fixed32 DefaultValue; // 默认值DXVA2_Fixed32 StepSize; // 步进增量
} DXVADDI_VALUERANGE;
过滤器属性枚举 (DXVA2_FilterProperty)
typedef enum {DXVA2_FilterProperty_NoiseFilterLumaLevel, // 亮度降噪DXVA2_FilterProperty_NoiseFilterLumaThreshold, // 亮度阈值DXVA2_FilterProperty_NoiseFilterLumaRadius, // 亮度半径DXVA2_FilterProperty_NoiseFilterChromaLevel, // 色度降噪// ...其他过滤器属性
} DXVA2_FilterProperty;
驱动程序实现规范
标准处理逻辑
case D3DDDICAPS_FILTERPROPERTYRANGE: {// 参数验证if (pArgs->DataSize < sizeof(DXVADDI_VALUERANGE)) {pArgs->DataSize = sizeof(DXVADDI_VALUERANGE);return E_INVALIDARG;}DXVADDI_QUERYFILTERPROPERTYRANGEINPUT* pInput = (DXVADDI_QUERYFILTERPROPERTYRANGEINPUT*)pArgs->pInfo;DXVADDI_VALUERANGE* pRange = (DXVADDI_VALUERANGE*)pArgs->pData;// 根据属性类型设置范围switch (pInput->Prop) {case DXVA2_FilterProperty_NoiseFilterLumaLevel:pRange->MinValue = DXVA2_Fixed32(0.0f); // 0%pRange->MaxValue = DXVA2_Fixed32(1.0f); // 100%pRange->DefaultValue = DXVA2_Fixed32(0.5f);// 50%pRange->StepSize = DXVA2_Fixed32(0.01f); // 1%步进break;case DXVA2_FilterProperty_NoiseFilterLumaRadius:pRange->MinValue = DXVA2_Fixed32(1.0f); // 1像素pRange->MaxValue = DXVA2_Fixed32(5.0f); // 5像素pRange->DefaultValue = DXVA2_Fixed32(2.0f);pRange->StepSize = DXVA2_Fixed32(1.0f); // 整像素步进break;// 其他属性处理...}pArgs->DataSize = sizeof(DXVADDI_VALUERANGE);return S_OK;
}
高级实现策略
动态范围调整
// 根据视频分辨率调整范围
if (pInput->VideoDesc.SampleWidth > 1920) {// 4K视频使用更精细的降噪pRange->StepSize = DXVA2_Fixed32(0.005f); pRange->MaxValue = DXVA2_Fixed32(0.8f); // 限制最大强度
}
硬件能力检测
// 检查硬件是否支持高级过滤
if (!CheckHardwareFilterSupport(pInput->Prop)) {pRange->MinValue = pRange->MaxValue = pRange->DefaultValue;pRange->StepSize = DXVA2_Fixed32(0.0f); // 固定值
}
错误处理规范
不支持的属性
if (!IsSupportedFilterProperty(pInput->Prop)) {return DXVA2_E_UNSUPPORTED_PROPERTY;
}
无效视频格式
if (pInput->VideoDesc.SampleFormat == D3DDDIFMT_UNKNOWN) {return E_INVALIDARG;
}
实际应用示例
运行时查询流程
// 准备查询参数
DXVADDI_QUERYFILTERPROPERTYRANGEINPUT input = {DXVA2_VideoProcProgressiveDevice,{1920, 1080, D3DDDIFMT_NV12, ...},DXVA2_FilterProperty_NoiseFilterLumaLevel
};DXVADDI_VALUERANGE range;
D3DDDIARG_GETCAPS args = {D3DDDICAPS_FILTERPROPERTYRANGE,&input,&range,sizeof(DXVADDI_VALUERANGE)
};// 执行查询
if (SUCCEEDED(pDevice->GetCaps(&args))) {float minLevel = FixedToFloat(range.MinValue);float maxLevel = FixedToFloat(range.MaxValue);// 配置UI控制范围...
}
Fixed32转换工具函数
// Fixed32转换为浮点数
inline float FixedToFloat(DXVA2_Fixed32 fixed) {return fixed.value + (fixed.fraction / 65536.0f);
}// 浮点数转换为Fixed32
inline DXVA2_Fixed32 FloatToFixed(float f) {DXVA2_Fixed32 fixed;fixed.value = static_cast<SHORT>(f);fixed.fraction = static_cast<USHORT>((f - fixed.value) * 65536.0f);return fixed;
}
此机制使应用程序能够:
- 精确了解各视频过滤器的可调参数范围
- 提供专业的视频质量控制界面
- 实现基于硬件能力的动态功能调整
- 确保参数设置的有效性和安全性