diff -Naur enigma2.orig/lib/dvb/decoder.cpp enigma2/lib/dvb/decoder.cpp --- enigma2.orig/lib/dvb/decoder.cpp 2008-07-22 08:18:53.000000000 +0200 +++ enigma2/lib/dvb/decoder.cpp 2008-08-03 21::00.000000000 +0200 @@ -100,7 +100,7 @@ return -errno; } eDebug("ok"); - + m_is_freezed=0; return 0; } @@ -205,7 +205,10 @@ if (::ioctl(m_fd, AUDIO_PLAY) < 0) eDebug("failed (%m)"); else + { eDebug("ok"); + m_is_freezed=0; + } return 0; } #endif @@ -476,6 +479,10 @@ { if (m_is_freezed) { + if(m_is_fast_forward) + setFastForward(-1); //erzwinge Rücksetzten von FF + if(m_is_slow_motion) + setSlowMotion(-1); //erzwinge Rücksetzen von SloMo eDebugNoNewLine("VIDEO_CONTINUE - "); if (::ioctl(m_fd, VIDEO_CONTINUE) < 0) eDebug("failed (%m)"); @@ -487,26 +494,40 @@ int eDVBVideo::setSlowMotion(int repeat) { - eDebugNoNewLine("VIDEO_SLOWMOTION - "); - m_is_slow_motion = repeat; - int ret = ::ioctl(m_fd, VIDEO_SLOWMOTION, repeat); - if (ret < 0) - eDebug("failed(%m)"); - else - eDebug("ok"); - return ret; + if(!m_is_freezed || (repeat < 0)) + { + eDebugNoNewLine("VIDEO_SLOWMOTION - "); + m_is_slow_motion = repeat; + int ret = ::ioctl(m_fd, VIDEO_SLOWMOTION, repeat < 0 ? 0:repeat); + if (ret < 0) + eDebug("failed(%m)"); + else + { + eDebug("ok %d", repeat); + m_is_freezed=0; + } + return ret; + } + return 0; } int eDVBVideo::setFastForward(int skip) { - eDebugNoNewLine("VIDEO_FAST_FORWARD - "); - m_is_fast_forward = skip; - int ret = ::ioctl(m_fd, VIDEO_FAST_FORWARD, skip); - if (ret < 0) - eDebug("failed(%m)"); - else - eDebug("ok"); - return ret; + if(!m_is_freezed ||(skip < 0)) //skip -1 setzt setFastForward auf 0 + { + eDebugNoNewLine("VIDEO_FAST_FORWARD - "); + m_is_fast_forward = skip; + int ret = ::ioctl(m_fd, VIDEO_FAST_FORWARD, skip < 0 ? 0:skip); + if (ret < 0) + eDebug("failed(%m)"); + else + { + eDebug("ok %d",skip); + m_is_freezed=0; + } + return ret; + } + return 0; } int eDVBVideo::getPTS(pts_t &now) @@ -1017,7 +1039,10 @@ /* preroll is start in freezed mode. */ RESULT eTSMPEGDecoder::preroll() { - return setState(); + int res = setState(); + if (m_video->is_freezed()) + freeze(0); + return res; } RESULT eTSMPEGDecoder::freeze(int cont) @@ -1059,7 +1080,15 @@ setState(); if (m_video) - return m_video->setFastForward(frames_to_skip); + { + int res = 0; + if (m_video->is_freezed() && (!m_is_ff)) + freeze(0); + else + res = m_video->setFastForward(frames_to_skip); + + return res; + } else return -1; } @@ -1071,7 +1100,16 @@ setState(); if (m_video) - return m_video->setSlowMotion(repeat); + { + + int res = 0; + if (m_video->is_freezed() && (!m_is_sm)) + freeze(0); + else + res = m_video->setSlowMotion(repeat); + + return res; + } else return -1; } diff -Naur enigma2.orig/lib/dvb/decoder.h enigma2/lib/dvb/decoder.h --- enigma2.orig/lib/dvb/decoder.h 2008-07-22 08:18:53.000000000 +0200 +++ enigma2/lib/dvb/decoder.h 2008-07-31 08:00:11.000000000 +0200 @@ -67,6 +67,7 @@ int getPTS(pts_t &now); virtual ~eDVBVideo(); RESULT connectEvent(const Slot1 &event, ePtr &conn); + int is_freezed() { return m_is_freezed; } }; class eDVBPCR: public iObject