diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2003-10-17 15:35:43 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2003-10-17 15:35:43 +0000 |
| commit | fc2f5b2cd655f1391f2abda1b39e37cdec98a951 (patch) | |
| tree | 312efcea86a319de407a7c314fb981fb1c71019a /lib/dvb/esection.cpp | |
| download | enigma2-fc2f5b2cd655f1391f2abda1b39e37cdec98a951.tar.gz enigma2-fc2f5b2cd655f1391f2abda1b39e37cdec98a951.zip | |
Initial revision
Diffstat (limited to 'lib/dvb/esection.cpp')
| -rw-r--r-- | lib/dvb/esection.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/lib/dvb/esection.cpp b/lib/dvb/esection.cpp new file mode 100644 index 00000000..08cb49be --- /dev/null +++ b/lib/dvb/esection.cpp @@ -0,0 +1,130 @@ +#include <lib/dvb/esection.h> +#include <lib/base/eerror.h> + +void eGTable::sectionRead(const __u8 *d) +{ + unsigned int last_section_number = d[7]; + m_table.flags &= ~eDVBTableSpec::tfAnyVersion; + m_table.flags |= eDVBTableSpec::tfThisVersion; + m_table.version = (d[5]>>1)&0x1F; + + + if (createTable(d[6], d, last_section_number + 1)) + { + if (m_timeout) + m_timeout->stop(); + m_reader->stop(); + ready = 1; + tableReady(error); + } else if ((m_table.flags & eDVBTableSpec::tfHaveTimeout) && m_timeout) + m_timeout->start(m_table.timeout, 1); // reset timeout +} + +void eGTable::timeout() +{ + eDebug("timeout!"); + m_reader->stop(); + ready = 1; + error = -1; + tableReady(error); +} + +eGTable::eGTable(): + ref(0), m_timeout(0), error(0) +{ +} + +DEFINE_REF(eGTable); + +RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table) +{ + RESULT res; + m_table = table; + + m_reader = reader; + m_reader->connectRead(slot(*this, &eGTable::sectionRead), m_sectionRead_conn); + + // setup filter struct + eDVBSectionFilterMask mask; + + memset(&mask, 0, sizeof(mask)); + mask.pid = m_table.pid; + mask.flags = 0; + + if (m_table.flags & eDVBTableSpec::tfCheckCRC) + mask.flags |= eDVBSectionFilterMask::rfCRC; + + if (m_table.flags & eDVBTableSpec::tfHaveTID) + { + mask.data[0] = m_table.tid; + mask.mask[0] = 0xFF; + } + + if (m_table.flags & eDVBTableSpec::tfHaveTIDExt) + { + mask.data[1] = m_table.tidext >> 8; + mask.data[2] = m_table.tidext; + mask.mask[1] = 0xFF; + mask.mask[2] = 0xFF; + } + + if (!(m_table.flags & eDVBTableSpec::tfAnyVersion)) + { + eDebug("doing version filtering"); + mask.data[3] |= (m_table.version << 1)|1; + mask.mask[3] |= 0x3f; + if (!(m_table.flags & eDVBTableSpec::tfThisVersion)) + mask.mode[3] |= 0x3e; // negative filtering + } else + eDebug("no version filtering"); + + eDebug("%04x: %02x %02x %02x %02x %02x %02x", + mask.pid, + mask.data[0], mask.data[1], mask.data[2], + mask.data[3], mask.data[4], mask.data[5]); + eDebug("mask: %02x %02x %02x %02x %02x %02x", + mask.mask[0], mask.mask[1], mask.mask[2], + mask.mask[3], mask.mask[4], mask.mask[5]); + eDebug("mode: %02x %02x %02x %02x %02x %02x", + mask.mode[0], mask.mode[1], mask.mode[2], + mask.mode[3], mask.mode[4], mask.mode[5]); + + if ((res = m_reader->start(mask))) + { + eDebug("reader failed to start."); + return res; + } + + if (m_table.flags & eDVBTableSpec::tfHaveTimeout) + { + eDebug("have timeout, %d", m_table.timeout); + if (m_timeout) + delete m_timeout; + m_timeout = new eTimer(eApp); + m_timeout->start(m_table.timeout, 1); // begin timeout + CONNECT(m_timeout->timeout, eGTable::timeout); + } + + return 0; +} + +RESULT eGTable::start(iDVBDemux *demux, const eDVBTableSpec &table) +{ + int res; + ePtr<iDVBSectionReader> reader; + res = demux->createSectionReader(eApp, reader); + if (res) + return res; + return start(reader, table); +} + +eGTable::~eGTable() +{ + if (m_timeout) + delete m_timeout; +} + +void eAUGTable::slotTableReady(int error) +{ + getNext(error); +} |
