protected override void AddToGraph(IGraphBuilder pGraphBuilder, ThrowExceptionForHRPointer errorFunc) { // add the Video Renderer filter to the graph int hr = pGraphBuilder.AddFilter(BaseFilter, "Video Renderer"); errorFunc(hr, GraphBuilderError.AddVideoRenderer); }
protected override void AddToGraph(IGraphBuilder pGraphBuilder, ThrowExceptionForHRPointer errorFunc) { // add the VMR9 to the graph int hr = pGraphBuilder.AddFilter(BaseFilter, "VMR9 (Windowless)"); errorFunc(hr, GraphBuilderError.AddVMR9); }
internal static IRenderer AddRenderer(IGraphBuilder pGraphBuilder, Renderer preferredVideoRenderer, ThrowExceptionForHRPointer errorFunc, IntPtr hMediaWindow) { return(AddRenderer(pGraphBuilder, preferredVideoRenderer, errorFunc, hMediaWindow, true)); }
internal static IRenderer AddRenderer(IGraphBuilder pGraphBuilder, Renderer preferredVideoRenderer, ThrowExceptionForHRPointer errorFunc, IntPtr hMediaWindow, bool fallBackOnVR) { RendererBase renderer = GetRenderer(preferredVideoRenderer); return(AddRenderer(pGraphBuilder, renderer, errorFunc, hMediaWindow, fallBackOnVR)); }
internal static IRenderer AddRenderer(IGraphBuilder pGraphBuilder, RendererBase renderer, ThrowExceptionForHRPointer errorFunc, IntPtr hMediaWindow, bool fallBackOnVR) { try { bool bOk = renderer.InstantiateRenderer(); if (!bOk) { if (fallBackOnVR) { // try default renderer renderer.Close(); renderer = GetRenderer(Renderer.VR); renderer.InstantiateRenderer(); // it will throw FilterGraphBuilderException if it can't be instantiated } else { throw new FilterGraphBuilderException(GraphBuilderError.VideoRenderer); } } renderer.AddToGraph(pGraphBuilder, errorFunc); // Windowed renderers should be initialized (parent window is set, etc) _after_ the renderer is connected because a video window is created then // On the contrary windowless renderes _must_ be initialized _before_ they are connected if (!renderer.IsDelayedInitialize) { renderer.Initialize(pGraphBuilder, hMediaWindow); } renderer.GraphBuilder = pGraphBuilder; renderer.MediaWindowHandle = hMediaWindow; renderer._ready = true; return(renderer); } finally { if (!renderer._ready) { renderer.Close(); } } }
protected abstract void AddToGraph(IGraphBuilder pGraphBuilder, ThrowExceptionForHRPointer errorFunc);
public override void BuildUp(FilterGraphBuilderParameters parameters) { // Create filter graph manager InitializeGraphBuilder(() => { object comobj = null; try { var type = Type.GetTypeFromCLSID(Clsid.FilterGraph, true); comobj = Activator.CreateInstance(type); var graphBuilder = (IGraphBuilder)comobj; comobj = null; // important! (see the finally block) return(graphBuilder); } catch (Exception e) { throw new FilterGraphBuilderException(GraphBuilderError.FilterGraphManager, e); } finally { if (comobj != null) { Marshal.FinalReleaseComObject(comobj); } } }); // Adding a source filter for a specific video file _sourceFilterHandler = SourceFilterHandlerFactory.AddSourceFilter(GraphBuilder, parameters.Source); // QUERY the filter graph interfaces InitializeMediaEventEx(parameters.MediaWindowHandle); InitializeFilterGraph2(); InitializeMediaControl(); InitializeMediaSeeking(); InitializeBasicAudio(); // create a renderer ThrowExceptionForHRPointer errorFunc = delegate(int hrCode, GraphBuilderError error) { hrCode.ThrowExceptionForHR(error); }; Renderer = RendererBase.AddRenderer(GraphBuilder, parameters.PreferredVideoRenderer, errorFunc, parameters.MediaWindowHandle); DoBuildGraph(); SeekingCapabilities caps = SeekingCapabilities.CanGetDuration; int hr = MediaSeeking.CheckCapabilities(ref caps); if (hr == DsHlp.S_OK) { _isGraphSeekable = true; long rtDuration; MediaSeeking.GetDuration(out rtDuration); _duration = rtDuration; } // MEDIA SIZE int height, arWidth; int width, arHeight; Renderer.GetNativeVideoSize(out width, out height, out arWidth, out arHeight); double w = arWidth; double h = arHeight; _aspectRatio = w / h; _sourceRect = new GDI.RECT { left = 0, top = 0, right = width, bottom = height }; // if (FindSplitter(pFilterGraph)) // ReportUnrenderedPins(pFilterGraph); // then we can raise OnFailedStreamsAvailable GatherMediaInfo(parameters.Source); }