diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2009-12-22 16:02:20 +0100 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2009-12-22 16:02:20 +0100 |
| commit | f901175ad6e72c60f0916c6ba6edcbdad7dbf5ec (patch) | |
| tree | 7fa7116ae62f8cabdded0943aedbdc11488060cf /lib/dvb | |
| parent | 6987607629f68a8c47cbe9cf48f6a112b83468ec (diff) | |
| parent | bbe28d433549d0559ac2f91ca2903d5bc6b60bf4 (diff) | |
| download | enigma2-f901175ad6e72c60f0916c6ba6edcbdad7dbf5ec.tar.gz enigma2-f901175ad6e72c60f0916c6ba6edcbdad7dbf5ec.zip | |
Merge branch 'bug_245_record_playback_fixes'
Diffstat (limited to 'lib/dvb')
| -rw-r--r-- | lib/dvb/dvb.cpp | 7 | ||||
| -rw-r--r-- | lib/dvb/pvrparse.cpp | 1 | ||||
| -rw-r--r-- | lib/dvb/tstools.cpp | 21 |
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 } } |
