diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2001-08-19 14:37:17 +0200 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2001-08-19 14:37:17 +0200 |
commit | 73870fc90706ced04a25f19ee72595eb3a9e4d2b (patch) | |
tree | b2b78fb4cd0370d294aea56a58a3876dd867e6b1 | |
parent | e994e3a4fef46bcd17aae84f04b552d2b32f7469 (diff) | |
download | vdr-73870fc90706ced04a25f19ee72595eb3a9e4d2b.tar.gz vdr-73870fc90706ced04a25f19ee72595eb3a9e4d2b.tar.bz2 |
Fixed broken recordings after a driver buffer overflow
-rw-r--r-- | HISTORY | 3 | ||||
-rw-r--r-- | dvbapi.c | 18 | ||||
-rw-r--r-- | remux.c | 21 |
3 files changed, 34 insertions, 8 deletions
@@ -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. @@ -7,7 +7,7 @@ * DVD support initially written by Andreas Schultz <aschultz@warp10.net> * based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si> * - * $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; + } } } } @@ -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); |