mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Fixed replaying the last few seconds of a recording
This commit is contained in:
parent
fd682083a4
commit
02f34ec0bf
4
HISTORY
4
HISTORY
@ -1415,3 +1415,7 @@ Video Disk Recorder Revision History
|
|||||||
- VDR no longer gives up if there is no DVB device. It continues to work if
|
- VDR no longer gives up if there is no DVB device. It continues to work if
|
||||||
there is at least one device, either a DVB device found by the core VDR code
|
there is at least one device, either a DVB device found by the core VDR code
|
||||||
itself, or a device implemented by a plugin.
|
itself, or a device implemented by a plugin.
|
||||||
|
|
||||||
|
2002-08-24: Version 1.1.8
|
||||||
|
|
||||||
|
- Fixed replaying the last few seconds of a recording.
|
||||||
|
4
config.h
4
config.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: config.h 1.123 2002/08/11 11:36:36 kls Exp $
|
* $Id: config.h 1.124 2002/08/24 10:23:48 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
@ -20,7 +20,7 @@
|
|||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
#define VDRVERSION "1.1.7"
|
#define VDRVERSION "1.1.8"
|
||||||
|
|
||||||
#define MAXPRIORITY 99
|
#define MAXPRIORITY 99
|
||||||
#define MAXLIFETIME 99
|
#define MAXLIFETIME 99
|
||||||
|
17
dvbplayer.c
17
dvbplayer.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: dvbplayer.c 1.11 2002/08/16 09:16:38 kls Exp $
|
* $Id: dvbplayer.c 1.12 2002/08/24 14:59:35 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dvbplayer.h"
|
#include "dvbplayer.h"
|
||||||
@ -307,7 +307,7 @@ void cDvbPlayer::Action(void)
|
|||||||
isyslog("resuming replay at index %d (%s)", readIndex, IndexToHMSF(readIndex, true));
|
isyslog("resuming replay at index %d (%s)", readIndex, IndexToHMSF(readIndex, true));
|
||||||
|
|
||||||
running = true;
|
running = true;
|
||||||
while (running && NextFile()) {
|
while (running && (NextFile() || readIndex >= 0 || ringBuffer->Available())) {
|
||||||
cPoller Poller;
|
cPoller Poller;
|
||||||
if (!readFrame)
|
if (!readFrame)
|
||||||
Poller.Add(replayFile, false);
|
Poller.Add(replayFile, false);
|
||||||
@ -317,7 +317,7 @@ void cDvbPlayer::Action(void)
|
|||||||
|
|
||||||
// Read the next frame from the file:
|
// Read the next frame from the file:
|
||||||
|
|
||||||
if (!readFrame) {
|
if (!readFrame && (replayFile >= 0 || readIndex >= 0)) {
|
||||||
if (playMode != pmStill) {
|
if (playMode != pmStill) {
|
||||||
int r = 0;
|
int r = 0;
|
||||||
if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) {
|
if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) {
|
||||||
@ -326,7 +326,7 @@ void cDvbPlayer::Action(void)
|
|||||||
int Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, true);
|
int Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, true);
|
||||||
if (Index >= 0) {
|
if (Index >= 0) {
|
||||||
if (!NextFile(FileNumber, FileOffset))
|
if (!NextFile(FileNumber, FileOffset))
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// can't call Play() here, because those functions may only be
|
// can't call Play() here, because those functions may only be
|
||||||
@ -347,8 +347,11 @@ void cDvbPlayer::Action(void)
|
|||||||
uchar FileNumber;
|
uchar FileNumber;
|
||||||
int FileOffset, Length;
|
int FileOffset, Length;
|
||||||
readIndex++;
|
readIndex++;
|
||||||
if (!(index->Get(readIndex, &FileNumber, &FileOffset, NULL, &Length) && NextFile(FileNumber, FileOffset)))
|
if (!(index->Get(readIndex, &FileNumber, &FileOffset, NULL, &Length) && NextFile(FileNumber, FileOffset))) {
|
||||||
break;
|
readIndex = -1;
|
||||||
|
eof = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
r = ReadFrame(replayFile, b, Length, sizeof(b));
|
r = ReadFrame(replayFile, b, Length, sizeof(b));
|
||||||
}
|
}
|
||||||
else // allows replay even if the index file is missing
|
else // allows replay even if the index file is missing
|
||||||
@ -557,7 +560,7 @@ void cDvbPlayer::SkipSeconds(int Seconds)
|
|||||||
if (Index > 0)
|
if (Index > 0)
|
||||||
Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL, true);
|
Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL, true);
|
||||||
if (Index >= 0)
|
if (Index >= 0)
|
||||||
readIndex = writeIndex = Index - 1; // Input() will first increment it!
|
readIndex = writeIndex = Index - 1; // Action() will first increment it!
|
||||||
}
|
}
|
||||||
Play();
|
Play();
|
||||||
}
|
}
|
||||||
|
13
recording.c
13
recording.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: recording.c 1.66 2002/08/11 11:48:11 kls Exp $
|
* $Id: recording.c 1.67 2002/08/24 14:09:49 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "recording.h"
|
#include "recording.h"
|
||||||
@ -756,6 +756,9 @@ void cRecordingUserCommand::InvokeCommand(const char *State, const char *Recordi
|
|||||||
// The maximum time to wait before giving up while catching up on an index file:
|
// The maximum time to wait before giving up while catching up on an index file:
|
||||||
#define MAXINDEXCATCHUP 2 // seconds
|
#define MAXINDEXCATCHUP 2 // seconds
|
||||||
|
|
||||||
|
// The minimum age of an index file for considering it no longer to be written:
|
||||||
|
#define MININDEXAGE 10 // seconds
|
||||||
|
|
||||||
cIndexFile::cIndexFile(const char *FileName, bool Record)
|
cIndexFile::cIndexFile(const char *FileName, bool Record)
|
||||||
:resumeFile(FileName)
|
:resumeFile(FileName)
|
||||||
{
|
{
|
||||||
@ -838,6 +841,12 @@ bool cIndexFile::CatchUp(int Index)
|
|||||||
for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) {
|
for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) {
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
if (fstat(f, &buf) == 0) {
|
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 false;
|
||||||
|
}
|
||||||
int newLast = buf.st_size / sizeof(tIndex) - 1;
|
int newLast = buf.st_size / sizeof(tIndex) - 1;
|
||||||
if (newLast > last) {
|
if (newLast > last) {
|
||||||
if (size <= newLast) {
|
if (size <= newLast) {
|
||||||
@ -897,7 +906,7 @@ bool cIndexFile::Get(int Index, uchar *FileNumber, int *FileOffset, uchar *Pictu
|
|||||||
{
|
{
|
||||||
if (index) {
|
if (index) {
|
||||||
CatchUp(Index);
|
CatchUp(Index);
|
||||||
if (Index >= 0 && Index <= last) {
|
if (Index >= 0 && Index < last) {
|
||||||
*FileNumber = index[Index].number;
|
*FileNumber = index[Index].number;
|
||||||
*FileOffset = index[Index].offset;
|
*FileOffset = index[Index].offset;
|
||||||
if (PictureType)
|
if (PictureType)
|
||||||
|
Loading…
Reference in New Issue
Block a user