Patch by Anders Holst:
* Undo "sparse-AP-fix"
At March 25 a patch was checked in that makes sure that AP:s closer
than half a second from each other are filtered away. I don't know
the exact purpose of this fix, but I don't think it is a good idea:
Besides being the cause of bugs 4 and 5 above, all seek operations
are based on the AP:s, and it is a pity to cripple the precision
here. And for example, when cutting movies it is important to be
able to reach the right GOP boundary. (And the next fix relies on
all boundaries being available.) (If you wonder, bug 5 was caused by
a destructive interaction of this with the discontinuity handling.)
* Hit GOP:s somewhat before GOP start
It turns out that if you jump exactly to the GOP start, then that
GOP is nevertheless skipped and playback starts from the GOP
thereafter. However, if you jump to (at least) one frame before the
GOP start, playback starts from that GOP. I don't know if this is a
bug in the driver or elsewhere, but the best I can do is this
workaround: Hit the GOP by jumping to half a GOP length before the
GOP start. (By scanning the ts file it is of course possible to find
the exact frame boundaries, but why bother since anywhere between
the previous GOP start and the previous frame start will do.)
Similarly, to show the first frame of a GOP, a few more frames must
be included. Therefore, add half a GOP at the end of each source
span.
* Jump over discontinuities during AP relative seek
The above two fixes together *almost* take care of bugs 1 and 2
above. Now seekRelative(1) moves one forward and seekRelative(-1) one
backwards. However, at discontinuities they may get stuck. This is
remedied by an extra if statement to check for discontinuities when
stepping throught the AP:s in AP relative seek.
* Stop after last source span
In the function eDVBChannel::getNextSourceSpan there was no code to
take care of the case when the seeked-to point is after the last
source span. Currently it just goes on until the movie ends. I have
added code for this, which takes care of bug 3, and as a fortunate
bonus effect bug 6 too. (But please check my code here, I hope I can
use current_offset the way I do, and return 0 size when it should
stop.)