make TheDOCs compiler happy
[enigma2.git] / lib / dvb / pmt.cpp
index c06701113178b080b9f061840d1dbd06765133ea..b8663f4b2a85f89c20a4a373d0cbef23d0df1c99 100644 (file)
@@ -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>
@@ -36,7 +37,7 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
        {
                if (m_channel)
                        if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode))
-                               eDebug("Allocating a demux for now tuned-in channel failed.");
+                               eDebug("Allocating %s-decoding a demux for now tuned-in channel failed.", m_use_decode_demux ? "" : "non-");
                
                serviceEvent(eventTuned);
                
@@ -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:
+                                               {
+                                                       const 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:
+                                       {
+                                               const 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;
@@ -145,7 +216,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
        program.pmtPid = -1;
        program.textPid = -1;
 
-       if (!m_PMT.getCurrent(ptr))
+       if ( ((m_service && m_service->usePMT()) || !m_service) && !m_PMT.getCurrent(ptr))
        {
                int cached_apid_ac3 = -1;
                int cached_apid_mpeg = -1;
@@ -350,6 +421,8 @@ int eDVBServicePMTHandler::getDecodeDemux(ePtr<iDVBDemux> &demux)
                demux = m_demux;
                return ret;
        }
+       
+       ASSERT(m_channel); /* calling without a previous ::tune is certainly bad. */
 
        ret = m_channel->getDemux(demux, iDVBChannel::capDecode);
        if (!ret)
@@ -401,7 +474,6 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
                                        m_pmt_pid = pmt_pid;
                                }
                        }
-                       
                } else
                        m_reference = parser.m_ref;
                
@@ -412,7 +484,11 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
                        eDebug("allocatePVRChannel failed!\n");
                m_channel = m_pvr_channel;
        }
-       
+
+       ePtr<iDVBChannelList> db;
+       if (!m_resourceManager->getChannelList(db))
+               db->getService((eServiceReferenceDVB&)m_reference, m_service);
+
        if (m_channel)
        {
                m_channel->connectStateChange(
@@ -436,10 +512,6 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
                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;
 }