From e677ac4a7bf81391877c909a703e5918ce4a511b Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sun, 13 Feb 2005 00:09:19 +0000 Subject: [PATCH] - started work on EIT - added "pcore", the navigation core for python --- lib/dvb/Makefile.am | 2 +- lib/dvb/eit.cpp | 50 ++++++++++++++++++++++++++++++++++++++ lib/dvb/eit.h | 28 +++++++++++++++++++++ lib/dvb/pmt.cpp | 2 ++ lib/dvb/pmt.h | 4 +-- lib/dvb/specs.h | 22 +++++++++++++++++ lib/nav/pcore.cpp | 38 +++++++++++++++++++++++++++++ lib/nav/pcore.h | 27 ++++++++++++++++++++ lib/service/Makefile.am | 3 ++- lib/service/event.cpp | 27 ++++++++++++++++++++ lib/service/event.h | 21 ++++++++++++++++ lib/service/iservice.h | 9 +++++-- lib/service/service.cpp | 9 +++++++ lib/service/servicedvb.cpp | 41 +++++++++++++++++++++++++++---- lib/service/servicedvb.h | 7 +++++- 15 files changed, 278 insertions(+), 12 deletions(-) create mode 100644 lib/dvb/eit.cpp create mode 100644 lib/dvb/eit.h create mode 100644 lib/nav/pcore.cpp create mode 100644 lib/nav/pcore.h create mode 100644 lib/service/event.cpp create mode 100644 lib/service/event.h diff --git a/lib/dvb/Makefile.am b/lib/dvb/Makefile.am index a3b81bc7..41ce1748 100644 --- a/lib/dvb/Makefile.am +++ b/lib/dvb/Makefile.am @@ -4,5 +4,5 @@ INCLUDES = \ noinst_LIBRARIES = libenigma_dvb.a libenigma_dvb_a_SOURCES = dvb.cpp demux.cpp frontend.cpp esection.cpp db.cpp \ - sec.cpp scan.cpp crc32.cpp pmt.cpp decoder.cpp + sec.cpp scan.cpp crc32.cpp pmt.cpp decoder.cpp eit.cpp \ No newline at end of file diff --git a/lib/dvb/eit.cpp b/lib/dvb/eit.cpp new file mode 100644 index 00000000..2462d333 --- /dev/null +++ b/lib/dvb/eit.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +void eDVBServiceEITHandler::EITready(int error) +{ + if (!error) + { + ePtr > ptr; + if (!m_EIT.getCurrent(ptr)) + { + int a = 0; + for (EventInformationTableConstIterator i = ptr->getSections().begin(); + i != ptr->getSections().end(); ++i) + { + for (EventConstIterator ev = (*i)->getEvents()->begin(); ev != (*i)->getEvents()->end(); ++ev) + { + ePtr evt = new eServiceEvent(); + evt->parseFrom(*ev); + if (!a) + m_event_now = evt; + else + m_event_next = evt; + ++a; + } + } + } + } + + m_eit_changed(); +} + +eDVBServiceEITHandler::eDVBServiceEITHandler() +{ + CONNECT(m_EIT.tableReady, eDVBServiceEITHandler::EITready); +} + +void eDVBServiceEITHandler::start(iDVBDemux *demux, int sid) +{ + m_EIT.begin(eApp, eDVBEITSpec(sid), demux); +} + +RESULT eDVBServiceEITHandler::getEvent(ePtr &event, int nownext) +{ + event = nownext ? m_event_next : m_event_now; + if (!event) + return -1; + return 0; +} diff --git a/lib/dvb/eit.h b/lib/dvb/eit.h new file mode 100644 index 00000000..7ec16bc8 --- /dev/null +++ b/lib/dvb/eit.h @@ -0,0 +1,28 @@ +#ifndef __lib_dvb_eit_h +#define __lib_dvb_eit_h + +#include +#include +#include +#include + +class eDVBServiceEITHandler: public Object +{ + ePtr m_demux; + eAUTable > m_EIT; + void EITready(int error); + + RESULT parseEvent(ePtr &serviceevent, const Event &dvbevent); + + ePtr m_event_now, m_event_next; +public: + eDVBServiceEITHandler(); + + void start(iDVBDemux *demux, int sid); + + RESULT getEvent(ePtr &event, int nownext); + + PSignal0 m_eit_changed; +}; + +#endif diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 292012e1..8c4388a4 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -24,6 +24,8 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) if (m_channel->getDemux(m_demux)) eDebug("shit it failed.. again."); + serviceEvent(eventTuned); + if (m_demux) { eDebug("ok ... now we start!!"); diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index ee2040af..b3a0a538 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -26,7 +26,6 @@ class eDVBServicePMTHandler: public Object void PMTready(int error); void PATready(int error); - public: eDVBServicePMTHandler(); @@ -36,7 +35,8 @@ public: eventNoPAT, // no pat could be received (timeout) eventNoPATEntry, // no pat entry for the corresponding SID could be found eventNoPMT, // no pmt could be received (timeout) - eventNewProgramInfo // we just received a PMT + eventNewProgramInfo, // we just received a PMT + eventTuned // a channel was sucessfully (re-)tuned in, you may start additional filters now }; Signal1 serviceEvent; diff --git a/lib/dvb/specs.h b/lib/dvb/specs.h index 3c6908c2..54457342 100644 --- a/lib/dvb/specs.h +++ b/lib/dvb/specs.h @@ -8,6 +8,7 @@ #include #include #include +#include struct eDVBPMTSpec { @@ -105,4 +106,25 @@ public: } }; +class eDVBEITSpec +{ + eDVBTableSpec m_spec; +public: + /* this is for now&next on actual transponder. */ + eDVBEITSpec(int sid) + { + m_spec.pid = EventInformationTable::PID; + m_spec.tid = EventInformationTable::TID; + m_spec.tidext = sid; + m_spec.timeout = EventInformationTable::TIMEOUT; + m_spec.flags = eDVBTableSpec::tfAnyVersion | + eDVBTableSpec::tfHaveTID | eDVBTableSpec::tfHaveTIDExt | + eDVBTableSpec::tfCheckCRC | eDVBTableSpec::tfHaveTimeout; + } + operator eDVBTableSpec &() + { + return m_spec; + } +}; + #endif diff --git a/lib/nav/pcore.cpp b/lib/nav/pcore.cpp new file mode 100644 index 00000000..7b61ce5c --- /dev/null +++ b/lib/nav/pcore.cpp @@ -0,0 +1,38 @@ +#include +#include + +DEFINE_REF(pNavigation); + +pNavigation::pNavigation() +{ + ePtr service_center; + eServiceCenter::getInstance(service_center); + + assert(service_center); + m_core = new eNavigation(service_center); +} + +RESULT pNavigation::playService(const eServiceReference &service) +{ + return m_core->playService(service); +} + +RESULT pNavigation::enqueueService(const eServiceReference &service) +{ + return m_core->enqueueService(service); +} + +RESULT pNavigation::getCurrentService(ePtr &service) +{ + return m_core->getCurrentService(service); +} + +RESULT pNavigation::getPlaylist(ePtr &playlist) +{ + return m_core->getPlaylist(playlist); +} + +RESULT pNavigation::pause(int p) +{ + return m_core->pause(p); +} diff --git a/lib/nav/pcore.h b/lib/nav/pcore.h new file mode 100644 index 00000000..3bb8f4ef --- /dev/null +++ b/lib/nav/pcore.h @@ -0,0 +1,27 @@ +#ifndef __lib_nav_pcore_h +#define __lib_nav_pcore_h + +#include +#include + +/* a subset of eNavigation */ + +class pNavigation: public iObject +{ +DECLARE_REF; +private: + ePtr m_core; +public: + PSignal1 event; + + pNavigation(); + + RESULT playService(const eServiceReference &service); + RESULT enqueueService(const eServiceReference &service); + RESULT getCurrentService(ePtr &service); + RESULT getPlaylist(ePtr &playlist); + + RESULT pause(int p); +}; + +#endif diff --git a/lib/service/Makefile.am b/lib/service/Makefile.am index a3c05cfa..f8cf6d52 100644 --- a/lib/service/Makefile.am +++ b/lib/service/Makefile.am @@ -4,5 +4,6 @@ INCLUDES = \ noinst_LIBRARIES = libenigma_service.a libenigma_service_a_SOURCES = \ - listboxservice.cpp service.cpp servicemp3.cpp servicedvb.cpp servicefs.cpp + listboxservice.cpp service.cpp servicemp3.cpp servicedvb.cpp servicefs.cpp \ + event.cpp diff --git a/lib/service/event.cpp b/lib/service/event.cpp new file mode 100644 index 00000000..7ea16560 --- /dev/null +++ b/lib/service/event.cpp @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +DEFINE_REF(eServiceEvent); + +RESULT eServiceEvent::parseFrom(Event *evt) +{ + m_begin = 0; // ich bin FAUL + m_duration = evt->getDuration(); + + + for (DescriptorConstIterator desc = evt->getDescriptors()->begin(); desc != evt->getDescriptors()->end(); ++desc) + { + switch ((*desc)->getTag()) + { + case SHORT_EVENT_DESCRIPTOR: + { + const ShortEventDescriptor *sed = (ShortEventDescriptor*)*desc; + m_event_name = sed->getEventName(); + m_description = sed->getText(); + break; + } + } + } +} diff --git a/lib/service/event.h b/lib/service/event.h new file mode 100644 index 00000000..967f9efa --- /dev/null +++ b/lib/service/event.h @@ -0,0 +1,21 @@ +#ifndef __service_ievent_h +#define __service_ievent_h + +#include +#include +#include +class Event; + +class eServiceEvent: public iObject +{ +DECLARE_REF; +public: + time_t m_begin; + int m_duration; + std::string m_event_name, m_description; + // .. additional info + + RESULT parseFrom(Event *evt); +}; + +#endif diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 5a8a0627..f699bdb9 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -155,10 +155,12 @@ public: TEMPLATE_TYPEDEF(ePtr, iStaticServiceInformationPtr); +class eServiceEvent; + class iServiceInformation: public iStaticServiceInformation { public: - + virtual RESULT getEvent(ePtr &evt, int nownext); }; TEMPLATE_TYPEDEF(ePtr, iServiceInformationPtr); @@ -179,7 +181,10 @@ public: enum { evStart, - evEnd + evEnd, + + // when iServiceInformation is implemented: + evNewEvent }; virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; virtual RESULT start()=0; diff --git a/lib/service/service.cpp b/lib/service/service.cpp index 75d4987b..0a4a8012 100644 --- a/lib/service/service.cpp +++ b/lib/service/service.cpp @@ -120,4 +120,13 @@ RESULT iServiceHandler::info(const eServiceReference &, ePtr + +RESULT iServiceInformation::getEvent(ePtr &evt, int m_nownext) +{ + evt = 0; + return -1; +} + + eAutoInitPtr init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter"); diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index d1ebeb30..06b6d97f 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -134,7 +134,8 @@ RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr m_event_now, m_event_next; + getEvent(m_event_now, 0); + getEvent(m_event_next, 1); + + if (m_event_now) + eDebug("now running: %s (%d seconds :)", m_event_now->m_event_name.c_str(), m_event_now->m_duration); + if (m_event_next) + eDebug("next running: %s (%d seconds :)", m_event_next->m_event_name.c_str(), m_event_next->m_duration); +} + void eDVBServicePlay::serviceEvent(int event) { eDebug("service event %d", event); switch (event) { + case eDVBServicePMTHandler::eventTuned: + { + ePtr m_demux; + if (!m_service_handler.getDemux(m_demux)) + { +// eventStartedEventAcquisition + m_event_handler.start(m_demux, ((eServiceReferenceDVB&)m_reference).getServiceID().get()); + } else + eDebug("no event data available :( "); +// eventNoEvent + break; + } case eDVBServicePMTHandler::eventNewProgramInfo: { int vpid = -1, apid = -1, pcrpid = -1; eDVBServicePMTHandler::program program; - if (m_serviceHandler.getProgramInfo(program)) + if (m_service_handler.getProgramInfo(program)) eDebug("getting program info failed."); else { @@ -196,7 +222,7 @@ void eDVBServicePlay::serviceEvent(int event) if (!m_decoder) { ePtr demux; - m_serviceHandler.getDemux(demux); + m_service_handler.getDemux(demux); if (demux) demux->getMPEGDecoder(m_decoder); } @@ -208,7 +234,7 @@ void eDVBServicePlay::serviceEvent(int event) m_decoder->setSyncPCR(pcrpid); m_decoder->start(); } - + break; } } @@ -217,7 +243,7 @@ void eDVBServicePlay::serviceEvent(int event) RESULT eDVBServicePlay::start() { eDebug("starting DVB service"); - return m_serviceHandler.tune((eServiceReferenceDVB&)m_reference); + return m_service_handler.tune((eServiceReferenceDVB&)m_reference); } RESULT eDVBServicePlay::stop() @@ -250,6 +276,11 @@ RESULT eDVBServicePlay::getName(const eServiceReference &ref, std::string &name) return 0; } +RESULT eDVBServicePlay::getEvent(ePtr &evt, int nownext) +{ + return m_event_handler.getEvent(evt, nownext); +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB"); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 94659ed1..941ad7bd 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -5,6 +5,7 @@ #include #include +#include class eServiceFactoryDVB: public iServiceHandler { @@ -42,10 +43,13 @@ private: ePtr m_decoder; - eDVBServicePMTHandler m_serviceHandler; + eDVBServicePMTHandler m_service_handler; + eDVBServiceEITHandler m_event_handler; eDVBServicePlay(const eServiceReference &ref); + void gotNewEvent(); + void serviceEvent(int event); public: virtual ~eDVBServicePlay(); @@ -59,6 +63,7 @@ public: // iServiceInformation RESULT getName(const eServiceReference &ref, std::string &name); + RESULT getEvent(ePtr &evt, int nownext); }; #endif -- 2.30.2