/// <summary> /// Crée le graphe DirectShow /// </summary> void SetupGraph() { FiltersConfiguration filtersConfiguration = GraphHelper.GetFiltersConfiguration(); if (filtersConfiguration == null) { throw new InvalidOperationException("The filters are not configured"); } //System.IO.FileStream fs = null; try { ExtensionFiltersSource extensionFiltersSources = GraphHelper.GetExtensionFiltersSource(filtersConfiguration, _sourceFilePath); try { /* Creates the GraphBuilder COM object */ _graph = new FilterGraphNoThread() as IGraphBuilder; if (_graph == null) { throw new Exception("Could not create a graph"); } //if (_graphLogLocation != null) //{ // fs = System.IO.File.Create(_graphLogLocation); // int r = _graph.SetLogFile(fs.Handle); //} // // Creating FileSource filter // IBaseFilter sourceFilter = GraphHelper.CreateLAVSplitterSourceFilter(_graph, _sourceFilePath, out IPin parserAudioOutputPin, out IPin parserVideoOutputPin); // // Creating renderer // Type videoRendererFilterType = null; IBaseFilter videoRenderer = null; GraphHelper.CreateFilter(NULL_RENDERER, "Null Renderer", ref videoRendererFilterType, ref videoRenderer); int hr = _graph.AddFilter(videoRenderer, "Null Renderer"); DsError.ThrowExceptionForHR(hr); IPin videoRendererInputPin = DsFindPin.ByDirection(videoRenderer, PinDirection.Input, 0); // // Creating Video filter // // Connection du sample Grabber IBaseFilter sampleGrabberFilter = (IBaseFilter)_sampleGrabber; hr = _graph.AddFilter(sampleGrabberFilter, "Sample Grabber"); DsError.ThrowExceptionForHR(hr); IPin sampleGrabberInputPin = DsFindPin.ByDirection(sampleGrabberFilter, PinDirection.Input, 0); IPin sampleGrabberOuputPin = DsFindPin.ByDirection(sampleGrabberFilter, PinDirection.Output, 0); //Insertion du Color Space Converter Type filterType = null; IBaseFilter colorSpaceConverter = null; GraphHelper.CreateFilter(GraphHelper.CLSID_COLOR_SPACE_CONVERTER, GraphHelper.COLOR_SPACE_CONVERTER_FRIENDLYNAME, ref filterType, ref colorSpaceConverter); hr = _graph.AddFilter(colorSpaceConverter, GraphHelper.COLOR_SPACE_CONVERTER_FRIENDLYNAME); DsError.ThrowExceptionForHR(hr); IPin colorSpaceConverterInputPin = DsFindPin.ByDirection(colorSpaceConverter, PinDirection.Input, 0); GraphHelper.ConnectSplitterAndRendererWithDecoder(_graph, extensionFiltersSources, parserVideoOutputPin, colorSpaceConverterInputPin); IPin colorSpaceConverterOutputPin = DsFindPin.ByDirection(colorSpaceConverter, PinDirection.Output, 0); hr = _graph.ConnectDirect(colorSpaceConverterOutputPin, sampleGrabberInputPin, null); DsError.ThrowExceptionForHR(hr); hr = _graph.Connect(sampleGrabberOuputPin, videoRendererInputPin); DsError.ThrowExceptionForHR(hr); // Removes the clock to run the graph as fast as possible ((IMediaFilter)_graph).SetSyncSource(null); GraphHelper.SafeRelease(parserAudioOutputPin); GraphHelper.SafeRelease(parserVideoOutputPin); GraphHelper.SafeRelease(videoRendererInputPin); GraphHelper.SafeRelease(sampleGrabberInputPin); GraphHelper.SafeRelease(sampleGrabberOuputPin); GraphHelper.SafeRelease(colorSpaceConverterInputPin); GraphHelper.SafeRelease(colorSpaceConverterOutputPin); _mediaSeeking = _graph as IMediaSeeking; _mediaControl = _graph as IMediaControl; _mediaEvent = _graph as IMediaEventEx; /* Attempt to set the time format */ hr = _mediaSeeking.SetTimeFormat(TimeFormat.MediaTime); DsError.ThrowExceptionForHR(hr); } catch (Exception ex) { this.TraceError(ex, ex.Message); /* This exection will happen usually if the media does * not exist or could not open due to not having the * proper filters installed */ FreeResources(); } } finally { /*if (_graphLogLocation != null && fs != null) * fs.Close();*/ } }