summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2013-01-20 13:40:30 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2013-01-20 13:40:30 +0100
commit1ba20fa20f632ffb548f57ca9b3b5b9bab5296d0 (patch)
tree152fc0790eabd7a056aa10138426da942cc3fbe4
parentabde1d04aeb7beb29c2638389c29ff92ff87a75a (diff)
downloadvdr-1ba20fa20f632ffb548f57ca9b3b5b9bab5296d0.tar.gz
vdr-1ba20fa20f632ffb548f57ca9b3b5b9bab5296d0.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--HISTORY2
-rw-r--r--transfer.c20
-rw-r--r--transfer.h5
3 files changed, 22 insertions, 5 deletions
diff --git a/HISTORY b/HISTORY
index a36f1af5..11cad93e 100644
--- a/HISTORY
+++ b/HISTORY
@@ -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.
diff --git a/transfer.c b/transfer.c
index 2a92a82b..51ba912b 100644
--- a/transfer.c
+++ b/transfer.c
@@ -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");
}
}
diff --git a/transfer.h b/transfer.h
index 004d5b06..0c668370 100644
--- a/transfer.h
+++ b/transfer.h
@@ -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);