diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-11-15 05:06:43 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-11-15 05:06:43 +0000 |
| commit | 06fb2bcb4ddf528cbe65d58be41cf8ecf8697e76 (patch) | |
| tree | c831c09d0bd44b046e0e819486d509b759109ec3 /lib/dvb/dvb.cpp | |
| parent | 0bb92df139892968d715539387d19de4d175c8b4 (diff) | |
| download | enigma2-06fb2bcb4ddf528cbe65d58be41cf8ecf8697e76.tar.gz enigma2-06fb2bcb4ddf528cbe65d58be41cf8ecf8697e76.zip | |
fix pts relative seeking, make pts_t signed
Diffstat (limited to 'lib/dvb/dvb.cpp')
| -rw-r--r-- | lib/dvb/dvb.cpp | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 78cef639..ed972bf1 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -618,27 +618,34 @@ RESULT eDVBChannel::getCurrentPosition(pts_t &pos) return 0; } -RESULT eDVBChannel::seekTo(pts_t &pts) +RESULT eDVBChannel::seekTo(int relative, 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.. */ + int bitrate = m_tstools.calcBitrate(); /* in bits/s */ - off_t r; + if (bitrate == -1) + return -1; - if (!m_tstools.getPosition(pts, r)); - m_pvr_thread->seek(r); - else - eDebug("getPosition failed!"); - m_pvr_thread->resume(); -#endif + if (relative) + { + pts_t now; + if (getCurrentPosition(now)) + { + eDebug("seekTo: getCurrentPosition failed!"); + return -1; + } + pts += now; + } + + if (pts < 0) + pts = 0; + + off_t offset = (pts * (pts_t)bitrate) / 8ULL / 90000ULL; + + seekToPosition(offset); return 0; } -RESULT eDVBChannel::seekToPosition(int relative, const off_t &r) +RESULT eDVBChannel::seekToPosition(const off_t &r) { /* when seeking, we have to ensure that all buffers are flushed. there are basically 3 buffers: @@ -664,7 +671,7 @@ RESULT eDVBChannel::seekToPosition(int relative, const off_t &r) m_decoder_demux->get().flush(); /* demux will also flush all decoder.. */ - m_pvr_thread->seek(relative ? SEEK_CUR : SEEK_SET, r); + m_pvr_thread->seek(SEEK_SET, r); m_pvr_thread->resume(); return 0; } |
