summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2012-03-12 14:53:59 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2012-03-12 14:53:59 +0100
commited10aaf68bbd519856430b7f6e6223a243feffc0 (patch)
treeb39124d14626ec594ad939fe53331e7c277847c3
parent9fa1654d0442bdf83dda528f88f306e37bf56c1c (diff)
downloadvdr-ed10aaf68bbd519856430b7f6e6223a243feffc0.tar.gz
vdr-ed10aaf68bbd519856430b7f6e6223a243feffc0.tar.bz2
Improved fast forwarding to the end of a timeshift recording
-rw-r--r--HISTORY3
-rw-r--r--dvbplayer.c22
-rw-r--r--recording.c11
-rw-r--r--recording.h4
4 files changed, 19 insertions, 21 deletions
diff --git a/HISTORY b/HISTORY
index a5c09f49..22c3b0f2 100644
--- a/HISTORY
+++ b/HISTORY
@@ -7010,7 +7010,7 @@ Video Disk Recorder Revision History
which is higher than any normal table id that is broadcast in the EIT data.
See PLUGINS.html, section "Electronic Program Guide" for more information.
-2012-03-11: Version 1.7.27
+2012-03-12: Version 1.7.27
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Changed the Green button in the "Edit timer" menu from "Once" to "Single"
@@ -7032,3 +7032,4 @@ Video Disk Recorder Revision History
Plugin authors may want to change -Woverloaded-virtual to -Werror=overloaded-virtual
in their Makefiles.
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
+- Improved fast forwarding to the end of a timeshift recording.
diff --git a/dvbplayer.c b/dvbplayer.c
index 4fd0685c..2bf27a36 100644
--- a/dvbplayer.c
+++ b/dvbplayer.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbplayer.c 2.25 2012/02/21 11:34:04 kls Exp $
+ * $Id: dvbplayer.c 2.26 2012/03/12 14:36:55 kls Exp $
*/
#include "dvbplayer.h"
@@ -441,9 +441,9 @@ void cDvbPlayer::Action(void)
int NewIndex = readIndex + d;
if (NewIndex <= 0 && readIndex > 0)
NewIndex = 1; // make sure the very first frame is delivered
- NewIndex = index->GetNextIFrame(NewIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, TimeShiftMode);
+ NewIndex = index->GetNextIFrame(NewIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length);
if (NewIndex < 0 && TimeShiftMode && playDir == pdForward)
- SwitchToPlayFrame = Index;
+ SwitchToPlayFrame = readIndex;
Index = NewIndex;
readIndependent = true;
}
@@ -452,7 +452,7 @@ void cDvbPlayer::Action(void)
if (!NextFile(FileNumber, FileOffset))
continue;
}
- else
+ else if (!(TimeShiftMode && playDir == pdForward))
eof = true;
}
else if (index) {
@@ -486,16 +486,16 @@ void cDvbPlayer::Action(void)
}
readFrame = new cFrame(b, -r, ftUnknown, readIndex, Pts); // hands over b to the ringBuffer
}
- else if (r < 0 && errno == EAGAIN)
- WaitingForData = true;
- else {
- if (r == 0)
- eof = true;
- else if (r < 0 && FATALERRNO) {
+ else if (r < 0) {
+ if (errno == EAGAIN)
+ WaitingForData = true;
+ else if (FATALERRNO) {
LOG_ERROR;
break;
}
}
+ else
+ eof = true;
}
}
@@ -764,7 +764,7 @@ void cDvbPlayer::SkipSeconds(int Seconds)
if (Index >= 0) {
Index = max(Index + SecondsToFrames(Seconds, framesPerSecond), 0);
if (Index > 0)
- Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL, true);
+ Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL);
if (Index >= 0)
readIndex = Index - 1; // Action() will first increment it!
}
diff --git a/recording.c b/recording.c
index 47a9881a..a4076ed4 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 2.51 2012/02/26 13:58:26 kls Exp $
+ * $Id: recording.c 2.52 2012/03/12 14:49:28 kls Exp $
*/
#include "recording.h"
@@ -1526,9 +1526,6 @@ void cIndexFileGenerator::Action(void)
#define INDEXFILESUFFIX "/index"
-// The number of frames to stay off the end in case of time shift:
-#define INDEXSAFETYLIMIT 150 // frames
-
// The maximum time to wait before giving up while catching up on an index file:
#define MAXINDEXCATCHUP 8 // seconds
@@ -1728,7 +1725,7 @@ bool cIndexFile::CatchUp(int 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"
+ if (Index < last)
break;
cCondWait::SleepMs(1000);
}
@@ -1775,13 +1772,13 @@ bool cIndexFile::Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *I
return false;
}
-int cIndexFile::GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber, off_t *FileOffset, int *Length, bool StayOffEnd)
+int cIndexFile::GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber, off_t *FileOffset, int *Length)
{
if (CatchUp()) {
int d = Forward ? 1 : -1;
for (;;) {
Index += d;
- if (Index >= 0 && Index < last - ((Forward && StayOffEnd) ? INDEXSAFETYLIMIT : 0)) {
+ if (Index >= 0 && Index < last) {
if (index[Index].independent) {
uint16_t fn;
if (!FileNumber)
diff --git a/recording.h b/recording.h
index 8e6b4b13..80c2817a 100644
--- a/recording.h
+++ b/recording.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.h 2.28 2012/03/11 15:26:01 kls Exp $
+ * $Id: recording.h 2.29 2012/03/12 11:44:06 kls Exp $
*/
#ifndef __RECORDING_H
@@ -284,7 +284,7 @@ public:
bool Ok(void) { return index != NULL; }
bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset);
bool Get(int Index, uint16_t *FileNumber, off_t *FileOffset, bool *Independent = NULL, int *Length = NULL);
- int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL, bool StayOffEnd = false);
+ int GetNextIFrame(int Index, bool Forward, uint16_t *FileNumber = NULL, off_t *FileOffset = NULL, int *Length = NULL);
int Get(uint16_t FileNumber, off_t FileOffset);
int Last(void) { CatchUp(); return last; }
int GetResume(void) { return resumeFile.Read(); }