diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 548e8b75..8a52c93f 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -3020,6 +3020,8 @@ Torsten Lang for reporting a problem with setting the system time from the TDT in case devices are tuned to the same transponder on different sources, and these broadcast different time data + for reporting a problem with unjustified "video data stream broken" errors in case + the system time is changed while a recording is active Christian Ruppert for some improvements to the Makefiles diff --git a/HISTORY b/HISTORY index 0b41dfa0..8c4bedea 100644 --- a/HISTORY +++ b/HISTORY @@ -7990,3 +7990,6 @@ Video Disk Recorder Revision History system time from the TDT, which avoids problems in case devices are tuned to the same transponder on different sources, and these broadcast different time data (reported by Torsten Lang). +- Changed cRecorder::Action() to use cTimeMs instead of time() to avoid problems with + unjustified "video data stream broken" errors in case the system time is changed + while a recording is active (reported by Torsten Lang). diff --git a/recorder.c b/recorder.c index a9cc8c95..7887a88b 100644 --- a/recorder.c +++ b/recorder.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recorder.c 2.17 2012/09/22 11:53:57 kls Exp $ + * $Id: recorder.c 3.1 2013/10/12 11:49:42 kls Exp $ */ #include "recorder.h" @@ -14,7 +14,7 @@ // The maximum time we wait before assuming that a recorded video data stream // is broken: -#define MAXBROKENTIMEOUT 30 // seconds +#define MAXBROKENTIMEOUT 30000 // milliseconds #define MINFREEDISKSPACE (512) // MB #define DISKCHECKINTERVAL 100 // seconds @@ -117,7 +117,7 @@ void cRecorder::Receive(uchar *Data, int Length) void cRecorder::Action(void) { - time_t t = time(NULL); + cTimeMs t(MAXBROKENTIMEOUT); bool InfoWritten = false; bool FirstIframeSeen = false; while (Running()) { @@ -160,16 +160,16 @@ void cRecorder::Action(void) break; } fileSize += Count; - t = time(NULL); + t.Set(MAXBROKENTIMEOUT); } } ringBuffer->Del(Count); } } - if (time(NULL) - t > MAXBROKENTIMEOUT) { + if (t.TimedOut()) { esyslog("ERROR: video data stream broken"); ShutdownHandler.RequestEmergencyExit(); - t = time(NULL); + t.Set(MAXBROKENTIMEOUT); } } }