Merge branch 'bug_570_playback_skip_fixes_and_cleanup_ml_aholst'
[enigma2.git] / lib / dvb / pmt.cpp
index 4a826c12d32ec82680ad8ad5802cf8c673b536ce..ca56141bc89115c4ba32bdc15f27a1bf4f465503 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;
@@ -697,6 +701,12 @@ void eDVBServicePMTHandler::SDTScanEvent(int event)
 }
 
 int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate, eDVBService *service)
+{
+       ePtr<iTsSource> s;
+       return tuneExt(ref, use_decode_demux, s, NULL, cue, simulate, service);
+}
+
+int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr<iTsSource> &source, const char *streaminfo_file, eCueSheet *cue, bool simulate, eDVBService *service)
 {
        RESULT res=0;
        m_reference = ref;
@@ -727,7 +737,9 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
                {
                        eWarning("no .meta file found, trying to find PMT pid");
                        eDVBTSTools tstools;
-                       if (tstools.openFile(ref.path.c_str()))
+                       if (source)
+                               tstools.setSource(source, streaminfo_file ? streaminfo_file : ref.path.c_str());
+                       else if (tstools.openFile(ref.path.c_str()))
                                eWarning("failed to open file");
                        else
                        {
@@ -780,7 +792,10 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
                if (m_pvr_channel)
                {
                        m_pvr_channel->setCueSheet(cue);
-                       m_pvr_channel->playFile(ref.path.c_str());
+                       if (source)
+                               m_pvr_channel->playSource(source, streaminfo_file);
+                       else
+                               m_pvr_channel->playFile(ref.path.c_str());
                }
        }