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