aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2010-12-13 13:24:59 +0100
committerghost <andreas.monzner@multimedia-labs.de>2010-12-13 13:24:59 +0100
commit0b019e9dd85ac88917984e90a9e27ae4cb496b0b (patch)
tree900b3d046bd3e274e3a4fafa893ffcff993287dd
parent36b4f5eccf81cc7a650d3bbfcc975d42b3d905c4 (diff)
parent26e11cd67e0bbfebd41b860a008f240d3d1b3052 (diff)
downloadenigma2-0b019e9dd85ac88917984e90a9e27ae4cb496b0b.tar.gz
enigma2-0b019e9dd85ac88917984e90a9e27ae4cb496b0b.zip
Merge branch 'bug_621_caid_info'
-rw-r--r--lib/dvb/pmt.cpp47
-rw-r--r--lib/dvb/pmt.h12
-rw-r--r--lib/dvb_ci/dvbci.cpp5
-rw-r--r--lib/service/iservice.h1
-rw-r--r--lib/service/servicedvb.cpp4
5 files changed, 53 insertions, 16 deletions
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index 46fa12ed..ca56141b 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -149,7 +149,7 @@ void eDVBServicePMTHandler::PATready(int)
serviceEvent(eventNoPAT);
}
-PyObject *eDVBServicePMTHandler::getCaIds()
+PyObject *eDVBServicePMTHandler::getCaIds(bool pair)
{
ePyObject ret;
@@ -157,20 +157,37 @@ PyObject *eDVBServicePMTHandler::getCaIds()
if ( !getProgramInfo(prog) )
{
- int cnt=prog.caids.size();
- if (cnt)
+ if (pair)
{
+ int cnt=prog.caids.size();
+ if (cnt)
+ {
+ ret=PyList_New(cnt);
+ std::list<program::capid_pair>::iterator it(prog.caids.begin());
+ while(cnt--)
+ {
+ ePyObject tuple = PyTuple_New(2);
+ PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(it->caid));
+ PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong((it++)->capid));
+ PyList_SET_ITEM(ret, cnt, tuple);
+ }
+ }
+ }
+ else
+ {
+ std::set<program::capid_pair> set(prog.caids.begin(), prog.caids.end());
+ std::set<program::capid_pair>::iterator it(set.begin());
+ int cnt=set.size();
ret=PyList_New(cnt);
- std::set<uint16_t>::iterator it(prog.caids.begin());
while(cnt--)
- PyList_SET_ITEM(ret, cnt, PyInt_FromLong(*it++));
+ PyList_SET_ITEM(ret, cnt, PyInt_FromLong((it++)->caid));
}
}
return ret ? (PyObject*)ret : (PyObject*)PyList_New(0);
}
-int eDVBServicePMTHandler::getProgramInfo(struct program &program)
+int eDVBServicePMTHandler::getProgramInfo(program &program)
{
ePtr<eTable<ProgramMapSection> > ptr;
int cached_apid_ac3 = -1;
@@ -460,7 +477,10 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
case CA_DESCRIPTOR:
{
CaDescriptor *descr = (CaDescriptor*)(*desc);
- program.caids.insert(descr->getCaSystemId());
+ program::capid_pair pair;
+ pair.caid = descr->getCaSystemId();
+ pair.capid = descr->getCaPid();
+ program.caids.push_back(pair);
break;
}
default:
@@ -523,7 +543,10 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
if ((*desc)->getTag() == CA_DESCRIPTOR)
{
CaDescriptor *descr = (CaDescriptor*)(*desc);
- program.caids.insert(descr->getCaSystemId());
+ program::capid_pair pair;
+ pair.caid = descr->getCaSystemId();
+ pair.capid = descr->getCaPid();
+ program.caids.push_back(pair);
}
}
}
@@ -589,8 +612,12 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
program.textPid = cached_tpid;
}
CAID_LIST &caids = m_service->m_ca;
- for (CAID_LIST::iterator it(caids.begin()); it != caids.end(); ++it)
- program.caids.insert(*it);
+ for (CAID_LIST::iterator it(caids.begin()); it != caids.end(); ++it) {
+ program::capid_pair pair;
+ pair.caid = *it;
+ pair.capid = -1; // not known yet
+ program.caids.push_back(pair);
+ }
if ( cnt )
ret = 0;
}
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index de0de052..5c8fa582 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -181,11 +181,17 @@ public:
struct program
{
+ struct capid_pair
+ {
+ uint16_t caid;
+ int capid;
+ bool operator< (const struct capid_pair &t) { return t.caid < caid; }
+ };
std::vector<videoStream> videoStreams;
std::vector<audioStream> audioStreams;
int defaultAudioStream;
std::vector<subtitleStream> subtitleStreams;
- std::set<uint16_t> caids;
+ std::list<capid_pair> caids;
int pcrPid;
int pmtPid;
int textPid;
@@ -193,10 +199,10 @@ public:
PyObject *createPythonObject();
};
- int getProgramInfo(struct program &program);
+ int getProgramInfo(program &program);
int getDataDemux(ePtr<iDVBDemux> &demux);
int getDecodeDemux(ePtr<iDVBDemux> &demux);
- PyObject *getCaIds();
+ PyObject *getCaIds(bool pair=false); // caid / ecmpid pair
int getPVRChannel(ePtr<iDVBPVRChannel> &pvr_channel);
int getServiceReference(eServiceReferenceDVB &service) { service = m_reference; return 0; }
diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp
index 883fb5a4..8a43e5b1 100644
--- a/lib/dvb_ci/dvbci.cpp
+++ b/lib/dvb_ci/dvbci.cpp
@@ -297,8 +297,9 @@ void eDVBCIInterfaces::recheckPMTHandlers()
if (!pmthandler->getProgramInfo(p))
{
int cnt=0;
- for (caidSet::reverse_iterator x(p.caids.rbegin()); x != p.caids.rend(); ++x, ++cnt)
- caids.push_front(*x);
+ std::set<eDVBServicePMTHandler::program::capid_pair> set(p.caids.begin(), p.caids.end());
+ for (std::set<eDVBServicePMTHandler::program::capid_pair>::reverse_iterator x(set.rbegin()); x != set.rend(); ++x, ++cnt)
+ caids.push_front(x->caid);
if (service && cnt)
service->m_ca = caids;
}
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index 2ba7cb46..7f582495 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -289,6 +289,7 @@ public:
sFileSize,
sCAIDs,
+ sCAIDPIDs,
sVideoType, /* MPEG2 MPEG4 */
sTags, /* space seperated list of tags */
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index f1858c9c..6a464aff 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -1591,7 +1591,7 @@ int eDVBServicePlay::getInfo(int w)
{
eDVBServicePMTHandler::program program;
- if (w == sCAIDs)
+ if (w == sCAIDs || w == sCAIDPIDs)
return resIsPyObject;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
@@ -1732,6 +1732,8 @@ PyObject *eDVBServicePlay::getInfoObject(int w)
{
case sCAIDs:
return m_service_handler.getCaIds();
+ case sCAIDPIDs:
+ return m_service_handler.getCaIds(true);
case sTransponderData:
return eStaticServiceDVBInformation().getInfoObject(m_reference, w);
default: