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;
}
此機制使應用程序能夠:
- 精確了解各視頻過濾器的可調參數范圍
- 提供專業的視頻質量控制界面
- 實現基于硬件能力的動態功能調整
- 確保參數設置的有效性和安全性