From 06fb2bcb4ddf528cbe65d58be41cf8ecf8697e76 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 15 Nov 2005 05:06:43 +0000 Subject: [PATCH] fix pts relative seeking, make pts_t signed --- lib/dvb/dvb.cpp | 39 ++++++++++++++++++++++---------------- lib/dvb/dvb.h | 6 ++++-- lib/dvb/idvb.h | 7 ++++--- lib/service/iservice.h | 2 +- lib/service/servicedvb.cpp | 5 +++-- 5 files changed, 35 insertions(+), 24 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; } diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index 01a0e47e..b739f0ae 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -192,8 +192,10 @@ public: RESULT playFile(const char *file); RESULT getLength(pts_t &len); RESULT getCurrentPosition(pts_t &pos); - RESULT seekTo(pts_t &pts); - RESULT seekToPosition(int relative, const off_t &off); + RESULT seekTo(int relative, pts_t &pts); + /* seeking to relative positions won't work - + there is an unknown amount of buffers in between */ + RESULT seekToPosition(const off_t &off); private: ePtr m_frontend; diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index a23960af..b68c014b 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -470,7 +470,8 @@ public: virtual void ReleaseUse() = 0; }; -typedef unsigned long long pts_t; + /* signed, so we can express deltas. */ +typedef long long pts_t; class iDVBPVRChannel: public iDVBChannel { @@ -486,8 +487,8 @@ public: virtual RESULT getLength(pts_t &pts) = 0; virtual RESULT getCurrentPosition(pts_t &pos) = 0; - virtual RESULT seekTo(pts_t &pts) = 0; - virtual RESULT seekToPosition(int relative, const off_t &pts) = 0; + virtual RESULT seekTo(int relative, pts_t &pts) = 0; + virtual RESULT seekToPosition(const off_t &pts) = 0; }; class iDVBSectionReader; diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 376ed027..98b9ba0b 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -146,7 +146,7 @@ public: SWIG_ALLOW_OUTPUT_SIMPLE(eServiceReference); -typedef unsigned long long pts_t; +typedef long long pts_t; /* the reason we have the servicereference as additional argument is that we don't have to create one object for every entry in a possibly diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index d49c5f6d..f805ee70 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -652,8 +652,9 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to) if (m_service_handler.getPVRChannel(pvr_channel)) return -1; - /* this is of couse wrong: PTS values don't match with bytes. */ - return pvr_channel->seekToPosition(SEEK_CUR, direction * to); + to *= direction; + + return pvr_channel->seekTo(1, to); } RESULT eDVBServicePlay::getPlayPosition(pts_t &pos) -- 2.30.2