Improved fast forwarding to the end of a timeshift recording

This commit is contained in:
Klaus Schmidinger 2012-03-12 14:53:59 +01:00
parent 9fa1654d04
commit ed10aaf68b
4 changed files with 19 additions and 21 deletions

View File

@ -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.

View File

@ -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!
}

View File

@ -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)

View File

@ -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(); }