From 2c0fdda82ac02f8436816236b4649819274d1c95 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 28 Feb 2006 01:43:36 +0000 Subject: [PATCH 1/1] add getNextAccessPoint --- lib/dvb/pvrparse.cpp | 35 +++++++++++++++++++++++++++++++++++ lib/dvb/pvrparse.h | 2 ++ lib/dvb/tstools.cpp | 11 +++++++++++ lib/dvb/tstools.h | 2 ++ 4 files changed, 50 insertions(+) diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp index bde43765..65e599c3 100644 --- a/lib/dvb/pvrparse.cpp +++ b/lib/dvb/pvrparse.cpp @@ -217,6 +217,41 @@ off_t eMPEGStreamInformation::getAccessPoint(pts_t ts) return last; } +int eMPEGStreamInformation::getNextAccessPoint(pts_t &ts, const pts_t &start, int direction) +{ + off_t offset = getAccessPoint(start); + std::map::const_iterator i = m_access_points.find(offset); + if (i == m_access_points.end()) + { + eDebug("getNextAccessPoint: initial AP not found"); + return -1; + } + while (direction) + { + if (direction > 0) + { + if (i == m_access_points.end()) + return -1; + ++i; + direction--; + } + if (direction < 0) + { + if (i == m_access_points.begin()) + { + eDebug("at start"); + return -1; + } + --i; + direction++; + } + } + ts = i->second - getDelta(i->first); + eDebug("fine, at %llx - %llx = %llx", ts, i->second, getDelta(i->first)); + eDebug("fine, at %lld - %lld = %lld", ts, i->second, getDelta(i->first)); + return 0; +} + eMPEGStreamParserTS::eMPEGStreamParserTS(eMPEGStreamInformation &streaminfo): m_streaminfo(streaminfo), m_pktptr(0), m_pid(-1), m_need_next_packet(0), m_skip(0) { } diff --git a/lib/dvb/pvrparse.h b/lib/dvb/pvrparse.h index 7b586331..9a0c3eb0 100644 --- a/lib/dvb/pvrparse.h +++ b/lib/dvb/pvrparse.h @@ -40,6 +40,8 @@ public: off_t getAccessPoint(pts_t ts); + int getNextAccessPoint(pts_t &ts, const pts_t &start, int direction); + bool empty(); }; diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index e440aeca..b6792c65 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -191,6 +191,17 @@ int eDVBTSTools::getOffset(off_t &offset, pts_t &pts) } } +int eDVBTSTools::getNextAccessPoint(pts_t &ts, const pts_t &start, int direction) +{ + if (m_use_streaminfo) + return m_streaminfo.getNextAccessPoint(ts, start, direction); + else + { + eDebug("can't get next access point without streaminfo"); + return -1; + } +} + void eDVBTSTools::calcBegin() { if (m_fd < 0) diff --git a/lib/dvb/tstools.h b/lib/dvb/tstools.h index f23d8108..76128071 100644 --- a/lib/dvb/tstools.h +++ b/lib/dvb/tstools.h @@ -41,6 +41,8 @@ public: /* get (approximate) offset corresponding to PTS */ int getOffset(off_t &offset, pts_t &pts); + int getNextAccessPoint(pts_t &ts, const pts_t &start, int direction); + void calcBegin(); void calcEnd(); -- 2.30.2