DirectShow.Net + VMR9 を使用して再生中の画像またはビデオ ソースでライブで動作する PixelShader コンパイラ/テスターをコーディングしました。
そして、実際のビデオプレーヤーとして試してみることに決め、すべての部分を適切に機能するように調整し始めるまでは、すべて問題ありませんでした (タイトルなど)。
その後、ATI gpu を使用した Windows7 で、ビデオが非常にピクセル化されている (補間が不十分である) ことがわかりました。解決策は、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、マネージド DX9。
この問題の解決策は何ですか? EVR でそれを行う方法に関するガイドラインはありますか?
どうもありがとうございました!