aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/pvrparse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dvb/pvrparse.cpp')
-rw-r--r--lib/dvb/pvrparse.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp
index 65e599c3..4b8da890 100644
--- a/lib/dvb/pvrparse.cpp
+++ b/lib/dvb/pvrparse.cpp
@@ -362,6 +362,30 @@ void eMPEGStreamParserTS::parseData(off_t offset, const void *data, unsigned int
/* sorry for the redundant code here, but there are too many special cases... */
while (len)
{
+ /* emergency resync. usually, this should not happen, because the data should
+ be sync-aligned.
+
+ to make this code work for non-strictly-sync-aligned data, (for example, bad
+ files) we fix a possible resync here by skipping data until the next 0x47.
+
+ if this is a false 0x47, the packet will be dropped by wantPacket, and the
+ next time, sync will be re-established. */
+ int skipped = 0;
+ while (!m_pktptr && len)
+ {
+ if (packet[0] == 0x47)
+ break;
+ len--;
+ packet++;
+ skipped++;
+ }
+
+ if (skipped)
+ eDebug("SYNC LOST: skipped %d bytes.", skipped);
+
+ if (!len)
+ break;
+
if (m_pktptr)
{
/* skip last packet */