From 73870fc90706ced04a25f19ee72595eb3a9e4d2b Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 19 Aug 2001 14:37:17 +0200 Subject: [PATCH] Fixed broken recordings after a driver buffer overflow --- HISTORY | 3 ++- dvbapi.c | 18 +++++++++++++----- remux.c | 21 +++++++++++++++++++-- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/HISTORY b/HISTORY index 7b51aa9f..e0c815a2 100644 --- a/HISTORY +++ b/HISTORY @@ -650,7 +650,7 @@ Video Disk Recorder Revision History only once. - Made I/O more robust by handling EINTR (thanks to Werner Fink). -2001-08-17: Version 0.92 +2001-08-18: Version 0.92 - The "channel not sync'ed" log message now also lists the card number. - Now using the EIT services from 'libdtv' (thanks to Rolf Hakenes), which @@ -660,3 +660,4 @@ Video Disk Recorder Revision History bugs are fixed can be controlled with the EPGBugfixLevel parameter in the "Setup" menu (see MANUAL for details, and cEventInfo::FixEpgBugs() in eit.c for the actual implementation). +- Fixed broken recordings after a driver buffer overflow. diff --git a/dvbapi.c b/dvbapi.c index a7565fed..e83d9d1c 100644 --- a/dvbapi.c +++ b/dvbapi.c @@ -7,7 +7,7 @@ * DVD support initially written by Andreas Schultz * based on dvdplayer-0.5 by Matjaz Thaler * - * $Id: dvbapi.c 1.107 2001/08/15 09:07:19 kls Exp $ + * $Id: dvbapi.c 1.108 2001/08/19 14:36:38 kls Exp $ */ //#define DVDDEBUG 1 @@ -545,9 +545,13 @@ void cRecordBuffer::Input(void) } else if (r < 0) { if (FATALERRNO) { - LOG_ERROR; - if (errno != EBUFFEROVERFLOW) + if (errno == EBUFFEROVERFLOW) { // this error code is not defined in the library + esyslog(LOG_ERR, "ERROR (%s,%d): DVB driver buffer overflow", __FILE__, __LINE__); + } + else { + LOG_ERROR; break; + } } } if (time(NULL) - t > MAXBROKENTIMEOUT) { @@ -2075,9 +2079,13 @@ void cTransferBuffer::Input(void) } else if (r < 0) { if (FATALERRNO) { - LOG_ERROR; - if (errno != EBUFFEROVERFLOW) + if (errno == EBUFFEROVERFLOW) { // this error code is not defined in the library + esyslog(LOG_ERR, "ERROR (%s,%d): DVB driver buffer overflow", __FILE__, __LINE__); + } + else { + LOG_ERROR; break; + } } } } diff --git a/remux.c b/remux.c index 3c7ec6e6..f89b897b 100644 --- a/remux.c +++ b/remux.c @@ -8,7 +8,7 @@ * the Linux DVB driver's 'tuxplayer' example and were rewritten to suit * VDR's needs. * - * $Id: remux.c 1.5 2001/06/24 16:37:23 kls Exp $ + * $Id: remux.c 1.6 2001/08/19 11:52:05 kls Exp $ */ /* The calling interface of the 'cRemux::Process()' function is defined @@ -489,6 +489,8 @@ void cRemux::SetAudioPid(int APid) resultCount = resultDelivered = 0; } +#define TS_SYNC_BYTE 0x47 + const uchar *cRemux::Process(const uchar *Data, int &Count, int &Result, uchar *PictureType) { uchar dummyPictureType; @@ -511,12 +513,27 @@ XXX*/ resultDelivered = 0; } + int used = 0; + + // Make sure we are looking at a TS packet: + + while (Count > TS_SIZE) { + if (Data[0] == TS_SYNC_BYTE && Data[TS_SIZE] == TS_SYNC_BYTE) + break; + Data++; + Count--; + used++; + } + if (used) + esyslog(LOG_ERR, "ERROR: skipped %d byte to sync on TS packet", used); + // Convert incoming TS data into multiplexed PES: - int used = 0; for (int i = 0; i < Count; i += TS_SIZE) { if (Count - i < TS_SIZE) break; + if (Data[i] != TS_SYNC_BYTE) + break; int pid = GetPid(Data + i + 1); if (Data[i + 3] & 0x10) { // got payload if (pid == vPid) vTS2PES->ts_to_pes(Data + i);