Ticket #5562: t5562_populate_default_authority.diff
File t5562_populate_default_authority.diff, 20.2 KB (added by , 15 years ago) |
---|
-
mythtv/libs/libmythtv/channelscan/channelimporter.cpp
diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp index 9931128..65d9f3e 100644
a b ScanDTVTransportList ChannelImporter::InsertChannels( 359 359 chan.atsc_minor_channel, 360 360 chan.use_on_air_guide, 361 361 chan.hidden, chan.hidden_in_guide, 362 chan.freqid); 362 chan.freqid, 363 QString::null, 364 QString::null, 365 QString::null, 366 chan.default_authority); 363 367 } 364 368 } 365 369 … … ScanDTVTransportList ChannelImporter::UpdateChannels( 485 489 chan.atsc_minor_channel, 486 490 chan.use_on_air_guide, 487 491 chan.hidden, chan.hidden_in_guide, 488 chan.freqid); 492 chan.freqid, 493 QString::null, 494 QString::null, 495 QString::null, 496 chan.default_authority); 489 497 } 490 498 491 499 if (filter) -
mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp
diff --git a/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp b/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp index 6328f0e..a81e7dc 100644
a b 65 65 /// 10 seconds, so lets wait at least 30 seconds, in 66 66 /// case of bad transmitter or lost packets. 67 67 const uint ChannelScanSM::kDVBTableTimeout = 30 * 1000; 68 /// The whole BAT & SDTo group comes round in 10s, so wait additional 69 /// 12 seconds to kDVBTableTimeout 70 const uint ChannelScanSM::kDVBoTableTimeout = ChannelScanSM::kDVBTableTimeout + 71 12 * 1000; 68 72 /// No logic here, lets just wait at least 10 seconds. 69 73 const uint ChannelScanSM::kATSCTableTimeout = 10 * 1000; 70 74 /// No logic here, lets just wait at least 15 seconds. … … ChannelScanSM::ChannelScanSM( 148 152 wait_for_mpeg(false), 149 153 wait_for_atsc(false), 150 154 wait_for_dvb(false), 155 wait_for_dvbo(false), 151 156 // Transports List 152 157 transportsScanned(0), 153 158 currentTestingDecryption(false), … … ChannelScanSM::ChannelScanSM( 183 188 data->AddMPEGListener(this); 184 189 data->AddATSCMainListener(this); 185 190 data->AddDVBMainListener(this); 191 data->AddDVBOtherListener(this); 186 192 } 187 193 } 188 194 … … void ChannelScanSM::HandleMGT(const MasterGuideTable *mgt) 371 377 UpdateChannelInfo(true); 372 378 } 373 379 374 void ChannelScanSM::HandleSDT(uint , const ServiceDescriptionTable *sdt)380 void ChannelScanSM::HandleSDT(uint tsid, const ServiceDescriptionTable *sdt) 375 381 { 376 382 VERBOSE(VB_CHANSCAN, LOC + 377 383 QString("Got a Service Description Table for %1") … … void ChannelScanSM::HandleNIT(const NetworkInformationTable *nit) 395 401 QString("Got a Network Information Table for %1") 396 402 .arg((*current).FriendlyName) + "\n" + nit->toString()); 397 403 404 uint netid = nit->NetworkID(); 405 406 // If this is Astra 28.2 add start listening for Freesat BAT and SDTo 407 if (!wait_for_dvbo && (netid == 2 || netid == 59)) 408 { 409 GetDTVSignalMonitor()->GetScanStreamData()->SetFreesatAdditionalSI(true); 410 wait_for_dvbo = true; 411 } 412 398 413 wait_for_dvb = true; 399 414 UpdateChannelInfo(true); 400 415 } 401 416 417 void ChannelScanSM::HandleBAT(const BouquetAssociationTable *bat) 418 { 419 VERBOSE(VB_CHANSCAN, LOC + "Got a Bouquet Association Table\n" + 420 bat->toString()); 421 422 for (uint i = 0; i < bat->TransportStreamCount(); i++) 423 { 424 uint tsid = bat->TSID(i); 425 uint netid = bat->OriginalNetworkID(i); 426 desc_list_t parsed = 427 MPEGDescriptor::Parse(bat->TransportDescriptors(i), 428 bat->TransportDescriptorsLength(i)); 429 // Look for default authority 430 const unsigned char *def_auth = 431 MPEGDescriptor::Find(parsed, DescriptorID::default_authority); 432 const unsigned char *serv_list = 433 MPEGDescriptor::Find(parsed, DescriptorID::service_list); 434 435 if (def_auth && serv_list) 436 { 437 DefaultAuthorityDescriptor authority(def_auth); 438 ServiceListDescriptor services(serv_list); 439 440 for (uint j = 0; j < services.ServiceCount(); j++) 441 { 442 // If the default authority is given in the SDT this 443 // overrides any definition in the BAT (or in the NIT) 444 uint64_t index = 445 ((uint64_t)netid << 32) | (tsid << 16) | services.ServiceID(j); 446 if (! defAuthorities.contains(index)) 447 defAuthorities[index] = authority.DefaultAuthority(); 448 } 449 } 450 } 451 UpdateChannelInfo(true); 452 } 453 454 void ChannelScanSM::HandleSDTo(uint tsid, const ServiceDescriptionTable *sdt) 455 { 456 VERBOSE(VB_CHANSCAN, LOC + "Got a Service Description Table (other)\n" + 457 sdt->toString()); 458 459 uint netid = sdt->OriginalNetworkID(); 460 461 for (uint i = 0; i < sdt->ServiceCount(); i++) 462 { 463 uint serviceId = sdt->ServiceID(i); 464 desc_list_t parsed = 465 MPEGDescriptor::Parse(sdt->ServiceDescriptors(i), 466 sdt->ServiceDescriptorsLength(i)); 467 // Look for default authority 468 const unsigned char *def_auth = 469 MPEGDescriptor::Find(parsed, DescriptorID::default_authority); 470 if (def_auth) 471 { 472 DefaultAuthorityDescriptor authority(def_auth); 473 defAuthorities[((uint64_t)netid << 32) | (tsid << 16) | serviceId] = 474 authority.DefaultAuthority(); 475 } 476 } 477 UpdateChannelInfo(true); 478 } 479 402 480 void ChannelScanSM::HandleEncryptionStatus(uint pnum, bool encrypted) 403 481 { 404 482 currentEncryptionStatus[pnum] = encrypted ? kEncEncrypted : kEncDecrypted; … … bool ChannelScanSM::UpdateChannelInfo(bool wait_until_complete) 783 861 currentEncryptionStatus.clear(); 784 862 currentEncryptionStatusChecked.clear(); 785 863 786 wait_for_mpeg = wait_for_atsc = wait_for_dvb = false;864 wait_for_mpeg = wait_for_atsc = wait_for_dvb = wait_for_dvbo = false; 787 865 788 866 if (scanning) 789 867 { … … static void update_info(ChannelInsertInfo &info, 848 926 } 849 927 850 928 static void update_info(ChannelInsertInfo &info, 851 const ServiceDescriptionTable *sdt, uint i) 929 const ServiceDescriptionTable *sdt, uint i, 930 const QMap<uint64_t, QString> &defAuthorities) 852 931 { 853 932 // HACK beg -- special exception for this network 854 933 // (dbver == "1067") … … static void update_info(ChannelInsertInfo &info, 887 966 (desc && !desc->IsDTV() && !desc->IsDigitalAudio()); 888 967 info.is_audio_service = (desc && desc->IsDigitalAudio()); 889 968 969 info.service_id = sdt->ServiceID(i); 890 970 info.sdt_tsid = sdt->TSID(); 891 971 info.orig_netid = sdt->OriginalNetworkID(); 892 972 info.in_sdt = true; 973 974 desc_list_t parsed = 975 MPEGDescriptor::Parse(sdt->ServiceDescriptors(i), 976 sdt->ServiceDescriptorsLength(i)); 977 // Look for default authority 978 const unsigned char *def_auth = 979 MPEGDescriptor::Find(parsed, DescriptorID::default_authority); 980 if (def_auth) 981 { 982 DefaultAuthorityDescriptor authority(def_auth); 983 info.default_authority = authority.DefaultAuthority(); 984 } 985 else 986 { 987 uint64_t index = (uint64_t)info.orig_netid << 32 | 988 info.sdt_tsid << 16 | info.service_id; 989 if (defAuthorities.contains(index)) 990 info.default_authority = defAuthorities[index]; 991 } 893 992 } 894 993 895 994 uint ChannelScanSM::GetCurrentTransportInfo( … … ChannelScanSM::GetChannelList(transport_scan_items_it_t trans_info, 1040 1139 { 1041 1140 uint pnum = (*sdt_it)->ServiceID(i); 1042 1141 PCM_INFO_INIT("dvb"); 1043 update_info(info, *sdt_it, i );1142 update_info(info, *sdt_it, i, defAuthorities); 1044 1143 } 1045 1144 } 1046 1145 } … … bool ChannelScanSM::HasTimedOut(void) 1295 1394 if (wait_for_dvb && !sd->HasCachedAllNIT() && !sd->HasCachedAllSDTs()) 1296 1395 max_timeout = max(max_timeout, (int) kDVBTableTimeout); 1297 1396 1397 if (wait_for_dvbo) 1398 max_timeout = max(max_timeout, (int) kDVBoTableTimeout); 1399 1298 1400 if (wait_for_atsc && !sd->HasCachedMGT() && !sd->HasCachedAllVCTs()) 1299 1401 max_timeout = max(max_timeout, (int) kATSCTableTimeout); 1300 1402 -
mythtv/libs/libmythtv/channelscan/channelscan_sm.h
diff --git a/mythtv/libs/libmythtv/channelscan/channelscan_sm.h b/mythtv/libs/libmythtv/channelscan/channelscan_sm.h index 5946546..d7e8087 100644
a b class AnalogSignalHandler : public SignalMonitorListener 82 82 83 83 class ChannelScanSM : public MPEGStreamListener, 84 84 public ATSCMainStreamListener, 85 public DVBMainStreamListener 85 public DVBMainStreamListener, 86 public DVBOtherStreamListener 86 87 { 87 88 friend class AnalogSignalHandler; 88 89 … … class ChannelScanSM : public MPEGStreamListener, 144 145 void HandleSDT(uint tsid, const ServiceDescriptionTable*); 145 146 void HandleTDT(const TimeDateTable*) {} 146 147 148 // DVB Other 149 void HandleNITo(const NetworkInformationTable*) {} 150 void HandleSDTo(uint tsid, const ServiceDescriptionTable*); 151 void HandleBAT(const BouquetAssociationTable*); 152 147 153 private: 148 154 // some useful gets 149 155 DTVChannel *GetDTVChannel(void); … … class ChannelScanSM : public MPEGStreamListener, 188 194 static QString loc(const ChannelScanSM*); 189 195 190 196 static const uint kDVBTableTimeout; 197 static const uint kDVBoTableTimeout; 191 198 static const uint kATSCTableTimeout; 192 199 static const uint kMPEGTableTimeout; 193 200 … … class ChannelScanSM : public MPEGStreamListener, 213 220 bool wait_for_mpeg; 214 221 bool wait_for_atsc; 215 222 bool wait_for_dvb; 223 bool wait_for_dvbo; 216 224 217 225 // Transports List 218 226 int transportsScanned; … … class ChannelScanSM : public MPEGStreamListener, 223 231 bool currentTestingDecryption; 224 232 QMap<uint, uint> currentEncryptionStatus; 225 233 QMap<uint, bool> currentEncryptionStatusChecked; 234 QMap<uint64_t, QString> defAuthorities; 226 235 227 236 /// Found Channel Info 228 237 ChannelList channelList; -
mythtv/libs/libmythtv/channelscan/scaninfo.cpp
diff --git a/mythtv/libs/libmythtv/channelscan/scaninfo.cpp b/mythtv/libs/libmythtv/channelscan/scaninfo.cpp index e01035e..bfa3829 100644
a b ScanDTVTransportList LoadScan(uint scanid) 119 119 " in_pat, in_pmt, in_vct, " 120 120 " in_nit, in_sdt, is_encrypted, " 121 121 " is_data_service, is_audio_service, is_opencable, " 122 " could_be_opencable, decryption_status "122 " could_be_opencable, decryption_status, default_authority " 123 123 "FROM channelscan_channel " 124 124 "WHERE transportid = :TRANSPORTID"); 125 125 query2.bindValue(":TRANSPORTID", query.value(15).toUInt()); … … ScanDTVTransportList LoadScan(uint scanid) 178 178 query2.value(31).toBool()/*is_audio_service*/, 179 179 query2.value(32).toBool()/*is_opencable*/, 180 180 query2.value(33).toBool()/*could_be_opencable*/, 181 query2.value(34).toInt()/*decryption_status*/); 181 query2.value(34).toInt()/*decryption_status*/, 182 query2.value(35).toString()/*default_authority*/); 182 183 183 184 mux.channels.push_back(chan); 184 185 } -
mythtv/libs/libmythtv/dbchannelinfo.cpp
diff --git a/mythtv/libs/libmythtv/dbchannelinfo.cpp b/mythtv/libs/libmythtv/dbchannelinfo.cpp index aa500e3..cf6f623 100644
a b bool ChannelInsertInfo::SaveScan(uint scanid, uint transportid) const 170 170 " in_pat, in_pmt, in_vct, " 171 171 " in_nit, in_sdt, is_encrypted, " 172 172 " is_data_service, is_audio_service, is_opencable, " 173 " could_be_opencable, decryption_status 173 " could_be_opencable, decryption_status, default_authority " 174 174 " ) " 175 175 "VALUES " 176 176 " ( :SCANID, :TRANSPORTID, " … … bool ChannelInsertInfo::SaveScan(uint scanid, uint transportid) const 185 185 " :IN_PAT, :IN_PMT, :IN_VCT, " 186 186 " :IN_NIT, :IN_SDT, :IS_ENCRYPTED, " 187 187 " :IS_DATA_SERVICE, :IS_AUDIO_SERVICE, :IS_OPEBCABLE, " 188 " :COULD_BE_OPENCABLE,:DECRYPTION_STATUS 188 " :COULD_BE_OPENCABLE,:DECRYPTION_STATUS, :DEFAULT_AUTHORITY " 189 189 " );"); 190 190 191 191 query.bindValue(":SCANID", scanid); … … bool ChannelInsertInfo::SaveScan(uint scanid, uint transportid) const 225 225 query.bindValue(":IS_OPEBCABLE", is_opencable); 226 226 query.bindValue(":COULD_BE_OPENCABLE", could_be_opencable); 227 227 query.bindValue(":DECRYPTION_STATUS", decryption_status); 228 query.bindValue(":DEFAULT_AUTHORITY", default_authority); 228 229 229 230 if (!query.exec()) 230 231 { … … ChannelInsertInfo::ChannelInsertInfo( 254 255 bool _in_nit, bool _in_sdt, 255 256 bool _is_encrypted, bool _is_data_service, 256 257 bool _is_audio_service, bool _is_opencable, 257 bool _could_be_opencable, int _decryption_status) : 258 bool _could_be_opencable, int _decryption_status, 259 QString _default_authority) : 258 260 db_mplexid(_db_mplexid), 259 261 source_id(_source_id), 260 262 channel_id(_channel_id), … … ChannelInsertInfo::ChannelInsertInfo( 271 273 icon(_icon), 272 274 format(_format), 273 275 xmltvid(_xmltvid), 276 default_authority(_default_authority), 274 277 pat_tsid(_pat_tsid), 275 278 vct_tsid(_vct_tsid), 276 279 vct_chan_tsid(_vct_chan_tsid), … … ChannelInsertInfo::ChannelInsertInfo( 298 301 icon.detach(); 299 302 format.detach(); 300 303 xmltvid.detach(); 304 default_authority.detach(); 301 305 si_standard.detach(); 302 306 } 303 307 … … ChannelInsertInfo &ChannelInsertInfo::operator=( 320 324 icon = other.icon; icon.detach(); 321 325 format = other.format; format.detach(); 322 326 xmltvid = other.xmltvid; xmltvid.detach(); 327 default_authority = other.default_authority; default_authority.detach(); 323 328 324 329 // non-DB info 325 330 pat_tsid = other.pat_tsid; … … void ChannelInsertInfo::ImportExtraInfo(const ChannelInsertInfo &other) 391 396 { 392 397 xmltvid = other.xmltvid; xmltvid.detach(); 393 398 } 399 if (!other.default_authority.isEmpty() && default_authority.isEmpty()) 400 { 401 default_authority = other.default_authority; default_authority.detach(); 402 } 394 403 // non-DB info 395 404 if (other.pat_tsid && !pat_tsid) 396 405 pat_tsid = other.pat_tsid; -
mythtv/libs/libmythtv/dbchannelinfo.h
diff --git a/mythtv/libs/libmythtv/dbchannelinfo.h b/mythtv/libs/libmythtv/dbchannelinfo.h index 5d1dc14..b2f9135 100644
a b class MPUBLIC ChannelInsertInfo 90 90 hidden(false), hidden_in_guide(false), 91 91 freqid(QString::null), icon(QString::null), 92 92 format(QString::null), xmltvid(QString::null), 93 default_authority(QString::null), 93 94 pat_tsid(0), vct_tsid(0), vct_chan_tsid(0), sdt_tsid(0), 94 95 orig_netid(0), netid(0), 95 96 si_standard(QString::null), … … class MPUBLIC ChannelInsertInfo 128 129 129 130 bool _is_encrypted, bool _is_data_service, 130 131 bool _is_audio_service, bool _is_opencable, 131 bool _could_be_opencable, int _decryption_status); 132 bool _could_be_opencable, int _decryption_status, 133 QString _default_authority); 132 134 133 135 ChannelInsertInfo(const ChannelInsertInfo &other) { (*this = other); } 134 136 ChannelInsertInfo &operator=(const ChannelInsertInfo &other); … … class MPUBLIC ChannelInsertInfo 156 158 QString icon; 157 159 QString format; 158 160 QString xmltvid; 161 QString default_authority; 159 162 160 163 // non-DB info 161 164 uint pat_tsid; -
mythtv/libs/libmythtv/dtvmultiplex.cpp
diff --git a/mythtv/libs/libmythtv/dtvmultiplex.cpp b/mythtv/libs/libmythtv/dtvmultiplex.cpp index ebe3be3..d28896b 100644
a b bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) 425 425 " c.serviceid, c.atsc_major_chan, c.atsc_minor_chan, " 426 426 " c.useonairguide, c.visible, c.freqid, " 427 427 " c.icon, c.tvformat, c.xmltvid, " 428 " d.transportid, d.networkid 428 " d.transportid, d.networkid, c.default_authority " 429 429 "FROM channel AS c, dtv_multiplex AS d " 430 430 "WHERE c.mplexid = :MPLEXID AND" 431 431 " c.mplexid = d.mplexid"); … … bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) 455 455 QString::null, 456 456 false, false, false, false, 457 457 false, false, false, false, 458 false, false, false, 0); 458 false, false, false, 0, 459 query.value(18).toString() /* default_authority */); 459 460 460 461 channels.push_back(chan); 461 462 } -
mythtv/libs/libmythtv/mpeg/mpegtables.h
diff --git a/mythtv/libs/libmythtv/mpeg/mpegtables.h b/mythtv/libs/libmythtv/mpeg/mpegtables.h index 678acc0..7aa5c27 100644
a b enum 197 197 PREMIERE_EIT_SPORT_PID = 0x0b12, 198 198 199 199 ATSC_PSIP_PID = 0x1ffb, 200 201 // UK Freesat PIDs: SDTo/BAT, longterm EIT, shortterm EIT 202 FREESAT_SI_PID = 0x0f01, 203 FREESAT_EIT_PID = 0x0f02, 204 FREESAT_ST_EIT_PID = 0x0f03, 200 205 }; 201 206 202 207 /** \class TableID -
mythtv/libs/libmythtv/mpeg/scanstreamdata.cpp
diff --git a/mythtv/libs/libmythtv/mpeg/scanstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/scanstreamdata.cpp index af48f3b..56c49d4 100644
a b 7 7 ScanStreamData::ScanStreamData() 8 8 : MPEGStreamData(-1, true), 9 9 ATSCStreamData(-1,-1, true), 10 DVBStreamData(0, 0, -1, true) 10 DVBStreamData(0, 0, -1, true), 11 dvb_uk_freesat_si(false) 11 12 { 12 13 } 13 14 … … ScanStreamData::~ScanStreamData() { ; } 18 19 */ 19 20 bool ScanStreamData::IsRedundant(uint pid, const PSIPTable &psip) const 20 21 { 22 // Treat BAT and SDTo as redundant unless they are on the FREESAT_SI_PID 23 if (dvb_uk_freesat_si && 24 (psip.TableID() == TableID::BAT || psip.TableID() == TableID::SDTo)) 25 return pid != FREESAT_SI_PID; 26 21 27 return (ATSCStreamData::IsRedundant(pid,psip) || 22 28 DVBStreamData::IsRedundant(pid,psip)); 23 29 } … … void ScanStreamData::Reset(void) 42 48 AddListeningPID(ATSC_PSIP_PID); 43 49 AddListeningPID(DVB_NIT_PID); 44 50 AddListeningPID(DVB_SDT_PID); 51 if (dvb_uk_freesat_si) 52 AddListeningPID(FREESAT_SI_PID); 45 53 } 46 54 47 55 QString ScanStreamData::GetSIStandard(QString guess) const -
mythtv/libs/libmythtv/mpeg/scanstreamdata.h
diff --git a/mythtv/libs/libmythtv/mpeg/scanstreamdata.h b/mythtv/libs/libmythtv/mpeg/scanstreamdata.h index e9ab448..17cad5b 100644
a b class ScanStreamData : 28 28 29 29 QString GetSIStandard(QString guess = "mpeg") const; 30 30 31 void SetFreesatAdditionalSI(bool freesat_si); 32 31 33 private: 32 34 virtual bool DeleteCachedTable(PSIPTable *psip) const; 35 /// listen for addiotional Freesat service information 36 int dvb_uk_freesat_si; 33 37 }; 34 38 39 inline void ScanStreamData::SetFreesatAdditionalSI(bool freesat_si) 40 { 41 QMutexLocker locker(&_listener_lock); 42 dvb_uk_freesat_si = freesat_si; 43 } 44 35 45 #endif // SCANSTREAMDATA_H_