VMR9 vs EVR:如何使用ImageCompositor与EVR

本文关键字:EVR ImageCompositor 何使用 vs VMR9 | 更新日期: 2023-09-27 17:49:33

我已经编写了一个PixelShader编译器/测试器,它可以在使用DirectShow播放的图像或视频源上工作。Net + VMR9.

一切都很好,直到我决定把它作为一个真正的视频播放器,并开始调整它的每一点工作,因为它应该(标题等)。

然后我发现视频是非常像素化(严重插值)在Windows7与ATI gpu。解决办法是使用EVR。我做到了。除了一些背景闪烁和调整大小缓慢的小问题,我将尝试用一个自定义演示器来解决,它看起来都很好。

但是…

我失去了对输出视频应用像素着色的能力,因为在EVR FilterConfig接口上没有SetImageCompositor方法。

这是EVR接口:

[SuppressUnmanagedCodeSecurity]
[Guid("83E91E85-82C1-4ea7-801D-85DC50B75086")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IEVRFilterConfig
{
    void GetNumberOfStreams(out int pdwMaxStreams);
    void SetNumberOfStreams(int dwMaxStreams);
}

这是VMR9接口:

[Guid("5a804648-4f66-4867-9c43-4f5c822cf1b8")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[SuppressUnmanagedCodeSecurity]
public interface IVMRFilterConfig9
{
    int GetNumberOfStreams(out int pdwMaxStreams);
    int GetRenderingMode(out VMR9Mode Mode);
    int GetRenderingPrefs(out VMR9RenderPrefs pdwRenderFlags);
    int SetImageCompositor(IVMRImageCompositor9 lpVMRImgCompositor);
    int SetNumberOfStreams(int dwMaxStreams);
    int SetRenderingMode(VMR9Mode Mode);
    int SetRenderingPrefs(VMR9RenderPrefs dwRenderFlags);
}

我一直在使用这种方法与自定义图像合成器应用像素着色器:

    IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)vmr9;
    // frameManager is my custom class implementing IVMRImageCompositor9
    hr = filterConfig.SetImageCompositor(frameManager);
    DsError.ThrowExceptionForHR(hr);

现在我不能…

使用:VS2010, c#, DirectShow。净,Mediafoundation。. NET, Managed DX9.

这个问题的解决方案是什么?对EVR有什么指导方针吗?

非常感谢!

VMR9 vs EVR:如何使用ImageCompositor与EVR

由于没有人提出建议,我挖掘了一下,并认为我已经找到了可能的解决方案:

http://msdn.microsoft.com/en-us/library/bb530107 (v = vs.85) . aspx