From: hschang Date: Wed, 7 Feb 2018 06:21:19 +0000 (+0900) Subject: [Scan] Fix DVB-T2 Network Scan. (need update libdvbsi++ 0.3.8) X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=07aa6cf57eae72224a32f6ef3f83b299f49977cf [Scan] Fix DVB-T2 Network Scan. (need update libdvbsi++ 0.3.8) --- diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 91c866c..ceecb6d 100755 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -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) { diff --git a/lib/dvb/frontendparms.h b/lib/dvb/frontendparms.h index c4989fb..b2a2cd7 100644 --- a/lib/dvb/frontendparms.h +++ b/lib/dvb/frontendparms.h @@ -6,6 +6,7 @@ #include #include #include +#include struct eDVBFrontendParametersSatellite { @@ -73,6 +74,7 @@ struct eDVBFrontendParametersTerrestrial { #ifndef SWIG void set(const TerrestrialDeliverySystemDescriptor &); + void set(const T2DeliverySystemDescriptor &); #endif enum { diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp index 969ed9f..46236dd 100644 --- a/lib/dvb/scan.cpp +++ b/lib/dvb/scan.cpp @@ -3,9 +3,12 @@ #include #include #include +#include #include #include #include +#include +#include #include #include #include @@ -502,7 +505,7 @@ void eDVBScan::addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParame m_new_channels.insert(std::pair >(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 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 feparm = new eDVBFrontendParameters; + feparm->setDVBT(t2transponder); + addChannelToScan(feparm); } break; } diff --git a/lib/dvb/scan.h b/lib/dvb/scan.h index 8f64abe..55da5d9 100644 --- a/lib/dvb/scan.h +++ b/lib/dvb/scan.h @@ -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;