private IBaseFilter GetRendererFilter(EVideoRendererType videoRendererType) { switch (videoRendererType) { case EVideoRendererType.EnhancedVideoRenderer: var evr = new EnhancedVideoRenderer(); var evrFilter = (IBaseFilter)evr; // Initialize the EVR renderer with our custom video presenter var evrPresenter = EVRPresenter.Create(); ((IMFVideoRenderer)evr).InitializeRenderer(null, evrPresenter.VideoPresenter); // Configure the presenter with our hWnd var displayControl = (IMFVideoDisplayControl)evrPresenter.VideoPresenter; displayControl.SetVideoWindow(_hwnd); _customPresenter = evrPresenter; _customPresenter.NewSurfaceEvent += _player.NewSurface; _customPresenter.NewFrameEvent += _player.NewFrame; return(evrFilter); case EVideoRendererType.VideoMixingRenderer: var vmr = new VideoMixingRenderer9(); var vmrFilter = (IBaseFilter)vmr; var vmrPresenter = VMR9Presenter.Create(); // Initialize the VMR renderer with out custom video presenter var filterConfig = (IVMRFilterConfig9)vmr; filterConfig.SetRenderingMode(VMR9Mode.Renderless); filterConfig.SetNumberOfStreams(1); var surfaceAllocatorNotify = (IVMRSurfaceAllocatorNotify9)vmr; surfaceAllocatorNotify.AdviseSurfaceAllocator(IntPtr.Zero, vmrPresenter.SurfaceAllocator); vmrPresenter.SurfaceAllocator.AdviseNotify(surfaceAllocatorNotify); _customPresenter = vmrPresenter; _customPresenter.NewSurfaceEvent += _player.NewSurface; _customPresenter.NewFrameEvent += _player.NewFrame; return(vmrFilter); } return(null); }
/// <summary> /// Creates an instance of the EVR /// </summary> private IBaseFilter CreateEnhancedVideoRenderer(IGraphBuilder graph) { var evr = new EnhancedVideoRenderer(); var filter = evr as IBaseFilter; int hr = graph.AddFilter(filter, string.Format("Renderer: {0}", VideoRendererType.EnhancedVideoRenderer)); DsError.ThrowExceptionForHR(hr); /* QueryInterface for the IMFVideoRenderer */ var videoRenderer = filter as IMFVideoRenderer; if (videoRenderer == null) throw new Exception("Could not QueryInterface for the IMFVideoRenderer"); /* Create a new EVR presenter */ var presenter = EvrPresenter.CreateNew(); /* Initialize the EVR renderer with the custom video presenter */ hr = videoRenderer.InitializeRenderer(null, presenter.VideoPresenter); DsError.ThrowExceptionForHR(hr); var presenterSettings = presenter.VideoPresenter as IEVRPresenterSettings; if (presenterSettings == null) throw new Exception("Could not QueryInterface for the IEVRPresenterSettings"); presenterSettings.SetBufferCount(4); /* Use our interop hWnd */ IntPtr handle = HwndHelper.Handle; /* QueryInterface the IMFVideoDisplayControl */ var displayControl = presenter.VideoPresenter as IMFVideoDisplayControl; if (displayControl == null) throw new Exception("Could not QueryInterface the IMFVideoDisplayControl"); /* Configure the presenter with our hWnd */ hr = displayControl.SetVideoWindow(handle); DsError.ThrowExceptionForHR(hr); var filterConfig = filter as IEVRFilterConfig; if(filterConfig != null) filterConfig.SetNumberOfStreams(4); RegisterCustomAllocator(presenter); return filter; }
/// <summary> /// Creates an instance of the EVR /// </summary> private IBaseFilter CreateEnhancedVideoRenderer(IGraphBuilder graph, int streamCount) { EvrPresenter presenter; IBaseFilter filter; lock (m_videoRendererInitLock) { var evr = new EnhancedVideoRenderer(); filter = evr as IBaseFilter; int hr = graph.AddFilter(filter, string.Format("Renderer: {0}", VideoRendererType.EnhancedVideoRenderer)); DsError.ThrowExceptionForHR(hr); /* QueryInterface for the IMFVideoRenderer */ var videoRenderer = filter as IMFVideoRenderer; if (videoRenderer == null) { throw new Exception("Could not QueryInterface for the IMFVideoRenderer"); } /* Create a new EVR presenter */ presenter = EvrPresenter.CreateNew(); /* Initialize the EVR renderer with the custom video presenter */ hr = videoRenderer.InitializeRenderer(null, presenter.VideoPresenter); DsError.ThrowExceptionForHR(hr); var presenterSettings = presenter.VideoPresenter as IEVRPresenterSettings; if (presenterSettings == null) { throw new Exception("Could not QueryInterface for the IEVRPresenterSettings"); } presenterSettings.SetBufferCount(3); /* Use our interop hWnd */ IntPtr handle = GetDesktopWindow();//HwndHelper.Handle; /* QueryInterface the IMFVideoDisplayControl */ var displayControl = presenter.VideoPresenter as IMFVideoDisplayControl; if (displayControl == null) { throw new Exception("Could not QueryInterface the IMFVideoDisplayControl"); } /* Configure the presenter with our hWnd */ hr = displayControl.SetVideoWindow(handle); DsError.ThrowExceptionForHR(hr); var filterConfig = filter as IEVRFilterConfig; if (filterConfig != null) { filterConfig.SetNumberOfStreams(streamCount); } } RegisterCustomAllocator(presenter); return(filter); }
private IBaseFilter GetRendererFilter(EVideoRendererType videoRendererType) { switch (videoRendererType) { case EVideoRendererType.EnhancedVideoRenderer: var evr = new EnhancedVideoRenderer(); var evrFilter = (IBaseFilter)evr; // Initialize the EVR renderer with our custom video presenter var evrPresenter = EVRPresenter.Create(); ((IMFVideoRenderer)evr).InitializeRenderer(null, evrPresenter.VideoPresenter); // Configure the presenter with our hWnd var displayControl = (IMFVideoDisplayControl)evrPresenter.VideoPresenter; displayControl.SetVideoWindow(_hwnd); _customPresenter = evrPresenter; _customPresenter.NewSurfaceEvent += _player.NewSurface; _customPresenter.NewFrameEvent += _player.NewFrame; return evrFilter; case EVideoRendererType.VideoMixingRenderer: var vmr = new VideoMixingRenderer9(); var vmrFilter = (IBaseFilter)vmr; var vmrPresenter = VMR9Presenter.Create(); // Initialize the VMR renderer with out custom video presenter var filterConfig = (IVMRFilterConfig9)vmr; filterConfig.SetRenderingMode(VMR9Mode.Renderless); filterConfig.SetNumberOfStreams(1); var surfaceAllocatorNotify = (IVMRSurfaceAllocatorNotify9)vmr; surfaceAllocatorNotify.AdviseSurfaceAllocator(IntPtr.Zero, vmrPresenter.SurfaceAllocator); vmrPresenter.SurfaceAllocator.AdviseNotify(surfaceAllocatorNotify); _customPresenter = vmrPresenter; _customPresenter.NewSurfaceEvent += _player.NewSurface; _customPresenter.NewFrameEvent += _player.NewFrame; return vmrFilter; } return null; }