From: Felix Domke Date: Thu, 24 May 2007 19:07:16 +0000 (+0000) Subject: ignore negative segments which might occur when PTS and PCR values are mixed X-Git-Tag: 2.6.0~2226 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/2feb8d273908707708619d771e779b0c64905671 ignore negative segments which might occur when PTS and PCR values are mixed --- diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index fa65a6d4..5157ef22 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -258,6 +258,14 @@ int eDVBTSTools::getOffset(off_t &offset, pts_t &pts) pts_t pts_diff = u->first - l->first; off_t offset_diff = u->second - l->second; + + if (offset_diff < 0) + { + eDebug("something went wrong when taking samples."); + m_samples.clear(); + takeSamples(); + continue; + } eDebug("using: %llx:%llx -> %llx:%llx", l->first, u->first, l->second, u->second); @@ -295,12 +303,14 @@ int eDVBTSTools::getOffset(off_t &offset, pts_t &pts) if (p != -1) { pts = p; + eDebug("aborting. Taking %llx as offset for %lld", offset, pts); return 0; } } int bitrate = calcBitrate(); offset = pts * (pts_t)bitrate / 8ULL / 90000ULL; + eDebug("fallback, bitrate=%d, results in %016llx", bitrate, offset); offset -= offset % 188; return 0; @@ -448,6 +458,29 @@ int eDVBTSTools::takeSample(off_t off, pts_t &p) { if (!eDVBTSTools::getPTS(off, p, 1)) { + /* as we are happily mixing PTS and PCR values (no comment, please), we might + end up with some "negative" segments. + + so check if this new sample is between the previous and the next field*/ + + std::map::const_iterator l = m_samples.lower_bound(p); + std::map::const_iterator u = l; + + if (l != m_samples.begin()) + { + --l; + if (u != m_samples.end()) + { + if ((l->second > off) || (u->second < off)) + { + eDebug("ignoring sample %llx %llx %llx (%lld %lld %lld)", + l->second, off, u->second, l->first, p, u->first); + return 1; + } + } + } + + m_samples[p] = off; return 0; }