diff options
Diffstat (limited to 'recording.c')
-rw-r--r-- | recording.c | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/recording.c b/recording.c index 669e8ffa..e9a6b169 100644 --- a/recording.c +++ b/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 3.20 2015/01/17 13:47:33 kls Exp $ + * $Id: recording.c 3.21 2015/01/17 14:52:28 kls Exp $ */ #include "recording.h" @@ -2241,17 +2241,19 @@ void cRecordingUserCommand::InvokeCommand(const char *State, const char *Recordi class cIndexFileGenerator : public cThread { private: cString recordingName; + bool update; protected: virtual void Action(void); public: - cIndexFileGenerator(const char *RecordingName); + cIndexFileGenerator(const char *RecordingName, bool Update = false); ~cIndexFileGenerator(); }; -cIndexFileGenerator::cIndexFileGenerator(const char *RecordingName) +cIndexFileGenerator::cIndexFileGenerator(const char *RecordingName, bool Update) :cThread("index file generator") ,recordingName(RecordingName) { + update = Update; Start(); } @@ -2270,16 +2272,34 @@ void cIndexFileGenerator::Action(void) cRingBufferLinear Buffer(IFG_BUFFER_SIZE, MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE); cPatPmtParser PatPmtParser; cFrameDetector FrameDetector; - cIndexFile IndexFile(recordingName, true); + cIndexFile IndexFile(recordingName, true, false, false, true); int BufferChunks = KILOBYTE(1); // no need to read a lot at the beginning when parsing PAT/PMT off_t FileSize = 0; off_t FrameOffset = -1; + uint16_t FileNumber = 1; + off_t FileOffset = 0; + int Last = -1; + if (update) { + // Look for current index and position to end of it if present: + bool Independent; + int Length; + Last = IndexFile.Last(); + if (Last >= 0 && !IndexFile.Get(Last, &FileNumber, &FileOffset, &Independent, &Length)) + Last = -1; // reset Last if an error occurred + if (Last >= 0) { + Rewind = true; + isyslog("updating index file"); + } + else + isyslog("generating index file"); + } Skins.QueueMessage(mtInfo, tr("Regenerating index file")); bool Stuffed = false; while (Running()) { // Rewind input file: if (Rewind) { - ReplayFile = FileName.SetOffset(1); + ReplayFile = FileName.SetOffset(FileNumber, FileOffset); + FileSize = FileOffset; Buffer.Clear(); Rewind = false; } @@ -2294,7 +2314,8 @@ void cIndexFileGenerator::Action(void) int Processed = FrameDetector.Analyze(Data, Length); if (Processed > 0) { if (FrameDetector.NewFrame()) { - IndexFile.Write(FrameDetector.IndependentFrame(), FileName.Number(), FrameOffset >= 0 ? FrameOffset : FileSize); + if (IndexFileWritten || Last < 0) // check for first frame and do not write if in update mode + IndexFile.Write(FrameDetector.IndependentFrame(), FileName.Number(), FrameOffset >= 0 ? FrameOffset : FileSize); FrameOffset = -1; IndexFileWritten = true; } @@ -2419,7 +2440,7 @@ struct tIndexTs { #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 -cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive) +cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive, bool Update) :resumeFile(FileName, IsPesRecording) { f = -1; @@ -2458,7 +2479,7 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, b 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) { + if ((!Record || Update) && last >= 0) { size = last + 1; index = MALLOC(tIndexTs, size); if (index) { @@ -2746,15 +2767,16 @@ int cIndexFile::GetLength(const char *FileName, bool IsPesRecording) return -1; } -bool GenerateIndex(const char *FileName) +bool GenerateIndex(const char *FileName, bool Update) { if (DirectoryOk(FileName)) { cRecording Recording(FileName); if (Recording.Name()) { if (!Recording.IsPesRecording()) { cString IndexFileName = AddDirectory(FileName, INDEXFILESUFFIX); - unlink(IndexFileName); - cIndexFileGenerator *IndexFileGenerator = new cIndexFileGenerator(FileName); + if (!Update) + unlink(IndexFileName); + cIndexFileGenerator *IndexFileGenerator = new cIndexFileGenerator(FileName, Update); while (IndexFileGenerator->Active()) cCondWait::SleepMs(INDEXFILECHECKINTERVAL); if (access(IndexFileName, R_OK) == 0) |