如何使用硬件视频缩放器?

Ale*_*x I 10 windows directx video image video-processing

现代图形卡具有硬件视频缩放器,例如作为AMD Avivo,NVIDIA PureVideo或Intel ClearVideo的一部分.例如,AMD的Avivo白皮书说:

"图像输出缩放器支持多达6个垂直滤波器抽头和多达10个水平滤波器抽头.这些缩放器是高度可编程的高精度多相缩放器;它们适用于几乎任何比例的放大,或最多4个缩小:1".

问题: 如何从Windows程序中使用视频缩放器硬件?

假设已经存在解码的视频帧,例如在a中IDirect3DSurface9,并且目标是使用硬件缩放器在屏幕上显示该视频帧.我想使用像Media Foundation或DirectShow这样的Windows API,而不是使用特定于供应商的API.我主要兴趣倍增通过一个相当大的因素左右1.5-3x.

第二个问题是,如何控制视频缩放器硬件参数?(例如,上述多相滤波器中的滤波器系数)

编辑:赏金开始了.请提供在视频卡中使用视频缩放器硬件的任何方式的示例(这可能是特定于供应商的,或使用任何版本的DirectX/DirectShow/Media Foundation API).

编辑:更新:使用视频缩放器硬件的程序的一些示例:WinDVD,PowerDVD,madVR.我想知道如何完成他们的工作,即使用GPU的内置视频硬件缩放器,而不是使用D3D着色器和纹理采样器实现的缩放器.

Ale*_*x I 4

一些可能的方法是:

  1. 用于MFCreateVideoRenderer创建 EVR 媒体接收器,并调用IMFVideoDisplayControl::SetRenderingPrefs设置MFVideoRenderPrefs_AllowScaling标志(或使用IMFAttributes并设置EVRConfig_AllowScaling属性),然后调用IMFVideoDisplayControl::SetVideoPosition定义结果的缩放方式。这是增强型视频渲染器 (EVR) 的一部分。

  2. 使用IDirectXVideoProcessor::VideoProcessBlt并设置DXVA2_VideoProcessBltParams::ConstrictionSize定义如何缩放结果。这也是基于 EVR/DXVA。

  3. (ananthonline 建议)使用Video Resizer DSP并使用IWMResizerProps::SetFullCropRegion(或MFPKEY_RESIZE_DST_WIDTHMFPKEY_RESIZE_DST_HEIGHT)缩放结果。这既是 DirectX 媒体对象 (DMO) 又是媒体基础转换 (MFT)。注意:视频MFT具有MF_SA_D3D_AWARE属性,可用于查询是否支持DirectX 3D硬件加速,可以通过发送消息来启用MFT_MESSAGE_SET_D3D_MANAGER

  4. 使用视频处理器 MFT并设置IMFVideoProcessorControl::SetConstrictionSize缩放结果。这是一个 MFT。

  5. 使用 DirectX 3D 设备并调用StretchRect来缩放表面。注意:这显然不使用视频缩放器硬件,它使用纹理采样器硬件。纹理可以在四边形上渲染,具有类似的效果。

我仍然不确定这些方法中的哪一个(如果有的话)使用视频缩放器硬件。至少方法 1 和 2 可能会,因为它们直接与 EVR/DXVA 相关;如果通过 DXVA 加速,方法 3 和 4 也可能有效。仍然需要明确的答案,最好是参考文档和/或代码示例。