1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed replaying ongoing recordings from other VDR instances

This commit is contained in:
Klaus Schmidinger 2012-12-24 09:00:55 +01:00
parent ef3af3b702
commit db59a8e745
3 changed files with 7 additions and 54 deletions

View File

@ -7417,7 +7417,7 @@ Video Disk Recorder Revision History
plugins to display these items in a more elaborate way than just a simple line of plugins to display these items in a more elaborate way than just a simple line of
text. text.
2012-12-23: Version 1.7.34 2012-12-24: Version 1.7.34
- Changed the type of the TimerMatch parameter in cSkinDisplayMenu::SetItemEvent() from - Changed the type of the TimerMatch parameter in cSkinDisplayMenu::SetItemEvent() from
'int' to 'eTimerEvent' (reported by Christoph Haubrich). 'int' to 'eTimerEvent' (reported by Christoph Haubrich).
@ -7458,3 +7458,4 @@ Video Disk Recorder Revision History
Regel). Regel).
- Fixed cIndexFile::GetNextIFrame() to properly handle the case where the very last frame - Fixed cIndexFile::GetNextIFrame() to properly handle the case where the very last frame
is an I-frame (which normally shouldn't occur). is an I-frame (which normally shouldn't occur).
- Fixed replaying ongoing recordings from other VDR instances.

View File

@ -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 2.80 2012/12/23 13:34:06 kls Exp $ * $Id: recording.c 2.81 2012/12/23 15:11:28 kls Exp $
*/ */
#include "recording.h" #include "recording.h"
@ -1666,7 +1666,8 @@ void cIndexFileGenerator::Action(void)
#define INDEXFILESUFFIX "/index" #define INDEXFILESUFFIX "/index"
// 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 8 // seconds #define MAXINDEXCATCHUP 8 // number of retries
#define INDEXCATCHUPWAIT 100 // milliseconds
struct tIndexPes { struct tIndexPes {
uint32_t offset; uint32_t offset;
@ -1693,9 +1694,6 @@ struct tIndexTs {
#define INDEXFILECHECKINTERVAL 500 // ms between checks for existence of the regenerated index file #define INDEXFILECHECKINTERVAL 500 // ms between checks for existence of the regenerated index file
#define INDEXFILETESTINTERVAL 10 // ms between tests for the size of the index file in case of pausing live video #define INDEXFILETESTINTERVAL 10 // ms between tests for the size of the index file in case of pausing live video
cMutex cIndexFile::indexListMutex;
cVector<const cIndexFile *> cIndexFile::indexList;
cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive) cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive)
:resumeFile(FileName, IsPesRecording) :resumeFile(FileName, IsPesRecording)
{ {
@ -1776,13 +1774,10 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, b
LOG_ERROR_STR(*fileName); LOG_ERROR_STR(*fileName);
} }
} }
if (Record)
AddToIndexList(this);
} }
cIndexFile::~cIndexFile() cIndexFile::~cIndexFile()
{ {
RemoveFromIndexList(this);
if (f >= 0) if (f >= 0)
close(f); close(f);
free(index); free(index);
@ -1829,11 +1824,6 @@ 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 (!IsInIndexList(this)) {
close(f);
f = -1;
break;
}
int newLast = int(buf.st_size / sizeof(tIndexTs) - 1); int newLast = int(buf.st_size / sizeof(tIndexTs) - 1);
if (newLast > last) { if (newLast > last) {
int NewSize = size; int NewSize = size;
@ -1873,7 +1863,7 @@ bool cIndexFile::CatchUp(int Index)
LOG_ERROR_STR(*fileName); LOG_ERROR_STR(*fileName);
if (Index < last) if (Index < last)
break; break;
cCondWait::SleepMs(1000); cCondWait::SleepMs(INDEXCATCHUPWAIT);
} }
} }
return index != NULL; return index != NULL;
@ -2028,39 +2018,6 @@ int cIndexFile::GetLength(const char *FileName, bool IsPesRecording)
return -1; return -1;
} }
void cIndexFile::AddToIndexList(const cIndexFile *IndexFile)
{
cMutexLock MutexLock(&indexListMutex);
for (int i = 0; i < indexList.Size(); i++) {
if (!indexList[i]) {
indexList[i] = IndexFile;
return;
}
}
indexList.Append(IndexFile);
}
void cIndexFile::RemoveFromIndexList(const cIndexFile *IndexFile)
{
cMutexLock MutexLock(&indexListMutex);
for (int i = 0; i < indexList.Size(); i++) {
if (indexList[i] == IndexFile) {
indexList[i] = NULL;
return;
}
}
}
bool cIndexFile::IsInIndexList(const cIndexFile *IndexFile)
{
cMutexLock MutexLock(&indexListMutex);
for (int i = 0; i < indexList.Size(); i++) {
if (indexList[i] && !strcmp(indexList[i]->fileName, IndexFile->fileName))
return true;
}
return false;
}
bool GenerateIndex(const char *FileName) bool GenerateIndex(const char *FileName)
{ {
if (DirectoryOk(FileName)) { if (DirectoryOk(FileName)) {

View File

@ -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.h 2.40 2012/11/13 11:43:59 kls Exp $ * $Id: recording.h 2.41 2012/12/23 15:11:53 kls Exp $
*/ */
#ifndef __RECORDING_H #ifndef __RECORDING_H
@ -292,11 +292,6 @@ private:
cResumeFile resumeFile; cResumeFile resumeFile;
cIndexFileGenerator *indexFileGenerator; cIndexFileGenerator *indexFileGenerator;
cMutex mutex; cMutex mutex;
static cMutex indexListMutex;
static cVector<const cIndexFile *> indexList;
static void AddToIndexList(const cIndexFile *IndexFile);
static void RemoveFromIndexList(const cIndexFile *IndexFile);
static bool IsInIndexList(const cIndexFile *IndexFile);
void ConvertFromPes(tIndexTs *IndexTs, int Count); void ConvertFromPes(tIndexTs *IndexTs, int Count);
void ConvertToPes(tIndexTs *IndexTs, int Count); void ConvertToPes(tIndexTs *IndexTs, int Count);
bool CatchUp(int Index = -1); bool CatchUp(int Index = -1);