- started work on EIT
authorFelix Domke <tmbinc@elitedvb.net>
Sun, 13 Feb 2005 00:09:19 +0000 (00:09 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sun, 13 Feb 2005 00:09:19 +0000 (00:09 +0000)
 - added "pcore", the navigation core for python

15 files changed:
lib/dvb/Makefile.am
lib/dvb/eit.cpp [new file with mode: 0644]
lib/dvb/eit.h [new file with mode: 0644]
lib/dvb/pmt.cpp
lib/dvb/pmt.h
lib/dvb/specs.h
lib/nav/pcore.cpp [new file with mode: 0644]
lib/nav/pcore.h [new file with mode: 0644]
lib/service/Makefile.am
lib/service/event.cpp [new file with mode: 0644]
lib/service/event.h [new file with mode: 0644]
lib/service/iservice.h
lib/service/service.cpp
lib/service/servicedvb.cpp
lib/service/servicedvb.h

index a3b81bc7fc0ce13f112268a26fcfc13447a923cf..41ce17482862f2bb9f3402f6170094f7d7906668 100644 (file)
@@ -4,5 +4,5 @@ INCLUDES = \
 noinst_LIBRARIES = libenigma_dvb.a
 
 libenigma_dvb_a_SOURCES = dvb.cpp demux.cpp frontend.cpp esection.cpp db.cpp \
 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
                
\ No newline at end of file
diff --git a/lib/dvb/eit.cpp b/lib/dvb/eit.cpp
new file mode 100644 (file)
index 0000000..2462d33
--- /dev/null
@@ -0,0 +1,50 @@
+#include <lib/dvb/eit.h>
+#include <lib/dvb/specs.h>
+#include <lib/base/eerror.h>
+#include <lib/service/event.h>
+
+void eDVBServiceEITHandler::EITready(int error)
+{
+       if (!error)
+       {
+               ePtr<eTable<EventInformationTable> > 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<eServiceEvent> 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<eServiceEvent> &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 (file)
index 0000000..7ec16bc
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef __lib_dvb_eit_h
+#define __lib_dvb_eit_h
+
+#include <lib/dvb/isection.h>
+#include <lib/dvb/esection.h>
+#include <lib/dvb_si/eit.h>
+#include <lib/service/event.h>
+
+class eDVBServiceEITHandler: public Object
+{
+       ePtr<iDVBDemux> m_demux;
+       eAUTable<eTable<EventInformationTable> > m_EIT;
+       void EITready(int error);
+       
+       RESULT parseEvent(ePtr<eServiceEvent> &serviceevent, const Event &dvbevent);
+       
+       ePtr<eServiceEvent> m_event_now, m_event_next;
+public:
+       eDVBServiceEITHandler();
+       
+       void start(iDVBDemux *demux, int sid);
+       
+       RESULT getEvent(ePtr<eServiceEvent> &event, int nownext);
+       
+       PSignal0<void> m_eit_changed;
+};
+
+#endif
index 292012e1f93a69080c8d89d7259e94db3343b2a8..8c4388a4452a0f02d262ac35f4f9b674534b269d 100644 (file)
@@ -24,6 +24,8 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
                        if (m_channel->getDemux(m_demux))
                                eDebug("shit it failed.. again.");
                
                        if (m_channel->getDemux(m_demux))
                                eDebug("shit it failed.. again.");
                
+               serviceEvent(eventTuned);
+               
                if (m_demux)
                {       
                        eDebug("ok ... now we start!!");
                if (m_demux)
                {       
                        eDebug("ok ... now we start!!");
index ee2040af01c826611e65dfd927bc4d52df0c4bfc..b3a0a538d9ae2daf7917fc8b0a8fa55bd8cce45c 100644 (file)
@@ -26,7 +26,6 @@ class eDVBServicePMTHandler: public Object
 
        void PMTready(int error);
        void PATready(int error);
 
        void PMTready(int error);
        void PATready(int error);
-
 public:
        eDVBServicePMTHandler();
        
 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)
                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<void,int> serviceEvent;
        };
 
        Signal1<void,int> serviceEvent;
index 3c6908c220c98c77eac987a3ffd17b95be7bee23..544573427de18d26baa4932d6f60e823457a25a0 100644 (file)
@@ -8,6 +8,7 @@
 #include <lib/dvb_si/nit.h>
 #include <lib/dvb_si/bat.h>
 #include <lib/dvb_si/pat.h>
 #include <lib/dvb_si/nit.h>
 #include <lib/dvb_si/bat.h>
 #include <lib/dvb_si/pat.h>
+#include <lib/dvb_si/eit.h>
 
 struct eDVBPMTSpec
 {
 
 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
 #endif
diff --git a/lib/nav/pcore.cpp b/lib/nav/pcore.cpp
new file mode 100644 (file)
index 0000000..7b61ce5
--- /dev/null
@@ -0,0 +1,38 @@
+#include <lib/nav/pcore.h>
+#include <lib/service/service.h>
+
+DEFINE_REF(pNavigation);
+
+pNavigation::pNavigation()
+{
+       ePtr<eServiceCenter> 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<iPlayableService> &service)
+{
+       return m_core->getCurrentService(service);
+}
+
+RESULT pNavigation::getPlaylist(ePtr<ePlaylist> &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 (file)
index 0000000..3bb8f4e
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef __lib_nav_pcore_h
+#define __lib_nav_pcore_h
+
+#include <lib/nav/core.h>
+#include <lib/python/connections.h>
+
+/* a subset of eNavigation */
+
+class pNavigation: public iObject
+{
+DECLARE_REF;
+private:
+       ePtr<eNavigation> m_core;
+public:
+       PSignal1<void, int> event;
+       
+       pNavigation();
+       
+       RESULT playService(const eServiceReference &service);
+       RESULT enqueueService(const eServiceReference &service);
+       RESULT getCurrentService(ePtr<iPlayableService> &service);
+       RESULT getPlaylist(ePtr<ePlaylist> &playlist);
+       
+       RESULT pause(int p);
+};
+
+#endif
index a3c05cfa7e24ab29862c6d259278790d306735f7..f8cf6d529d1fc5573971cc70cb3f48449026ae9b 100644 (file)
@@ -4,5 +4,6 @@ INCLUDES = \
 noinst_LIBRARIES = libenigma_service.a
 
 libenigma_service_a_SOURCES = \
 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 (file)
index 0000000..7ea1656
--- /dev/null
@@ -0,0 +1,27 @@
+#include <lib/service/event.h>
+#include <lib/dvb_si/eit.h>
+#include <lib/dvb_si/short_event_descriptor.h>
+#include <lib/dvb_si/descriptor_tag.h>
+
+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 (file)
index 0000000..967f9ef
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef __service_ievent_h
+#define __service_ievent_h
+
+#include <time.h>
+#include <lib/base/object.h>
+#include <string>
+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
index 5a8a0627fa1ba913e142a4338f73aebfcb2324ff..f699bdb91853eff51fda94c7452726198e67090d 100644 (file)
@@ -155,10 +155,12 @@ public:
 
 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
 
 
 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
 
+class eServiceEvent;
+
 class iServiceInformation: public iStaticServiceInformation
 {
 public:
 class iServiceInformation: public iStaticServiceInformation
 {
 public:
-       
+       virtual RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
 };
 
 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
 };
 
 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
@@ -179,7 +181,10 @@ public:
        enum
        {
                evStart,
        enum
        {
                evStart,
-               evEnd
+               evEnd,
+               
+               // when iServiceInformation is implemented:
+               evNewEvent
        };
        virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
        virtual RESULT start()=0;
        };
        virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
        virtual RESULT start()=0;
index 75d4987b424bf65a15c14f7da18fb7a6838de4e8..0a4a80127f58f3927008689f0831666e41c6fe33 100644 (file)
@@ -120,4 +120,13 @@ RESULT iServiceHandler::info(const eServiceReference &, ePtr<iStaticServiceInfor
        return -1;
 }
 
        return -1;
 }
 
+#include <lib/service/event.h>
+
+RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
+{      
+       evt = 0;
+       return -1;
+}
+
+
 eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
 eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
index d1ebeb30e8d0bf355445257dc6d6967695eeb663..06b6d97f743a4fcfc3fa19e173a9683658b87bed 100644 (file)
@@ -134,7 +134,8 @@ RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr<iStaticServic
 eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref): 
        m_reference(ref)
 {
 eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref): 
        m_reference(ref)
 {
-       CONNECT(m_serviceHandler.serviceEvent, eDVBServicePlay::serviceEvent);
+       CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
+       CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent);
        eDebug("DVB start (play)");
 }
 
        eDebug("DVB start (play)");
 }
 
@@ -143,16 +144,41 @@ eDVBServicePlay::~eDVBServicePlay()
        eDebug("DVB stop (play)");
 }
 
        eDebug("DVB stop (play)");
 }
 
+void eDVBServicePlay::gotNewEvent()
+{
+               // debug only
+       ePtr<eServiceEvent> 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)
        {
 void eDVBServicePlay::serviceEvent(int event)
 {
        eDebug("service event %d", event);
        switch (event)
        {
+       case eDVBServicePMTHandler::eventTuned:
+       {
+               ePtr<iDVBDemux> 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;
        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
                {
                        eDebug("getting program info failed.");
                else
                {
@@ -196,7 +222,7 @@ void eDVBServicePlay::serviceEvent(int event)
                if (!m_decoder)
                {
                        ePtr<iDVBDemux> demux;
                if (!m_decoder)
                {
                        ePtr<iDVBDemux> demux;
-                       m_serviceHandler.getDemux(demux);
+                       m_service_handler.getDemux(demux);
                        if (demux)
                                demux->getMPEGDecoder(m_decoder);
                }
                        if (demux)
                                demux->getMPEGDecoder(m_decoder);
                }
@@ -208,7 +234,7 @@ void eDVBServicePlay::serviceEvent(int event)
                        m_decoder->setSyncPCR(pcrpid);
                        m_decoder->start();
                }
                        m_decoder->setSyncPCR(pcrpid);
                        m_decoder->start();
                }
-                               
+               
                break;
        }
        }
                break;
        }
        }
@@ -217,7 +243,7 @@ void eDVBServicePlay::serviceEvent(int event)
 RESULT eDVBServicePlay::start()
 {
        eDebug("starting DVB service");
 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()
 }
 
 RESULT eDVBServicePlay::stop()
@@ -250,6 +276,11 @@ RESULT eDVBServicePlay::getName(const eServiceReference &ref, std::string &name)
        return 0;
 }
 
        return 0;
 }
 
+RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext)
+{
+       return m_event_handler.getEvent(evt, nownext);
+}
+
 DEFINE_REF(eDVBServicePlay)
 
 eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
 DEFINE_REF(eDVBServicePlay)
 
 eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
index 94659ed1106a88aa666f8f3618ffdfb638d8e836..941ad7bd32858838836bae95c970c324191906e0 100644 (file)
@@ -5,6 +5,7 @@
 #include <lib/dvb/idvb.h>
 
 #include <lib/dvb/pmt.h>
 #include <lib/dvb/idvb.h>
 
 #include <lib/dvb/pmt.h>
+#include <lib/dvb/eit.h>
 
 class eServiceFactoryDVB: public iServiceHandler
 {
 
 class eServiceFactoryDVB: public iServiceHandler
 {
@@ -42,10 +43,13 @@ private:
        
        ePtr<iTSMPEGDecoder> m_decoder;
        
        
        ePtr<iTSMPEGDecoder> m_decoder;
        
-       eDVBServicePMTHandler m_serviceHandler;
+       eDVBServicePMTHandler m_service_handler;
+       eDVBServiceEITHandler m_event_handler;
        
        eDVBServicePlay(const eServiceReference &ref);
        
        
        eDVBServicePlay(const eServiceReference &ref);
        
+       void gotNewEvent();
+       
        void serviceEvent(int event);
 public:
        virtual ~eDVBServicePlay();
        void serviceEvent(int event);
 public:
        virtual ~eDVBServicePlay();
@@ -59,6 +63,7 @@ public:
        
                // iServiceInformation
        RESULT getName(const eServiceReference &ref, std::string &name);
        
                // iServiceInformation
        RESULT getName(const eServiceReference &ref, std::string &name);
+       RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
 };
 
 #endif
 };
 
 #endif