summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2001-08-19 14:37:17 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2001-08-19 14:37:17 +0200
commit73870fc90706ced04a25f19ee72595eb3a9e4d2b (patch)
treeb2b78fb4cd0370d294aea56a58a3876dd867e6b1
parente994e3a4fef46bcd17aae84f04b552d2b32f7469 (diff)
downloadvdr-73870fc90706ced04a25f19ee72595eb3a9e4d2b.tar.gz
vdr-73870fc90706ced04a25f19ee72595eb3a9e4d2b.tar.bz2
Fixed broken recordings after a driver buffer overflow
-rw-r--r--HISTORY3
-rw-r--r--dvbapi.c18
-rw-r--r--remux.c21
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 <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;
+ }
}
}
}
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);