Ticket #5562: t5562_default_authority_r21554.diff
File t5562_default_authority_r21554.diff, 19.6 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 f84ec74..0f0e48c 100644
a b ScanDTVTransportList ChannelImporter::InsertChannels( 358 358 chan.atsc_minor_channel, 359 359 chan.use_on_air_guide, 360 360 chan.hidden, chan.hidden_in_guide, 361 chan.freqid); 361 chan.freqid, 362 QString::null, 363 QString::null, 364 QString::null, 365 chan.default_authority); 362 366 } 363 367 } 364 368 … … ScanDTVTransportList ChannelImporter::UpdateChannels( 484 488 chan.atsc_minor_channel, 485 489 chan.use_on_air_guide, 486 490 chan.hidden, chan.hidden_in_guide, 487 chan.freqid); 491 chan.freqid, 492 QString::null, 493 QString::null, 494 QString::null, 495 chan.default_authority); 488 496 } 489 497 490 498 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 bcd986d..d41b301 100644
a b 63 63 /// 10 seconds, so lets wait at least 30 seconds, in 64 64 /// case of bad transmitter or lost packets. 65 65 const uint ChannelScanSM::kDVBTableTimeout = 30 * 1000; 66 /// The whole BAT & SDTo group comes round in 10s, so wait additional 67 /// 12 seconds to kDVBTableTimeout 68 const uint ChannelScanSM::kDVBoTableTimeout = ChannelScanSM::kDVBTableTimeout + 69 12 * 1000; 66 70 /// No logic here, lets just wait at least 10 seconds. 67 71 const uint ChannelScanSM::kATSCTableTimeout = 10 * 1000; 68 72 /// No logic here, lets just wait at least 15 seconds. … … ChannelScanSM::ChannelScanSM( 150 154 scanning(false), 151 155 threadExit(false), 152 156 waitingForTables(false), 157 wait_for_dvbo(false), 153 158 // Transports List 154 159 transportsScanned(0), 155 160 currentTestingDecryption(false), … … ChannelScanSM::ChannelScanSM( 185 190 data->AddMPEGListener(this); 186 191 data->AddATSCMainListener(this); 187 192 data->AddDVBMainListener(this); 193 data->AddDVBOtherListener(this); 188 194 } 189 195 } 190 196 … … void ChannelScanSM::HandleMGT(const MasterGuideTable *mgt) 370 376 UpdateChannelInfo(true); 371 377 } 372 378 373 void ChannelScanSM::HandleSDT(uint , const ServiceDescriptionTable *sdt)379 void ChannelScanSM::HandleSDT(uint tsid, const ServiceDescriptionTable *sdt) 374 380 { 375 381 VERBOSE(VB_CHANSCAN, LOC + 376 382 QString("Got a Service Description Table for %1") … … void ChannelScanSM::HandleNIT(const NetworkInformationTable *nit) 396 402 QString("Got a Network Information Table for %1") 397 403 .arg((*current).FriendlyName) + "\n" + nit->toString()); 398 404 405 uint netid = nit->NetworkID(); 406 407 // If this is Astra 28.2 add start listening for Freesat BAT and SDTo 408 if (!wait_for_dvbo && (netid == 2 || netid == 59)) 409 { 410 VERBOSE(VB_IMPORTANT, LOC + QString("NIT has NetworkID %1, look for " 411 "additional Freesat SI").arg(netid)); 412 GetDTVSignalMonitor()->GetScanStreamData()->SetFreesatAdditionalSI(true); 413 wait_for_dvbo = true; 414 } 415 416 UpdateChannelInfo(true); 417 } 418 419 void ChannelScanSM::HandleBAT(const BouquetAssociationTable *bat) 420 { 421 VERBOSE(VB_CHANSCAN, LOC + "Got a Bouquet Association Table\n" + 422 bat->toString()); 423 424 for (uint i = 0; i < bat->TransportStreamCount(); i++) 425 { 426 uint tsid = bat->TSID(i); 427 uint netid = bat->OriginalNetworkID(i); 428 desc_list_t parsed = 429 MPEGDescriptor::Parse(bat->TransportDescriptors(i), 430 bat->TransportDescriptorsLength(i)); 431 // Look for default authority 432 const unsigned char *def_auth = 433 MPEGDescriptor::Find(parsed, DescriptorID::default_authority); 434 const unsigned char *serv_list = 435 MPEGDescriptor::Find(parsed, DescriptorID::service_list); 436 437 if (def_auth && serv_list) 438 { 439 DefaultAuthorityDescriptor authority(def_auth); 440 ServiceListDescriptor services(serv_list); 441 442 for (uint j = 0; j < services.ServiceCount(); j++) 443 { 444 // If the default authority is given in the SDT this 445 // overrides any definition in the BAT (or in the NIT) 446 VERBOSE(VB_IMPORTANT, LOC + QString("found default authority(BAT) " 447 "for service %1 %2 %3") 448 .arg(netid).arg(tsid).arg(services.ServiceID(j))); 449 uint64_t index = 450 ((uint64_t)netid << 32) | (tsid << 16) | services.ServiceID(j); 451 if (! defAuthorities.contains(index)) 452 defAuthorities[index] = authority.DefaultAuthority(); 453 } 454 } 455 } 456 wait_for_dvbo = false; 457 UpdateChannelInfo(true); 458 } 459 460 void ChannelScanSM::HandleSDTo(uint tsid, const ServiceDescriptionTable *sdt) 461 { 462 VERBOSE(VB_CHANSCAN, LOC + "Got a Service Description Table (other)\n" + 463 sdt->toString()); 464 465 uint netid = sdt->OriginalNetworkID(); 466 467 for (uint i = 0; i < sdt->ServiceCount(); i++) 468 { 469 uint serviceId = sdt->ServiceID(i); 470 desc_list_t parsed = 471 MPEGDescriptor::Parse(sdt->ServiceDescriptors(i), 472 sdt->ServiceDescriptorsLength(i)); 473 // Look for default authority 474 const unsigned char *def_auth = 475 MPEGDescriptor::Find(parsed, DescriptorID::default_authority); 476 if (def_auth) 477 { 478 DefaultAuthorityDescriptor authority(def_auth); 479 VERBOSE(VB_IMPORTANT, LOC + QString("found default authority(SDTo) " 480 "for service %1 %2 %3") 481 .arg(netid).arg(tsid).arg(serviceId)); 482 defAuthorities[((uint64_t)netid << 32) | (tsid << 16) | serviceId] = 483 authority.DefaultAuthority(); 484 } 485 } 399 486 UpdateChannelInfo(true); 400 487 } 401 488 … … bool ChannelScanSM::UpdateChannelInfo(bool wait_until_complete) 650 737 transport_tune_complete &= 651 738 (!currentInfo->tvcts.empty() || !currentInfo->cvcts.empty()); 652 739 } 653 if (sd->HasCachedAnyNIT() || sd->HasCachedAnySDTs() )740 if (sd->HasCachedAnyNIT() || sd->HasCachedAnySDTs() || wait_for_dvbo) 654 741 { 655 742 transport_tune_complete &= !currentInfo->nits.empty(); 656 743 transport_tune_complete &= !currentInfo->sdts.empty(); 744 transport_tune_complete &= !wait_for_dvbo; 657 745 } 658 746 if (transport_tune_complete) 659 747 { … … bool ChannelScanSM::UpdateChannelInfo(bool wait_until_complete) 783 871 784 872 currentEncryptionStatus.clear(); 785 873 currentEncryptionStatusChecked.clear(); 874 wait_for_dvbo = false; 786 875 787 876 if (scanning) 788 877 { … … static void update_info(ChannelInsertInfo &info, 847 936 } 848 937 849 938 static void update_info(ChannelInsertInfo &info, 850 const ServiceDescriptionTable *sdt, uint i) 939 const ServiceDescriptionTable *sdt, uint i, 940 const QMap<uint64_t, QString> &defAuthorities) 851 941 { 852 942 // HACK beg -- special exception for this network 853 943 // (dbver == "1067") … … static void update_info(ChannelInsertInfo &info, 886 976 (desc && !desc->IsDTV() && !desc->IsDigitalAudio()); 887 977 info.is_audio_service = (desc && desc->IsDigitalAudio()); 888 978 979 info.service_id = sdt->ServiceID(i); 889 980 info.sdt_tsid = sdt->TSID(); 890 981 info.orig_netid = sdt->OriginalNetworkID(); 891 982 info.in_sdt = true; 983 984 desc_list_t parsed = 985 MPEGDescriptor::Parse(sdt->ServiceDescriptors(i), 986 sdt->ServiceDescriptorsLength(i)); 987 // Look for default authority 988 const unsigned char *def_auth = 989 MPEGDescriptor::Find(parsed, DescriptorID::default_authority); 990 if (def_auth) 991 { 992 DefaultAuthorityDescriptor authority(def_auth); 993 VERBOSE(VB_IMPORTANT, QString("found default authority(SDT) " 994 "for service %1 %2 %3") 995 .arg(info.orig_netid).arg(info.sdt_tsid).arg(info.service_id)); 996 info.default_authority = authority.DefaultAuthority(); 997 } 998 else 999 { 1000 uint64_t index = (uint64_t)info.orig_netid << 32 | 1001 info.sdt_tsid << 16 | info.service_id; 1002 if (defAuthorities.contains(index)) 1003 info.default_authority = defAuthorities[index]; 1004 } 892 1005 } 893 1006 894 1007 uint ChannelScanSM::GetCurrentTransportInfo( … … ChannelScanSM::GetChannelList(transport_scan_items_it_t trans_info, 1039 1152 { 1040 1153 uint pnum = (*sdt_it)->ServiceID(i); 1041 1154 PCM_INFO_INIT("dvb"); 1042 update_info(info, *sdt_it, i );1155 update_info(info, *sdt_it, i, defAuthorities); 1043 1156 } 1044 1157 } 1045 1158 } … … bool ChannelScanSM::HasTimedOut(void) 1293 1406 return timer.elapsed() > (int) kDVBTableTimeout; 1294 1407 if (sd->HasCachedMGT() || sd->HasCachedAnyVCTs()) 1295 1408 return timer.elapsed() > (int) kATSCTableTimeout; 1296 if (sd->HasCachedAnyPAT() || sd->HasCachedAnyPMTs() )1409 if (sd->HasCachedAnyPAT() || sd->HasCachedAnyPMTs() || wait_for_dvbo) 1297 1410 return timer.elapsed() > (int) kMPEGTableTimeout; 1298 1411 1299 1412 return true; -
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 2d36bdc..8bf0427 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, 209 216 bool waitingForTables; 210 217 QTime timer; 211 218 219 bool wait_for_dvbo; 212 220 // Transports List 213 221 int transportsScanned; 214 222 QSet<uint32_t> ts_scanned; … … class ChannelScanSM : public MPEGStreamListener, 219 227 bool currentTestingDecryption; 220 228 QMap<uint, uint> currentEncryptionStatus; 221 229 QMap<uint, bool> currentEncryptionStatusChecked; 230 QMap<uint64_t, QString> defAuthorities; 222 231 223 232 /// Found Channel Info 224 233 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 9a42aff..5b5db3f 100644
a b bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) 429 429 " c.serviceid, c.atsc_major_chan, c.atsc_minor_chan, " 430 430 " c.useonairguide, c.visible, c.freqid, " 431 431 " c.icon, c.tvformat, c.xmltvid, " 432 " d.transportid, d.networkid 432 " d.transportid, d.networkid, c.default_authority " 433 433 "FROM channel AS c, dtv_multiplex AS d " 434 434 "WHERE c.mplexid = :MPLEXID AND" 435 435 " c.mplexid = d.mplexid"); … … bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) 459 459 QString::null, 460 460 false, false, false, false, 461 461 false, false, false, false, 462 false, false, false, 0); 462 false, false, false, 0, 463 query.value(18).toString() /* default_authority */); 463 464 464 465 channels.push_back(chan); 465 466 } -
mythtv/libs/libmythtv/dvbstreamhandler.cpp
diff --git a/mythtv/libs/libmythtv/dvbstreamhandler.cpp b/mythtv/libs/libmythtv/dvbstreamhandler.cpp index d14a188..2a632b2 100644
a b void DVBStreamHandler::RunSR(void) 462 462 463 463 bool DVBStreamHandler::AddPIDFilter(PIDInfo *info) 464 464 { 465 #ifdef DEBUG_PID_FILTERS466 VERBOSE(VB_ RECORD, LOC + QString("AddPIDFilter(0x%1) priority %2")465 //#ifdef DEBUG_PID_FILTERS 466 VERBOSE(VB_IMPORTANT, LOC + QString("AddPIDFilter(0x%1) priority %2") 467 467 .arg(info->_pid, 0, 16).arg(GetPIDPriority(info->_pid))); 468 #endif // DEBUG_PID_FILTERS468 //#endif // DEBUG_PID_FILTERS 469 469 470 470 QMutexLocker writing_locker(&_pid_lock); 471 471 _pid_info[info->_pid] = info;