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); }