10

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

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

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

假设已经存在解码的视频帧,例如在 aIDirect3DSurface9中,目标是使用硬件缩放器在屏幕上显示该视频帧。如果可能,我想使用像 Media Foundation 或 DirectShow 这样的 Windows API,而不是供应商特定的 API。我主要对以1.5-3左右的相当大的因子进行升级感兴趣。

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

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

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

4

3 回答 3

2

一些可能的方法是:

  1. 用于MFCreateVideoRenderer创建 EVR 媒体接收器,调用IMFVideoDisplayControl::SetRenderingPrefsMFVideoRenderPrefs_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. 使用Video Processor MFT并设置IMFVideoProcessorControl::SetConstrictionSize缩放结果。这是一个 MFT。

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

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

于 2012-12-14T20:16:40.720 回答
2

仅访问硬件 - Direct2D(Direct3D 可能是更好的选择)就可以了。但是要访问视频缩放器,您需要使用 DirectShow 或 Windows Media Foundation(我并没有真正使用过很多)。

AFAIK - “Resizer DMO”过滤器将访问正确的硬件并为您执行视频调整大小。是使用此过滤器的代码示例。

编辑:如果您使用 MFT,视频处理器过滤器也应该同样有效。如文档中所述,“视频处理器支持使用 Microsoft Direct3D 11 的 GPU 加速视频处理。有关详细信息,请参阅MF_SA_D3D11_AWARE。”

另请参阅有关硬件 MFT 属性的部分,尤其是MFT_ENUM_HARDWARE_URL_Attribute,它可以让您检查 MFT 是否在硬件中实现请注意, DXVA 与 Media Foundation 集成并将其功能公开为 MFT。所以在硬件上实现的MFT最有可能是使用底层硬件,是Windows自己使用的方法。

希望这可以帮助!

于 2012-12-10T21:57:21.307 回答
0

Direct2D是 Microsoft 获得对图形硬件的访问权的方式,尽管是间接的。Direct2D 转换进行缩放。您无法直接控制视频缩放器,但必须相信驱动程序会为您选择正确的设置。

于 2012-12-07T22:06:27.893 回答