[Scan] Fix DVB-T2 Network Scan. (need update libdvbsi++ 0.3.8)
authorhschang <chang@dev3>
Wed, 7 Feb 2018 06:21:19 +0000 (15:21 +0900)
committerhschang <chang@dev3>
Wed, 7 Feb 2018 07:26:00 +0000 (16:26 +0900)
lib/dvb/frontend.cpp
lib/dvb/frontendparms.h
lib/dvb/scan.cpp
lib/dvb/scan.h

index 91c866c..ceecb6d 100755 (executable)
@@ -178,8 +178,6 @@ void eDVBFrontendParametersTerrestrial::set(const TerrestrialDeliverySystemDescr
                case 1: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_7MHz; break;
                case 2: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_6MHz; break;
                case 3: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_5MHz; break;
-               case 4: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_10MHz; break;
-               case 5: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_1_712MHz; break;
                default: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_Auto; break;
        }
        switch (descriptor.getCodeRateHpStream())
@@ -205,9 +203,6 @@ void eDVBFrontendParametersTerrestrial::set(const TerrestrialDeliverySystemDescr
                case 0: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_2k; break;
                case 1: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_8k; break;
                case 2: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_4k; break;
-               case 3: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_1k; break;
-               case 4: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_16k; break;
-               case 5: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_32k; break;
                default: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto; break;
        }
        switch (descriptor.getGuardInterval())
@@ -216,9 +211,6 @@ void eDVBFrontendParametersTerrestrial::set(const TerrestrialDeliverySystemDescr
                case 1: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_16; break;
                case 2: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_8; break;
                case 3: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_4; break;
-               case 4: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_128; break;
-               case 5: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_19_128; break;
-               case 6: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_19_256; break;
                default: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_Auto; break;
        }
 //     hierarchy = descriptor.getHierarchyInformation();
@@ -236,6 +228,50 @@ void eDVBFrontendParametersTerrestrial::set(const TerrestrialDeliverySystemDescr
                guard_interval, hierarchy, modulation);
 }
 
+void eDVBFrontendParametersTerrestrial::set(const T2DeliverySystemDescriptor &descriptor)
+{
+       switch (descriptor.getBandwidth())
+       {
+               case 0: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_8MHz; break;
+               case 1: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_7MHz; break;
+               case 2: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_6MHz; break;
+               case 3: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_5MHz; break;
+               case 4: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_10MHz; break;
+               case 5: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_1_712MHz; break;
+               default: bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_Auto; break;
+       }
+       switch (descriptor.getTransmissionMode())
+       {
+               case 0: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_2k; break;
+               case 1: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_8k; break;
+               case 2: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_4k; break;
+               case 3: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_1k; break;
+               case 4: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_16k; break;
+               case 5: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_32k; break;
+               default: transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto; break;
+       }
+       switch (descriptor.getGuardInterval())
+       {
+               case 0: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_32; break;
+               case 1: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_16; break;
+               case 2: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_8; break;
+               case 3: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_4; break;
+               case 4: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_1_128; break;
+               case 5: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_19_128; break;
+               case 6: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_19_256; break;
+               default: guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_Auto; break;
+       }
+       plpid = descriptor.getPlpId();
+       code_rate_HP = eDVBFrontendParametersTerrestrial::FEC_Auto;
+       code_rate_LP = eDVBFrontendParametersTerrestrial::FEC_Auto;
+       hierarchy = eDVBFrontendParametersTerrestrial::Hierarchy_Auto;
+       modulation = eDVBFrontendParametersTerrestrial::Modulation_Auto;
+       inversion = eDVBFrontendParametersTerrestrial::Inversion_Unknown;
+       system = eDVBFrontendParametersTerrestrial::System_DVB_T2;
+       eDebug("T2 bw %d, tm_mode %d, guard %d, plpid %d",
+               bandwidth, transmission_mode, guard_interval, plpid);
+}
+
 eDVBFrontendParameters::eDVBFrontendParameters()
        :m_type(-1), m_flags(0)
 {
index c4989fb..b2a2cd7 100644 (file)
@@ -6,6 +6,7 @@
 #include <dvbsi++/satellite_delivery_system_descriptor.h>
 #include <dvbsi++/cable_delivery_system_descriptor.h>
 #include <dvbsi++/terrestrial_delivery_system_descriptor.h>
+#include <dvbsi++/t2_delivery_system_descriptor.h>
 
 struct eDVBFrontendParametersSatellite
 {
@@ -73,6 +74,7 @@ struct eDVBFrontendParametersTerrestrial
 {
 #ifndef SWIG
        void set(const TerrestrialDeliverySystemDescriptor  &);
+       void set(const T2DeliverySystemDescriptor &);
 #endif
 
        enum {
index 969ed9f..46236dd 100644 (file)
@@ -3,9 +3,12 @@
 #include <dvbsi++/service_descriptor.h>
 #include <dvbsi++/satellite_delivery_system_descriptor.h>
 #include <dvbsi++/terrestrial_delivery_system_descriptor.h>
+#include <dvbsi++/t2_delivery_system_descriptor.h>
 #include <dvbsi++/cable_delivery_system_descriptor.h>
 #include <dvbsi++/ca_identifier_descriptor.h>
 #include <dvbsi++/registration_descriptor.h>
+#include <dvbsi++/extension_descriptor.h>
+#include <dvbsi++/frequency_list_descriptor.h>
 #include <lib/dvb/specs.h>
 #include <lib/dvb/esection.h>
 #include <lib/dvb/scan.h>
@@ -502,7 +505,7 @@ void eDVBScan::addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParame
                m_new_channels.insert(std::pair<eDVBChannelID,ePtr<iDVBFrontendParameters> >(chid, feparm));
 }
 
-void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameters *feparm)
+void eDVBScan::addChannelToScan(iDVBFrontendParameters *feparm)
 {
                /* check if we don't already have that channel ... */
 
@@ -645,9 +648,9 @@ void eDVBScan::channelDone()
                        {
                                SCAN_eDebug("TSID: %04x ONID: %04x", (*tsinfo)->getTransportStreamId(),
                                        (*tsinfo)->getOriginalNetworkId());
-                               
-                               eOriginalNetworkID onid = (*tsinfo)->getOriginalNetworkId();
-                               eTransportStreamID tsid = (*tsinfo)->getTransportStreamId();
+
+                               bool T2 = false;
+                               eDVBFrontendParametersTerrestrial t2transponder;
                                
                                for (DescriptorConstIterator desc = (*tsinfo)->getDescriptors()->begin();
                                                desc != (*tsinfo)->getDescriptors()->end(); ++desc)
@@ -664,13 +667,7 @@ void eDVBScan::channelDone()
                                                cable.set(d);
                                                feparm->setDVBC(cable);
 
-                                               unsigned long hash=0;
-                                               feparm->getHash(hash);
-                                               eDVBNamespace ns = buildNamespace(onid, tsid, hash);
-
-                                               addChannelToScan(
-                                                       eDVBChannelID(ns, tsid, onid),
-                                                       feparm);
+                                               addChannelToScan(feparm);
                                                break;
                                        }
                                        case TERRESTRIAL_DELIVERY_SYSTEM_DESCRIPTOR:
@@ -683,13 +680,7 @@ void eDVBScan::channelDone()
                                                terr.set(d);
                                                feparm->setDVBT(terr);
 
-                                               unsigned long hash=0;
-                                               feparm->getHash(hash);
-                                               eDVBNamespace ns = buildNamespace(onid, tsid, hash);
-
-                                               addChannelToScan(
-                                                       eDVBChannelID(ns, tsid, onid),
-                                                       feparm);
+                                               addChannelToScan(feparm);
                                                break;
                                        }
                                        case SATELLITE_DELIVERY_SYSTEM_DESCRIPTOR:
@@ -723,11 +714,56 @@ void eDVBScan::channelDone()
                                                        SCAN_eDebug("dropping this transponder, it's on another satellite.");
                                                else
                                                {
-                                                       unsigned long hash=0;
-                                                       feparm->getHash(hash);
-                                                       addChannelToScan(
-                                                                       eDVBChannelID(buildNamespace(onid, tsid, hash), tsid, onid),
-                                                                       feparm);
+                                                       addChannelToScan(feparm);
+                                               }
+                                               break;
+                                       }
+                                       case EXTENSION_DESCRIPTOR:
+                                       {
+                                               if (system != iDVBFrontend::feTerrestrial)
+                                                       break; // when current locked transponder is no terrestrial transponder ignore this descriptor
+
+                                               ExtensionDescriptor &d = (ExtensionDescriptor&)**desc;
+                                               switch (d.getExtensionTag())
+                                               {
+                                               case T2_DELIVERY_SYSTEM_DESCRIPTOR:
+                                                       T2 = true;
+                                                       T2DeliverySystemDescriptor &d = (T2DeliverySystemDescriptor&)**desc;
+                                                       t2transponder.set(d);
+
+                                                       for (T2CellConstIterator cell = d.getCells()->begin();
+                                                               cell != d.getCells()->end(); ++cell)
+                                                       {
+                                                               for (T2FrequencyConstIterator freq = (*cell)->getCentreFrequencies()->begin();
+                                                                       freq != (*cell)->getCentreFrequencies()->end(); ++freq)
+                                                               {
+                                                                       t2transponder.frequency = (*freq) * 10;
+                                                                       ePtr<eDVBFrontendParameters> feparm = new eDVBFrontendParameters;
+                                                                       feparm->setDVBT(t2transponder);
+                                                                       addChannelToScan(feparm);
+                                                               }
+                                                       }
+                                               }
+                                               break;
+                                       }
+                                       case FREQUENCY_LIST_DESCRIPTOR:
+                                       {
+                                               if (system != iDVBFrontend::feTerrestrial)
+                                                       break; // when current locked transponder is no terrestrial transponder ignore this descriptor
+                                               if (!T2)
+                                                       break;
+
+                                               FrequencyListDescriptor &d = (FrequencyListDescriptor&)**desc;
+                                               if (d.getCodingType() != 0x03)
+                                                       break;
+
+                                               for (CentreFrequencyConstIterator it = d.getCentreFrequencies()->begin();
+                                                               it != d.getCentreFrequencies()->end(); ++it)
+                                               {
+                                                       t2transponder.frequency = (*it) * 10;
+                                                       ePtr<eDVBFrontendParameters> feparm = new eDVBFrontendParameters;
+                                                       feparm->setDVBT(t2transponder);
+                                                       addChannelToScan(feparm);
                                                }
                                                break;
                                        }
index 8f64abe..55da5d9 100644 (file)
@@ -80,7 +80,7 @@ class eDVBScan: public Object, public iObject
        void PMTready(int err);
 
        void addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
-       void addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
+       void addChannelToScan(iDVBFrontendParameters *feparm);
 
        int sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2, bool exact=false) const;