如何使用硬件video缩放器?

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

图像输出缩放器最多可支持6个垂直滤波器抽头和10个水平滤波器抽头,这些缩放器是高度精确的多相位缩放器,具有高度可编程性,适用于按任意比例放大,或缩小至4 :1“。

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

假设已经存在解码的video帧,例如在IDirect3DSurface9 ,目标是使用硬件缩放器在屏幕上显示该video帧。 我想使用Windows API(如Media Foundation或DirectShow),而不是使用特定于供应商的API(如果可能)。 我主要感兴趣的是1.5-3倍左右的相当大的因素。

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

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

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

Solutions Collecting From Web of "如何使用硬件video缩放器?"

只要访问硬件 – Direct2D(Direct3D可能是一个更好的选择)是好的。 但要访问视频缩放器,您需要使用DirectShow或Windows Media Foundation(我还没有真正使用过这个)。

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

编辑:如果您使用MFTs, 视频处理器过滤器也应该是效率。 如文档中所述,“视频处理器支持使用Microsoft Direct3D 11的GPU加速视频处理。有关更多信息,请参见MF_SA_D3D11_AWARE 。”

另外 – 请参阅硬件MFT属性的本节,尤其是MFT_ENUM_HARDWARE_URL_Attribute ,它可以让您检查MFT是否在硬件中实现 。 请注意, DXVA与Media Foundation集成并将其功能公开为MFT。 所以在硬件中实现的MFT很可能使用底层硬件,并且是Windows本身使用的方法。

希望这可以帮助!

一些可能的方法是:

  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消息来启用此MFT_MESSAGE_SET_D3D_MANAGER

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

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

我仍不确定哪些方法(如果有的话)使用视频定标器硬件。 至少方法1和方法2是可能的,因为它们直接与EVR / DXVA联系在一起; 方法3和4也可能在DXVA加速的情况下进行。 仍然需要一个明确的答案,理想情况下参照文档和/或代码示例。

Direct2D是微软获取图形硬件的途径,尽管是间接的。 Direct2D转换不会缩放。 您不会直接控制视频缩放器,但必须相信驱动程序为您选择正确的设置。