diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-04-26 17:18:52 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-04-26 17:18:52 +0000 |
| commit | bcfb71b423699d8f7e1d1e7bb5dc24ad4413a4ae (patch) | |
| tree | c7e81151e82f9b7baf1aac81ab34f1532c2c7ef9 /lib/dvb | |
| parent | 0bd832437c2d361866236751a03887ecb3048c64 (diff) | |
| download | enigma2-bcfb71b423699d8f7e1d1e7bb5dc24ad4413a4ae.tar.gz enigma2-bcfb71b423699d8f7e1d1e7bb5dc24ad4413a4ae.zip | |
add function to get a list of CAIDs for a running dvb service from python
Diffstat (limited to 'lib/dvb')
| -rw-r--r-- | lib/dvb/pmt.cpp | 71 | ||||
| -rw-r--r-- | lib/dvb/pmt.h | 2 |
2 files changed, 73 insertions, 0 deletions
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 5ea47467..5e9c7602 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -5,6 +5,7 @@ #include <lib/dvb/metaparser.h> #include <lib/dvb_ci/dvbci.h> #include <lib/dvb/epgcache.h> +#include <dvbsi++/ca_descriptor.h> #include <dvbsi++/ca_program_map_section.h> #include <dvbsi++/teletext_descriptor.h> #include <dvbsi++/descriptor_tag.h> @@ -134,6 +135,76 @@ void eDVBServicePMTHandler::PATready(int) serviceEvent(eventNoPAT); } +PyObject *eDVBServicePMTHandler::getCaIds() +{ + PyObject *ret=0; + + ePtr<eTable<ProgramMapSection> > ptr; + + if ( ((m_service && m_service->usePMT()) || !m_service) && !m_PMT.getCurrent(ptr)) + { + uint16_t caids[255]; + memset(caids, 0, sizeof(caids)); + std::vector<ProgramMapSection*>::const_iterator i = ptr->getSections().begin(); + for (; i != ptr->getSections().end(); ++i) + { + const ProgramMapSection &pmt = **i; + ElementaryStreamInfoConstIterator es = pmt.getEsInfo()->begin(); + for (; es != pmt.getEsInfo()->end(); ++es) + { + for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); + desc != (*es)->getDescriptors()->end(); ++desc) + { + switch ((*desc)->getTag()) + { + case CA_DESCRIPTOR: + { + CaDescriptor *cadescr = *desc; + uint16_t caid = cadescr->getCaSystemId(); + int idx=0; + while (caids[idx] && caids[idx] != caid) + ++idx; + caids[idx]=caid; + break; + } + } + } + } + for (DescriptorConstIterator desc = pmt.getDescriptors()->begin(); + desc != pmt.getDescriptors()->end(); ++desc) + { + switch ((*desc)->getTag()) + { + case CA_DESCRIPTOR: + { + CaDescriptor *cadescr = *desc; + uint16_t caid = cadescr->getCaSystemId(); + int idx=0; + while (caids[idx] && caids[idx] != caid) + ++idx; + caids[idx]=caid; + break; + } + } + } + } + int cnt=0; + while (caids[cnt]) + ++cnt; + if (cnt) + { + ret=PyList_New(cnt); + while(cnt--) + PyList_SET_ITEM(ret, cnt, PyInt_FromLong(caids[cnt])); + } + } + + if (!ret) + ret=PyList_New(0); + + return ret; +} + int eDVBServicePMTHandler::getProgramInfo(struct program &program) { ePtr<eTable<ProgramMapSection> > ptr; diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index 79d7917c..5149167c 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -6,6 +6,7 @@ #include <lib/dvb/dvb.h> #include <lib/dvb/idemux.h> #include <lib/dvb/esection.h> +#include <lib/python/python.h> #include <dvbsi++/program_map_section.h> #include <dvbsi++/program_association_section.h> @@ -120,6 +121,7 @@ public: int getProgramInfo(struct program &program); int getDataDemux(ePtr<iDVBDemux> &demux); int getDecodeDemux(ePtr<iDVBDemux> &demux); + PyObject *getCaIds(); int getPVRChannel(ePtr<iDVBPVRChannel> &pvr_channel); int getService(eServiceReferenceDVB &service) { service = m_reference; return 0; } |
