protected void destroyGraph() { try { this.derenderGraph(); } catch { } this.graphState = GraphState.Null; this.isCaptureRendered = false; this.isPreviewRendered = false; if (this.rotCookie != 0) { DsROT.RemoveGraphFromRot(ref this.rotCookie); this.rotCookie = 0; } if (this.muxFilter != null) { this.graphBuilder.RemoveFilter(this.muxFilter); } if (this.baseGrabFlt != null) { this.graphBuilder.RemoveFilter(this.baseGrabFlt); } if (this.graphBuilder != null) { Marshal.ReleaseComObject(this.graphBuilder); } this.graphBuilder = null; if (this.muxFilter != null) { Marshal.ReleaseComObject(this.muxFilter); } this.muxFilter = null; if (this.baseGrabFlt != null) { Marshal.ReleaseComObject(this.baseGrabFlt); } this.baseGrabFlt = null; this.mediaControl = null; this.videoWindow = null; GC.Collect(); }
/// <summary> do cleanup and release DirectShow. </summary> void CloseInterfaces() { int hr; try { #if DEBUG if (rotCookie != 0) { DsROT.RemoveGraphFromRot(ref rotCookie); } #endif if (mediaCtrl != null) { hr = mediaCtrl.Stop(); mediaCtrl = null; } if (mediaEvt != null) { hr = mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero); mediaEvt = null; } if (videoWin != null) { hr = videoWin.put_Visible(DsHlp.OAFALSE); hr = videoWin.put_Owner(IntPtr.Zero); videoWin = null; } baseGrabFlt = null; if (sampGrabber != null) { Marshal.ReleaseComObject(sampGrabber); } sampGrabber = null; if (capGraph != null) { Marshal.ReleaseComObject(capGraph); } capGraph = null; if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); } graphBuilder = null; if (capFilter != null) { Marshal.ReleaseComObject(capFilter); } capFilter = null; if (capDevices != null) { foreach (DsDevice d in capDevices) { d.Dispose(); } capDevices = null; } } catch (Exception) { } }
protected void destroyGraph() { try { this.derenderGraph(); } catch { } this.graphState = GraphState.Null; this.isCaptureRendered = false; this.isPreviewRendered = false; if (this.rotCookie != 0) { DsROT.RemoveGraphFromRot(ref this.rotCookie); this.rotCookie = 0; } if (this.muxFilter != null) { this.graphBuilder.RemoveFilter(this.muxFilter); } if (this.baseGrabFlt != null) { this.graphBuilder.RemoveFilter(this.baseGrabFlt); } if (this.videoCompressorFilter != null) { this.graphBuilder.RemoveFilter(this.videoCompressorFilter); } if (this.audioCompressorFilter != null) { this.graphBuilder.RemoveFilter(this.audioCompressorFilter); } if (this.videoDeviceFilter != null) { this.graphBuilder.RemoveFilter(this.videoDeviceFilter); } if (this.audioDeviceFilter != null) { this.graphBuilder.RemoveFilter(this.audioDeviceFilter); } if (this.videoSources != null) { this.videoSources.Dispose(); } this.videoSources = null; if (this.audioSources != null) { this.audioSources.Dispose(); } this.audioSources = null; if (this.propertyPages != null) { this.propertyPages.Dispose(); } this.propertyPages = null; if (this.tuner != null) { this.tuner.Dispose(); } this.tuner = null; if (this.graphBuilder != null) { Marshal.ReleaseComObject(this.graphBuilder); } this.graphBuilder = null; if (this.captureGraphBuilder != null) { Marshal.ReleaseComObject(this.captureGraphBuilder); } this.captureGraphBuilder = null; if (this.muxFilter != null) { Marshal.ReleaseComObject(this.muxFilter); } this.muxFilter = null; if (this.baseGrabFlt != null) { Marshal.ReleaseComObject(this.baseGrabFlt); } this.baseGrabFlt = null; if (this.fileWriterFilter != null) { Marshal.ReleaseComObject(this.fileWriterFilter); } this.fileWriterFilter = null; if (this.videoDeviceFilter != null) { Marshal.ReleaseComObject(this.videoDeviceFilter); } this.videoDeviceFilter = null; if (this.audioDeviceFilter != null) { Marshal.ReleaseComObject(this.audioDeviceFilter); } this.audioDeviceFilter = null; if (this.videoCompressorFilter != null) { Marshal.ReleaseComObject(this.videoCompressorFilter); } this.videoCompressorFilter = null; if (this.audioCompressorFilter != null) { Marshal.ReleaseComObject(this.audioCompressorFilter); } this.audioCompressorFilter = null; this.mediaControl = null; this.videoWindow = null; GC.Collect(); }
protected void destroyGraph() { // Derender the graph (This will stop the graph // and release preview window. It also destroys // half of the graph which is unnecessary but // harmless here.) (ignore errors) try { derenderGraph(); } catch { } // Update the state after derender because it // depends on correct status. But we also want to // update the state as early as possible in case // of error. graphState = GraphState.Null; isCaptureRendered = false; isPreviewRendered = false; // Remove graph from the ROT if (rotCookie != 0) { DsROT.RemoveGraphFromRot(ref rotCookie); rotCookie = 0; } // Remove filters from the graph // This should be unnecessary but the Nvidia WDM // video driver cannot be used by this application // again unless we remove it. Ideally, we should // simply enumerate all the filters in the graph // and remove them. (ignore errors) if (muxFilter != null) { graphBuilder.RemoveFilter(muxFilter); } if (videoCompressorFilter != null) { graphBuilder.RemoveFilter(videoCompressorFilter); } if (audioCompressorFilter != null) { graphBuilder.RemoveFilter(audioCompressorFilter); } if (videoDeviceFilter != null) { graphBuilder.RemoveFilter(videoDeviceFilter); } if (audioDeviceFilter != null) { graphBuilder.RemoveFilter(audioDeviceFilter); } // Clean up properties if (videoSources != null) { videoSources.Dispose(); } videoSources = null; if (audioSources != null) { audioSources.Dispose(); } audioSources = null; if (propertyPages != null) { propertyPages.Dispose(); } propertyPages = null; if (tuner != null) { tuner.Dispose(); } tuner = null; // Cleanup if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); } graphBuilder = null; if (captureGraphBuilder != null) { Marshal.ReleaseComObject(captureGraphBuilder); } captureGraphBuilder = null; if (muxFilter != null) { Marshal.ReleaseComObject(muxFilter); } muxFilter = null; if (fileWriterFilter != null) { Marshal.ReleaseComObject(fileWriterFilter); } fileWriterFilter = null; if (videoDeviceFilter != null) { Marshal.ReleaseComObject(videoDeviceFilter); } videoDeviceFilter = null; if (audioDeviceFilter != null) { Marshal.ReleaseComObject(audioDeviceFilter); } audioDeviceFilter = null; if (videoCompressorFilter != null) { Marshal.ReleaseComObject(videoCompressorFilter); } videoCompressorFilter = null; if (audioCompressorFilter != null) { Marshal.ReleaseComObject(audioCompressorFilter); } audioCompressorFilter = null; // These are copies of graphBuilder mediaControl = null; videoWindow = null; // For unmanaged objects we haven't released explicitly GC.Collect(); }
/// <summary> do cleanup and release DirectShow. </summary> void CloseInterfaces() { int hr; #if DEBUG if (rotCookie != 0) { DsROT.RemoveGraphFromRot(ref rotCookie); } #endif if (mediaCtrl != null) { hr = mediaCtrl.Stop(); Marshal.ReleaseComObject(mediaCtrl); mediaCtrl = null; } if (mediaEvt != null) { Marshal.ReleaseComObject(mediaEvt); mediaEvt = null; } if (baseGrabFlt != null) { Marshal.ReleaseComObject(baseGrabFlt); baseGrabFlt = null; } if (sampleGrabber != null) { Marshal.ReleaseComObject(sampleGrabber); sampleGrabber = null; } if (grabberConfig != null) { Marshal.ReleaseComObject(grabberConfig); grabberConfig = null; } if (capGraph != null) { Marshal.ReleaseComObject(capGraph); capGraph = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; } if (dev != null) { dev.Dispose(); dev = null; } if (wmVideoDecoder != null) { Marshal.ReleaseComObject(wmVideoDecoder); wmVideoDecoder = null; } if (capFilter != null) { Marshal.ReleaseComObject(capFilter); capFilter = null; } if (capDevices != null) { foreach (DsDevice d in capDevices) { d.Dispose(); } capDevices = null; } if (atiCrossbar != null) { Marshal.ReleaseComObject(atiCrossbar); atiCrossbar = null; } if (motionVector != null) { Marshal.ReleaseComObject(motionVector); motionVector = null; } if (teeSplitter != null) { Marshal.ReleaseComObject(teeSplitter); teeSplitter = null; } if (videoRenderer != null) { Marshal.ReleaseComObject(videoRenderer); videoRenderer = null; } if (vectorGrabber != null) { //vectorGrabber.SetCallback(null); // FIXME: sometimes, this causes an exception Marshal.ReleaseComObject(vectorGrabber); vectorGrabber = null; } if (crossBar != null) { Marshal.ReleaseComObject(crossBar); crossBar = null; } }