aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2009-12-22 16:02:20 +0100
committerghost <andreas.monzner@multimedia-labs.de>2009-12-22 16:02:20 +0100
commitf901175ad6e72c60f0916c6ba6edcbdad7dbf5ec (patch)
tree7fa7116ae62f8cabdded0943aedbdc11488060cf /lib/dvb
parent6987607629f68a8c47cbe9cf48f6a112b83468ec (diff)
parentbbe28d433549d0559ac2f91ca2903d5bc6b60bf4 (diff)
downloadenigma2-f901175ad6e72c60f0916c6ba6edcbdad7dbf5ec.tar.gz
enigma2-f901175ad6e72c60f0916c6ba6edcbdad7dbf5ec.zip
Merge branch 'bug_245_record_playback_fixes'
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/dvb.cpp7
-rw-r--r--lib/dvb/pvrparse.cpp1
-rw-r--r--lib/dvb/tstools.cpp21
3 files changed, 18 insertions, 11 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index 894287e8..a8dfb193 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -1462,12 +1462,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
continue;
}
- size_t iframe_len;
- /* try to align to iframe */
- int direction = pts < 0 ? -1 : 1;
- m_tstools.findFrame(offset, iframe_len, direction);
-
- eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx (skipped additional %d frames due to iframe re-align)", relative, pts, offset, direction);
+ eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx", relative, pts, offset);
current_offset = align(offset, blocksize); /* in case tstools return non-aligned offset */
}
diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp
index 1393bf77..5cdecbd6 100644
--- a/lib/dvb/pvrparse.cpp
+++ b/lib/dvb/pvrparse.cpp
@@ -244,6 +244,7 @@ off_t eMPEGStreamInformation::getAccessPoint(pts_t ts, int marg)
off_t last = 0;
off_t last2 = 0;
pts_t lastc = 0;
+ ts += 1; // Add rounding error margin
for (std::map<off_t, pts_t>::const_iterator i(m_access_points.begin()); i != m_access_points.end(); ++i)
{
pts_t delta = getDelta(i->first);
diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp
index 00a1da72..b7ea945f 100644
--- a/lib/dvb/tstools.cpp
+++ b/lib/dvb/tstools.cpp
@@ -663,18 +663,23 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram
int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int frame_types)
{
- int nr_frames = 0;
+ int nr_frames, direction;
// eDebug("trying to move %d frames at %llx", distance, offset);
frame_types = frametypeI; /* TODO: intelligent "allow IP frames when not crossing an I-Frame */
- int direction = distance > 0 ? 0 : -1;
- distance = abs(distance);
-
off_t new_offset = offset;
size_t new_len = len;
int first = 1;
+ if (distance > 0) {
+ direction = 0;
+ nr_frames = 0;
+ } else {
+ direction = -1;
+ nr_frames = -1;
+ distance = -distance+1;
+ }
while (distance > 0)
{
int dir = direction;
@@ -688,12 +693,18 @@ int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int
// eDebug("we moved %d, %d to go frames (now at %llx)", dir, distance, new_offset);
- if (distance >= 0 || first)
+ if (distance >= 0 || direction == 0)
{
first = 0;
offset = new_offset;
len = new_len;
nr_frames += abs(dir);
+ }
+ else if (first) {
+ first = 0;
+ offset = new_offset;
+ len = new_len;
+ nr_frames += abs(dir) + distance; // never jump forward during rewind
}
}