X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a33ff213255db7f59090f70235ec06c502e2a2ce..dbe120313d2b4589e3c7ebe49ee98586a2b04e16:/lib/dvb/esection.cpp diff --git a/lib/dvb/esection.cpp b/lib/dvb/esection.cpp index a80168b5..0af62252 100644 --- a/lib/dvb/esection.cpp +++ b/lib/dvb/esection.cpp @@ -8,6 +8,16 @@ void eGTable::sectionRead(const __u8 *d) m_table.flags |= eDVBTableSpec::tfThisVersion; m_table.version = (d[5]>>1)&0x1F; + /* if a section is missing, we retry reading the + whole data up to 5 times. if after that the + section is still missing, we timeout. */ + if (m_tries > 5 * (last_section_number+1)) + { + timeout(); + return; + } + + m_tries++; if (createTable(d[6], d, last_section_number + 1)) { @@ -44,6 +54,8 @@ RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table) m_reader = reader; m_reader->connectRead(slot(*this, &eGTable::sectionRead), m_sectionRead_conn); + m_tries = 0; + // setup filter struct eDVBSectionFilterMask mask; @@ -57,15 +69,26 @@ RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table) if (m_table.flags & eDVBTableSpec::tfHaveTID) { mask.data[0] = m_table.tid; - mask.mask[0] = mask.pid == 0x14 ? 0xFC : 0xFF; + if (m_table.flags & eDVBTableSpec::tfHaveTIDMask) + mask.mask[0] = m_table.tid_mask; + else + 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::tfHaveTIDExtMask) + { + mask.mask[1] = m_table.tidext_mask >> 8; + mask.mask[2] = m_table.tidext_mask; + } + else + { + mask.mask[1] = 0xFF; + mask.mask[2] = 0xFF; + } } if (!(m_table.flags & eDVBTableSpec::tfAnyVersion))