mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Fixed broken recordings after a driver buffer overflow
This commit is contained in:
parent
e994e3a4fe
commit
73870fc907
3
HISTORY
3
HISTORY
@ -650,7 +650,7 @@ Video Disk Recorder Revision History
|
|||||||
only once.
|
only once.
|
||||||
- Made I/O more robust by handling EINTR (thanks to Werner Fink).
|
- 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.
|
- 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
|
- 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
|
bugs are fixed can be controlled with the EPGBugfixLevel parameter in the
|
||||||
"Setup" menu (see MANUAL for details, and cEventInfo::FixEpgBugs() in eit.c
|
"Setup" menu (see MANUAL for details, and cEventInfo::FixEpgBugs() in eit.c
|
||||||
for the actual implementation).
|
for the actual implementation).
|
||||||
|
- Fixed broken recordings after a driver buffer overflow.
|
||||||
|
14
dvbapi.c
14
dvbapi.c
@ -7,7 +7,7 @@
|
|||||||
* DVD support initially written by Andreas Schultz <aschultz@warp10.net>
|
* DVD support initially written by Andreas Schultz <aschultz@warp10.net>
|
||||||
* based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si>
|
* 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
|
//#define DVDDEBUG 1
|
||||||
@ -545,11 +545,15 @@ void cRecordBuffer::Input(void)
|
|||||||
}
|
}
|
||||||
else if (r < 0) {
|
else if (r < 0) {
|
||||||
if (FATALERRNO) {
|
if (FATALERRNO) {
|
||||||
|
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;
|
LOG_ERROR;
|
||||||
if (errno != EBUFFEROVERFLOW)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (time(NULL) - t > MAXBROKENTIMEOUT) {
|
if (time(NULL) - t > MAXBROKENTIMEOUT) {
|
||||||
esyslog(LOG_ERR, "ERROR: video data stream broken");
|
esyslog(LOG_ERR, "ERROR: video data stream broken");
|
||||||
cThread::EmergencyExit(true);
|
cThread::EmergencyExit(true);
|
||||||
@ -2075,12 +2079,16 @@ void cTransferBuffer::Input(void)
|
|||||||
}
|
}
|
||||||
else if (r < 0) {
|
else if (r < 0) {
|
||||||
if (FATALERRNO) {
|
if (FATALERRNO) {
|
||||||
|
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;
|
LOG_ERROR;
|
||||||
if (errno != EBUFFEROVERFLOW)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dsyslog(LOG_INFO, "input thread ended (pid=%d)", getpid());
|
dsyslog(LOG_INFO, "input thread ended (pid=%d)", getpid());
|
||||||
}
|
}
|
||||||
|
21
remux.c
21
remux.c
@ -8,7 +8,7 @@
|
|||||||
* the Linux DVB driver's 'tuxplayer' example and were rewritten to suit
|
* the Linux DVB driver's 'tuxplayer' example and were rewritten to suit
|
||||||
* VDR's needs.
|
* 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
|
/* The calling interface of the 'cRemux::Process()' function is defined
|
||||||
@ -489,6 +489,8 @@ void cRemux::SetAudioPid(int APid)
|
|||||||
resultCount = resultDelivered = 0;
|
resultCount = resultDelivered = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define TS_SYNC_BYTE 0x47
|
||||||
|
|
||||||
const uchar *cRemux::Process(const uchar *Data, int &Count, int &Result, uchar *PictureType)
|
const uchar *cRemux::Process(const uchar *Data, int &Count, int &Result, uchar *PictureType)
|
||||||
{
|
{
|
||||||
uchar dummyPictureType;
|
uchar dummyPictureType;
|
||||||
@ -511,12 +513,27 @@ XXX*/
|
|||||||
resultDelivered = 0;
|
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:
|
// Convert incoming TS data into multiplexed PES:
|
||||||
|
|
||||||
int used = 0;
|
|
||||||
for (int i = 0; i < Count; i += TS_SIZE) {
|
for (int i = 0; i < Count; i += TS_SIZE) {
|
||||||
if (Count - i < TS_SIZE)
|
if (Count - i < TS_SIZE)
|
||||||
break;
|
break;
|
||||||
|
if (Data[i] != TS_SYNC_BYTE)
|
||||||
|
break;
|
||||||
int pid = GetPid(Data + i + 1);
|
int pid = GetPid(Data + i + 1);
|
||||||
if (Data[i + 3] & 0x10) { // got payload
|
if (Data[i + 3] & 0x10) { // got payload
|
||||||
if (pid == vPid) vTS2PES->ts_to_pes(Data + i);
|
if (pid == vPid) vTS2PES->ts_to_pes(Data + i);
|
||||||
|
Loading…
Reference in New Issue
Block a user