don't use internals of other classes
[enigma2.git] / lib / dvb / decoder.cpp
index 8d1a4b1256c60a68aaaeba9aba87db22d5b524ce..951a2edf1e5d539d2f9c28ca4c2e0d1e476776d9 100644 (file)
@@ -65,12 +65,11 @@ int eDVBAudio::startPid(int pid)
                eWarning("audio: DMX_SET_PES_FILTER: %m");
                return -errno;
        }
-       if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
+       if (::ioctl(m_fd_demux, DMX_START) < 0)
        {
                eWarning("audio: DMX_START: %m");
                return -errno;
        }
-       
        if (::ioctl(m_fd, AUDIO_PLAY) < 0)
                eWarning("audio: AUDIO_PLAY: %m");
        return 0;
@@ -80,8 +79,36 @@ void eDVBAudio::stop()
 {
        if (::ioctl(m_fd, AUDIO_STOP) < 0)
                eWarning("audio: AUDIO_STOP: %m");
+#if HAVE_DVB_API_VERSION > 2
        if (::ioctl(m_fd_demux, DMX_STOP) < 0)
                eWarning("audio: DMX_STOP: %m");
+#endif
+}
+       
+#if HAVE_DVB_API_VERSION < 3
+void eDVBAudio::stopPid()
+{
+       if (::ioctl(m_fd_demux, DMX_STOP) < 0)
+               eWarning("audio: DMX_STOP: %m");
+}
+#endif
+
+void eDVBAudio::flush()
+{
+       if (::ioctl(m_fd, AUDIO_CLEAR_BUFFER) < 0)
+               eDebug("audio: AUDIO_CLEAR_BUFFER: %m");
+}
+
+void eDVBAudio::freeze()
+{
+       if (::ioctl(m_fd, AUDIO_PAUSE) < 0)
+               eDebug("video: AUDIO_PAUSE: %m");
+}
+       
+void eDVBAudio::unfreeze()
+{
+       if (::ioctl(m_fd, AUDIO_CONTINUE) < 0)
+               eDebug("video: AUDIO_CONTINUE: %m");
 }
        
 eDVBAudio::~eDVBAudio()
@@ -117,6 +144,7 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux)
        
 int eDVBVideo::startPid(int pid)
 {      
+       eDebug("setting video pid to %x", pid);
        if ((m_fd < 0) || (m_fd_demux < 0))
                return -1;
        dmx_pes_filter_params pes;
@@ -131,12 +159,11 @@ int eDVBVideo::startPid(int pid)
                eWarning("video: DMX_SET_PES_FILTER: %m");
                return -errno;
        }
-       if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
+       if (::ioctl(m_fd_demux, DMX_START) < 0)
        {
                eWarning("video: DMX_START: %m");
                return -errno;
        }
-       
        if (::ioctl(m_fd, VIDEO_PLAY) < 0)
                eWarning("video: VIDEO_PLAY: %m");
        else
@@ -148,9 +175,37 @@ void eDVBVideo::stop()
 {
        if (::ioctl(m_fd, VIDEO_STOP) < 0)
                eWarning("video: VIDEO_STOP: %m");
+#if HAVE_DVB_API_VERSION > 2
+       if (::ioctl(m_fd_demux, DMX_STOP) < 0)
+               eWarning("video: DMX_STOP: %m");
+#endif
+}
+
+#if HAVE_DVB_API_VERSION < 3
+void eDVBVideo::stopPid()
+{
        if (::ioctl(m_fd_demux, DMX_STOP) < 0)
                eWarning("video: DMX_STOP: %m");
 }
+#endif
+
+void eDVBVideo::flush()
+{
+       if (::ioctl(m_fd, VIDEO_CLEAR_BUFFER) < 0)
+               eDebug("video: VIDEO_CLEAR_BUFFER: %m");
+}
+       
+void eDVBVideo::freeze()
+{
+       if (::ioctl(m_fd, VIDEO_FREEZE) < 0)
+               eDebug("video: VIDEO_FREEZE: %m");
+}
+       
+void eDVBVideo::unfreeze()
+{
+       if (::ioctl(m_fd, VIDEO_CONTINUE) < 0)
+               eDebug("video: VIDEO_CONTINUE: %m");
+}
        
 eDVBVideo::~eDVBVideo()
 {
@@ -177,6 +232,7 @@ eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
 
 int eDVBPCR::startPid(int pid)
 {
+       eDebug("setting pcr pid to %x", pid);
        if (m_fd_demux < 0)
                return -1;
        dmx_pes_filter_params pes;
@@ -191,7 +247,7 @@ int eDVBPCR::startPid(int pid)
                eWarning("video: DMX_SET_PES_FILTER: %m");
                return -errno;
        }
-       if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
+       if (::ioctl(m_fd_demux, DMX_START) < 0)
        {
                eWarning("video: DMX_START: %m");
                return -errno;
@@ -217,12 +273,28 @@ int eTSMPEGDecoder::setState()
 {
        int res = 0;
        eDebug("changed %x", m_changed);
-
+#if HAVE_DVB_API_VERSION < 3
+       if (m_changed & changeAudio && m_audio)
+               m_audio->stopPid();
+       if (m_changed & changeVideo && m_video)
+               m_video->stopPid();
+       if (m_changed & changePCR && m_pcr)
+       {
+               m_pcr->stop();
+               m_pcr=0;
+       }
+       if (m_changed & changeAudio && m_audio)
+       {
+               m_audio->stop();
+               m_audio=0;
+       }
+       if (m_changed & changeVideo && m_video)
+       {
+               m_video->stop();
+               m_video=0;
+       }
        if (m_changed & changePCR)
        {
-               if (m_pcr)
-                       m_pcr->stop();
-               m_pcr = 0;
                m_pcr = new eDVBPCR(m_demux);
                if (m_pcr->startPid(m_pcrpid))
                {
@@ -233,9 +305,6 @@ int eTSMPEGDecoder::setState()
        }
        if (m_changed & changeVideo)
        {
-               if (m_video)
-                       m_video->stop();
-               m_video = 0;
                m_video = new eDVBVideo(m_demux, 0);
                if (m_video->startPid(m_vpid))
                {
@@ -246,9 +315,6 @@ int eTSMPEGDecoder::setState()
        }
        if (m_changed & changeAudio)
        {
-               if (m_audio)
-                       m_audio->stop();
-               m_audio = 0;
                m_audio = new eDVBAudio(m_demux, 0);
                if (m_audio->startPid(m_apid))
                {
@@ -257,11 +323,62 @@ int eTSMPEGDecoder::setState()
                }
                m_changed &= ~changeAudio;
        }
+#else
+       if (m_changed & changePCR)
+       {
+               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))
+                       {
+                               eWarning("video: startpid failed!");
+                               res = -1;
+                       }
+               }
+               m_changed &= ~changePCR;
+       }
+       if (m_changed & changeVideo)
+       {
+               if (m_video)
+                       m_video->stop();
+               m_video = 0;
+               if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
+               {
+                       m_video = new eDVBVideo(m_demux, 0);
+                       if (m_video->startPid(m_vpid))
+                       {
+                               eWarning("video: startpid failed!");
+                               res = -1;
+                       }
+               }
+               m_changed &= ~changeVideo;
+       }
+       if (m_changed & changeAudio)
+       {
+               if (m_audio)
+                       m_audio->stop();
+               m_audio = 0;
+               if ((m_apid >= 0) && (m_apid < 0x1FFF))
+               {
+                       m_audio = new eDVBAudio(m_demux, 0);
+                       if (m_audio->startPid(m_apid))
+                       {
+                               eWarning("audio: startpid failed!");
+                               res = -1;
+                       }
+               }
+               m_changed &= ~changeAudio;
+       }
+#endif
        return res;
 }
 
-eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
+eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux), m_changed(0)
 {
+       demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event);
 }
 
 eTSMPEGDecoder::~eTSMPEGDecoder()
@@ -299,7 +416,7 @@ RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
                m_changed |= changePCR;
                m_pcrpid = pcrpid;
        }
-       return -1;
+       return 0;
 }
 
 RESULT eTSMPEGDecoder::setSyncMaster(int who)
@@ -314,12 +431,24 @@ RESULT eTSMPEGDecoder::start()
 
 RESULT eTSMPEGDecoder::freeze(int cont)
 {
-       return -1;
+       if (m_video)
+               m_video->freeze();
+
+       if (m_audio)
+               m_audio->freeze();
+       
+       return 0;
 }
 
 RESULT eTSMPEGDecoder::unfreeze()
 {
-       return -1;
+       if (m_video)
+               m_video->unfreeze();
+
+       if (m_audio)
+               m_audio->unfreeze();
+       
+       return 0;
 }
 
 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
@@ -341,3 +470,24 @@ RESULT eTSMPEGDecoder::setZoom(int what)
 {
        return -1;
 }
+
+RESULT eTSMPEGDecoder::flush()
+{
+       if (m_audio)
+               m_audio->flush();
+       if (m_video)
+               m_video->flush();
+       return 0;
+}
+
+void eTSMPEGDecoder::demux_event(int event)
+{
+       switch (event)
+       {
+       case eDVBDemux::evtFlush:
+               flush();
+               break;
+       default:
+               break;
+       }
+}