示例#1
0
 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();
 }
示例#2
0
        /// <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)
            { }
        }
示例#3
0
 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();
 }
示例#4
0
        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();
        }
示例#5
0
        /// <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;
            }
        }