VMR9 против EVR: как использовать ImageCompositor с EVR?

Я закодировал компилятор / тестер PixelShader, который работает в реальном времени с источником изображения или видео, воспроизводимого с использованием DirectShow.Net + VMR9.

И все было хорошо, пока я не решил попробовать его как настоящий видеоплеер и не начал настраивать каждый его бит, чтобы он работал должным образом (заголовки и т. Д.).

Затем я обнаружил, что видео очень пиксельное (плохо интерполированное) на Windows7 с графическим процессором ATI. Решение было пойти с 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.NET, Mediafoundation.NET, Managed DX9.

Какое решение этой проблемы? Есть какие-нибудь рекомендации, как это сделать с EVR?

Большое тебе спасибо!


person Marino Šimić    schedule 07.04.2011    source источник


Ответы (1)


Поскольку ни у кого не было предложений, я немного покопался и думаю, что нашел решение:

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

Теперь это нужно сделать в настраиваемом презентаторе ...

person Marino Šimić    schedule 08.04.2011
comment
Проголосовали за ваш ответ, потому что любой, кто не получает ответа, находит свой и делится им с остальными, заслуживает одобрения. - person Stevens Miller; 17.03.2012