diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d128222b..5abb1085 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2711,3 +2711,7 @@ Dirk Leber Marco Göbenich for reporting a problem with executing diseqc commands from different threads + +Johan Andersson + for reporting a bug in detecting frames in case the Picture Start Code or Access Unit + Delimiter extends over TS packet boundaries diff --git a/HISTORY b/HISTORY index 4b091020..c65c0e0f 100644 --- a/HISTORY +++ b/HISTORY @@ -6607,7 +6607,7 @@ Video Disk Recorder Revision History - Avoiding an unecessary call to Recordings.ResetResume() (thanks to Reinhard Nissl). -2011-06-02: Version 1.7.19 +2011-06-11: Version 1.7.19 - Fixed cString's operator=(const char *String) in case the given string is the same as the existing one (thanks to Dirk Leber). @@ -6632,3 +6632,5 @@ Video Disk Recorder Revision History indicating the strength (upper bar) and quality (lower bar) of the received signal. The number to the left of these bars indicates the actual device the current channel is being received with. +- Fixed detecting frames in case the Picture Start Code or Access Unit Delimiter + extends over TS packet boundaries (reported by Johan Andersson). diff --git a/remux.c b/remux.c index f7ef87a9..a62c36cd 100644 --- a/remux.c +++ b/remux.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remux.c 2.53 2011/03/20 10:21:14 kls Exp $ + * $Id: remux.c 2.54 2011/06/11 11:20:06 kls Exp $ */ #include "remux.h" @@ -906,9 +906,20 @@ int cFrameDetector::Analyze(const uchar *Data, int Length) if (DebugFrames && !synced) dbgframes("/"); } + int PacketsForFrameDetector = MIN_TS_PACKETS_FOR_FRAME_DETECTOR; for (int i = PayloadOffset; scanning && i < TS_SIZE; i++) { scanner <<= 8; scanner |= Data[i]; + if (i == TS_SIZE - 1) { // it was the last byte in this TS packet + if (SeenPayloadStart && --PacketsForFrameDetector > 0) { + Data += TS_SIZE; + Length -= TS_SIZE; + Processed += TS_SIZE; + if (Length < TS_SIZE) + return Processed; + i = TsPayloadOffset(Data) - 1; // one before the first payload byte of the next TS packet + } + } switch (type) { case 0x01: // MPEG 1 video case 0x02: // MPEG 2 video