X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/c2f1a638b1eb861d1a8e97530adfcefd65ff6ac0..8f01a41693ff4b01a224e9ea2f9a26538ec20414:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 13ae224c..31cf7720 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -9,6 +9,7 @@ #include #include #include +#include DEFINE_REF(eDVBRegisteredFrontend); DEFINE_REF(eDVBRegisteredDemux); @@ -619,11 +620,49 @@ RESULT eDVBChannel::getCurrentPosition(pts_t &pos) RESULT eDVBChannel::seekTo(pts_t &pts) { +#if 0 + eDebug("eDVBChannel: seekTo .. %llx", pts); m_pvr_thread->pause(); if (m_decoder_demux) m_decoder_demux->get().flush(); /* demux will also flush all decoder.. */ -// m_pvr_thread->seek(pts); + + off_t r; + + if (!m_tstools.getPosition(pts, r)); + m_pvr_thread->seek(r); + else + eDebug("getPosition failed!"); m_pvr_thread->resume(); +#endif } +RESULT eDVBChannel::seekToPosition(int relative, const off_t &r) +{ + /* when seeking, we have to ensure that all buffers are flushed. + there are basically 3 buffers: + a.) the filepush's internal buffer + b.) the PVR buffer (before demux) + c.) the ratebuffer (after demux) + + it's important to clear them in the correct order, otherwise + the ratebuffer (for example) would immediately refill from + the not-yet-flushed PVR buffer. + */ + eDebug("eDVBChannel: seekToPosition .. %llx", r); + m_pvr_thread->pause(); + + /* flush internal filepush buffer */ + m_pvr_thread->flush(); + + /* HACK: flush PVR buffer */ + ::ioctl(m_pvr_fd_dst, 0); + + /* flush ratebuffers (video, audio) */ + if (m_decoder_demux) + m_decoder_demux->get().flush(); + + /* demux will also flush all decoder.. */ + m_pvr_thread->seek(relative ? SEEK_CUR : SEEK_SET, r); + m_pvr_thread->resume(); +}