From 141be00b0febd77db0bca46e9a788f018d07aeb8 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Fri, 12 May 2006 15:17:24 +0000 Subject: add pes parser --- lib/dvb/pesparse.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 lib/dvb/pesparse.cpp (limited to 'lib/dvb/pesparse.cpp') diff --git a/lib/dvb/pesparse.cpp b/lib/dvb/pesparse.cpp new file mode 100644 index 00000000..7e05c96a --- /dev/null +++ b/lib/dvb/pesparse.cpp @@ -0,0 +1,57 @@ +#include +#include + +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) +{ + m_header[3] = id; +} + +void ePESParser::processData(unsigned char *p, int len) +{ + /* 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) + if (*p != "\x00\x00\x01\xbd"[m_pes_position]) + { + m_pes_position = 0; + 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; + } + } + } +} -- cgit v1.2.3