add pid cache
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 15 Aug 2005 23:46:05 +0000 (23:46 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 15 Aug 2005 23:46:05 +0000 (23:46 +0000)
lib/dvb/db.cpp
lib/dvb/idvb.h
lib/dvb/pmt.cpp
lib/dvb/pmt.h

index cdc05fcba8b06116cdd28203c91311b01d3fa5fd..92293b7e1f35057002f898b4d3d936b573bd18fc 100644 (file)
@@ -74,6 +74,19 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ
                return res;
 }
 
                return res;
 }
 
+int eDVBService::getCachePID(cacheID id)
+{
+       std::map<int, int>::iterator it = m_cache.find(id);
+       if ( it != m_cache.end() )
+               return it->second;
+       return -1;
+}
+
+void eDVBService::setCachePID(cacheID id, int pid)
+{
+       m_cache[id] = pid;
+}
+
 DEFINE_REF(eDVBDB);
 
 eDVBDB::eDVBDB()
 DEFINE_REF(eDVBDB);
 
 eDVBDB::eDVBDB()
index d338f298533ae4ffaf2ddd84caf58baab0322708..1e6c61f5c5e5a7d846a18bea525e3df8e81a3a50 100644 (file)
@@ -170,6 +170,15 @@ class eDVBService: public iStaticServiceInformation
 {
        DECLARE_REF(eDVBService);
 public:
 {
        DECLARE_REF(eDVBService);
 public:
+       enum cacheID
+       {
+               cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax
+       };
+
+       int getCachePID(cacheID);
+       void setCachePID(cacheID, int);
+       bool cacheEmpty() { return m_cache.empty(); }
+
        eDVBService();
        std::string m_service_name;
        std::string m_provider_name;
        eDVBService();
        std::string m_service_name;
        std::string m_provider_name;
index d80897b95e48754245c45d624fc9585e5e314f4c..541a248c2e2feee0bcd6f30a538c7071ea1121d4 100644 (file)
@@ -1,4 +1,4 @@
-#include <lib/base/eerror.h>
+ #include <lib/base/eerror.h>
 #include <lib/dvb/pmt.h>
 #include <lib/dvb/specs.h>
 #include <lib/dvb/dvb.h>
 #include <lib/dvb/pmt.h>
 #include <lib/dvb/specs.h>
 #include <lib/dvb/dvb.h>
@@ -6,9 +6,7 @@
 
 eDVBServicePMTHandler::eDVBServicePMTHandler()
 {
 
 eDVBServicePMTHandler::eDVBServicePMTHandler()
 {
-       ePtr<eDVBResourceManager> mgr;
-       eDVBResourceManager::getInstance(mgr);
-       m_resourceManager = mgr;
+       eDVBResourceManager::getInstance(m_resourceManager);
        CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
        CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
 }
        CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
        CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
 }
@@ -34,6 +32,9 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
                        /* emit */ m_resourceManager->m_channelRunning(channel);
 
                        m_PAT.begin(eApp, eDVBPATSpec(), m_demux);
                        /* emit */ m_resourceManager->m_channelRunning(channel);
 
                        m_PAT.begin(eApp, eDVBPATSpec(), m_demux);
+
+                       if ( m_service && !m_service->cacheEmpty() )
+                               serviceEvent(eventNewProgramInfo);
                }
        }
 }
                }
        }
 }
@@ -74,11 +75,11 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
 {
        eDebug("got PMT");
        ePtr<eTable<ProgramMapTable> > ptr;
 {
        eDebug("got PMT");
        ePtr<eTable<ProgramMapTable> > ptr;
-       
+
        program.videoStreams.clear();
        program.audioStreams.clear();
        program.pcrPid = -1;
        program.videoStreams.clear();
        program.audioStreams.clear();
        program.pcrPid = -1;
-       
+
        if (!m_PMT.getCurrent(ptr))
        {
                ProgramMapTableConstIterator i;
        if (!m_PMT.getCurrent(ptr))
        {
                ProgramMapTableConstIterator i;
@@ -116,8 +117,46 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
                        }
                }
                return 0;
                        }
                }
                return 0;
-       } else
-               return -1;
+       }
+       else if ( m_service && !m_service->cacheEmpty() )
+       {
+               int vpid = m_service->getCachePID(eDVBService::cVPID),
+                       apid_ac3 = m_service->getCachePID(eDVBService::cAPID),
+                       apid_mpeg = m_service->getCachePID(eDVBService::cAC3PID),
+                       pcrpid = m_service->getCachePID(eDVBService::cPCRPID),
+                       cnt=0;
+               if ( vpid != -1 )
+               {
+                       videoStream s;
+                       s.pid = vpid;
+                       program.videoStreams.push_back(s);
+                       ++cnt;
+               }
+               if ( apid_ac3 != -1 )
+               {
+                       audioStream s;
+                       s.type = audioStream::atAC3;
+                       s.pid = apid_ac3;
+                       program.audioStreams.push_back(s);
+                       ++cnt;
+               }
+               if ( apid_mpeg != -1 )
+               {
+                       audioStream s;
+                       s.type = audioStream::atMPEG;
+                       s.pid = apid_mpeg;
+                       program.audioStreams.push_back(s);
+                       ++cnt;
+               }
+               if ( pcrpid != -1 )
+               {
+                       ++cnt;
+                       program.pcrPid = pcrpid;
+               }
+               if ( cnt )
+                       return 0;
+       }
+       return -1;
 }
 
 int eDVBServicePMTHandler::getDemux(ePtr<iDVBDemux> &demux)
 }
 
 int eDVBServicePMTHandler::getDemux(ePtr<iDVBDemux> &demux)
@@ -167,9 +206,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref)
                m_last_channel_state = -1;
                channelStateChanged(m_channel);
        }
                m_last_channel_state = -1;
                channelStateChanged(m_channel);
        }
-       
+
        if (m_pvr_channel)
                m_pvr_channel->playFile(ref.path.c_str());
        if (m_pvr_channel)
                m_pvr_channel->playFile(ref.path.c_str());
-       
+
+       ePtr<iDVBChannelList> db;
+       if (!m_resourceManager->getChannelList(db))
+               db->getService((eServiceReferenceDVB&)m_reference, m_service);
+
        return res;
 }
        return res;
 }
index d8ea062befe9422f2764a2e2d0142aa7b36b7727..9d35aa4c849d912f1fc9d27e387d207924ba6a80 100644 (file)
@@ -11,7 +11,7 @@
 class eDVBServicePMTHandler: public Object
 {
        eServiceReferenceDVB m_reference;
 class eDVBServicePMTHandler: public Object
 {
        eServiceReferenceDVB m_reference;
-//     ePtr<eDVBService> m_service;
+       ePtr<eDVBService> m_service;
 
        int m_last_channel_state;
        
 
        int m_last_channel_state;