vdr  2.4.1
transfer.c
Go to the documentation of this file.
1 /*
2  * transfer.c: Transfer mode
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * $Id: transfer.c 4.2 2017/12/07 15:00:33 kls Exp $
8  */
9 
10 #include "transfer.h"
11 
12 // --- cTransfer -------------------------------------------------------------
13 
15 :cReceiver(Channel, TRANSFERPRIORITY)
16 {
17  lastErrorReport = 0;
18  numLostPackets = 0;
19  patPmtGenerator.SetChannel(Channel);
20 }
21 
23 {
26 }
27 
28 void cTransfer::Activate(bool On)
29 {
30  if (On) {
32  int Index = 0;
33  while (uchar *pmt = patPmtGenerator.GetPmt(Index))
34  PlayTs(pmt, TS_SIZE);
35  }
36  else
38 }
39 
40 #define MAXRETRIES 20 // max. number of retries for a single TS packet
41 #define RETRYWAIT 5 // time (in ms) between two retries
42 #define ERRORDELTA 60 // seconds before reporting lost TS packets again
43 
44 void cTransfer::Receive(const uchar *Data, int Length)
45 {
46  if (cPlayer::IsAttached()) {
47  // Transfer Mode means "live tv", so there's no point in doing any additional
48  // buffering here. The TS packets *must* get through here! However, every
49  // now and then there may be conditions where the packet just can't be
50  // handled when offered the first time, so that's why we try several times:
51  for (int i = 0; i < MAXRETRIES; i++) {
52  if (PlayTs(Data, Length) > 0)
53  return;
55  }
56  DeviceClear();
58  if (time(NULL) - lastErrorReport > ERRORDELTA) {
59  esyslog("ERROR: %d TS packet(s) not accepted in Transfer Mode", numLostPackets);
60  numLostPackets = 0;
61  lastErrorReport = time(NULL);
62  }
63  }
64 }
65 
66 // --- cTransferControl ------------------------------------------------------
67 
69 
70 cTransferControl::cTransferControl(cDevice *ReceiverDevice, const cChannel *Channel)
71 :cControl(transfer = new cTransfer(Channel), true)
72 {
75 }
76 
78 {
79  receiverDevice = NULL;
80  delete transfer;
81 }
TS_SIZE
#define TS_SIZE
Definition: remux.h:34
cPlayer::Detach
void Detach(void)
Definition: player.c:34
cTransferControl::transfer
cTransfer * transfer
Definition: transfer.h:32
cPatPmtGenerator::GetPmt
uchar * GetPmt(int &Index)
Returns a pointer to the Index'th TS packet of the PMT section.
Definition: remux.c:636
transfer.h
RETRYWAIT
#define RETRYWAIT
Definition: transfer.c:41
cReceiver
Definition: receiver.h:17
cTransferControl::cTransferControl
cTransferControl(cDevice *ReceiverDevice, const cChannel *Channel)
Definition: transfer.c:70
cTransferControl::receiverDevice
static cDevice * receiverDevice
Definition: transfer.h:33
cTransfer::numLostPackets
int numLostPackets
Definition: transfer.h:20
cTransfer::Receive
virtual void Receive(const uchar *Data, int Length)
This function is called from the cDevice we are attached to, and delivers one TS packet from the set ...
Definition: transfer.c:44
cControl
Definition: player.h:80
TRANSFERPRIORITY
#define TRANSFERPRIORITY
Definition: config.h:42
cPlayer::PlayTs
int PlayTs(const uchar *Data, int Length, bool VideoOnly=false)
Definition: player.h:47
cTransfer
Definition: transfer.h:17
cTransferControl::~cTransferControl
~cTransferControl()
Definition: transfer.c:77
cDevice
Definition: device.h:117
uchar
unsigned char uchar
Definition: tools.h:31
cPatPmtGenerator::GetPat
uchar * GetPat(void)
Returns a pointer to the PAT section, which consists of exactly one TS packet.
Definition: remux.c:630
cPlayer::DeviceClear
void DeviceClear(void)
Definition: player.h:31
cTransferControl::ReceiverDevice
static cDevice * ReceiverDevice(void)
Definition: transfer.h:38
cTransfer::Activate
virtual void Activate(bool On)
Definition: transfer.c:28
cDevice::AttachReceiver
bool AttachReceiver(cReceiver *Receiver)
Attaches the given receiver to this device.
Definition: device.c:1750
cChannel
Definition: channels.h:89
cReceiver::Detach
void Detach(void)
Definition: receiver.c:125
cPatPmtGenerator::SetChannel
void SetChannel(const cChannel *Channel)
Sets the Channel for which the PAT/PMT shall be generated.
Definition: remux.c:621
cTransfer::patPmtGenerator
cPatPmtGenerator patPmtGenerator
Definition: transfer.h:21
cCondWait::SleepMs
static void SleepMs(int TimeoutMs)
Creates a cCondWait object and uses it to sleep for TimeoutMs milliseconds, immediately giving up the...
Definition: thread.c:72
cTransfer::lastErrorReport
time_t lastErrorReport
Definition: transfer.h:19
cPlayer::IsAttached
bool IsAttached(void)
Definition: player.h:54
ERRORDELTA
#define ERRORDELTA
Definition: transfer.c:42
MAXRETRIES
#define MAXRETRIES
Definition: transfer.c:40
esyslog
#define esyslog(a...)
Definition: tools.h:35
cTransfer::~cTransfer
virtual ~cTransfer()
Definition: transfer.c:22
cTransfer::cTransfer
cTransfer(const cChannel *Channel)
Definition: transfer.c:14