diff options
| author | Felix Domke <felix.domke@multimedia-labs.de> | 2009-10-29 01:47:49 +0100 |
|---|---|---|
| committer | Felix Domke <felix.domke@multimedia-labs.de> | 2009-10-29 01:56:31 +0100 |
| commit | 4a7a8362a83b1a6c2bd0abf13cd7b19359e9768a (patch) | |
| tree | cc5e1ad69645ee0dea5f71469554c3c5fc5fa0ab /lib/dvb | |
| parent | dafa266c71fd625cd5a9bedbea10a47e27c868ad (diff) | |
| download | enigma2-4a7a8362a83b1a6c2bd0abf13cd7b19359e9768a.tar.gz enigma2-4a7a8362a83b1a6c2bd0abf13cd7b19359e9768a.zip | |
By Anders Holst:
* My previous code for "slow rewind" (aka "SeekBackHack") is not
required any more. Indeed, since the change in "decoder states"
some time ago my code stopped working and is now only destructively
interfering with the new winding approach, effectively ruining the
speed accuracy for slow rewind. Similarly, the "non-smooth winding"
code ruins the accuracy for high winding speeds. The patch below
removes the "SeekBackHack", and temporarily disables the
"non-smooth winding" code until we know whether the decoder states
will allow simultaneous repeat and skip rates
again. (InfoBarGenerics.py)
* Due to a bug in 'eDVBTSTools::findNextPicture', rewind was always
at the required speed minus one. (The frame just played was counted
as one when skipping backwards.) Fixed below. (tstools.cpp)
* A piece of code to apparently increase precision in seeking, by
always aligning to an i-frame start, had exactly the opposite
effect: GOP single-stepping fails completely on DM7025 and gets
highly unreliable on DM800. The piece of code is removed.
(It destructively interferes with previous code by me to hit frames
somewhat before the GOP start. As an alternative, my previous code
can be removed instead, and the currently removed piece of code
adjusted to work. But then it has to be done differently on the two
platforms.) (dvb.cpp)
* By some reason eDVBVideo::getPTS only returns even numbers on DM800
even when it should be odd. This ruins GOP single stepping in 50%
of the cases. This is easy to compensate for by adding a margin of
1 in getAccessPoint. (pvrparse.cpp)
* After the above, when GOP single-stepping works reliable on both
platforms and on SD/HD, the correct step lengths can be
used. (InfoBarGenerics.py)
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 a9eef406..2e5c5665 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -652,18 +652,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; @@ -677,12 +682,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 } } |
