diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2006-05-12 15:17:24 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2006-05-12 15:17:24 +0000 |
| commit | 141be00b0febd77db0bca46e9a788f018d07aeb8 (patch) | |
| tree | c09e95f62c526670d889bfe24e68d778e33b9911 /lib/dvb/pesparse.cpp | |
| parent | 29f1104e0e69589c5d78e3bdf4811fa6362fb4aa (diff) | |
| download | enigma2-141be00b0febd77db0bca46e9a788f018d07aeb8.tar.gz enigma2-141be00b0febd77db0bca46e9a788f018d07aeb8.zip | |
add pes parser
Diffstat (limited to 'lib/dvb/pesparse.cpp')
| -rw-r--r-- | lib/dvb/pesparse.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
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 <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) +{ + 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; + } + } + } +} |
