diff options
Diffstat (limited to 'p2pvr/dvb/siParsers/programMap.cpp')
-rw-r--r-- | p2pvr/dvb/siParsers/programMap.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/p2pvr/dvb/siParsers/programMap.cpp b/p2pvr/dvb/siParsers/programMap.cpp new file mode 100644 index 0000000..1ba78c4 --- /dev/null +++ b/p2pvr/dvb/siParsers/programMap.cpp @@ -0,0 +1,48 @@ +#include <pch.hpp> +#include "programMap.h" +#include <boost/bind.hpp> +#include <logger.h> + +struct ProgramMapStream { + uint8_t stream_type; +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + u_char reserved1 :3; + u_char elementary_PID_hi :5; +#else + u_char elementary_PID_hi :5; + u_char reserved1 :3; +#endif + u_char elementary_PID_lo; +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + u_char reserved2 :4; + u_char ES_info_length_hi :4; +#else + u_char ES_info_length_hi :4; + u_char reserved2 :4; +#endif + u_char ES_info_length_lo; + u_char data[]; +}; + + +bool +SiProgramMapParser::CheckTableId(u_char tableId) const +{ + return (tableId == 0x02); +} + +void +SiProgramMapParser::ParseSiTable(const struct ProgramMap * pm, DVBSI::ProgramMapPtr pmp) +{ + pmp->ServiceId = ntohs(pm->header.content_id); + auto pms = ParseDescriptors<ProgramMapStream>(pm->data, HILO(pm->program_info_len)); + while (reinterpret_cast<const u_char*>(pms) < &pm->header.section_length_lo + HILO(pm->header.section_length) - 4) { + DVBSI::StreamPtr s = new DVBSI::Stream(); + s->Type = pms->stream_type; + s->Id = HILO(pms->elementary_PID); + s->ServiceId = pmp->ServiceId; + pmp->Streams.push_back(s); + // Don't care what's in here, just need to move along + pms = ParseDescriptors<ProgramMapStream>(pms->data, HILO(pms->ES_info_length)); + } +} |