From d17452dcfa08e92955d2def34f24a10fbffd08b1 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Fri, 15 Jun 2001 14:12:56 +0200 Subject: [PATCH] Bugfix in editing mechanism --- HISTORY | 5 +++-- dvbapi.c | 52 ++++++++++++++++++++++------------------------------ 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/HISTORY b/HISTORY index 3617b25d..5d0d94be 100644 --- a/HISTORY +++ b/HISTORY @@ -506,7 +506,7 @@ Video Disk Recorder Revision History - Fixed removing recordings with Lifetime = 99. - Improved channel switching. -2001-06-14: Version 0.82 +2001-06-15: Version 0.82 - Increased timeout until reporting "broken video data stream" when recording. - Modified method of turning off PIDs when switching channel. @@ -526,4 +526,5 @@ Video Disk Recorder Revision History This will create packets for the second audio track that are small enough to multiplex smoothly with the video data. - +- Fixed a bug in the editing mechanism (didn't work with recordings that + consist of more than one data file). diff --git a/dvbapi.c b/dvbapi.c index 325d095e..7d2efa66 100644 --- a/dvbapi.c +++ b/dvbapi.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbapi.c 1.73 2001/06/14 15:10:16 kls Exp $ + * $Id: dvbapi.c 1.74 2001/06/15 14:11:21 kls Exp $ */ #include "dvbapi.h" @@ -595,6 +595,22 @@ void cRecordBuffer::Output(void) dsyslog(LOG_INFO, "output thread ended (pid=%d)", getpid()); } +// --- ReadFrame ------------------------------------------------------------- + +int ReadFrame(int f, uchar *b, int Length, int Max) +{ + if (Length == -1) + Length = Max; // this means we read up to EOF (see cIndex) + else if (Length > Max) { + esyslog(LOG_ERR, "ERROR: frame larger than buffer (%d > %d)", Length, Max); + Length = Max; + } + int r = read(f, b, Length); + if (r < 0) + LOG_ERROR; + return r; +} + // --- cReplayBuffer --------------------------------------------------------- class cReplayBuffer : public cRingBuffer { @@ -614,7 +630,6 @@ private: bool NextFile(uchar FileNumber = 0, int FileOffset = -1); void Clear(bool Block = false); void Close(void); - int ReadFrame(uchar *b, int Length, int Max); void StripAudioPackets(uchar *b, int Length, uchar Except = 0x00); void DisplayFrame(uchar *b, int Length); int Resume(void); @@ -708,7 +723,7 @@ void cReplayBuffer::Input(void) } lastIndex = Index; playIndex = -1; - r = ReadFrame(b, Length, sizeof(b)); + r = ReadFrame(replayFile, b, Length, sizeof(b)); StripAudioPackets(b, r); } else { @@ -718,7 +733,7 @@ void cReplayBuffer::Input(void) int FileOffset, Length; if (!(index->Get(playIndex, &FileNumber, &FileOffset, NULL, &Length) && NextFile(FileNumber, FileOffset))) break; - r = ReadFrame(b, Length, sizeof(b)); + r = ReadFrame(replayFile, b, Length, sizeof(b)); StripAudioPackets(b, r, audioTrack); } if (r > 0) { @@ -775,22 +790,6 @@ void cReplayBuffer::Output(void) dsyslog(LOG_INFO, "output thread ended (pid=%d)", getpid()); } -int cReplayBuffer::ReadFrame(uchar *b, int Length, int Max) -{ - if (Length > Max) { - esyslog(LOG_ERR, "ERROR: frame larger than buffer (%d > %d)", Length, Max); - Length = Max; - } - int r = read(replayFile, b, Length); - if (r >= 0) { - if (r != Length) - esyslog(LOG_ERR, "ERROR: got %d byte while reading %d", r, Length); - return r; - } - LOG_ERROR; - return -1; -} - void cReplayBuffer::StripAudioPackets(uchar *b, int Length, uchar Except) { for (int i = 0; i < Length - 6; i++) { @@ -988,7 +987,7 @@ void cReplayBuffer::Goto(int Index, bool Still) stillIndex = Index; playIndex = -1; uchar b[MAXFRAMESIZE]; - int r = ReadFrame(b, Length, sizeof(b)); + int r = ReadFrame(replayFile, b, Length, sizeof(b)); if (r > 0) DisplayFrame(b, r); fileOffset += Length; @@ -1230,16 +1229,9 @@ void cCuttingBuffer::Action(void) CurrentFileNumber = FileNumber; } if (fromFile >= 0) { - if (Length <= (int)sizeof(buffer)) { - if (read(fromFile, buffer, Length) < 0) { - LOG_ERROR; - break; - } - } - else { - esyslog(LOG_ERR, "ERROR: frame larger than buffer (%d > %d)", Length, sizeof(buffer)); + Length = ReadFrame(fromFile, buffer, Length, sizeof(buffer)); + if (Length < 0) break; - } } else break;