blob: da50c0400b8f51394a17b4e51dd5a5a227de93d7 (
plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#include <lib/base/eerror.h>
#include <lib/dvb/pesparse.h>
#include <memory.h>
ePESParser::ePESParser()
{
m_pes_position = 0;
m_pes_length = 0;
m_header[0] = 0;
m_header[1] = 0;
m_header[2] = 1;
setStreamID(0); /* must be overridden */
}
void ePESParser::setStreamID(unsigned char id, unsigned char id_mask)
{
m_header[3] = id;
m_stream_id_mask = id_mask;
}
void ePESParser::processData(const __u8 *p, int len)
{
int i;
/* this is a state machine, handling arbitary amounts of pes-formatted data. */
while (len)
{
if (m_pes_position >= 6) // length ok?
{
int max = m_pes_length - m_pes_position;
if (max > len)
max = len;
memcpy(m_pes_buffer + m_pes_position, p, max);
m_pes_position += max;
p += max;
len -= max;
if (m_pes_position == m_pes_length)
{
processPESPacket(m_pes_buffer, m_pes_position);
m_pes_position = 0;
}
} else
{
if (m_pes_position < 4)
{
unsigned char ch = *p;
if (m_pes_position == 3)
ch &= m_stream_id_mask;
if (ch != m_header[m_pes_position])
{
// eDebug("sync lost at %d (%02x)", m_pes_position, *p);
m_pes_position = 0;
while (m_header[m_pes_position] == ch) /* guaranteed to stop at the old m_pes_position */
m_pes_position++;
p++;
len--;
continue;
}
}
m_pes_buffer[m_pes_position++] = *p++; len--;
if (m_pes_position == 6)
{
m_pes_length = ((m_pes_buffer[4] << 8) | m_pes_buffer[5]) + 6;
}
}
}
}
|