1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include "receiver.h"
#include "remux/ts2es.h"
#include <vdr/channels.h>
#include <vdr/ringbuffer.h>
cOsdPipReceiver::cOsdPipReceiver(const cChannel *Channel,
cRingBufferLinear *ESBuffer):
cReceiver(Channel->Ca(), 0, 2, Channel->Vpid(), Channel->Apid1()) {
m_TSBuffer = new cRingBufferLinear(MEGABYTE(3), TS_SIZE * 2, true);
m_ESBuffer = ESBuffer;
m_Remux = new cTS2ESRemux(Channel->Vpid());
m_Active = false;
}
cOsdPipReceiver::~cOsdPipReceiver() {
Detach();
delete m_Remux;
delete m_TSBuffer;
}
void cOsdPipReceiver::Activate(bool On) {
if (On)
Start();
else if (m_Active) {
m_Active = false;
Cancel(3);
}
}
void cOsdPipReceiver::Receive(uchar *Data, int Length) {
int put = m_TSBuffer->Put(Data, Length);
if (put != Length)
esyslog("osdpip: ringbuffer overflow (%d bytes dropped)", Length - put);
}
void cOsdPipReceiver::Action(void) {
dsyslog("osdpip: receiver thread started (pid=%d)", getpid());
m_Active = true;
while (m_Active) {
int r;
const uchar *b = m_TSBuffer->Get(r);
if (b) {
int Count = r, Result;
uchar *p = m_Remux->Process(b, Count, Result);
m_TSBuffer->Del(Count);
if (p)
m_ESBuffer->Put(p, Result);
} else
usleep(1); // this keeps the CPU load low
}
dsyslog("osdpip: receiver thread ended (pid=%d)", getpid());
}
|