aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/tstools.cpp
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2010-11-25 00:12:59 +0100
committerghost <andreas.monzner@multimedia-labs.de>2010-11-25 00:12:59 +0100
commitcdfd7a570b5b0813c8f62fc76deed949d7a11803 (patch)
tree1b4e1f1ada84e532fe7c37ea9aea49a4c9d32fa0 /lib/dvb/tstools.cpp
parentac065de0aa482d630e41ba80ccdc5ef617e7e378 (diff)
parent16902de6f4215ccd425622b92e8ae6be1ae4a97f (diff)
downloadenigma2-cdfd7a570b5b0813c8f62fc76deed949d7a11803.tar.gz
enigma2-cdfd7a570b5b0813c8f62fc76deed949d7a11803.zip
Merge branch 'bug_570_playback_skip_fixes_and_cleanup_ml_aholst' into experimental
Diffstat (limited to 'lib/dvb/tstools.cpp')
-rw-r--r--lib/dvb/tstools.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp
index cfea3fdd..ad55509f 100644
--- a/lib/dvb/tstools.cpp
+++ b/lib/dvb/tstools.cpp
@@ -700,9 +700,23 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram
else if (direction == +1)
direction = 0;
}
- /* let's find the next frame after the given offset */
off_t start = offset;
+ /* backtrack to find the previous sequence start, in case of MPEG2 */
+ if ((data & 0xFF) == 0x00) {
+ do {
+ --start;
+ if (m_streaminfo.getStructureEntry(start, data, 0))
+ {
+ eDebug("get previous failed");
+ return -1;
+ }
+ } while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00) && ((data & 0xFF) != 0xB3)); /* sequence start or previous frame */
+ if ((data & 0xFF) != 0xB3)
+ start = offset; /* Failed to find corresponding sequence start, so never mind */
+ }
+
+ /* let's find the next frame after the given offset */
do {
if (m_streaminfo.getStructureEntry(offset, data, 1))
{
@@ -718,8 +732,8 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram
} while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00)); /* next frame */
/* align to TS pkt start */
-// start = start - (start % 188);
-// offset = offset - (offset % 188);
+ start = start - (start % 188);
+ offset = offset - (offset % 188);
len = offset - start;
_offset = start;