1 #include <lib/dvb/esection.h>
2 #include <lib/base/eerror.h>
4 void eGTable::sectionRead(const __u8 *d)
6 unsigned int last_section_number = d[7];
7 m_table.flags &= ~eDVBTableSpec::tfAnyVersion;
8 m_table.flags |= eDVBTableSpec::tfThisVersion;
9 m_table.version = (d[5]>>1)&0x1F;
11 /* if a section is missing, we retry reading the
12 whole data up to 5 times. if after that the
13 section is still missing, we timeout. */
14 if (m_tries > 5 * (last_section_number+1))
22 if (createTable(d[6], d, last_section_number + 1))
31 } else if ((m_table.flags & eDVBTableSpec::tfHaveTimeout) && m_timeout)
32 m_timeout->start(m_table.timeout, 1); // reset timeout
35 void eGTable::timeout()
47 m_timeout(0), error(0)
53 RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table)
59 m_reader->connectRead(slot(*this, &eGTable::sectionRead), m_sectionRead_conn);
63 // setup filter struct
64 eDVBSectionFilterMask mask;
66 memset(&mask, 0, sizeof(mask));
67 mask.pid = m_table.pid;
70 if (m_table.flags & eDVBTableSpec::tfCheckCRC)
71 mask.flags |= eDVBSectionFilterMask::rfCRC;
73 if (m_table.flags & eDVBTableSpec::tfHaveTID)
75 mask.data[0] = m_table.tid;
76 if (m_table.flags & eDVBTableSpec::tfHaveTIDMask)
77 mask.mask[0] = m_table.tid_mask;
82 if (m_table.flags & eDVBTableSpec::tfHaveTIDExt)
84 mask.data[1] = m_table.tidext >> 8;
85 mask.data[2] = m_table.tidext;
86 if (m_table.flags & eDVBTableSpec::tfHaveTIDExtMask)
88 mask.mask[1] = m_table.tidext_mask >> 8;
89 mask.mask[2] = m_table.tidext_mask;
98 if (!(m_table.flags & eDVBTableSpec::tfAnyVersion))
100 eDebug("doing version filtering");
101 mask.data[3] |= (m_table.version << 1)|1;
102 mask.mask[3] |= 0x3f;
103 if (!(m_table.flags & eDVBTableSpec::tfThisVersion))
104 mask.mode[3] |= 0x3e; // negative filtering
106 eDebug("no version filtering");
108 eDebug("%04x: %02x %02x %02x %02x %02x %02x",
110 mask.data[0], mask.data[1], mask.data[2],
111 mask.data[3], mask.data[4], mask.data[5]);
112 eDebug("mask: %02x %02x %02x %02x %02x %02x",
113 mask.mask[0], mask.mask[1], mask.mask[2],
114 mask.mask[3], mask.mask[4], mask.mask[5]);
115 eDebug("mode: %02x %02x %02x %02x %02x %02x",
116 mask.mode[0], mask.mode[1], mask.mode[2],
117 mask.mode[3], mask.mode[4], mask.mode[5]);
119 if ((res = m_reader->start(mask)))
121 eDebug("reader failed to start.");
125 if (m_table.flags & eDVBTableSpec::tfHaveTimeout)
129 m_timeout = new eTimer(eApp);
130 m_timeout->start(m_table.timeout, 1); // begin timeout
131 CONNECT(m_timeout->timeout, eGTable::timeout);
137 RESULT eGTable::start(iDVBDemux *demux, const eDVBTableSpec &table)
140 ePtr<iDVBSectionReader> reader;
141 res = demux->createSectionReader(eApp, reader);
144 return start(reader, table);
153 void eAUGTable::slotTableReady(int error)