aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2008-03-25 17:24:50 +0000
committerFelix Domke <tmbinc@elitedvb.net>2008-03-25 17:24:50 +0000
commit01dfc57fc043ec0d404068d5abf325c2a59ff027 (patch)
tree280c59857777dacffc04c8ac2d4517cea8ba8209
parent3bc44367624845557581d560c4700c4f62080b8f (diff)
downloadenigma2-01dfc57fc043ec0d404068d5abf325c2a59ff027.tar.gz
enigma2-01dfc57fc043ec0d404068d5abf325c2a59ff027.zip
optimize pvr parser a bit, don't load more than 2 APs per second to speed up things a bit
-rw-r--r--lib/dvb/pvrparse.cpp39
-rw-r--r--lib/dvb/pvrparse.h5
2 files changed, 31 insertions, 13 deletions
diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp
index c96669b0..d6978301 100644
--- a/lib/dvb/pvrparse.cpp
+++ b/lib/dvb/pvrparse.cpp
@@ -35,6 +35,9 @@ int eMPEGStreamInformation::load(const char *filename)
if (!f)
return -1;
m_access_points.clear();
+ m_pts_to_offset.clear();
+ pts_t last = -(1LL<<62);
+ int loaded = 0, skipped = 0;
while (1)
{
unsigned long long d[2];
@@ -45,8 +48,16 @@ int eMPEGStreamInformation::load(const char *filename)
d[0] = bswap_64(d[0]);
d[1] = bswap_64(d[1]);
#endif
- m_access_points[d[0]] = d[1];
+ if ((d[1] - last) > 90000/2)
+ {
+ m_access_points[d[0]] = d[1];
+ m_pts_to_offset.insert(std::pair<pts_t,off_t>(d[1], d[0]));
+ last = d[1];
+ loaded++;
+ } else
+ skipped++;
}
+ eDebug("loaded %d, skipped %d", loaded, skipped);
fclose(f);
fixupDiscontinuties();
return 0;
@@ -123,7 +134,7 @@ pts_t eMPEGStreamInformation::getDelta(off_t offset)
/* i can be the first when you query for something before the first PTS */
if (i != m_timestamp_deltas.begin())
--i;
-
+
return i->second;
}
@@ -132,24 +143,29 @@ int eMPEGStreamInformation::fixupPTS(const off_t &offset, pts_t &ts)
if (!m_timestamp_deltas.size())
return -1;
- std::map<off_t, pts_t>::const_iterator i = m_access_points.upper_bound(offset - 4 * 1024 * 1024), nearest = m_access_points.end();
-
- while (i != m_access_points.end())
+ std::multimap<pts_t, off_t>::const_iterator
+ l = m_pts_to_offset.upper_bound(ts - 60 * 90000),
+ u = m_pts_to_offset.upper_bound(ts + 60 * 90000),
+ nearest = m_access_points.end();
+
+ while (l != u)
{
- if ((nearest == m_access_points.end()) || (llabs(i->second - ts) < llabs(nearest->second - ts)))
- nearest = i;
- ++i;
+ if ((nearest == m_pts_to_offset.end()) || (llabs(l->first - ts) < llabs(nearest->first - ts)))
+ nearest = l;
+ ++l;
}
if (nearest == m_access_points.end())
- return -1;
- ts -= getDelta(nearest->first);
+ return 1;
+
+ ts -= getDelta(nearest->second);
+
return 0;
}
int eMPEGStreamInformation::getPTS(off_t &offset, pts_t &pts)
{
std::map<off_t,pts_t>::iterator before = m_access_points.lower_bound(offset);
-
+
/* usually, we prefer the AP before the given offset. however if there is none, we take any. */
if (before != m_access_points.begin())
--before;
@@ -170,7 +186,6 @@ pts_t eMPEGStreamInformation::getInterpolated(off_t offset)
{
/* get the PTS values before and after the offset. */
std::map<off_t,pts_t>::iterator before, after;
-
after = m_access_points.upper_bound(offset);
before = after;
diff --git a/lib/dvb/pvrparse.h b/lib/dvb/pvrparse.h
index 9a0c3eb0..69bb9924 100644
--- a/lib/dvb/pvrparse.h
+++ b/lib/dvb/pvrparse.h
@@ -19,7 +19,10 @@ public:
/* timestampDelta is in fact the difference between */
/* the PTS in the stream and a real PTS from 0..max */
std::map<off_t, pts_t> m_timestamp_deltas;
-
+
+ /* these are non-fixed up pts value (like m_access_points), just used to accelerate stuff. */
+ std::multimap<pts_t, off_t> m_pts_to_offset;
+
int save(const char *filename);
int load(const char *filename);