X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d6df38ffdd575880994170db75ce93480fb618f8..0fb354eb517927bd6c8465523800e6ee398a1db7:/lib/dvb/tstools.cpp diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index b47de868..5157ef22 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -1,3 +1,4 @@ +#define _ISOC99_SOURCE /* for llabs */ #include #include #include @@ -75,8 +76,11 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) offset -= offset % 188; if (m_file.lseek(offset, SEEK_SET) < 0) + { + eDebug("lseek failed"); return -1; - + } + int left = m_maxrange; while (left >= 188) @@ -92,6 +96,7 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) if (packet[0] != 0x47) { + eDebug("resync"); int i = 0; while (i < 188) { @@ -125,7 +130,7 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) pts |= ((unsigned long long)(packet[ 9]&0xFF)) << 1; pts |= ((unsigned long long)(packet[10]&0x80)) >> 7; offset -= 188; - eDebug("PCR found: %16llx", pts); + eDebug("PCR found at %llx: %16llx", offset, pts); if (fixed && fixupPTS(offset, pts)) return -1; return 0; @@ -162,7 +167,7 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) pts |= ((unsigned long long)(payload[13]&0xFE)) >> 1; offset -= 188; - eDebug("found pts %08llx at %08llx pid %02x stream: %02x", pts, offset, pid, payload[3]); +// eDebug("found pts %08llx at %08llx pid %02x stream: %02x", pts, offset, pid, payload[3]); /* convert to zero-based */ if (fixed && fixupPTS(offset, pts)) @@ -212,7 +217,6 @@ int eDVBTSTools::getOffset(off_t &offset, pts_t &pts) return 0; } else { - eDebug("get offset: pts=%llx", pts); calcBegin(); calcEnd(); if (!m_begin_valid) @@ -254,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); @@ -270,8 +282,6 @@ int eDVBTSTools::getOffset(off_t &offset, pts_t &pts) p = pts; - eDebug("so next guess at %llx", offset); - if (!takeSample(offset, p)) { int diff = (p - pts) / 90; @@ -293,13 +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; } } - eDebug("falling back"); int bitrate = calcBitrate(); offset = pts * (pts_t)bitrate / 8ULL / 90000ULL; + eDebug("fallback, bitrate=%d, results in %016llx", bitrate, offset); offset -= offset % 188; return 0; @@ -339,7 +350,7 @@ void eDVBTSTools::calcEnd() off_t end = m_file.lseek(0, SEEK_END); - if (abs(end - m_last_filelength) > 1*1024*1024) + if (llabs(end - m_last_filelength) > 1*1024*1024) { m_last_filelength = end; m_end_valid = 0; @@ -445,10 +456,31 @@ void eDVBTSTools::takeSamples() /* returns 0 when a sample was taken. */ int eDVBTSTools::takeSample(off_t off, pts_t &p) { - eDebug("take sample: %llx", off); if (!eDVBTSTools::getPTS(off, p, 1)) { - eDebug("took sample: %llx, %llx", off, p); + /* 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; }