diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2013-01-20 13:40:30 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2013-01-20 13:40:30 +0100 |
commit | 1ba20fa20f632ffb548f57ca9b3b5b9bab5296d0 (patch) | |
tree | 152fc0790eabd7a056aa10138426da942cc3fbe4 | |
parent | abde1d04aeb7beb29c2638389c29ff92ff87a75a (diff) | |
download | vdr-0f1c2e5cbc415ac6473966c687550a7d72240eb2.tar.gz vdr-0f1c2e5cbc415ac6473966c687550a7d72240eb2.tar.bz2 |
Reduced the number of retries in cTransfer::Receive() to avoid blocking recordings in case the primary device can't handle the current live signal1.7.36
-rw-r--r-- | HISTORY | 2 | ||||
-rw-r--r-- | transfer.c | 20 | ||||
-rw-r--r-- | transfer.h | 5 |
3 files changed, 22 insertions, 5 deletions
@@ -7531,3 +7531,5 @@ Video Disk Recorder Revision History exists (suggested by Malte Forkel). - Implemented scaling of SPU bitmaps (thanks to Johann Friedrichs). - Improved cutting MPEG-2 video (thanks to Sören Moch). +- Reduced the number of retries in cTransfer::Receive() to avoid blocking recordings + in case the primary device can't handle the current live signal. @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: transfer.c 2.6 2012/02/29 14:16:23 kls Exp $ + * $Id: transfer.c 2.7 2013/01/20 13:40:30 kls Exp $ */ #include "transfer.h" @@ -15,6 +15,7 @@ cTransfer::cTransfer(const cChannel *Channel) :cReceiver(Channel, TRANSFERPRIORITY) { patPmtGenerator.SetChannel(Channel); + retriesExceeded = false; } cTransfer::~cTransfer() @@ -35,6 +36,10 @@ void cTransfer::Activate(bool On) cPlayer::Detach(); } +#define MAXRETRIES 5 // max. number of retries for a single TS packet +#define RETRYWAIT 5 // time (in ms) between two retries +#define RETRYPAUSE 10000 // time (in ms) for which to pause retrying once a packet has not been accepted + void cTransfer::Receive(uchar *Data, int Length) { if (cPlayer::IsAttached()) { @@ -42,11 +47,18 @@ void cTransfer::Receive(uchar *Data, int Length) // buffering here. The TS packets *must* get through here! However, every // now and then there may be conditions where the packet just can't be // handled when offered the first time, so that's why we try several times: - for (int i = 0; i < 100; i++) { - if (PlayTs(Data, Length) > 0) + for (int i = 0; i < MAXRETRIES; i++) { + if (PlayTs(Data, Length) > 0) { + if (retriesExceeded && timer.TimedOut()) + retriesExceeded = false; + return; + } + if (retriesExceeded) // no retries once a packet has not been accepted return; - cCondWait::SleepMs(10); + cCondWait::SleepMs(RETRYWAIT); } + retriesExceeded = true; + timer.Set(RETRYPAUSE); // wait a while before retrying esyslog("ERROR: TS packet not accepted in Transfer Mode"); } } @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: transfer.h 2.2 2010/01/29 16:38:09 kls Exp $ + * $Id: transfer.h 2.3 2013/01/20 13:12:38 kls Exp $ */ #ifndef __TRANSFER_H @@ -13,10 +13,13 @@ #include "player.h" #include "receiver.h" #include "remux.h" +#include "tools.h" class cTransfer : public cReceiver, public cPlayer { private: cPatPmtGenerator patPmtGenerator; + bool retriesExceeded; + cTimeMs timer; protected: virtual void Activate(bool On); virtual void Receive(uchar *Data, int Length); |