aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-08-15 23:46:05 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-08-15 23:46:05 +0000
commit8aabe6351fdaff2bd5529be670846357e221a16a (patch)
treee664fa0bd656a09c89f25336952d6b552d90db99 /lib
parent7544e052e6ed6a5d1e0fd783bd04f4b8aa0d45ce (diff)
downloadenigma2-8aabe6351fdaff2bd5529be670846357e221a16a.tar.gz
enigma2-8aabe6351fdaff2bd5529be670846357e221a16a.zip
add pid cache
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/db.cpp13
-rw-r--r--lib/dvb/idvb.h9
-rw-r--r--lib/dvb/pmt.cpp63
-rw-r--r--lib/dvb/pmt.h2
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<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()
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 <lib/base/eerror.h>
+ #include <lib/base/eerror.h>
#include <lib/dvb/pmt.h>
#include <lib/dvb/specs.h>
#include <lib/dvb/dvb.h>
@@ -6,9 +6,7 @@
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);
}
@@ -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<eTable<ProgramMapTable> > 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<iDVBDemux> &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<iDVBChannelList> 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<eDVBService> m_service;
+ ePtr<eDVBService> m_service;
int m_last_channel_state;