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

10
现代图形卡有硬件视频缩放器,例如AMD Avivo、NVIDIA PureVideo或Intel ClearVideo的一部分。例如,AMD的Avivo白皮书说:“图像输出缩放器支持高达6个垂直滤波器和高达10个水平滤波器。这些缩放器是高精度多相缩放器,具有高度可编程性;它们适用于按照任何比例放大或最多缩小4:1。”问题是:如何从Windows程序中使用视频缩放器硬件?假设已经存在一个已解码的视频帧,例如在IDirect3DSurface9中,并且目标是使用硬件缩放器在屏幕上显示该视频帧。如果可能的话,我想使用Windows API(如Media Foundation或DirectShow),而不是特定于供应商的API。我主要对1.5-3倍左右的放大感兴趣。
一个次要的问题是,如何控制视频缩放器硬件参数?(例如,上面提到的多相滤波器中的滤波器系数)。
编辑:开始悬赏。请提供使用视频卡中视频缩放器硬件的任何方式的示例(这可能是特定供应商的,也可能使用任何版本的DirectX / DirectShow / Media Foundation API)。
编辑:更新:一些使用视频缩放器硬件的程序的示例:WinDVD、PowerDVD、madVR。我想知道如何完成他们所做的事情,也就是使用GPU内置的视频硬件缩放器,而不是使用D3D着色器和纹理采样器实现的缩放器。
3个回答

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

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

  3. (由ananthonline建议) 使用 视频调整大小DSP 并使用 IWMResizerProps::SetFullCropRegion(或 MFPKEY_RESIZE_DST_WIDTHMFPKEY_RESIZE_DST_HEIGHT)来缩放结果。 这既是DirectX媒体对象(DMO),也是Media Foundation Transform(MFT)。 注意:视频MFT具有属性 MF_SA_D3D_AWARE,可用于查询它是否支持DirectX 3D硬件加速,并且可以通过发送 MFT_MESSAGE_SET_D3D_MANAGER 消息启用它。

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

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

我仍然不确定这些方法中,哪一个(如果有的话)使用了视频缩放器硬件。由于它们直接与EVR/DXVA相关联,因此至少方案1和2可能会使用硬件加速; 如果方案3和4也通过DXVA进行了加速,则它们也可能使用。最好能够给出权威的答案,并附上文档参考和/或代码示例。


谢谢!使用方法2(DXVA2_VideoProcessBltParams :: ConstrictionSize)的Direct3D对我有用! - sailfish009

2

仅仅访问硬件 - 使用Direct2D(Direct3D可能是更好的选择)即可。但是,如果要访问视频缩放器,则需要使用DirectShow或Windows Media Foundation(我并没有真正使用过这个)。

AFAIK(据我所知)-“Resizer DMO”滤镜将访问正确的硬件并为您执行视频调整大小。 这里 是一个使用此过滤器的代码示例。

编辑:如果您正在使用MFT,则Video Processor Filter 也应该是高效的。如文档中所述,“视频处理器支持使用Microsoft Direct3D 11进行GPU加速的视频处理。有关详细信息,请参见 MF_SA_D3D11_AWARE 。”

此外,还可以查看部分有关硬件MFT属性的信息,特别是MFT_ENUM_HARDWARE_URL_Attribute,它允许您检查该MFT是否是硬件实现的请注意,DXVA与Media Foundation集成,并将其功能公开为MFT。因此,硬件实现的MFT最有可能使用底层硬件,并且是Windows本身使用的方法。

希望这可以帮到您!


这很有前途。 "Video Resizer DSP"文档在此处:http://msdn.microsoft.com/en-us/library/windows/desktop/ff819491%28v=vs.85%29.aspx。它可以作为DMO或MF Transform使用。除了输入和输出宽度、裁剪等选项之外,唯一的选项是MFPKEY_RESIZE_QUALITY,可以是“高”或“低”。我们如何知道这使用硬件?在底层实现方面,这与VideoProcessBlt有何不同? - Alex I
看一下上面指向MFT_HARDWARE_URL_Attribute的部分。那将表明特定的MFT是否在硬件中实现。至于具体访问特定的视频缩放器 - 你可能需要编写特定设备的代码,也许需要专有驱动程序信息。这可能是从硬件无关的高级API中能做到的最好的事情了。 - Ani
因为您提出了一些新的方法,所以获得了悬赏奖励。 - Alex I
我曾尝试使用Direct3D11的视频处理器滤镜,但我的测试显卡是廉价的基于英特尔的显卡,只支持Direct3D 10.1,并且必须支持Windows 7平台,所以唯一的解决方案似乎是DirectShow。 - sailfish009

0

Direct2D 是微软间接访问图形硬件的方式。Direct2D Transform 可以进行缩放。你无法直接控制视频缩放器,但必须信任驱动程序为你选择正确的设置。


@AlexI,我提供的链接特别讲述了使用图形硬件,但不幸的是并没有详细说明。实际上,它可能使用的是3D功能而非视频,因为它是在Direct3D上层化的。我不确定图形硬件是什么,难道同样的路径用于两种目的吗? - Mark Ransom
我相信它们不是同一个东西。根据各种规格说明,视频缩放器使用的多点滤波器比3D纹理采样器中可用的任何东西都要多得多,因此它们可能是不同的硬件单元。 - Alex I
1
@AlexI - 我已经检查过了,你是正确的。Direct2D 就像使用纹理采样器来进行调整大小(而不是使用内置的硬件组件进行缩放、解码等)。 - Ani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接