vdr-plugin-softhddevice-drm-gles 1.4.0
pipreceiver.cpp
Go to the documentation of this file.
1
20#include <vdr/remux.h>
21
22#include "logger.h"
23#include "pipreceiver.h"
24#include "softhddevice.h"
25
26/*****************************************************************************
27 * cPipReceiver class
28 ****************************************************************************/
29
33cPipReceiver::cPipReceiver(const cChannel *channel, cSoftHdDevice *device) : cReceiver(NULL, MINPRIORITY)
34{
35 LOGDEBUG("pipreceiver: %s", __FUNCTION__);
36 m_pDevice = device;
37 AddPid(channel->Vpid());
40}
41
46{
47 LOGDEBUG("pipreceiver: %s", __FUNCTION__);
48 Detach();
49}
50
55{
56 LOGDEBUG("pipreceiver: %s %s", __FUNCTION__, on ? "on" : "off");
57 m_pTsToPesVideo.Reset();
58}
59
60#define MAXRETRIES 20 // max. number of retries for a single TS packet
61#define RETRYWAITMS 5 // time between two retries
62#define ERRORDELTASEC 60 // seconds before reporting lost packages again
68void cPipReceiver::Receive(const uchar *data, int size)
69{
70 for (int i = 0; i < MAXRETRIES; i++) {
71 if (ParseTs(data, size) > 0)
72 return;
73 cCondWait::SleepMs(RETRYWAITMS);
74 }
75 m_numLostPackets++;
76 if (cTimeMs::Now() - m_lastErrorReport > ERRORDELTASEC) {
77 LOGWARNING("pipreceiver: %d TS packet(s) not accepted in pip stream", m_numLostPackets);
78 m_numLostPackets = 0;
79 m_lastErrorReport = cTimeMs::Now();
80 }
81}
82
88int cPipReceiver::ParseTs(const uchar *data, int size)
89{
90 int played = 0;
91
92 if (!data) {
93 LOGWARNING("pipreceiver: %s null data received, reset pes buffer!", __FUNCTION__);
94 m_pTsToPesVideo.Reset();
95 return 0;
96 }
97
98 if (size < TS_SIZE) {
99 LOGWARNING("pipreceiver: %s TS fragment received!", __FUNCTION__);
100 return size;
101 }
102
103 while (size >= TS_SIZE) {
104 if (int skipped = TS_SYNC(data, size)) {
105 LOGWARNING("pipreceiver: %s TS stream not in sync!", __FUNCTION__);
106 return played + skipped;
107 }
108
109 if (TsHasPayload(data)) {
110 int payloadOffset = TsPayloadOffset(data);
111 if (payloadOffset < TS_SIZE) {
112 int w = PlayTs(data, TS_SIZE);
113 if (w < 0)
114 return played ? played : w;
115 if (w == 0)
116 break;
117 }
118 }
119
120 played += TS_SIZE;
121 size -= TS_SIZE;
122 data += TS_SIZE;
123 }
124
125 return played;
126}
127
133int cPipReceiver::PlayTs(const uchar *data, int size)
134{
135 if (TsPayloadStart(data)) {
136 int length;
137 while (const uchar *pes = m_pTsToPesVideo.GetPes(length)) {
138 int w = m_pDevice->PlayPipVideo(pes, length);
139 if (w <= 0) {
140 m_pTsToPesVideo.SetRepeatLast();
141 return w;
142 }
143 }
144 m_pTsToPesVideo.Reset();
145 }
146 m_pTsToPesVideo.PutTs(data, size);
147
148 return size;
149}
cTsToPes m_pTsToPesVideo
Definition: pipreceiver.h:42
virtual ~cPipReceiver(void)
pip receiver class destructor
Definition: pipreceiver.cpp:45
int PlayTs(const uchar *, int)
Get the pes payload and send it to the player.
uint64_t m_lastErrorReport
Definition: pipreceiver.h:43
virtual void Activate(bool)
called before the receiver gets attached or after it got detached
Definition: pipreceiver.cpp:54
int ParseTs(const uchar *, int)
Parse the ts stream and send it to the pes player.
Definition: pipreceiver.cpp:88
cSoftHdDevice * m_pDevice
Definition: pipreceiver.h:41
cPipReceiver(const cChannel *, cSoftHdDevice *)
pip receiver class constructor
Definition: pipreceiver.cpp:33
int m_numLostPackets
Definition: pipreceiver.h:44
int PlayPipVideo(const uchar *, int)
Play a video packet of the pip videostream.
Logger class header file.
#define LOGDEBUG
Definition: logger.h:49
#define LOGWARNING
Definition: logger.h:47
#define ERRORDELTASEC
Definition: pipreceiver.cpp:62
#define MAXRETRIES
Definition: pipreceiver.cpp:60
#define RETRYWAITMS
Definition: pipreceiver.cpp:61
Pip receiver header file.
Device class header file.