From d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Fri, 17 Oct 2003 15:36:42 +0000 Subject: import of enigma2 --- lib/dvb/esection.h | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 lib/dvb/esection.h (limited to 'lib/dvb/esection.h') diff --git a/lib/dvb/esection.h b/lib/dvb/esection.h new file mode 100644 index 00000000..ca63c184 --- /dev/null +++ b/lib/dvb/esection.h @@ -0,0 +1,189 @@ +#ifndef __esection_h +#define __esection_h + +#include +#include + +class eGTable: public virtual iObject, public Object +{ +DECLARE_REF; +private: + ePtr m_reader; + eDVBTableSpec m_table; + + eTimer *m_timeout; + + void sectionRead(const __u8 *data); + void timeout(); + ePtr m_sectionRead_conn; +protected: + virtual int createTable(int nr, const __u8 *data, unsigned int max)=0; +public: + Signal1 tableReady; + eGTable(); + RESULT start(iDVBSectionReader *reader, const eDVBTableSpec &table); + RESULT start(iDVBDemux *reader, const eDVBTableSpec &table); + RESULT getSpec(eDVBTableSpec &spec) { spec = m_table; return 0; } + virtual ~eGTable(); + int error; + int ready; +}; + +template +class eTable: public eGTable +{ +private: + std::vector sections; + std::set avail; +protected: + int createTable(int nr, const __u8 *data, unsigned int max) + { + if (avail.find(nr) != avail.end()) + delete sections[nr]; + sections.resize(max); + + + sections[nr] = new Section(data); + avail.insert(nr); + + for (unsigned int i = 0; i < max; ++i) + if (avail.find(i) != avail.end()) + printf("+"); + else + printf("-"); + + printf(" %d/%d\n", avail.size(), max); + + if (avail.size() == max) + return 1; + else + return 0; + } +public: + std::vector &getSections() { return sections; } + eTable(): eGTable() + { + } + ~eTable() + { + for (typename std::vector::iterator i(sections.begin()); i != sections.end(); ++i) + delete *i; + } +}; + +class eAUGTable: public Object +{ +protected: + void slotTableReady(int); +public: + Signal1 tableReady; + virtual void getNext(int err)=0; +}; + +template +class eAUTable: public eAUGTable +{ + ePtr current, next; // current is READY AND ERRORFREE, next is not yet ready + int first; + ePtr m_demux; + eMainloop *ml; +public: + + eAUTable() + { + } + + ~eAUTable() + { + current=next=0; + } + + int begin(eMainloop *m, const eDVBTableSpec &spec, ePtr demux) + { + ml = m; + m_demux = demux; + first= 1; + current = 0; + next = new Table(); + CONNECT(next->tableReady, eAUTable::slotTableReady); + next->start(demux, spec); + return 0; + } + + int get() + { + if (current) + { + /*emit*/ tableReady(0); + return 0; + } else if (!next) + { + /*emit*/ tableReady(-1); + return 0; + } else + return 1; + } + + RESULT getCurrent(ePtr
&ptr) + { + if (!current) + return -1; + ptr = current; + return 0; + } + +#if 0 + void abort() + { + eDebug("eAUTable: aborted!"); + if (next) + next->abort(); + delete next; + next=0; + } +#endif + + int ready() + { + return !!current; + } + + void inject(Table *t) + { + next=t; + getNext(0); + } + + void getNext(int error) + { + current = 0; + if (error) + { + next=0; + if (first) + /*emit*/ tableReady(error); + first=0; + return; + } else + current=next; + + next=0; + first=0; + + assert(current->ready); + + /*emit*/ tableReady(0); + + eDVBTableSpec spec; + + if (current && (!current->getSpec(spec))) + { + next = new Table(); + CONNECT(next->tableReady, eAUTable::slotTableReady); + spec.flags &= ~(eDVBTableSpec::tfAnyVersion|eDVBTableSpec::tfThisVersion|eDVBTableSpec::tfHaveTimeout); + next->eGTable::start(m_demux, spec); + } + } +}; + +#endif -- cgit v1.2.3