/// <summary> /// Creates a new VMR9 renderer and configures it with an allocator /// </summary> /// <returns>An initialized DirectShow VMR9 renderer</returns> private IBaseFilter CreateVideoMixingRenderer9(IGraphBuilder graph, int streamCount) { IBaseFilter vmr9; try { vmr9 = new VideoMixingRenderer9() as IBaseFilter; } catch (COMException ex) { throw new WPFMediaKitException("Could not create VMR9, do you have the grahics driver and DirectX properly installed?", ex); } var filterConfig = vmr9 as IVMRFilterConfig9; if (filterConfig == null) { throw new WPFMediaKitException("Could not query VMR9 filter configuration."); } /* We will only have one video stream connected to the filter */ int hr = filterConfig.SetNumberOfStreams(streamCount); DsError.ThrowExceptionForHR(hr); /* Setting the renderer to "Renderless" mode * sounds counter productive, but its what we * need to do for setting up a custom allocator */ hr = filterConfig.SetRenderingMode(VMR9Mode.Renderless); DsError.ThrowExceptionForHR(hr); /* Query the allocator interface */ var vmrSurfAllocNotify = vmr9 as IVMRSurfaceAllocatorNotify9; if (vmrSurfAllocNotify == null) { throw new WPFMediaKitException("Could not query the VMR surface allocator."); } var allocator = new Vmr9Allocator(); /* We supply our custom allocator to the renderer */ hr = vmrSurfAllocNotify.AdviseSurfaceAllocator(m_userId, allocator); DsError.ThrowExceptionForHR(hr); hr = allocator.AdviseNotify(vmrSurfAllocNotify); DsError.ThrowExceptionForHR(hr); RegisterCustomAllocator(allocator); hr = graph.AddFilter(vmr9, string.Format("Renderer: {0}", VideoRendererType.VideoMixingRenderer9)); DsError.ThrowExceptionForHR(hr); return(vmr9); }
/// <summary> /// Creates a new VMR9 renderer and configures it with an allocator /// </summary> /// <returns>An initialized DirectShow VMR9 renderer</returns> private IBaseFilter CreateVideoMixingRenderer9(IGraphBuilder graph) { var vmr9 = new VideoMixingRenderer9() as IBaseFilter; var filterConfig = vmr9 as IVMRFilterConfig9; if (filterConfig == null) throw new Exception("Could not query filter configuration."); /* We will only have one video stream connected to the filter */ int hr = filterConfig.SetNumberOfStreams(4); DsError.ThrowExceptionForHR(hr); /* Setting the renderer to "Renderless" mode * sounds counter productive, but its what we * need to do for setting up a custom allocator */ hr = filterConfig.SetRenderingMode(VMR9Mode.Renderless); DsError.ThrowExceptionForHR(hr); /* Query the allocator interface */ var vmrSurfAllocNotify = vmr9 as IVMRSurfaceAllocatorNotify9; if (vmrSurfAllocNotify == null) throw new Exception("Could not query the VMR surface allocator."); /* We supply an hWnd so Direct3D can initialize */ var allocator = new Vmr9Allocator(HwndHelper.Handle); /* We supply our custom allocator to the renderer */ hr = vmrSurfAllocNotify.AdviseSurfaceAllocator(userId, allocator); DsError.ThrowExceptionForHR(hr); hr = allocator.AdviseNotify(vmrSurfAllocNotify); DsError.ThrowExceptionForHR(hr); RegisterCustomAllocator(allocator); hr = graph.AddFilter(vmr9, //"Renderer: 1"); string.Format("Renderer: {0}", VideoRendererType.VideoMixingRenderer9)); DsError.ThrowExceptionForHR(hr); return vmr9; }