From cd3cda2654bbd4272096bbabb4953ce352de8358 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Tue, 11 May 2021 20:47:31 +0200 Subject: Fixed cTsPayload::AtPayloadStart() to ignore TS packets from other PIDs --- HISTORY | 3 ++- remux.c | 8 ++++---- remux.h | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/HISTORY b/HISTORY index f9288897..58798b49 100644 --- a/HISTORY +++ b/HISTORY @@ -9663,9 +9663,10 @@ Video Disk Recorder Revision History - EXPIRELATENCY now only applies to VPS timers. - Deleting expired timers is now triggered immediately after the timers are modified. -2021-04-29: +2021-05-11: - Now using a separate fixed value for internal EPG linger time. This fixes problems with spawned timers jumping to the next event in case Setup.EPGLinger is very small. (reported by Jürgen Schneider). - Fixed a possible crash in the Schedule menu, in case Setup.EPGLinger is 0. +- Fixed cTsPayload::AtPayloadStart() to ignore TS packets from other PIDs. diff --git a/remux.c b/remux.c index 0bf41f36..c338698d 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 4.9 2020/06/22 12:15:52 kls Exp $ + * $Id: remux.c 5.1 2021/05/11 20:47:31 kls Exp $ */ #include "remux.h" @@ -1292,7 +1292,7 @@ int cMpeg2Parser::Parse(const uchar *Data, int Length, int Pid) tsPayload.Statistics(); break; } - if (tsPayload.AtPayloadStart() // stop at any new payload start to have the buffer refilled if necessary + if (tsPayload.AtPayloadStart() // stop at a new payload start to have the buffer refilled if necessary || tsPayload.Eof()) // or if we're out of data break; } @@ -1445,7 +1445,7 @@ int cH264Parser::Parse(const uchar *Data, int Length, int Pid) default: ; } } - if (tsPayload.AtPayloadStart() // stop at any new payload start to have the buffer refilled if necessary + if (tsPayload.AtPayloadStart() // stop at a new payload start to have the buffer refilled if necessary || tsPayload.Eof()) // or if we're out of data break; } @@ -1603,7 +1603,7 @@ int cH265Parser::Parse(const uchar *Data, int Length, int Pid) break; } } - if (tsPayload.AtPayloadStart() // stop at any new payload start to have the buffer refilled if necessary + if (tsPayload.AtPayloadStart() // stop at a new payload start to have the buffer refilled if necessary || tsPayload.Eof()) // or if we're out of data break; } diff --git a/remux.h b/remux.h index 6ff3c971..391663b4 100644 --- a/remux.h +++ b/remux.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remux.h 4.6 2020/09/16 13:48:33 kls Exp $ + * $Id: remux.h 5.1 2021/05/11 20:47:31 kls Exp $ */ #ifndef __REMUX_H @@ -225,6 +225,7 @@ int64_t PtsDiff(int64_t Pts1, int64_t Pts2); class cTsPayload { private: +public://XXX uchar *data; int length; int pid; @@ -249,7 +250,7 @@ public: bool AtTsStart(void) { return index < length && (index % TS_SIZE) == 0; } ///< Returns true if this payload handler is currently pointing to first byte ///< of a TS packet. - bool AtPayloadStart(void) { return AtTsStart() && TsPayloadStart(data + index); } + bool AtPayloadStart(void) { return AtTsStart() && TsPayloadStart(data + index) && TsPid(data + index) == pid; } ///< Returns true if this payload handler is currently pointing to the first byte ///< of a TS packet that starts a new payload. int Available(void) { return length - index; } -- cgit v1.2.3