diff --git a/HISTORY b/HISTORY index ef999259..914b39a0 100644 --- a/HISTORY +++ b/HISTORY @@ -2209,7 +2209,7 @@ Video Disk Recorder Revision History - It is now possible to directly delete a timer that is currently recording (thanks to Alexander Damhuis for reporting this one). -2003-05-29: Version 1.2.0pre1 +2003-05-30: Version 1.2.0pre1 - Some corrections to the French OSD texts (thanks to Olivier Jacques). - Fixed some missing commas in i18n.c (thanks to Dimitrios Dimitrakos for @@ -2217,9 +2217,8 @@ Video Disk Recorder Revision History - Some corrections to the Finnish OSD texts (thanks to Niko Tarnanen and Rolf Ahrenberg). - Completed the Italian OSD texts (thanks to Antonio Ospite). -- Added an additional sleep() after going into "Pause live video" mode to avoid - breaking off replay in case the user hits "Play" or "Pause" too soon (thanks - to Karim Afifi for reporting ths one). +- Fixed breaking off replay in case the user hits "Play" or "Pause" too soon after + going into "Pause live video" mode (thanks to Karim Afifi for reporting ths one). - Some corrections to the Catalanian OSD texts (thanks to Jordi Vilà). - Single event timers are now deleted if the recording they are doing is deleted before the timer ends. diff --git a/menu.c b/menu.c index 64930a7e..ecf2493c 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.252 2003/05/29 11:43:36 kls Exp $ + * $Id: menu.c 1.253 2003/05/30 09:53:57 kls Exp $ */ #include "menu.h" @@ -3141,7 +3141,6 @@ bool cRecordControls::PauseLiveVideo(void) sleep(1); // allow device to replay some frames, so we have a picture Interface->Close(); rc->ProcessKey(kPause); // pause, allowing replay mode display - sleep(3); // allow recorded file to fill up enough to continue replaying return true; } Interface->Close(); diff --git a/recording.c b/recording.c index 7e68a791..06f63255 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 1.79 2003/05/24 11:22:34 kls Exp $ + * $Id: recording.c 1.80 2003/05/30 13:23:54 kls Exp $ */ #include "recording.h" @@ -769,6 +769,12 @@ void cRecordingUserCommand::InvokeCommand(const char *State, const char *Recordi #define INDEXFILESUFFIX "/index.vdr" +// The number of frames to stay off the end in case of time shift: +#define INDEXSAFETYLIMIT 100 // frames + +// The maximum time to wait before giving up while catching up on an index file: +#define MAXINDEXCATCHUP 8 // seconds + // The minimum age of an index file for considering it no longer to be written: #define MININDEXAGE 3600 // seconds @@ -852,47 +858,50 @@ bool cIndexFile::CatchUp(int Index) { // returns true unless something really goes wrong, so that 'index' becomes NULL if (index && f >= 0) { - if (Index < 0 || Index >= last) { - struct stat buf; - if (fstat(f, &buf) == 0) { - if (time(NULL) - buf.st_mtime > MININDEXAGE) { - // apparently the index file is not being written any more - close(f); - f = -1; - return true; - } - int newLast = buf.st_size / sizeof(tIndex) - 1; - if (newLast > last) { - if (size <= newLast) { - size *= 2; - if (size <= newLast) - size = newLast + 1; - } - index = (tIndex *)realloc(index, size * sizeof(tIndex)); - if (index) { - int offset = (last + 1) * sizeof(tIndex); - int delta = (newLast - last) * sizeof(tIndex); - if (lseek(f, offset, SEEK_SET) == offset) { - if (safe_read(f, &index[last + 1], delta) != delta) { - esyslog("ERROR: can't read from index"); - free(index); - index = NULL; - close(f); - f = -1; - return true; - } - last = newLast; - } - else - LOG_ERROR_STR(fileName); - } - else - esyslog("ERROR: can't realloc() index"); - } - } - else - LOG_ERROR_STR(fileName); - } + for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) { + struct stat buf; + if (fstat(f, &buf) == 0) { + if (time(NULL) - buf.st_mtime > MININDEXAGE) { + // apparently the index file is not being written any more + close(f); + f = -1; + break; + } + int newLast = buf.st_size / sizeof(tIndex) - 1; + if (newLast > last) { + if (size <= newLast) { + size *= 2; + if (size <= newLast) + size = newLast + 1; + } + index = (tIndex *)realloc(index, size * sizeof(tIndex)); + if (index) { + int offset = (last + 1) * sizeof(tIndex); + int delta = (newLast - last) * sizeof(tIndex); + if (lseek(f, offset, SEEK_SET) == offset) { + if (safe_read(f, &index[last + 1], delta) != delta) { + esyslog("ERROR: can't read from index"); + free(index); + index = NULL; + close(f); + f = -1; + break; + } + last = newLast; + } + else + LOG_ERROR_STR(fileName); + } + else + esyslog("ERROR: can't realloc() index"); + } + } + else + LOG_ERROR_STR(fileName); + if (Index < last - (i ? 2 * INDEXSAFETYLIMIT : 0) || Index > 10 * INDEXSAFETYLIMIT) // keep off the end in case of "Pause live video" + break; + sleep(1); + } } return index != NULL; } @@ -940,7 +949,7 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uchar *FileNumber, int *F int d = Forward ? 1 : -1; for (;;) { Index += d; - if (Index >= 0 && Index < last - ((Forward && StayOffEnd) ? 100 : 0)) { + if (Index >= 0 && Index < last - ((Forward && StayOffEnd) ? INDEXSAFETYLIMIT : 0)) { if (index[Index].type == I_FRAME) { if (FileNumber) *FileNumber = index[Index].number;