use std::list instead of std::set for caid/capid pairs to support duplicate caids
authorghost <andreas.monzner@multimedia-labs.de>
Mon, 29 Nov 2010 13:10:30 +0000 (14:10 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Mon, 29 Nov 2010 13:10:30 +0000 (14:10 +0100)
refs #621

lib/dvb/pmt.cpp
lib/dvb/pmt.h
lib/dvb_ci/dvbci.cpp

index 4a826c1..be4fb17 100644 (file)
@@ -157,13 +157,13 @@ PyObject *eDVBServicePMTHandler::getCaIds(bool pair)
 
        if ( !getProgramInfo(prog) )
        {
-               int cnt=prog.caids.size();
-               if (cnt)
+               if (pair)
                {
-                       ret=PyList_New(cnt);
-                       std::set<program::capid_pair>::iterator it(prog.caids.begin());
-                       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);
@@ -172,11 +172,15 @@ PyObject *eDVBServicePMTHandler::getCaIds(bool pair)
                                        PyList_SET_ITEM(ret, cnt, tuple);
                                }
                        }
-                       else
-                       {
-                               while(cnt--)
-                                       PyList_SET_ITEM(ret, cnt, PyInt_FromLong((it++)->caid));
-                       }
+               }
+               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);
+                       while(cnt--)
+                               PyList_SET_ITEM(ret, cnt, PyInt_FromLong((it++)->caid));
                }
        }
 
@@ -476,7 +480,7 @@ int eDVBServicePMTHandler::getProgramInfo(program &program)
                                                                program::capid_pair pair;
                                                                pair.caid = descr->getCaSystemId();
                                                                pair.capid = descr->getCaPid();
-                                                               program.caids.insert(pair);
+                                                               program.caids.push_back(pair);
                                                                break;
                                                        }
                                                        default:
@@ -542,7 +546,7 @@ int eDVBServicePMTHandler::getProgramInfo(program &program)
                                                program::capid_pair pair;
                                                pair.caid = descr->getCaSystemId();
                                                pair.capid = descr->getCaPid();
-                                               program.caids.insert(pair);
+                                               program.caids.push_back(pair);
                                        }
                                }
                        }
@@ -612,7 +616,7 @@ int eDVBServicePMTHandler::getProgramInfo(program &program)
                        program::capid_pair pair;
                        pair.caid = *it;
                        pair.capid = -1; // not known yet
-                       program.caids.insert(pair);
+                       program.caids.push_back(pair);
                }
                if ( cnt )
                        ret = 0;
index 4a506a4..40a226e 100644 (file)
@@ -191,7 +191,7 @@ public:
                std::vector<audioStream> audioStreams;
                int defaultAudioStream;
                std::vector<subtitleStream> subtitleStreams;
-               std::set<capid_pair> caids;
+               std::list<capid_pair> caids;
                int pcrPid;
                int pmtPid;
                int textPid;
index 342f06a..8a43e5b 100644 (file)
@@ -297,7 +297,8 @@ void eDVBCIInterfaces::recheckPMTHandlers()
                if (!pmthandler->getProgramInfo(p))
                {
                        int cnt=0;
-                       for (std::set<eDVBServicePMTHandler::program::capid_pair>::reverse_iterator x(p.caids.rbegin()); x != p.caids.rend(); ++x, ++cnt)
+                       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;