From 96055681fcbcfdd287541372b4b00218a4b697cb Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 14 Feb 2004 10:43:57 +0100 Subject: [PATCH] Initiating an emergency exit on too many UPT errors per recording --- CONTRIBUTORS | 2 ++ HISTORY | 6 +++++- remux.c | 9 +++++++-- remux.h | 3 ++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 25d1a253..6719ef41 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -438,6 +438,8 @@ Gregoire Favre for fixing some function headers to make them compile with gcc 3.x for reporting a bug in taking an active SVDRP connection into account when doing shutdown for translating OSD texts to the French language + for suggesting to initiate an "emergency exit" if there are UPT errors during a + recording Sven Grothklags for fixing the cutting mechanism to make it re-sync in case a frame is larger diff --git a/HISTORY b/HISTORY index 47c2a170..9c6dd2eb 100644 --- a/HISTORY +++ b/HISTORY @@ -2652,7 +2652,7 @@ Video Disk Recorder Revision History actual CAM type as reported by the CAM. The 'ca.conf' file has been stripped down to the values 0..4. -2004-02-13: Version 1.3.5 +2004-02-14: Version 1.3.5 - Fixed reading the EPG preferred language parameter from 'setup.conf'. - Fixed switching to a visible programme in case the current channel has neither @@ -2663,3 +2663,7 @@ Video Disk Recorder Revision History transponders on the same frequency, with different polarization, like Hispasat at S30.0W (thanks to Thomas Bergwinkl for pointing this out). See man vdr(5) for details about the enhanced channel ID format. +- Since there appears to be no general solution for the UPT error yet, a recording + now initiates an "emergency exit" if the number of UPT errors during one + recording exceeds 10 (suggested by Gregoire Favre). Since the UPT error doesn't + happen on my system, this has not been explicitly tested. diff --git a/remux.c b/remux.c index 5ea24bf9..65544b5e 100644 --- a/remux.c +++ b/remux.c @@ -8,7 +8,7 @@ * the Linux DVB driver's 'tuxplayer' example and were rewritten to suit * VDR's needs. * - * $Id: remux.c 1.17 2003/09/14 10:34:39 kls Exp $ + * $Id: remux.c 1.18 2004/02/14 10:40:37 kls Exp $ */ /* The calling interface of the 'cRemux::Process()' function is defined @@ -114,6 +114,7 @@ #define SC_PICTURE 0x00 // "picture header" #define MAXNONUSEFULDATA (10*1024*1024) +#define MAXNUMUPTERRORS 10 class cTS2PES { private: @@ -459,6 +460,7 @@ cRemux::cRemux(int VPid, int APid1, int APid2, int DPid1, int DPid2, bool ExitOn dPid1 = DPid1; dPid2 = DPid2; exitOnFailure = ExitOnFailure; + numUPTerrors = 0; synced = false; skipped = 0; resultCount = resultDelivered = 0; @@ -618,8 +620,11 @@ XXX*/ if (l < 0) return NULL; // no useful data found, wait for more if (pt != NO_PICTURE) { - if (pt < I_FRAME || B_FRAME < pt) + if (pt < I_FRAME || B_FRAME < pt) { esyslog("ERROR: unknown picture type '%d'", pt); + if (++numUPTerrors > MAXNUMUPTERRORS && exitOnFailure) + cThread::EmergencyExit(true); + } else if (!synced) { if (pt == I_FRAME) { resultDelivered = i; // will drop everything before this position diff --git a/remux.h b/remux.h index e953001d..31e64dfb 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 1.10 2003/04/26 14:13:11 kls Exp $ + * $Id: remux.h 1.11 2004/02/14 10:40:41 kls Exp $ */ #ifndef __REMUX_H @@ -30,6 +30,7 @@ class cTS2PES; class cRemux { private: bool exitOnFailure; + int numUPTerrors; bool synced; int skipped; int vPid, aPid1, aPid2, dPid1, dPid2;