decoder.cpp: stop all pids first, and the restart pids... this hopefully fixes proble...
authorghost <andreas.monzner@multimedia-labs.de>
Tue, 11 Nov 2008 19:20:20 +0000 (20:20 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Tue, 11 Nov 2008 19:20:20 +0000 (20:20 +0100)
lib/dvb/decoder.cpp

index 5fa59ed..6ad3922 100644 (file)
@@ -836,37 +836,40 @@ int eTSMPEGDecoder::setState()
                if (m_pcr)
                        m_pcr->stop();
                m_pcr = 0;
-               if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
-               {
-                       m_pcr = new eDVBPCR(m_demux);
-                       if (m_pcr->startPid(m_pcrpid))
-                               res = -1;
-               }
-               m_changed &= ~changePCR;
        }
        if (m_changed & changeVideo)
        {
-               eDebug("VIDEO CHANGED (to %04x)", m_vpid);
                if (m_video)
                {
                        m_video->stop();
                        m_video = 0;
                        m_video_event_conn = 0;
                }
-               if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
-               {
-                       m_video = new eDVBVideo(m_demux, m_decoder);
-                       m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn);
-                       if (m_video->startPid(m_vpid, m_vtype))
-                               res = -1;
-               }
-               m_changed &= ~changeVideo;
        }
        if (m_changed & changeAudio)
        {
                if (m_audio)
                        m_audio->stop();
                m_audio = 0;
+       }
+       if (m_changed & changeText)
+       {
+               if (m_text)
+                       m_text->stop();
+               m_text = 0;
+       }
+       if (m_changed & changePCR)
+       {
+               if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
+               {
+                       m_pcr = new eDVBPCR(m_demux);
+                       if (m_pcr->startPid(m_pcrpid))
+                               res = -1;
+               }
+               m_changed &= ~changePCR;
+       }
+       if (m_changed & changeAudio)
+       {
                if ((m_apid >= 0) && (m_apid < 0x1FFF) && !noaudio)
                {
                        m_audio = new eDVBAudio(m_demux, m_decoder);
@@ -875,11 +878,19 @@ int eTSMPEGDecoder::setState()
                }
                m_changed &= ~changeAudio;
        }
+       if (m_changed & changeVideo)
+       {
+               if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
+               {
+                       m_video = new eDVBVideo(m_demux, m_decoder);
+                       m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn);
+                       if (m_video->startPid(m_vpid, m_vtype))
+                               res = -1;
+               }
+               m_changed &= ~changeVideo;
+       }
        if (m_changed & changeText)
        {
-               if (m_text)
-                       m_text->stop();
-               m_text = 0;
                if ((m_textpid >= 0) && (m_textpid < 0x1FFF) && !nott)
                {
                        m_text = new eDVBTText(m_demux);