2 * @file Demultiplexer.cpp
6 #include "mpeg2/ts/Demultiplexer.h"
13 Demultiplexer::Demultiplexer()
19 _continuity_counter_sdt = 0xFF;
20 _continuity_counter_0012 = 0xFF;
21 _continuity_counter_0026 = 0xFF;
22 _continuity_counter_0027 = 0xFF;
25 Demultiplexer::~Demultiplexer()
30 void Demultiplexer::setListener(Listener *listener)
37 void Demultiplexer::setFlag(uint32_t flag, bool onoff)
51 void Demultiplexer::putSDT(Header *header, uint8_t *packet)
53 if (_continuity_counter_sdt != 0xFF)
55 if (((_continuity_counter_sdt + 1) & 0x0F) != header->_continuity_counter)
57 printf("packet loss\n");
59 ((Table *)&_sdt)->reset();
61 _continuity_counter_sdt = header->_continuity_counter;
63 if (_sdt.decode(header, packet))
65 if ((_listener) && ((_flag & FLG_SDT) == FLG_SDT))
67 _listener->detect(&_sdt);
73 void Demultiplexer::putEIT(Header *header, uint8_t *packet)
78 if (_continuity_counter_0012 != 0xFF)
80 if (((_continuity_counter_0012 + 1) & 0x0F) != header->_continuity_counter)
82 printf("packet loss\n");
84 ((Table *)&_eit_0012)->reset();
87 _continuity_counter_0012 = header->_continuity_counter;
91 if (_continuity_counter_0026 != 0xFF)
93 if (((_continuity_counter_0026 + 1) & 0x0F) != header->_continuity_counter)
95 printf("packet loss\n");
97 ((Table *)&_eit_0026)->reset();
100 _continuity_counter_0026 = header->_continuity_counter;
104 if (_continuity_counter_0027 != 0xFF)
106 if (((_continuity_counter_0027 + 1) & 0x0F) != header->_continuity_counter)
108 printf("packet loss\n");
110 ((Table *)&_eit_0027)->reset();
113 _continuity_counter_0027 = header->_continuity_counter;
117 switch (header->_pid)
120 if (_eit_0012.decode(header, packet))
122 if ((_listener) && ((_flag & FLG_EIT) == FLG_EIT))
124 _listener->detect(&_eit_0012);
130 if (_eit_0026.decode(header, packet))
132 if ((_listener) && ((_flag & FLG_EIT) == FLG_EIT))
134 _listener->detect(&_eit_0026);
140 if (_eit_0027.decode(header, packet))
142 if ((_listener) && ((_flag & FLG_EIT) == FLG_EIT))
144 _listener->detect(&_eit_0027);
152 void Demultiplexer::put(uint8_t *buffer, uint32_t size)
155 while (offset < size)
157 if (buffer[offset] != SYNC_BYTE)
164 Header header(&buffer[offset]);
165 if (!header._transport_error)
179 putSDT(&header, &buffer[offset]);
185 putEIT(&header, &buffer[offset]);
198 offset += PACKET_SIZE;