aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/tstools.cpp
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2007-05-24 19:07:16 +0000
committerFelix Domke <tmbinc@elitedvb.net>2007-05-24 19:07:16 +0000
commit2feb8d273908707708619d771e779b0c64905671 (patch)
tree7f0810e73fb43c0d05eebe0e3956981e10e0e3a1 /lib/dvb/tstools.cpp
parentbf2ca3f72899f3bb64da6bea39704a52ce1b84db (diff)
downloadenigma2-2feb8d273908707708619d771e779b0c64905671.tar.gz
enigma2-2feb8d273908707708619d771e779b0c64905671.zip
ignore negative segments which might occur when PTS and PCR values are mixed
Diffstat (limited to 'lib/dvb/tstools.cpp')
-rw-r--r--lib/dvb/tstools.cpp33
1 files changed, 33 insertions, 0 deletions
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<pts_t, off_t>::const_iterator l = m_samples.lower_bound(p);
+ std::map<pts_t, off_t>::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;
}