summaryrefslogtreecommitdiff
path: root/dvbplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'dvbplayer.c')
-rw-r--r--dvbplayer.c62
1 files changed, 57 insertions, 5 deletions
diff --git a/dvbplayer.c b/dvbplayer.c
index 1858cb98..1b049f26 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 3.1 2013/12/25 13:24:07 kls Exp $
+ * $Id: dvbplayer.c 3.2 2015/01/25 13:12:13 kls Exp $
*/
#include "dvbplayer.h"
@@ -211,6 +211,7 @@ private:
cNonBlockingFileReader *nonBlockingFileReader;
cRingBufferFrame *ringBuffer;
cPtsIndex ptsIndex;
+ cMarks marks;
cFileName *fileName;
cIndexFile *index;
cUnbufferedFile *replayFile;
@@ -296,6 +297,8 @@ cDvbPlayer::cDvbPlayer(const char *FileName, bool PauseLive)
}
else if (PauseLive)
framesPerSecond = cRecording(FileName).FramesPerSecond(); // the fps rate might have changed from the default
+ if (Setup.SkipEdited || Setup.PauseAtLastMark)
+ marks.Load(FileName, framesPerSecond, isPesRecording);
}
cDvbPlayer::~cDvbPlayer()
@@ -402,8 +405,19 @@ void cDvbPlayer::Action(void)
int pc = 0;
readIndex = Resume();
- if (readIndex >= 0)
+ if (readIndex > 0)
isyslog("resuming replay at index %d (%s)", readIndex, *IndexToHMSF(readIndex, true, framesPerSecond));
+ else if (Setup.SkipEdited) {
+ if (marks.First() && index) {
+ int Index = marks.First()->Position();
+ uint16_t FileNumber;
+ off_t FileOffset;
+ if (index->Get(Index, &FileNumber, &FileOffset) && NextFile(FileNumber, FileOffset)) {
+ isyslog("starting replay at first mark %d (%s)", Index, *IndexToHMSF(Index, true, framesPerSecond));
+ readIndex = Index;
+ }
+ }
+ }
nonBlockingFileReader = new cNonBlockingFileReader;
int Length = 0;
@@ -413,6 +427,8 @@ void cDvbPlayer::Action(void)
uint32_t LastStc = 0;
int LastReadIFrame = -1;
int SwitchToPlayFrame = 0;
+ bool CutIn = false;
+ bool AtLastMark = false;
if (pauseLive)
Goto(0, true);
@@ -431,7 +447,7 @@ void cDvbPlayer::Action(void)
// Read the next frame from the file:
- if (playMode != pmStill && playMode != pmPause) {
+ if (playMode != pmStill && playMode != pmPause && !AtLastMark) {
if (!readFrame && (replayFile || readIndex >= 0)) {
if (!nonBlockingFileReader->Reading()) {
if (!SwitchToPlayFrame && (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward))) {
@@ -468,8 +484,30 @@ void cDvbPlayer::Action(void)
else if (index) {
uint16_t FileNumber;
off_t FileOffset;
- if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent, &Length) && NextFile(FileNumber, FileOffset))
+ if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent, &Length) && NextFile(FileNumber, FileOffset)) {
readIndex++;
+ if (Setup.SkipEdited || Setup.PauseAtLastMark) {
+ marks.Update();
+ cMark *m = marks.Get(readIndex);
+ if (m && (m->Index() & 0x01) != 0) { // we're at an end mark
+ m = marks.GetNextBegin(m);
+ int Index = -1;
+ if (m)
+ Index = m->Position(); // skip to next begin mark
+ else if (Setup.PauseAtLastMark)
+ AtLastMark = true; // triggers going into Pause mode
+ else if (index->IsStillRecording())
+ Index = index->GetNextIFrame(index->Last() - int(round(MAXSTUCKATEOF * framesPerSecond)), false); // skip, but stay off end of live-recordings
+ else
+ AtLastMark = true; // triggers stopping replay
+ if (Setup.SkipEdited && Index > readIndex) {
+ isyslog("skipping from %d (%s) to %d (%s)", readIndex - 1, *IndexToHMSF(readIndex - 1, true, framesPerSecond), Index, *IndexToHMSF(Index, true, framesPerSecond));
+ readIndex = Index;
+ CutIn = true;
+ }
+ }
+ }
+ }
else
eof = true;
}
@@ -512,6 +550,11 @@ void cDvbPlayer::Action(void)
// Store the frame in the buffer:
if (readFrame) {
+ if (CutIn) {
+ if (isPesRecording)
+ cRemux::SetBrokenLink(readFrame->Data(), readFrame->Count());
+ CutIn = false;
+ }
if (ringBuffer->Put(readFrame))
readFrame = NULL;
else
@@ -578,8 +621,17 @@ void cDvbPlayer::Action(void)
p = NULL;
}
}
- else
+ else {
+ if (AtLastMark) {
+ if (Setup.PauseAtLastMark) {
+ playMode = pmPause;
+ AtLastMark = false;
+ }
+ else
+ eof = true;
+ }
Sleep = true;
+ }
// Handle hitting begin/end of recording: