mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Implemented static cIndexFile::IndexFileName()
This commit is contained in:
parent
67e7f93d29
commit
ef611229f3
3
HISTORY
3
HISTORY
@ -6650,7 +6650,7 @@ Video Disk Recorder Revision History
|
||||
- Added support for "content identifier descriptor" and "default authority descriptor"
|
||||
to 'libsi' (thanks to Dave Pickles).
|
||||
|
||||
2011-08-12: Version 1.7.20
|
||||
2011-08-13: Version 1.7.20
|
||||
|
||||
- Added some missing 'const' to tChannelID (reported by Sundararaj Reel).
|
||||
- The isnumber() function now checks the given pointer for NULL (thanks to Holger
|
||||
@ -6678,3 +6678,4 @@ Video Disk Recorder Revision History
|
||||
case insensitive sorting (suggested by Sundararaj Reel).
|
||||
- Now scanning new transponders before old ones, to make sure transponder changes
|
||||
are recognized (thanks to Reinhard Nissl).
|
||||
- Implemented static cIndexFile::IndexFileName().
|
||||
|
149
recording.c
149
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.31 2011/06/12 13:04:28 kls Exp $
|
||||
* $Id: recording.c 2.32 2011/08/13 10:59:32 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recording.h"
|
||||
@ -1540,84 +1540,75 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording)
|
||||
:resumeFile(FileName, IsPesRecording)
|
||||
{
|
||||
f = -1;
|
||||
fileName = NULL;
|
||||
size = 0;
|
||||
last = -1;
|
||||
index = NULL;
|
||||
isPesRecording = IsPesRecording;
|
||||
indexFileGenerator = NULL;
|
||||
if (FileName) {
|
||||
const char *Suffix = isPesRecording ? INDEXFILESUFFIX ".vdr" : INDEXFILESUFFIX;
|
||||
fileName = MALLOC(char, strlen(FileName) + strlen(Suffix) + 1);
|
||||
if (fileName) {
|
||||
strcpy(fileName, FileName);
|
||||
char *pFileExt = fileName + strlen(fileName);
|
||||
strcpy(pFileExt, Suffix);
|
||||
int delta = 0;
|
||||
if (!Record && access(fileName, R_OK) != 0) {
|
||||
// Index file doesn't exist, so try to regenerate it:
|
||||
if (!isPesRecording) { // sorry, can only do this for TS recordings
|
||||
resumeFile.Delete(); // just in case
|
||||
indexFileGenerator = new cIndexFileGenerator(FileName);
|
||||
// Wait until the index file exists:
|
||||
time_t tmax = time(NULL) + MAXWAITFORINDEXFILE;
|
||||
do {
|
||||
cCondWait::SleepMs(INDEXFILECHECKINTERVAL); // start with a sleep, to give it a head start
|
||||
} while (access(fileName, R_OK) != 0 && time(NULL) < tmax);
|
||||
}
|
||||
}
|
||||
if (access(fileName, R_OK) == 0) {
|
||||
struct stat buf;
|
||||
if (stat(fileName, &buf) == 0) {
|
||||
delta = int(buf.st_size % sizeof(tIndexTs));
|
||||
if (delta) {
|
||||
delta = sizeof(tIndexTs) - delta;
|
||||
esyslog("ERROR: invalid file size (%"PRId64") in '%s'", buf.st_size, fileName);
|
||||
}
|
||||
last = int((buf.st_size + delta) / sizeof(tIndexTs) - 1);
|
||||
if (!Record && last >= 0) {
|
||||
size = last + 1;
|
||||
index = MALLOC(tIndexTs, size);
|
||||
if (index) {
|
||||
f = open(fileName, O_RDONLY);
|
||||
if (f >= 0) {
|
||||
if (safe_read(f, index, size_t(buf.st_size)) != buf.st_size) {
|
||||
esyslog("ERROR: can't read from file '%s'", fileName);
|
||||
free(index);
|
||||
index = NULL;
|
||||
close(f);
|
||||
f = -1;
|
||||
}
|
||||
// we don't close f here, see CatchUp()!
|
||||
else if (isPesRecording)
|
||||
ConvertFromPes(index, size);
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(fileName);
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: can't allocate %zd bytes for index '%s'", size * sizeof(tIndexTs), fileName);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR;
|
||||
}
|
||||
else if (!Record)
|
||||
isyslog("missing index file %s", fileName);
|
||||
if (Record) {
|
||||
if ((f = open(fileName, O_WRONLY | O_CREAT | O_APPEND, DEFFILEMODE)) >= 0) {
|
||||
if (delta) {
|
||||
esyslog("ERROR: padding index file with %d '0' bytes", delta);
|
||||
while (delta--)
|
||||
writechar(f, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(fileName);
|
||||
fileName = IndexFileName(FileName, isPesRecording);
|
||||
int delta = 0;
|
||||
if (!Record && access(fileName, R_OK) != 0) {
|
||||
// Index file doesn't exist, so try to regenerate it:
|
||||
if (!isPesRecording) { // sorry, can only do this for TS recordings
|
||||
resumeFile.Delete(); // just in case
|
||||
indexFileGenerator = new cIndexFileGenerator(FileName);
|
||||
// Wait until the index file exists:
|
||||
time_t tmax = time(NULL) + MAXWAITFORINDEXFILE;
|
||||
do {
|
||||
cCondWait::SleepMs(INDEXFILECHECKINTERVAL); // start with a sleep, to give it a head start
|
||||
} while (access(fileName, R_OK) != 0 && time(NULL) < tmax);
|
||||
}
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: can't copy file name '%s'", FileName);
|
||||
if (access(fileName, R_OK) == 0) {
|
||||
struct stat buf;
|
||||
if (stat(fileName, &buf) == 0) {
|
||||
delta = int(buf.st_size % sizeof(tIndexTs));
|
||||
if (delta) {
|
||||
delta = sizeof(tIndexTs) - delta;
|
||||
esyslog("ERROR: invalid file size (%"PRId64") in '%s'", buf.st_size, *fileName);
|
||||
}
|
||||
last = int((buf.st_size + delta) / sizeof(tIndexTs) - 1);
|
||||
if (!Record && last >= 0) {
|
||||
size = last + 1;
|
||||
index = MALLOC(tIndexTs, size);
|
||||
if (index) {
|
||||
f = open(fileName, O_RDONLY);
|
||||
if (f >= 0) {
|
||||
if (safe_read(f, index, size_t(buf.st_size)) != buf.st_size) {
|
||||
esyslog("ERROR: can't read from file '%s'", *fileName);
|
||||
free(index);
|
||||
index = NULL;
|
||||
close(f);
|
||||
f = -1;
|
||||
}
|
||||
// we don't close f here, see CatchUp()!
|
||||
else if (isPesRecording)
|
||||
ConvertFromPes(index, size);
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(*fileName);
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: can't allocate %zd bytes for index '%s'", size * sizeof(tIndexTs), *fileName);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR;
|
||||
}
|
||||
else if (!Record)
|
||||
isyslog("missing index file %s", *fileName);
|
||||
if (Record) {
|
||||
if ((f = open(fileName, O_WRONLY | O_CREAT | O_APPEND, DEFFILEMODE)) >= 0) {
|
||||
if (delta) {
|
||||
esyslog("ERROR: padding index file with %d '0' bytes", delta);
|
||||
while (delta--)
|
||||
writechar(f, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(*fileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1625,11 +1616,15 @@ cIndexFile::~cIndexFile()
|
||||
{
|
||||
if (f >= 0)
|
||||
close(f);
|
||||
free(fileName);
|
||||
free(index);
|
||||
delete indexFileGenerator;
|
||||
}
|
||||
|
||||
cString cIndexFile::IndexFileName(const char *FileName, bool IsPesRecording)
|
||||
{
|
||||
return cString::sprintf("%s%s", FileName, IsPesRecording ? INDEXFILESUFFIX ".vdr" : INDEXFILESUFFIX);
|
||||
}
|
||||
|
||||
void cIndexFile::ConvertFromPes(tIndexTs *IndexTs, int Count)
|
||||
{
|
||||
tIndexPes IndexPes;
|
||||
@ -1696,7 +1691,7 @@ bool cIndexFile::CatchUp(int Index)
|
||||
last = newLast;
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(fileName);
|
||||
LOG_ERROR_STR(*fileName);
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: can't realloc() index");
|
||||
@ -1705,7 +1700,7 @@ bool cIndexFile::CatchUp(int Index)
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR_STR(fileName);
|
||||
LOG_ERROR_STR(*fileName);
|
||||
if (Index < last - (i ? 2 * INDEXSAFETYLIMIT : 0) || Index > 10 * INDEXSAFETYLIMIT) // keep off the end in case of "Pause live video"
|
||||
break;
|
||||
cCondWait::SleepMs(1000);
|
||||
@ -1721,7 +1716,7 @@ bool cIndexFile::Write(bool Independent, uint16_t FileNumber, off_t FileOffset)
|
||||
if (isPesRecording)
|
||||
ConvertToPes(&i, 1);
|
||||
if (safe_write(f, &i, sizeof(i)) < 0) {
|
||||
LOG_ERROR_STR(fileName);
|
||||
LOG_ERROR_STR(*fileName);
|
||||
close(f);
|
||||
f = -1;
|
||||
return false;
|
||||
@ -1811,8 +1806,8 @@ bool cIndexFile::IsStillRecording()
|
||||
|
||||
void cIndexFile::Delete(void)
|
||||
{
|
||||
if (fileName) {
|
||||
dsyslog("deleting index file '%s'", fileName);
|
||||
if (*fileName) {
|
||||
dsyslog("deleting index file '%s'", *fileName);
|
||||
if (f >= 0) {
|
||||
close(f);
|
||||
f = -1;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.h 2.19 2011/04/17 13:18:04 kls Exp $
|
||||
* $Id: recording.h 2.20 2011/08/13 09:52:25 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __RECORDING_H
|
||||
@ -236,13 +236,14 @@ class cIndexFileGenerator;
|
||||
class cIndexFile {
|
||||
private:
|
||||
int f;
|
||||
char *fileName;
|
||||
cString fileName;
|
||||
int size, last;
|
||||
tIndexTs *index;
|
||||
bool isPesRecording;
|
||||
cResumeFile resumeFile;
|
||||
cIndexFileGenerator *indexFileGenerator;
|
||||
cMutex mutex;
|
||||
static cString IndexFileName(const char *FileName, bool IsPesRecording);
|
||||
void ConvertFromPes(tIndexTs *IndexTs, int Count);
|
||||
void ConvertToPes(tIndexTs *IndexTs, int Count);
|
||||
bool CatchUp(int Index = -1);
|
||||
|
Loading…
Reference in New Issue
Block a user