Moved the detection of a broken video data stream from the cDevice into the cRecorder

This commit is contained in:
Klaus Schmidinger 2003-05-16 13:36:06 +02:00
parent 0e10fc9599
commit e944312b65
4 changed files with 19 additions and 15 deletions

View File

@ -575,6 +575,8 @@ Jan Ekholm <chakie@infa.abo.fi>
Marcel Wiesweg <marcel.wiesweg@gmx.de> Marcel Wiesweg <marcel.wiesweg@gmx.de>
for pointing out a problem with high CPU load during replay for pointing out a problem with high CPU load during replay
for reporting broken support for raw OSDs of plugins for reporting broken support for raw OSDs of plugins
for reporting a problem with cReceivers that want to receive from PIDs that are
currently not transmitting
Torsten Herz <torsten.herz@web.de> Torsten Herz <torsten.herz@web.de>
for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu

View File

@ -2159,3 +2159,7 @@ Video Disk Recorder Revision History
the translators to have their texts translated. Note that there are now 16 the translators to have their texts translated. Note that there are now 16
different OSD languages, so please make sure you have 16 versions for each of different OSD languages, so please make sure you have 16 versions for each of
your texts. your texts.
- Moved the detection of a broken video data stream from the cDevice into the
cRecorder to avoid problems with cReceivers that want to receive from PIDs
that are currently not transmitting (thanks to Marcel Wiesweg for reporting
this one).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 1.42 2003/05/11 08:53:09 kls Exp $ * $Id: device.c 1.43 2003/05/16 13:26:43 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -25,10 +25,6 @@
// The default priority for non-primary devices: // The default priority for non-primary devices:
#define DEFAULTPRIORITY -2 #define DEFAULTPRIORITY -2
// The maximum time we wait before assuming that a recorded video data stream
// is broken:
#define MAXBROKENTIMEOUT 30 // seconds
int cDevice::numDevices = 0; int cDevice::numDevices = 0;
int cDevice::useDevice = 0; int cDevice::useDevice = 0;
int cDevice::nextCardIndex = 0; int cDevice::nextCardIndex = 0;
@ -656,7 +652,6 @@ void cDevice::Action(void)
dsyslog("receiver thread started on device %d (pid=%d)", CardIndex() + 1, getpid()); dsyslog("receiver thread started on device %d (pid=%d)", CardIndex() + 1, getpid());
if (OpenDvr()) { if (OpenDvr()) {
time_t t = time(NULL);
active = true; active = true;
for (; active;) { for (; active;) {
// Read data from the DVR device: // Read data from the DVR device:
@ -671,18 +666,10 @@ void cDevice::Action(void)
receiver[i]->Receive(b, TS_SIZE); receiver[i]->Receive(b, TS_SIZE);
} }
Unlock(); Unlock();
t = time(NULL);
} }
} }
else else
break; break;
//XXX+ put this into the recorder??? or give the receiver a flag whether it wants this?
if (time(NULL) - t > MAXBROKENTIMEOUT) {
esyslog("ERROR: video data stream broken on device %d", CardIndex() + 1);
cThread::EmergencyExit(true);
t = time(NULL);
}
} }
CloseDvr(); CloseDvr();
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recorder.c 1.5 2003/01/25 16:23:36 kls Exp $ * $Id: recorder.c 1.6 2003/05/16 13:33:04 kls Exp $
*/ */
#include <stdarg.h> #include <stdarg.h>
@ -16,6 +16,10 @@
// (must be larger than MINVIDEODATA - see remux.h) // (must be larger than MINVIDEODATA - see remux.h)
#define VIDEOBUFSIZE MEGABYTE(5) #define VIDEOBUFSIZE MEGABYTE(5)
// The maximum time we wait before assuming that a recorded video data stream
// is broken:
#define MAXBROKENTIMEOUT 30 // seconds
#define MINFREEDISKSPACE (512) // MB #define MINFREEDISKSPACE (512) // MB
#define DISKCHECKINTERVAL 100 // seconds #define DISKCHECKINTERVAL 100 // seconds
@ -110,6 +114,7 @@ void cRecorder::Action(void)
{ {
dsyslog("recording thread started (pid=%d)", getpid()); dsyslog("recording thread started (pid=%d)", getpid());
time_t t = time(NULL);
active = true; active = true;
while (active) { while (active) {
int r; int r;
@ -134,6 +139,12 @@ void cRecorder::Action(void)
else else
break; break;
} }
t = time(NULL);
}
else if (time(NULL) - t > MAXBROKENTIMEOUT) {
esyslog("ERROR: video data stream broken");
cThread::EmergencyExit(true);
t = time(NULL);
} }
else else
usleep(1); // this keeps the CPU load low usleep(1); // this keeps the CPU load low