Я кодировал компилятор / тестер 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?
Большое спасибо!