add pes parser
[vuplus_dvbapp] / lib / dvb / pesparse.cpp
1 #include <lib/dvb/pesparse.h>
2 #include <memory.h>
3
4 ePESParser::ePESParser()
5 {
6         m_pes_position = 0;
7         m_pes_length = 0;
8         m_header[0] = 0;
9         m_header[1] = 0;
10         m_header[2] = 1;
11         setStreamID(0); /* must be overridden */
12 }
13
14 void ePESParser::setStreamID(unsigned char id)
15 {
16         m_header[3] = id;
17 }
18
19 void ePESParser::processData(unsigned char *p, int len)
20 {
21                 /* this is a state machine, handling arbitary amounts of pes-formatted data. */
22         while (len)
23         {
24                 if (m_pes_position >= 6) // length ok?
25                 {
26                         int max = m_pes_length - m_pes_position;
27                         if (max > len)
28                                 max = len;
29                         memcpy(m_pes_buffer + m_pes_position, p, max);
30                         m_pes_position += max;
31                         p += max;
32                         
33                         len -= max;
34                         
35                         if (m_pes_position == m_pes_length)
36                         {
37                                 processPESPacket(m_pes_buffer, m_pes_position);
38                                 m_pes_position = 0;
39                         }
40                 } else
41                 {
42                         if (m_pes_position < 4)
43                                 if (*p != "\x00\x00\x01\xbd"[m_pes_position])
44                                 {
45                                         m_pes_position = 0;
46                                         p++;
47                                         len--;
48                                         continue;
49                                 }
50                         m_pes_buffer[m_pes_position++] = *p++; len--;
51                         if (m_pes_position == 6)
52                         {
53                                 m_pes_length = ((m_pes_buffer[4] << 8) | m_pes_buffer[5]) + 6;
54                         }
55                 }
56         }
57 }