当前位置: 首页 > ds >正文

window 显示驱动开发-如何查询视频处理功能(六)

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;
}

此机制使应用程序能够:

  • 精确了解各视频过滤器的可调参数范围
  • 提供专业的视频质量控制界面
  • 实现基于硬件能力的动态功能调整
  • 确保参数设置的有效性和安全性
http://www.xdnf.cn/news/13588.html

相关文章:

  • (LeetCode 动态规划(基础版) )337. 打家劫舍 III (深度优先搜索dfs)
  • 智慧医疗能源事业线深度画像分析(下)
  • window 显示驱动开发-创建视频处理设备
  • android studio底部导航栏
  • Windows 上安装 devsidecar 后,使用 WSL ubuntu ssl 报错
  • redisson锁的可重入、可重试、超时续约原理详解
  • npm包 本地测试流程
  • 软件测试之单元测试详解
  • 2025年5月一区SCI-状态优化算法Status-based Optimization-附Matlab免费代码
  • 闸门远程控制系统的主要功能有哪些?
  • LeetCode-多语言实现冒泡排序以及算法优化改进
  • 数据可视化新姿势:Altair的声明式魔法
  • Ubuntu+k3s+karmada离线安装部署说明
  • shell正则表达式
  • GFS分布式文件系统
  • 汽车电子行业的高效研发利器——全星研发项目管理APQP软件系统
  • 中国汽车启动电池市场深度剖析:现状、趋势与展望
  • Linux 查看两个主机之间时间是否同步 - clockdiff命令详解
  • 前端面试六之axios
  • 408考研逐题详解:2009年第38题
  • 【Kubernetes】架构与原理:核心概念、组件协同及容器化部署解析
  • 【考研数学:高数6】一元函数微分学的应用(二)——中值定理、微分等式和微分不等式
  • 鼠标右键添加新建某种文件的方法
  • Go并发模型与模式:context 上下文控制
  • 01.pycharm整合conda
  • 华为OD最新机试真题-对称美学-OD统一考试(B卷)
  • WinForm中实现Adobe PDF Reader实现旋转PDF功能
  • opencv vs2020正确的环境配置
  • 《HarmonyOSNext终极UIAbility手册:从启动模式到页面跳转,一网打尽!》
  • 菌菇食用攻略:从营养解析到安全指南,解锁科学食菌