public void Stop() { _videoWin.put_Visible(OABool.False); _mediaCtrl.Stop(); if (_pinAudio != null) { Release.ComObject(_pinAudio); _pinAudio = null; } if (_pinVideo != null) { Release.ComObject(_pinVideo); _pinVideo = null; } if (_mpegDemux != null) { Release.ComObject(_mpegDemux); _mpegDemux = null; } if (_tsFileSource != null) { Release.ComObject(_tsFileSource); _tsFileSource = null; } if (_rotEntry != null) { _rotEntry.Dispose(); _rotEntry = null; } if (_graphBuilder != null) { Release.ComObject(_graphBuilder); _graphBuilder = null; } }
public bool Play(string fileName, Form form) { fileName += ".tsbuffer"; Log.WriteFile("play:{0}", fileName); _graphBuilder = (IFilterGraph2) new FilterGraph(); _rotEntry = new DsROTEntry(_graphBuilder); Log.WriteFile("add tsfilesource"); _tsFileSource = new TsFileSource(); _graphBuilder.AddFilter((IBaseFilter)_tsFileSource, "TsFileSource"); #region add mpeg-2 demux filter Log.WriteFile("add mpeg-2 demux"); MPEG2Demultiplexer demux = new MPEG2Demultiplexer(); _mpegDemux = (IBaseFilter)demux; int hr = _graphBuilder.AddFilter(_mpegDemux, "MPEG-2 Demultiplexer"); #endregion #region create mpeg2 demux pins Log.WriteFile("create mpeg-2 demux pins"); //create mpeg-2 demux output pins IMpeg2Demultiplexer demuxer = _mpegDemux as IMpeg2Demultiplexer; if (demuxer != null) { hr = demuxer.CreateOutputPin(GetAudioMpg2Media(), "Audio", out _pinAudio); } if (hr != 0) { Log.WriteFile("unable to create audio pin"); return(false); } if (demuxer != null) { hr = demuxer.CreateOutputPin(GetVideoMpg2Media(), "Video", out _pinVideo); } if (hr != 0) { Log.WriteFile("unable to create video pin"); return(false); } #endregion #region load file in tsfilesource Log.WriteFile("load file in tsfilesource"); IFileSourceFilter interfaceFile = (IFileSourceFilter)_tsFileSource; if (interfaceFile == null) { Log.WriteFile("TSStreamBufferPlayer9:Failed to get IFileSourceFilter"); return(false); } AMMediaType mpeg2ProgramStream = new AMMediaType(); mpeg2ProgramStream.majorType = MediaType.Stream; mpeg2ProgramStream.subType = MediaSubType.Mpeg2Program; mpeg2ProgramStream.unkPtr = IntPtr.Zero; mpeg2ProgramStream.sampleSize = 0; mpeg2ProgramStream.temporalCompression = false; mpeg2ProgramStream.fixedSizeSamples = true; mpeg2ProgramStream.formatType = FormatType.None; mpeg2ProgramStream.formatSize = 0; mpeg2ProgramStream.formatPtr = IntPtr.Zero; hr = interfaceFile.Load(fileName, mpeg2ProgramStream); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:Failed to load file"); return(false); } #region connect tsfilesource->demux Log.WriteFile("connect tsfilesource->demux"); Log.WriteFile("TSStreamBufferPlayer9:connect tsfilesource->mpeg2 demux"); IPin pinTsOut = DsFindPin.ByDirection((IBaseFilter)_tsFileSource, PinDirection.Output, 0); if (pinTsOut == null) { Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource"); return(false); } IPin pinDemuxIn = DsFindPin.ByDirection(_mpegDemux, PinDirection.Input, 0); if (pinDemuxIn == null) { Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource"); return(false); } hr = _graphBuilder.Connect(pinTsOut, pinDemuxIn); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:failed to connect tsfilesource->mpeg2 demux:{0:X}", hr); return(false); } Release.ComObject(pinTsOut); Release.ComObject(pinDemuxIn); #endregion #region map demux pids Log.WriteFile("map mpeg2 pids"); IMPEG2StreamIdMap pStreamId = (IMPEG2StreamIdMap)_pinVideo; hr = pStreamId.MapStreamId(0xe0, MPEG2Program.ElementaryStream, 0, 0); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9: failed to map pid 0xe0->video pin"); return(false); } pStreamId = (IMPEG2StreamIdMap)_pinAudio; hr = pStreamId.MapStreamId(0xc0, MPEG2Program.ElementaryStream, 0, 0); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9: failed to map pid 0xc0->audio pin"); return(false); } #endregion #region render demux audio/video pins Log.WriteFile("render pins"); hr = _graphBuilder.Render(_pinAudio); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:failed to render video output pin:{0:X}", hr); } hr = _graphBuilder.Render(_pinVideo); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:failed to render audio output pin:{0:X}", hr); } #endregion #endregion _videoWin = _graphBuilder as IVideoWindow; if (_videoWin != null) { _videoWin.put_Visible(OABool.True); _videoWin.put_Owner(form.Handle); _videoWin.put_WindowStyle( (WindowStyle)((int)WindowStyle.Child + (int)WindowStyle.ClipSiblings + (int)WindowStyle.ClipChildren)); _videoWin.put_MessageDrain(form.Handle); _videoWin.SetWindowPosition(190, 250, 150, 150); } Log.WriteFile("run graph"); _mediaCtrl = (IMediaControl)_graphBuilder; hr = _mediaCtrl.Run(); Log.WriteFile("TSStreamBufferPlayer9:running:{0:X}", hr); return(true); }
public bool Play(string fileName, Form form) { fileName += ".tsbuffer"; Log.WriteFile("play:{0}", fileName); _graphBuilder = (IFilterGraph2)new FilterGraph(); _rotEntry = new DsROTEntry(_graphBuilder); Log.WriteFile("add tsfilesource"); _tsFileSource = new TsFileSource(); _graphBuilder.AddFilter((IBaseFilter)_tsFileSource, "TsFileSource"); #region add mpeg-2 demux filter Log.WriteFile("add mpeg-2 demux"); MPEG2Demultiplexer demux = new MPEG2Demultiplexer(); _mpegDemux = (IBaseFilter)demux; int hr = _graphBuilder.AddFilter(_mpegDemux, "MPEG-2 Demultiplexer"); #endregion #region create mpeg2 demux pins Log.WriteFile("create mpeg-2 demux pins"); //create mpeg-2 demux output pins IMpeg2Demultiplexer demuxer = _mpegDemux as IMpeg2Demultiplexer; if (demuxer != null) hr = demuxer.CreateOutputPin(GetAudioMpg2Media(), "Audio", out _pinAudio); if (hr != 0) { Log.WriteFile("unable to create audio pin"); return false; } if (demuxer != null) hr = demuxer.CreateOutputPin(GetVideoMpg2Media(), "Video", out _pinVideo); if (hr != 0) { Log.WriteFile("unable to create video pin"); return false; } #endregion #region load file in tsfilesource Log.WriteFile("load file in tsfilesource"); IFileSourceFilter interfaceFile = (IFileSourceFilter)_tsFileSource; if (interfaceFile == null) { Log.WriteFile("TSStreamBufferPlayer9:Failed to get IFileSourceFilter"); return false; } AMMediaType mpeg2ProgramStream = new AMMediaType(); mpeg2ProgramStream.majorType = MediaType.Stream; mpeg2ProgramStream.subType = MediaSubType.Mpeg2Program; mpeg2ProgramStream.unkPtr = IntPtr.Zero; mpeg2ProgramStream.sampleSize = 0; mpeg2ProgramStream.temporalCompression = false; mpeg2ProgramStream.fixedSizeSamples = true; mpeg2ProgramStream.formatType = FormatType.None; mpeg2ProgramStream.formatSize = 0; mpeg2ProgramStream.formatPtr = IntPtr.Zero; hr = interfaceFile.Load(fileName, mpeg2ProgramStream); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:Failed to load file"); return false; } #region connect tsfilesource->demux Log.WriteFile("connect tsfilesource->demux"); Log.WriteFile("TSStreamBufferPlayer9:connect tsfilesource->mpeg2 demux"); IPin pinTsOut = DsFindPin.ByDirection((IBaseFilter)_tsFileSource, PinDirection.Output, 0); if (pinTsOut == null) { Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource"); return false; } IPin pinDemuxIn = DsFindPin.ByDirection(_mpegDemux, PinDirection.Input, 0); if (pinDemuxIn == null) { Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource"); return false; } hr = _graphBuilder.Connect(pinTsOut, pinDemuxIn); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:failed to connect tsfilesource->mpeg2 demux:{0:X}", hr); return false; } Release.ComObject(pinTsOut); Release.ComObject(pinDemuxIn); #endregion #region map demux pids Log.WriteFile("map mpeg2 pids"); IMPEG2StreamIdMap pStreamId = (IMPEG2StreamIdMap)_pinVideo; hr = pStreamId.MapStreamId(0xe0, MPEG2Program.ElementaryStream, 0, 0); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9: failed to map pid 0xe0->video pin"); return false; } pStreamId = (IMPEG2StreamIdMap)_pinAudio; hr = pStreamId.MapStreamId(0xc0, MPEG2Program.ElementaryStream, 0, 0); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9: failed to map pid 0xc0->audio pin"); return false; } #endregion #region render demux audio/video pins Log.WriteFile("render pins"); hr = _graphBuilder.Render(_pinAudio); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:failed to render video output pin:{0:X}", hr); } hr = _graphBuilder.Render(_pinVideo); if (hr != 0) { Log.WriteFile("TSStreamBufferPlayer9:failed to render audio output pin:{0:X}", hr); } #endregion #endregion _videoWin = _graphBuilder as IVideoWindow; if (_videoWin != null) { _videoWin.put_Visible(OABool.True); _videoWin.put_Owner(form.Handle); _videoWin.put_WindowStyle( (WindowStyle)((int)WindowStyle.Child + (int)WindowStyle.ClipSiblings + (int)WindowStyle.ClipChildren)); _videoWin.put_MessageDrain(form.Handle); _videoWin.SetWindowPosition(190, 250, 150, 150); } Log.WriteFile("run graph"); _mediaCtrl = (IMediaControl)_graphBuilder; hr = _mediaCtrl.Run(); Log.WriteFile("TSStreamBufferPlayer9:running:{0:X}", hr); return true; }
public override void BuildGraph() { try { useWPF = Settings.UseWPF; int hr = 0; this.graphBuilder = (IFilterGraph2) new FilterGraph(); rot = new DsROTEntry(this.graphBuilder); string extension = Path.GetExtension(this.fileName).ToLower(); if (extension == ".ts") { TsFileSource fileSource = new TsFileSource(); this.filterSource = fileSource as IBaseFilter; if (this.filterSource != null) { this.graphBuilder.AddFilter(this.filterSource, "TsFileSource"); IFileSourceFilter interFaceFile = (IFileSourceFilter)fileSource; interFaceFile.Load(this.fileName, null); ITSFileSource tsFileSource = fileSource as ITSFileSource; ushort audioPid = 0; tsFileSource.GetAudioPid(ref audioPid); ushort videoPid = 0; tsFileSource.GetVideoPid(ref videoPid); byte[] videoPidTypeByteBuffer = new byte[16]; tsFileSource.GetVideoPidType(videoPidTypeByteBuffer); int posCharZero = 0; for (; posCharZero < videoPidTypeByteBuffer.Length; posCharZero++) { if (videoPidTypeByteBuffer[posCharZero] == 0) { break; } } char[] videoPidTypeCharBuffer = new char[posCharZero]; Array.Copy(videoPidTypeByteBuffer, 0, videoPidTypeCharBuffer, 0, posCharZero); string videoPidType = new string(videoPidTypeCharBuffer); // "MPEG 2", "H.264" AddMPEG2DemuxFilter(); //IMpeg2Demultiplexer mpeg2Demultiplexer = this.mpeg2Demux as IMpeg2Demultiplexer; ////Log.WriteFile(Log.LogType.Log, false, "DVBGraphBDA: create mpg4 video pin"); //AMMediaType mediaMPG4 = new AMMediaType(); //mediaMPG4.majorType = MediaType.Video; //mediaMPG4.subType = new Guid(0x8d2d71cb, 0x243f, 0x45e3, 0xb2, 0xd8, 0x5f, 0xd7, 0x96, 0x7e, 0xc0, 0x9b); //mediaMPG4.sampleSize = 0; //mediaMPG4.temporalCompression = false; //mediaMPG4.fixedSizeSamples = false; //mediaMPG4.unkPtr = IntPtr.Zero; //mediaMPG4.formatType = FormatType.Mpeg2Video; //mediaMPG4.formatSize = Mpeg2ProgramVideo.GetLength(0); //mediaMPG4.formatPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(mediaMPG4.formatSize); //System.Runtime.InteropServices.Marshal.Copy(Mpeg2ProgramVideo, 0, mediaMPG4.formatPtr, mediaMPG4.formatSize); //int hr = mpeg2Demultiplexer.CreateOutputPin(mediaMPG4, "MPG4", out this.pinDemuxerVideoMPEG4); //if (this.pinDemuxerVideoMPEG4 != null) //{ // IMPEG2PIDMap mpeg2PIDMap = this.pinDemuxerVideoMPEG4 as IMPEG2PIDMap; // if (mpeg2PIDMap != null) // hr = mpeg2PIDMap.MapPID(1, new int[] { 0x00a2 }, MediaSampleContent.ElementaryStream); // Marshal.ReleaseComObject(this.pinDemuxerVideoMPEG4); //} ////if (hr < 0 || this.pinDemuxerVideoMPEG4 == null) ////{ //// _lastError = String.Format("failed to add mpg4 video pin"); //// Log.WriteFile(Log.LogType.Log, true, "DVBGraphBDA:FAILED to create MPG4 pin:0x{0:X}", hr); ////} //DsDevice[] tunDevices = DeviceEnumerator.GetH264Devices(); //if (tunDevices.Length > 0) //{ // IBaseFilter elecardMPEG4VideoDecoder; // hr = this.graphBuilder.AddSourceFilterForMoniker(tunDevices[0].Mon, null, tunDevices[0].Name, out elecardMPEG4VideoDecoder); // DsError.ThrowExceptionForHR(hr); //} AddRenderers(); if (!useWPF) { ConfigureVMR9InWindowlessMode(2); } //IVMRMixerControl9 vmrMixerControl9 = this.videoRenderer as IVMRMixerControl9; //vmrMixerControl9.SetZOrder(0, 1); //// Connect the MPEG-2 Demux output pin for the "BDA MPEG2 Transport Information Filter" //IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0); //if (pinOut != null) //{ // hr = this.graphBuilder.Render(pinOut); // //DsError.ThrowExceptionForHR(hr); // // In fact the last pin don't render since i havn't added the BDA MPE Filter... // Marshal.ReleaseComObject(pinOut); //} //ConnectFilters(); //IPin pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 0); //if (pinOut != null) //{ // hr = this.graphBuilder.Render(pinOut); // //DsError.ThrowExceptionForHR(hr); // // In fact the last pin don't render since i havn't added the BDA MPE Filter... // Marshal.ReleaseComObject(pinOut); //} //pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 1); //if (pinOut != null) //{ // hr = this.graphBuilder.Render(pinOut); // //DsError.ThrowExceptionForHR(hr); // // In fact the last pin don't render since i havn't added the BDA MPE Filter... // Marshal.ReleaseComObject(pinOut); //} IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0); if (pinOut != null) { hr = this.graphBuilder.Render(pinOut); //DsError.ThrowExceptionForHR(hr); // In fact the last pin don't render since i havn't added the BDA MPE Filter... Marshal.ReleaseComObject(pinOut); } AddAndConnectNullRendererForWPF(); this.hostingControl.CurrentGraphBuilder = this; OnGraphStarted(); return; } } AddRenderers(); if (!useWPF) { ConfigureVMR9InWindowlessMode(); } this.graphBuilder.RenderFile(this.fileName, null); //AddAndConnectNullRendererForWPF(); if (useWPF) { // In order to keep the audio/video synchro, we need the NullRenderer IBaseFilter nullRenderer = new NullRenderer() as IBaseFilter; hr = graphBuilder.AddFilter(nullRenderer, "NullRenderer"); ThrowExceptionForHR("Adding the NullRenderer: ", hr); IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0); if (pinOutFromFilterOut != null) { UnRender(pinOutFromFilterOut); try { IPin pinInFromFilterOut = DsFindPin.ByDirection(nullRenderer, PinDirection.Input, 0); if (pinInFromFilterOut != null) { try { hr = this.graphBuilder.Connect(pinOutFromFilterOut, pinInFromFilterOut); } finally { Marshal.ReleaseComObject(pinInFromFilterOut); } } } finally { Marshal.ReleaseComObject(pinOutFromFilterOut); } } //IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0); //if (pinOutFromFilterOut != null) //{ // hr = this.graphBuilder.Render(pinOutFromFilterOut); // Marshal.ReleaseComObject(pinOutFromFilterOut); //} WpfUpdateVideoSize(); //WPF } this.hostingControl.CurrentGraphBuilder = this; OnGraphStarted(); } catch (Exception ex) { Decompose(); throw ex; } }
public override void BuildGraph() { try { useWPF = Settings.UseWPF; int hr = 0; this.graphBuilder = (IFilterGraph2)new FilterGraph(); rot = new DsROTEntry(this.graphBuilder); string extension = Path.GetExtension(this.fileName).ToLower(); if (extension == ".ts") { TsFileSource fileSource = new TsFileSource(); this.filterSource = fileSource as IBaseFilter; if (this.filterSource != null) { this.graphBuilder.AddFilter(this.filterSource, "TsFileSource"); IFileSourceFilter interFaceFile = (IFileSourceFilter)fileSource; interFaceFile.Load(this.fileName, null); ITSFileSource tsFileSource = fileSource as ITSFileSource; ushort audioPid = 0; tsFileSource.GetAudioPid(ref audioPid); ushort videoPid = 0; tsFileSource.GetVideoPid(ref videoPid); byte[] videoPidTypeByteBuffer = new byte[16]; tsFileSource.GetVideoPidType(videoPidTypeByteBuffer); int posCharZero = 0; for (; posCharZero < videoPidTypeByteBuffer.Length; posCharZero++) if (videoPidTypeByteBuffer[posCharZero] == 0) break; char[] videoPidTypeCharBuffer = new char[posCharZero]; Array.Copy(videoPidTypeByteBuffer, 0, videoPidTypeCharBuffer, 0, posCharZero); string videoPidType = new string(videoPidTypeCharBuffer); // "MPEG 2", "H.264" AddMPEG2DemuxFilter(); //IMpeg2Demultiplexer mpeg2Demultiplexer = this.mpeg2Demux as IMpeg2Demultiplexer; ////Log.WriteFile(Log.LogType.Log, false, "DVBGraphBDA: create mpg4 video pin"); //AMMediaType mediaMPG4 = new AMMediaType(); //mediaMPG4.majorType = MediaType.Video; //mediaMPG4.subType = new Guid(0x8d2d71cb, 0x243f, 0x45e3, 0xb2, 0xd8, 0x5f, 0xd7, 0x96, 0x7e, 0xc0, 0x9b); //mediaMPG4.sampleSize = 0; //mediaMPG4.temporalCompression = false; //mediaMPG4.fixedSizeSamples = false; //mediaMPG4.unkPtr = IntPtr.Zero; //mediaMPG4.formatType = FormatType.Mpeg2Video; //mediaMPG4.formatSize = Mpeg2ProgramVideo.GetLength(0); //mediaMPG4.formatPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(mediaMPG4.formatSize); //System.Runtime.InteropServices.Marshal.Copy(Mpeg2ProgramVideo, 0, mediaMPG4.formatPtr, mediaMPG4.formatSize); //int hr = mpeg2Demultiplexer.CreateOutputPin(mediaMPG4, "MPG4", out this.pinDemuxerVideoMPEG4); //if (this.pinDemuxerVideoMPEG4 != null) //{ // IMPEG2PIDMap mpeg2PIDMap = this.pinDemuxerVideoMPEG4 as IMPEG2PIDMap; // if (mpeg2PIDMap != null) // hr = mpeg2PIDMap.MapPID(1, new int[] { 0x00a2 }, MediaSampleContent.ElementaryStream); // Marshal.ReleaseComObject(this.pinDemuxerVideoMPEG4); //} ////if (hr < 0 || this.pinDemuxerVideoMPEG4 == null) ////{ //// _lastError = String.Format("failed to add mpg4 video pin"); //// Log.WriteFile(Log.LogType.Log, true, "DVBGraphBDA:FAILED to create MPG4 pin:0x{0:X}", hr); ////} //DsDevice[] tunDevices = DeviceEnumerator.GetH264Devices(); //if (tunDevices.Length > 0) //{ // IBaseFilter elecardMPEG4VideoDecoder; // hr = this.graphBuilder.AddSourceFilterForMoniker(tunDevices[0].Mon, null, tunDevices[0].Name, out elecardMPEG4VideoDecoder); // DsError.ThrowExceptionForHR(hr); //} AddRenderers(); if (!useWPF) ConfigureVMR9InWindowlessMode(2); //IVMRMixerControl9 vmrMixerControl9 = this.videoRenderer as IVMRMixerControl9; //vmrMixerControl9.SetZOrder(0, 1); //// Connect the MPEG-2 Demux output pin for the "BDA MPEG2 Transport Information Filter" //IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0); //if (pinOut != null) //{ // hr = this.graphBuilder.Render(pinOut); // //DsError.ThrowExceptionForHR(hr); // // In fact the last pin don't render since i havn't added the BDA MPE Filter... // Marshal.ReleaseComObject(pinOut); //} //ConnectFilters(); //IPin pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 0); //if (pinOut != null) //{ // hr = this.graphBuilder.Render(pinOut); // //DsError.ThrowExceptionForHR(hr); // // In fact the last pin don't render since i havn't added the BDA MPE Filter... // Marshal.ReleaseComObject(pinOut); //} //pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 1); //if (pinOut != null) //{ // hr = this.graphBuilder.Render(pinOut); // //DsError.ThrowExceptionForHR(hr); // // In fact the last pin don't render since i havn't added the BDA MPE Filter... // Marshal.ReleaseComObject(pinOut); //} IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0); if (pinOut != null) { hr = this.graphBuilder.Render(pinOut); //DsError.ThrowExceptionForHR(hr); // In fact the last pin don't render since i havn't added the BDA MPE Filter... Marshal.ReleaseComObject(pinOut); } AddAndConnectNullRendererForWPF(); this.hostingControl.CurrentGraphBuilder = this; OnGraphStarted(); return; } } AddRenderers(); if (!useWPF) ConfigureVMR9InWindowlessMode(); this.graphBuilder.RenderFile(this.fileName, null); //AddAndConnectNullRendererForWPF(); if (useWPF) { // In order to keep the audio/video synchro, we need the NullRenderer IBaseFilter nullRenderer = new NullRenderer() as IBaseFilter; hr = graphBuilder.AddFilter(nullRenderer, "NullRenderer"); ThrowExceptionForHR("Adding the NullRenderer: ", hr); IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0); if (pinOutFromFilterOut != null) { UnRender(pinOutFromFilterOut); try { IPin pinInFromFilterOut = DsFindPin.ByDirection(nullRenderer, PinDirection.Input, 0); if (pinInFromFilterOut != null) { try { hr = this.graphBuilder.Connect(pinOutFromFilterOut, pinInFromFilterOut); } finally { Marshal.ReleaseComObject(pinInFromFilterOut); } } } finally { Marshal.ReleaseComObject(pinOutFromFilterOut); } } //IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0); //if (pinOutFromFilterOut != null) //{ // hr = this.graphBuilder.Render(pinOutFromFilterOut); // Marshal.ReleaseComObject(pinOutFromFilterOut); //} WpfUpdateVideoSize(); //WPF } this.hostingControl.CurrentGraphBuilder = this; OnGraphStarted(); } catch (Exception ex) { Decompose(); throw ex; } }