Fixed broken recordings after a driver buffer overflow

This commit is contained in:
Klaus Schmidinger 2001-08-19 14:37:17 +02:00
parent e994e3a4fe
commit 73870fc907
3 changed files with 34 additions and 8 deletions

View File

@ -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.

View File

@ -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;
}
}
}
}

21
remux.c
View File

@ -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);