Exemple #1
0
        private void Cleanup()
        {
            if (_graphBuilder == null)
            {
                return;
            }
            int hr;

            using (Settings xmlreader = new MPSettings())
            {
                int    codecValue = 0;
                string codecType  = "";
                codecType = xmlreader.GetValueAsString("dvdplayer", "videocodec", "");
                if (codecType == "InterVideo Video Decoder")
                {
                    codecValue = xmlreader.GetValueAsInt("videocodec", "intervideo", 1);
                    Log.Info("DVDPlayer9:Resetting InterVideo DXVA to {0}", codecValue);
                    using (
                        RegistryKey subkey = Registry.CurrentUser.CreateSubKey(@"Software\InterVideo\Common\VideoDec\MediaPortal"))
                    {
                        subkey.SetValue("DXVA", codecValue);
                    }
                }
                if (codecType.StartsWith("CyberLink Video/SP Decoder"))
                {
                    codecValue = xmlreader.GetValueAsInt("videocodec", "cyberlink", 1);
                    Log.Info("DVDPlayer9:Resetting CyberLink DXVA to {0}", codecValue);
                    using (RegistryKey subkey = Registry.CurrentUser.CreateSubKey(@"Software\Cyberlink\Common\CLVSD\MediaPortal"))
                    {
                        subkey.SetValue("UIUseHVA", codecValue);
                    }
                }
                if (codecType == "NVIDIA Video Decoder")
                {
                    codecValue = xmlreader.GetValueAsInt("videocodec", "nvidia", 1);
                    Log.Info("DVDPlayer9:Resetting NVIDIA DXVA to {0}", codecValue);
                    using (RegistryKey subkey = Registry.LocalMachine.CreateSubKey(@"Software\NVIDIA Corporation\Filters\Video"))
                    {
                        subkey.SetValue("EnableDXVA", codecValue);
                    }
                }
            }
            try
            {
                Log.Info("DVDPlayer9: cleanup DShow graph");

                if (_mediaCtrl != null)
                {
                    int         counter = 0;
                    FilterState state;
                    hr = _mediaCtrl.Stop();
                    hr = _mediaCtrl.GetState(10, out state);
                    while (state != FilterState.Stopped || GUIGraphicsContext.InVmr9Render)
                    {
                        System.Threading.Thread.Sleep(100);
                        hr = _mediaCtrl.GetState(10, out state);
                        counter++;
                        if (counter >= 30)
                        {
                            if (state != FilterState.Stopped)
                            {
                                Log.Debug("DVDPlayer9: graph still running");
                            }
                            if (GUIGraphicsContext.InVmr9Render)
                            {
                                Log.Debug("DVDPlayer9: in renderer");
                            }
                            break;
                        }
                    }
                    _mediaCtrl = null;
                }

                _state = PlayState.Stopped;
                VMR9Util.g_vmr9.EVRSetDVDMenuState(false);

                _visible    = false;
                _mediaEvt   = null;
                _dvdCtrl    = null;
                _dvdInfo    = null;
                _basicVideo = null;
                _basicAudio = null;
                _mediaPos   = null;
                _videoWin   = null;
                _pendingCmd = false;

                if (_cmdOption != null)
                {
                    DirectShowUtil.ReleaseComObject(_cmdOption);
                    _cmdOption = null;
                }

                if (_dvdbasefilter != null)
                {
                    while ((hr = DirectShowUtil.ReleaseComObject(_dvdbasefilter)) > 0)
                    {
                        ;
                    }
                    _dvdbasefilter = null;
                }

                if (_dvdGraph != null)
                {
                    while ((hr = DirectShowUtil.ReleaseComObject(_dvdGraph)) > 0)
                    {
                        ;
                    }
                    _dvdGraph = null;
                }

                if (_line21Decoder != null)
                {
                    while ((hr = DirectShowUtil.ReleaseComObject(_line21Decoder)) > 0)
                    {
                        ;
                    }
                    _line21Decoder = null;
                }

                PostProcessingEngine.GetInstance().FreePostProcess();

                if (_vmr9 != null)
                {
                    _vmr9.Enable(false);
                    _vmr9.SafeDispose();
                    _vmr9 = null;
                }

                if (_graphBuilder != null)
                {
                    DirectShowUtil.RemoveFilters(_graphBuilder);
                    // _rotEntry has a reference to _graphBuilder (see _rotEntry ctor)
                    // so, release of _rotEntry must be before _graphBuilder is released
                    if (_rotEntry != null)
                    {
                        _rotEntry.SafeDispose();
                        _rotEntry = null;
                    }
                    while ((hr = DirectShowUtil.ReleaseComObject(_graphBuilder)) > 0)
                    {
                        ;
                    }
                    _graphBuilder = null;
                }

                _state = PlayState.Init;
                GUIGraphicsContext.form.Invalidate(true);
                //GUIGraphicsContext.form.Activate();
            }
            catch (Exception ex)
            {
                Log.Error("DVDPlayer9: Exception while cleanuping DShow graph - {0} {1}", ex.Message, ex.StackTrace);
            }
            Log.Info("DVDPlayer9: Disabling DX9 exclusive mode");
            GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 0, 0, null);

            GUIWindowManager.SendMessage(msg);
        }
Exemple #2
0
        private void Cleanup()
        {
            if (graphBuilder == null)
            {
                return;
            }
            int hr;

            Log.Info("RTSPPlayer:cleanup DShow graph");
            try
            {
                if (_mediaCtrl != null)
                {
                    int         counter = 0;
                    FilterState state;
                    hr = _mediaCtrl.Stop();
                    hr = _mediaCtrl.GetState(10, out state);
                    while (state != FilterState.Stopped || GUIGraphicsContext.InVmr9Render)
                    {
                        Thread.Sleep(100);
                        hr = _mediaCtrl.GetState(10, out state);
                        counter++;
                        if (counter >= 30)
                        {
                            if (state != FilterState.Stopped)
                            {
                                Log.Error("RTSPPlayer: graph still running");
                            }
                            if (GUIGraphicsContext.InVmr9Render)
                            {
                                Log.Error("RTSPPlayer: in renderer");
                            }
                            break;
                        }
                    }
                    _mediaCtrl = null;
                }

                if (Vmr9 != null)
                {
                    Vmr9.Enable(false);
                }

                if (mediaEvt != null)
                {
                    hr       = mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
                    mediaEvt = null;
                }

                videoWin = graphBuilder as IVideoWindow;
                if (videoWin != null)
                {
                    hr       = videoWin.put_Visible(OABool.False);
                    hr       = videoWin.put_Owner(IntPtr.Zero);
                    videoWin = null;
                }

                _mediaSeeking = null;
                mediaPos      = null;
                basicAudio    = null;
                basicVideo    = null;
                videoWin      = null;
                SubEngine.GetInstance().FreeSubtitles();

                if (graphBuilder != null)
                {
                    DirectShowUtil.RemoveFilters(graphBuilder);
                    if (_rotEntry != null)
                    {
                        _rotEntry.SafeDispose();
                        _rotEntry = null;
                    }
                    DirectShowUtil.ReleaseComObject(graphBuilder);
                    graphBuilder = null;
                }

                if (Vmr9 != null)
                {
                    Vmr9.SafeDispose();
                    Vmr9 = null;
                }

                GUIGraphicsContext.form.Invalidate(true);
                _state = PlayState.Init;

                if (_mpegDemux != null)
                {
                    Log.Info("cleanup mpegdemux");
                    while ((hr = DirectShowUtil.ReleaseComObject(_mpegDemux)) > 0)
                    {
                        ;
                    }
                    _mpegDemux = null;
                }
                if (_rtspSource != null)
                {
                    Log.Info("cleanup _rtspSource");
                    while ((hr = DirectShowUtil.ReleaseComObject(_rtspSource)) > 0)
                    {
                        ;
                    }
                    _rtspSource = null;
                }
                if (_subtitleFilter != null)
                {
                    while ((hr = DirectShowUtil.ReleaseComObject(_subtitleFilter)) > 0)
                    {
                        ;
                    }
                    _subtitleFilter = null;
                    if (this.dvbSubRenderer != null)
                    {
                        this.dvbSubRenderer.SetPlayer(null);
                    }
                    this.dvbSubRenderer = null;
                }


                if (vobSub != null)
                {
                    Log.Info("cleanup vobSub");
                    while ((hr = DirectShowUtil.ReleaseComObject(vobSub)) > 0)
                    {
                        ;
                    }
                    vobSub = null;
                }
            }
            catch (Exception ex)
            {
                Log.Error("RTSPPlayer: Exception while cleanuping DShow graph - {0} {1}", ex.Message, ex.StackTrace);
            }

            //switch back to directx windowed mode
            Log.Info("RTSPPlayer: Disabling DX9 exclusive mode");
            GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 0, 0, null);

            GUIWindowManager.SendMessage(msg);
        }
        private void Cleanup()
        {
            lock (lockObj)
            {
                if (_graphBuilder == null)
                {
                    return;
                }
                int hr;
                Log.Info("TSReaderPlayer: cleanup DShow graph {0}", GUIGraphicsContext.InVmr9Render);
                try
                {
                    if (_mediaCtrl != null)
                    {
                        int         counter = 0;
                        FilterState state;
                        hr = _mediaCtrl.Stop();
                        hr = _mediaCtrl.GetState(10, out state);
                        while (state != FilterState.Stopped || GUIGraphicsContext.InVmr9Render)
                        {
                            Thread.Sleep(100);
                            hr = _mediaCtrl.GetState(10, out state);
                            counter++;
                            if (counter >= 30)
                            {
                                if (state != FilterState.Stopped)
                                {
                                    Log.Error("TSReaderPlayer: graph still running");
                                }
                                if (GUIGraphicsContext.InVmr9Render)
                                {
                                    Log.Error("TSReaderPlayer: in renderer");
                                }
                                break;
                            }
                        }
                        _mediaCtrl = null;
                    }

                    if (_mediaEvt != null)
                    {
                        hr        = _mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
                        _mediaEvt = null;
                    }

                    _videoWin = _graphBuilder as IVideoWindow;
                    if (_videoWin != null)
                    {
                        hr        = _videoWin.put_Visible(OABool.False);
                        hr        = _videoWin.put_Owner(IntPtr.Zero);
                        _videoWin = null;
                    }

                    _mediaSeeking = null;
                    _basicAudio   = null;
                    _basicVideo   = null;
                    _ireader      = null;

                    if (_audioRendererFilter != null)
                    {
                        while (DirectShowUtil.ReleaseComObject(_audioRendererFilter) > 0)
                        {
                            ;
                        }
                        _audioRendererFilter = null;
                    }

                    if (_fileSource != null)
                    {
                        DirectShowUtil.ReleaseComObject(_fileSource, 5000);
                        _fileSource = null;
                    }

                    PostProcessingEngine.GetInstance().FreePostProcess();

                    if (_vmr9 != null)
                    {
                        _vmr9.Enable(false);
                        _vmr9.SafeDispose();
                        _vmr9 = null;
                    }

                    if (_line21Decoder != null)
                    {
                        while ((hr = DirectShowUtil.ReleaseComObject(_line21Decoder)) > 0)
                        {
                            ;
                        }
                        _line21Decoder = null;
                    }

                    if (_graphBuilder != null)
                    {
                        DirectShowUtil.RemoveFilters(_graphBuilder);
                        if (_rotEntry != null)
                        {
                            _rotEntry.SafeDispose();
                            _rotEntry = null;
                        }
                        while ((hr = DirectShowUtil.ReleaseComObject(_graphBuilder)) > 0)
                        {
                            ;
                        }
                        _graphBuilder = null;
                    }

                    if (_dvbSubRenderer != null)
                    {
                        _dvbSubRenderer.SetPlayer(null);
                        _dvbSubRenderer = null;
                    }

                    GUIGraphicsContext.form.Invalidate(true);
                    _state = PlayState.Init;
                }
                catch (Exception ex)
                {
                    Log.Error("TSReaderPlayer: Exception while cleaning DShow graph - {0} {1}", ex.Message, ex.StackTrace);
                }
                //switch back to directx windowed mode
                Log.Info("TSReaderPlayer: Disabling DX9 exclusive mode");
                GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 0, 0, null);
                GUIWindowManager.SendMessage(msg);
            }
        }
        private void Cleanup()
        {
            if (_graphBuilder == null)
            {
                Log.Info("StreamBufferPlayer9:grapbuilder=null");
                return;
            }

            int hr;

            Log.Info("StreamBufferPlayer9:cleanup DShow graph {0}", GUIGraphicsContext.InVmr9Render);
            try
            {
                if (_mediaCtrl != null)
                {
                    int         counter = 0;
                    FilterState state;
                    hr = _mediaCtrl.Stop();
                    hr = _mediaCtrl.GetState(10, out state);
                    while (state != FilterState.Stopped || GUIGraphicsContext.InVmr9Render)
                    {
                        System.Threading.Thread.Sleep(100);
                        hr = _mediaCtrl.GetState(10, out state);
                        counter++;
                        if (counter >= 30)
                        {
                            if (state != FilterState.Stopped)
                            {
                                Log.Debug("StreamBufferPlayer9: graph still running");
                            }
                            if (GUIGraphicsContext.InVmr9Render)
                            {
                                Log.Debug("StreamBufferPlayer9: in renderer");
                            }
                            break;
                        }
                    }
                    _mediaCtrl = null;
                }

                if (_vmr9 != null)
                {
                    Log.Info("StreamBufferPlayer9: vmr9 disable");
                    _vmr9.Enable(false);
                }

                _mediaEvt           = null;
                _mediaSeeking       = null;
                _mediaSeeking2      = null;
                _videoWin           = null;
                _basicAudio         = null;
                _basicVideo         = null;
                _bufferSource       = null;
                _pinVmr9ConnectedTo = null;

                if (_pinVmr9ConnectedTo != null)
                {
                    DirectShowUtil.ReleaseComObject(_pinVmr9ConnectedTo);
                    _pinVmr9ConnectedTo = null;
                }

                if (streamConfig2 != null)
                {
                    while ((hr = DirectShowUtil.ReleaseComObject(streamConfig2)) > 0)
                    {
                        ;
                    }
                    streamConfig2 = null;
                }

                m_StreamBufferConfig = null;

                if (_vmr9 != null)
                {
                    Log.Info("StreamBufferPlayer9: vmr9 dispose");
                    _vmr9.SafeDispose();
                    _vmr9 = null;
                }

                if (_graphBuilder != null)
                {
                    DirectShowUtil.RemoveFilters(_graphBuilder);
                    if (_rotEntry != null)
                    {
                        _rotEntry.SafeDispose();
                        _rotEntry = null;
                    }
                    while ((hr = DirectShowUtil.ReleaseComObject(_graphBuilder)) > 0)
                    {
                        ;
                    }
                    _graphBuilder = null;
                }

                GUIGraphicsContext.form.Invalidate(true);
                _state = PlayState.Init;
            }
            catch (Exception ex)
            {
                Log.Error("StreamBufferPlayer9: Exception while cleaning DShow graph - {0} {1}", ex.Message, ex.StackTrace);
            }

            //switch back to directx windowed mode
            Log.Info("StreamBufferPlayer9: Disabling DX9 exclusive mode");
            GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 0, 0, null);

            GUIWindowManager.SendMessage(msg);

            Log.Info("StreamBufferPlayer9: Cleanup done");
        }
        protected void Cleanup()
        {
            if (graphBuilder == null)
            {
                return;
            }
            int hr = 0;

            Log.Info("VideoPlayer9: Cleanup DShow graph");
            try
            {
                if (mediaCtrl != null)
                {
                    int         counter = 0;
                    FilterState state;
                    hr = mediaCtrl.Stop();
                    hr = mediaCtrl.GetState(10, out state);
                    while (state != FilterState.Stopped || GUIGraphicsContext.InVmr9Render)
                    {
                        Log.Debug("VideoPlayer9: graph still running");
                        Thread.Sleep(100);
                        hr = mediaCtrl.GetState(10, out state);
                        counter++;
                        if (counter >= 30)
                        {
                            if (state != FilterState.Stopped)
                            {
                                Log.Debug("VideoPlayer9: graph still running");
                            }
                            if (GUIGraphicsContext.InVmr9Render)
                            {
                                Log.Debug("VideoPlayer9: in renderer");
                            }
                            break;
                        }
                    }
                    mediaCtrl = null;
                }

                if (mediaEvt != null)
                {
                    hr       = mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
                    mediaEvt = null;
                }

                if (videoWin != null)
                {
                    hr       = videoWin.put_Visible(OABool.False);
                    hr       = videoWin.put_Owner(IntPtr.Zero);
                    videoWin = null;
                }

                mediaSeek  = null;
                mediaPos   = null;
                basicAudio = null;
                basicVideo = null;
                SubEngine.GetInstance().FreeSubtitles();
                PostProcessingEngine.GetInstance().FreePostProcess();

                if (_FFDShowAudio != null)
                {
                    DirectShowUtil.ReleaseComObject(_FFDShowAudio);
                    _FFDShowAudio = null;
                }

                if (_audioSwitcher != null)
                {
                    DirectShowUtil.ReleaseComObject(_audioSwitcher);
                    _audioSwitcher = null;
                }

                if (Vmr9 != null)
                {
                    Vmr9.Enable(false);
                    Vmr9.SafeDispose();
                    Vmr9 = null;
                }

                if (graphBuilder != null)
                {
                    DirectShowUtil.RemoveFilters(graphBuilder);
                    if (_rotEntry != null)
                    {
                        _rotEntry.SafeDispose();
                        _rotEntry = null;
                    }
                    DirectShowUtil.ReleaseComObject(graphBuilder);
                    graphBuilder = null;
                }

                GUIGraphicsContext.form.Invalidate(true);
                m_state = PlayState.Init;
            }
            catch (Exception ex)
            {
                Log.Error("VideoPlayerVMR9: Exception while cleanuping DShow graph - {0} {1}", ex.Message, ex.StackTrace);
            }
            //switch back to directx windowed mode
            Log.Info("VideoPlayerVMR9: Disabling DX9 exclusive mode");
            GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 0, 0, null);

            GUIWindowManager.SendMessage(msg);
        }