summaryrefslogtreecommitdiff
path: root/p2pvr/dvb/siParsers/programMap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'p2pvr/dvb/siParsers/programMap.cpp')
-rw-r--r--p2pvr/dvb/siParsers/programMap.cpp48
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));
+ }
+}