summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2003-05-30 13:23:54 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2003-05-30 13:23:54 +0200
commit77b56da51f2aa2ddebb235a4fb3d5a145eec36ef (patch)
tree2711963c2184f5caf809937b26dc4db076829157
parentde86dc7d01eca1e890027ea80aebdbb407c640fb (diff)
downloadvdr-77b56da51f2aa2ddebb235a4fb3d5a145eec36ef.tar.gz
vdr-77b56da51f2aa2ddebb235a4fb3d5a145eec36ef.tar.bz2
Fixed breaking off replay in case the user hits "Play" or "Pause" too soon after going into "Pause live video" mode1.2.0pre1
-rw-r--r--HISTORY7
-rw-r--r--menu.c3
-rw-r--r--recording.c95
3 files changed, 56 insertions, 49 deletions
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;