From 8aabe6351fdaff2bd5529be670846357e221a16a Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Mon, 15 Aug 2005 23:46:05 +0000 Subject: [PATCH] add pid cache --- lib/dvb/db.cpp | 13 ++++++++++ lib/dvb/idvb.h | 9 +++++++ lib/dvb/pmt.cpp | 63 +++++++++++++++++++++++++++++++++++++++++-------- lib/dvb/pmt.h | 2 +- 4 files changed, 76 insertions(+), 11 deletions(-) diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index cdc05fcb..92293b7e 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -74,6 +74,19 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ return res; } +int eDVBService::getCachePID(cacheID id) +{ + std::map::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() diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index d338f298..1e6c61f5 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -170,6 +170,15 @@ class eDVBService: public iStaticServiceInformation { 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; diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index d80897b9..541a248c 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -1,4 +1,4 @@ -#include + #include #include #include #include @@ -6,9 +6,7 @@ eDVBServicePMTHandler::eDVBServicePMTHandler() { - ePtr mgr; - eDVBResourceManager::getInstance(mgr); - m_resourceManager = mgr; + eDVBResourceManager::getInstance(m_resourceManager); 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); + + if ( m_service && !m_service->cacheEmpty() ) + serviceEvent(eventNewProgramInfo); } } } @@ -74,11 +75,11 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) { eDebug("got PMT"); ePtr > ptr; - + program.videoStreams.clear(); program.audioStreams.clear(); program.pcrPid = -1; - + if (!m_PMT.getCurrent(ptr)) { ProgramMapTableConstIterator i; @@ -116,8 +117,46 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) } } 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 &demux) @@ -167,9 +206,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) m_last_channel_state = -1; channelStateChanged(m_channel); } - + if (m_pvr_channel) m_pvr_channel->playFile(ref.path.c_str()); - + + ePtr db; + if (!m_resourceManager->getChannelList(db)) + db->getService((eServiceReferenceDVB&)m_reference, m_service); + return res; } diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index d8ea062b..9d35aa4c 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -11,7 +11,7 @@ class eDVBServicePMTHandler: public Object { eServiceReferenceDVB m_reference; -// ePtr m_service; + ePtr m_service; int m_last_channel_state; -- 2.30.2