small pat/pmt scan fix
[enigma2.git] / lib / dvb / scan.cpp
index 3c4f407bfe576a0cfaac3f31cfd29d1de4531c53..fb8e544200456ada8c100027225f8e45c5422928 100644 (file)
@@ -164,7 +164,7 @@ RESULT eDVBScan::startFilter()
                        }
                        m_PMT = new eTable<ProgramMapSection>();
                        CONNECT(m_PMT->tableReady, eDVBScan::PMTready);
-                       PMTready(-1);
+                       PMTready(-2);
 
                        // KabelBW HACK ... on 618Mhz and 626Mhz the transport stream id in PAT and SDT is different
                        {
@@ -275,7 +275,7 @@ void eDVBScan::PMTready(int err)
                        if (pcrpid == 0xFFFF)
                                pcrpid = pmt.getPcrPid();
                        else
-                               eDebug("already have a pcrpid %04x %04x", pcrpid, pmt.getPcrPid());
+                               SCAN_eDebug("already have a pcrpid %04x %04x", pcrpid, pmt.getPcrPid());
                        ElementaryStreamInfoConstIterator es;
                        for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es)
                        {
@@ -299,35 +299,37 @@ void eDVBScan::PMTready(int err)
                                        for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin();
                                                        desc != (*es)->getDescriptors()->end(); ++desc)
                                        {
-                                               switch ((*desc)->getTag())
+                                               uint8_t tag = (*desc)->getTag();
+                                               if (!isaudio && !isvideo)
                                                {
-                                               case DTS_DESCRIPTOR:
-                                               case AAC_DESCRIPTOR:
-                                                       isaudio = 1;
-                                               case AC3_DESCRIPTOR:
-                                                       isaudio = 1;
-                                                       break;
-                                               case CA_DESCRIPTOR:
-                                                       is_scrambled = 1;
-                                                       break;
-                                               case REGISTRATION_DESCRIPTOR: /* some services don't have a separate AC3 descriptor */
-                                               {
-                                                               /* libdvbsi++ doesn't yet support this descriptor type, so work around. */
-                                                       if ((*desc)->getLength() != 4)
-                                                               break;
-                                                       unsigned char descr[6];
-                                                       (*desc)->writeToBuffer(descr);
-                                                       int format_identifier = (descr[2] << 24) | (descr[3] << 16) | (descr[4] << 8) | (descr[5]);
-                                                       switch (format_identifier)
+                                                       switch (tag)
                                                        {
-                                                       case 0x41432d33:
+                                                       case DTS_DESCRIPTOR:
+                                                       case AAC_DESCRIPTOR:
+                                                       case AC3_DESCRIPTOR:
                                                                isaudio = 1;
-                                                       default:
+                                                               break;
+                                                       case REGISTRATION_DESCRIPTOR: /* some services don't have a separate AC3 descriptor */
+                                                       {
+                                                                       /* libdvbsi++ doesn't yet support this descriptor type, so work around. */
+                                                               if ((*desc)->getLength() != 4)
+                                                                       break;
+                                                               unsigned char descr[6];
+                                                               (*desc)->writeToBuffer(descr);
+                                                               int format_identifier = (descr[2] << 24) | (descr[3] << 16) | (descr[4] << 8) | (descr[5]);
+                                                               switch (format_identifier)
+                                                               {
+                                                               case 0x41432d33:
+                                                                       isaudio = 1;
+                                                               default:
+                                                                       break;
+                                                               }
                                                                break;
                                                        }
-                                                       break;
-                                               }
+                                                       }
                                                }
+                                               if (tag == CA_DESCRIPTOR)
+                                                       is_scrambled = 1;
                                        }
                                        break;
                                }
@@ -355,7 +357,7 @@ void eDVBScan::PMTready(int err)
                else
                        m_pmt_in_progress->second.serviceType = 100;
        }
-       if (err == -2) // aborted in sdt progress
+       if (err == -1) // aborted in sdt progress or pmt timout..
                m_pmts_to_read.erase(m_pmt_in_progress++);
        else if (m_pmt_running)
                ++m_pmt_in_progress;
@@ -395,7 +397,7 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
        {
                eDVBFrontendParametersSatellite parm;
                feparm->getDVBS(parm);
-               eDebug("try to add %d %d %d %d %d %d",
+               SCAN_eDebug("try to add %d %d %d %d %d %d",
                        parm.orbital_position, parm.frequency, parm.symbol_rate, parm.polarisation, parm.fec, parm.modulation);
                break;
        }
@@ -403,7 +405,7 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
        {
                eDVBFrontendParametersCable parm;
                feparm->getDVBC(parm);
-               eDebug("try to add %d %d %d %d",
+               SCAN_eDebug("try to add %d %d %d %d",
                        parm.frequency, parm.symbol_rate, parm.modulation, parm.fec_inner);
                break;
        }
@@ -411,7 +413,7 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
        {
                eDVBFrontendParametersTerrestrial parm;
                feparm->getDVBT(parm);
-               eDebug("try to add %d %d %d %d %d %d %d %d",
+               SCAN_eDebug("try to add %d %d %d %d %d %d %d %d",
                        parm.frequency, parm.modulation, parm.transmission_mode, parm.hierarchy,
                        parm.guard_interval, parm.code_rate_LP, parm.code_rate_HP, parm.bandwidth);
                break;
@@ -427,11 +429,11 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
                        if (!found_count)
                        {
                                *i = feparm;  // update
-                               eDebug("update");
+                               SCAN_eDebug("update");
                        }
                        else
                        {
-                               eDebug("remove dupe");
+                               SCAN_eDebug("remove dupe");
                                m_ch_toScan.erase(i++);
                                continue;
                        }
@@ -442,7 +444,7 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
 
        if (found_count > 0)
        {
-               eDebug("already in todo list");
+               SCAN_eDebug("already in todo list");
                return;
        }
 
@@ -450,7 +452,7 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
        for (std::list<ePtr<iDVBFrontendParameters> >::const_iterator i(m_ch_scanned.begin()); i != m_ch_scanned.end(); ++i)
                if (sameChannel(*i, feparm))
                {
-                       eDebug("successfully scanned");
+                       SCAN_eDebug("successfully scanned");
                        return;
                }
 
@@ -458,18 +460,18 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
        for (std::list<ePtr<iDVBFrontendParameters> >::const_iterator i(m_ch_unavailable.begin()); i != m_ch_unavailable.end(); ++i)
                if (sameChannel(*i, feparm, true))
                {
-                       eDebug("scanned but not available");
+                       SCAN_eDebug("scanned but not available");
                        return;
                }
 
                /* ... on the current channel */
        if (sameChannel(m_ch_current, feparm))
        {
-               eDebug("is current");
+               SCAN_eDebug("is current");
                return;
        }
 
-       eDebug("really add");
+       SCAN_eDebug("really add");
                /* otherwise, add it to the todo list. */
        m_ch_toScan.push_front(feparm); // better.. then the rotor not turning wild from east to west :)
 }
@@ -516,7 +518,6 @@ void eDVBScan::channelDone()
        
        if (m_ready & validNIT)
        {
-               eDebug("validNIT");
                int system;
                std::list<ePtr<iDVBFrontendParameters> > m_ch_toScan_backup;
                m_ch_current->getSystem(system);
@@ -604,7 +605,7 @@ void eDVBScan::channelDone()
 
                                                if ( abs(abs(3600 - p.orbital_position) - sat.orbital_position) < 5 )
                                                {
-                                                       eDebug("found transponder with incorrect west/east flag ... correct this");
+                                                       SCAN_eDebug("found transponder with incorrect west/east flag ... correct this");
                                                        sat.orbital_position = p.orbital_position;
                                                }
 
@@ -792,7 +793,7 @@ void eDVBScan::channelDone()
        {
                if (sameChannel(*i, m_ch_current))
                {
-                       eDebug("remove dupe 2");
+                       SCAN_eDebug("remove dupe 2");
                        m_ch_toScan.erase(i++);
                        continue;
                }
@@ -841,10 +842,8 @@ void eDVBScan::insertInto(iDVBChannelList *db, bool dontRemoveOldFlags)
                std::list<ePtr<iDVBFrontendParameters> >::iterator it(m_ch_scanned.begin());
                for (;it != m_ch_scanned.end(); ++it)
                {
-                       if (m_flags & scanDontRemoveUnscanned) {
-                               eDebug("scanDontRemoveUnscanned!");
+                       if (m_flags & scanDontRemoveUnscanned)
                                db->removeServices(&(*(*it)));
-                       }
                        else
                        {
                                int system;