Ticket #2874: encryption_sigmon.diff
File encryption_sigmon.diff, 18.2 KB (added by , 17 years ago) |
---|
-
mythtv/libs/libmythtv/dtvsignalmonitor.cpp
diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp index 52ddf2f..b30d44b 100644
a b 1 1 #include <unistd.h> 2 2 3 3 #include "dtvchannel.h" 4 #include "dvbchannel.h" 4 5 #include "dtvsignalmonitor.h" 5 6 #include "scanstreamdata.h" 6 7 #include "mpegtables.h" … … DTVSignalMonitor::DTVSignalMonitor(int db_cardnum, 30 31 seenVCT(tr("Seen")+" VCT", "seen_vct", 1, true, 0, 1, 0), 31 32 seenNIT(tr("Seen")+" NIT", "seen_nit", 1, true, 0, 1, 0), 32 33 seenSDT(tr("Seen")+" SDT", "seen_sdt", 1, true, 0, 1, 0), 34 seenCrypt(tr("Seen")+" Crypt", "seen_crypt", 1, true, 0, 1, 0), 33 35 matchingPAT(tr("Matching")+" PAT", "matching_pat", 1, true, 0, 1, 0), 34 36 matchingPMT(tr("Matching")+" PMT", "matching_pmt", 1, true, 0, 1, 0), 35 37 matchingMGT(tr("Matching")+" MGT", "matching_mgt", 1, true, 0, 1, 0), 36 38 matchingVCT(tr("Matching")+" VCT", "matching_vct", 1, true, 0, 1, 0), 37 39 matchingNIT(tr("Matching")+" NIT", "matching_nit", 1, true, 0, 1, 0), 38 40 matchingSDT(tr("Matching")+" SDT", "matching_sdt", 1, true, 0, 1, 0), 41 matchingCrypt(tr("Matching")+" Crypt", "matching_crypt", 1, true, 0, 1, 0), 39 42 majorChannel(-1), minorChannel(-1), 40 43 networkID(0), transportID(0), 41 44 detectedNetworkID(0), detectedTransportID(0), … … QStringList DTVSignalMonitor::GetStatusList(bool kick) 112 115 list<<seenSDT.GetName()<<seenSDT.GetStatus(); 113 116 list<<matchingSDT.GetName()<<matchingSDT.GetStatus(); 114 117 } 118 if (flags & kDTVSigMon_WaitForCrypt) 119 { 120 list<<seenCrypt.GetName()<<seenCrypt.GetStatus(); 121 list<<matchingCrypt.GetName()<<matchingCrypt.GetStatus(); 122 } 115 123 if (error != "") 116 124 { 117 125 list<<"error"<<error; … … void DTVSignalMonitor::UpdateMonitorValues(void) 140 148 seenVCT.SetValue( (flags & kDTVSigMon_VCTSeen) ? 1 : 0); 141 149 seenNIT.SetValue( (flags & kDTVSigMon_NITSeen) ? 1 : 0); 142 150 seenSDT.SetValue( (flags & kDTVSigMon_SDTSeen) ? 1 : 0); 151 seenCrypt.SetValue( (flags & kDTVSigMon_CryptSeen) ? 1 : 0); 143 152 matchingPAT.SetValue((flags & kDTVSigMon_PATMatch) ? 1 : 0); 144 153 matchingPMT.SetValue((flags & kDTVSigMon_PMTMatch) ? 1 : 0); 145 154 matchingMGT.SetValue((flags & kDTVSigMon_MGTMatch) ? 1 : 0); 146 155 matchingVCT.SetValue((flags & kDTVSigMon_VCTMatch) ? 1 : 0); 147 156 matchingNIT.SetValue((flags & kDTVSigMon_NITMatch) ? 1 : 0); 148 157 matchingSDT.SetValue((flags & kDTVSigMon_SDTMatch) ? 1 : 0); 158 matchingCrypt.SetValue((flags & kDTVSigMon_CryptMatch) ? 1 : 0); 149 159 } 150 160 151 161 void DTVSignalMonitor::UpdateListeningForEIT(void) … … void DTVSignalMonitor::SetChannel(int major, int minor) 179 189 { 180 190 RemoveFlags(kDTVSigMon_PATSeen | kDTVSigMon_PATMatch | 181 191 kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 182 kDTVSigMon_VCTSeen | kDTVSigMon_VCTMatch); 192 kDTVSigMon_VCTSeen | kDTVSigMon_VCTMatch | 193 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 183 194 majorChannel = major; 184 195 minorChannel = minor; 185 196 GetATSCStreamData()->SetDesiredChannel(major, minor); … … void DTVSignalMonitor::SetProgramNumber(int progNum) 192 203 DBG_SM(QString("SetProgramNumber(%1)").arg(progNum), ""); 193 204 if (programNumber != progNum) 194 205 { 195 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch); 206 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 207 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 196 208 programNumber = progNum; 197 209 if (GetStreamData()) 198 210 GetStreamData()->SetDesiredProgram(programNumber); … … void DTVSignalMonitor::SetDVBService(uint netid, uint tsid, int serviceid) 212 224 } 213 225 214 226 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 215 kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch); 227 kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch | 228 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 216 229 217 230 transportID = tsid; 218 231 networkID = netid; … … void DTVSignalMonitor::HandlePAT(const ProgramAssociationTable *pat) 296 309 297 310 void DTVSignalMonitor::HandlePMT(uint, const ProgramMapTable *pmt) 298 311 { 312 bool test_decryption = false; 299 313 AddFlags(kDTVSigMon_PMTSeen); 300 314 301 315 if (programNumber < 0) … … void DTVSignalMonitor::HandlePMT(uint, const ProgramMapTable *pmt) 309 323 return; // Not the PMT we are looking for... 310 324 } 311 325 312 if ( ignoreEncrypted &&pmt->IsEncrypted())326 if (pmt->IsEncrypted()) 313 327 { 314 VERBOSE(VB_IMPORTANT, LOC + "Ignoring encrypted program"); 315 return; 328 if (ignoreEncrypted) 329 { 330 VERBOSE(VB_IMPORTANT, LOC + "Ignoring encrypted program"); 331 return; 332 } 333 else 334 { 335 DVBChannel* dvbchan = dynamic_cast<DVBChannel*>(GetDTVChannel()); 336 if (dvbchan) 337 dvbchan->SetPMT(pmt); 338 AddFlags(kDTVSigMon_WaitForCrypt); 339 test_decryption = true; 340 } 316 341 } 317 342 318 343 // if PMT contains audio and/or video stream set as matching. 319 344 uint hasAudio = 0; 320 345 uint hasVideo = 0; 346 bool needVideo = GetStreamData()->GetVideoStreamsRequired(); 321 347 322 348 for (uint i = 0; i < pmt->StreamCount(); i++) 323 349 { 324 hasVideo += pmt->IsVideo(i, GetDTVChannel()->GetSIStandard()); 325 hasAudio += pmt->IsAudio(i, GetDTVChannel()->GetSIStandard()); 350 if (pmt->IsVideo(i, GetDTVChannel()->GetSIStandard())) 351 { 352 hasVideo++; 353 if (needVideo && test_decryption) 354 { 355 test_decryption = false; 356 uint pid = pmt->StreamPID(i); 357 VERBOSE(VB_RECORD, QString("Trying to decrypt the video stream " 358 "on PID %1.").arg(pid)); 359 GetStreamData()->AddEncryptionTestPID(pid); 360 GetStreamData()->AddListeningPID(pid); 361 } 362 } 363 if (pmt->IsAudio(i, GetDTVChannel()->GetSIStandard())) 364 { 365 hasAudio++; 366 if (!needVideo && test_decryption) 367 { 368 test_decryption = false; 369 uint pid = pmt->StreamPID(i); 370 VERBOSE(VB_RECORD, QString("Trying to decrypt the audio stream " 371 "on PID %1.").arg(pid)); 372 GetStreamData()->AddEncryptionTestPID(pid); 373 GetStreamData()->AddListeningPID(pid); 374 } 375 } 326 376 } 327 377 328 378 if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) && … … void DTVSignalMonitor::HandleSDT(uint, const ServiceDescriptionTable *sdt) 432 482 } 433 483 } 434 484 485 void DTVSignalMonitor::HandleEncryptionStatus(uint pid, bool enc_status) 486 { 487 488 AddFlags(kDTVSigMon_CryptSeen); 489 if (!enc_status) 490 { 491 VERBOSE(VB_RECORD, QString("Stream on PID %1 is unencrypted").arg(pid)); 492 GetStreamData()->RemoveEncryptionTestPID(pid); 493 GetStreamData()->RemoveListeningPID(pid); 494 //RemoveFlags(kDTVSigMon_WaitForCrypt); 495 AddFlags(kDTVSigMon_CryptMatch); 496 } 497 } 498 435 499 ATSCStreamData *DTVSignalMonitor::GetATSCStreamData() 436 500 { 437 501 return dynamic_cast<ATSCStreamData*>(stream_data); … … bool DTVSignalMonitor::IsAllGood(void) const 479 543 return false; 480 544 if ((flags & kDTVSigMon_WaitForSDT) && !matchingSDT.IsGood()) 481 545 return false; 546 if ((flags & kDTVSigMon_WaitForCrypt) && !matchingCrypt.IsGood()) 547 return false; 482 548 483 549 return true; 484 550 } -
mythtv/libs/libmythtv/dtvsignalmonitor.h
diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.h b/mythtv/libs/libmythtv/dtvsignalmonitor.h index 4547b22..d52225e 100644
a b class DTVSignalMonitor : public SignalMonitor, 86 86 void HandlePAT(const ProgramAssociationTable*); 87 87 void HandleCAT(const ConditionalAccessTable*) {} 88 88 void HandlePMT(uint, const ProgramMapTable*); 89 void HandleEncryptionStatus(uint, bool enc_status); 89 90 90 91 // ATSC Main 91 92 void HandleSTT(const SystemTimeTable*) {} … … class DTVSignalMonitor : public SignalMonitor, 118 119 SignalMonitorValue seenVCT; 119 120 SignalMonitorValue seenNIT; 120 121 SignalMonitorValue seenSDT; 122 SignalMonitorValue seenCrypt; 121 123 SignalMonitorValue matchingPAT; 122 124 SignalMonitorValue matchingPMT; 123 125 SignalMonitorValue matchingMGT; 124 126 SignalMonitorValue matchingVCT; 125 127 SignalMonitorValue matchingNIT; 126 128 SignalMonitorValue matchingSDT; 129 SignalMonitorValue matchingCrypt; 127 130 128 131 // ATSC tuning info 129 132 int majorChannel; -
mythtv/libs/libmythtv/dvbrecorder.h
diff --git a/mythtv/libs/libmythtv/dvbrecorder.h b/mythtv/libs/libmythtv/dvbrecorder.h index 69fba97..7104af2 100644
a b class DVBRecorder : public DTVRecorder, 81 81 void HandlePAT(const ProgramAssociationTable*); 82 82 void HandleCAT(const ConditionalAccessTable*) {} 83 83 void HandlePMT(uint pid, const ProgramMapTable*); 84 void HandleEncryptionStatus(uint, bool) { } 84 85 85 86 void SetStreamData(MPEGStreamData*); 86 87 MPEGStreamData* GetStreamData(void) { return _stream_data; } -
mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp index 246ef84..a6eee70 100644
a b bool MPEGStreamData::ProcessTSPacket(const TSPacket& tspacket) 728 728 { 729 729 bool ok = !tspacket.TransportError(); 730 730 if (ok && !tspacket.ScramplingControl() && tspacket.HasPayload() && 731 IsListeningPID(tspacket.PID()) )731 IsListeningPID(tspacket.PID()) && !IsEncryptionTestPID(tspacket.PID())) 732 732 { 733 733 HandleTSTables(&tspacket); 734 734 } 735 else if (IsEncryptionTestPID(tspacket.PID())) 736 { 737 _listener_lock.lock(); 738 for (uint i = 0; i < _mpeg_listeners.size(); i++) 739 _mpeg_listeners[i]->HandleEncryptionStatus(tspacket.PID(), 740 tspacket.ScramplingControl()); 741 _listener_lock.unlock(); 742 } 743 735 744 return ok; 736 745 } 737 746 … … bool MPEGStreamData::IsAudioPID(uint pid) const 778 787 return it != _pids_audio.end(); 779 788 } 780 789 790 bool MPEGStreamData::IsEncryptionTestPID(uint pid) const 791 { 792 QMap<uint, bool>::const_iterator it = _pids_encryption.find(pid); 793 return it != _pids_encryption.end(); 794 } 795 781 796 void MPEGStreamData::SavePartialPES(uint pid, PESPacket* packet) 782 797 { 783 798 pid_pes_map_t::iterator it = _partial_pes_packet_cache.find(pid); -
mythtv/libs/libmythtv/mpeg/mpegstreamdata.h
diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h index fd053a2..9b6c46f 100644
a b class MPEGStreamData : public EITSource 74 74 virtual void AddNotListeningPID(uint pid){_pids_notlistening[pid] = true;} 75 75 virtual void AddWritingPID(uint pid) { _pids_writing[pid] = true; } 76 76 virtual void AddAudioPID(uint pid) { _pids_audio[pid] = true; } 77 virtual void AddEncryptionTestPID(uint pid) { _pids_encryption[pid] = true;} 77 78 78 79 virtual void RemoveListeningPID(uint pid) { _pids_listening.erase(pid); } 79 80 virtual void RemoveNotListeningPID(uint pid) 80 81 { _pids_notlistening.erase(pid); } 81 82 virtual void RemoveWritingPID(uint pid) { _pids_writing.erase(pid); } 82 83 virtual void RemoveAudioPID(uint pid) { _pids_audio.erase(pid); } 84 virtual void RemoveEncryptionTestPID(uint pid) { _pids_encryption.erase(pid);} 83 85 84 86 virtual bool IsListeningPID(uint pid) const; 85 87 virtual bool IsNotListeningPID(uint pid) const; 86 88 virtual bool IsWritingPID(uint pid) const; 87 89 virtual bool IsAudioPID(uint pid) const; 90 virtual bool IsEncryptionTestPID(uint pid) const; 88 91 89 92 virtual QMap<uint, bool> ListeningPIDs(void) const 90 93 { return _pids_listening; } 91 94 95 virtual QMap<uint, bool> EncryptionTestPID(void) const 96 { return _pids_encryption; } 97 98 92 99 // Table versions 93 100 void SetVersionPAT(uint tsid, int version, uint last_section) 94 101 { … … class MPEGStreamData : public EITSource 237 244 QMap<uint, bool> _pids_notlistening; 238 245 QMap<uint, bool> _pids_writing; 239 246 QMap<uint, bool> _pids_audio; 247 QMap<uint, bool> _pids_encryption; 240 248 241 249 // Signals 242 250 mutable QMutex _listener_lock; -
mythtv/libs/libmythtv/mpeg/streamlisteners.h
diff --git a/mythtv/libs/libmythtv/mpeg/streamlisteners.h b/mythtv/libs/libmythtv/mpeg/streamlisteners.h index 7a719ec..a884b00 100644
a b 1 // -*- Mode: c++ -*- 1 2 #ifndef _STREAMLISTENERS_H_ 2 3 #define _STREAMLISTENERS_H_ 3 4 … … class MPEGStreamListener 41 42 virtual void HandlePAT(const ProgramAssociationTable*) = 0; 42 43 virtual void HandleCAT(const ConditionalAccessTable*) = 0; 43 44 virtual void HandlePMT(uint program_num, const ProgramMapTable*) = 0; 45 virtual void HandleEncryptionStatus(uint pid, bool) = 0; 44 46 }; 45 47 46 48 class MPEGSingleProgramStreamListener -
mythtv/libs/libmythtv/signalmonitor.h
diff --git a/mythtv/libs/libmythtv/signalmonitor.h b/mythtv/libs/libmythtv/signalmonitor.h index 0ecb13a..80aa7cb 100644
a b class SignalMonitor : public QObject 148 148 static const uint64_t kDTVSigMon_SDTSeen = 0x0000000080ULL; 149 149 /// We've seen the FireWire STB power state 150 150 static const uint64_t kFWSigMon_PowerSeen = 0x0000000100ULL; 151 /// We can encrypt the stream 152 static const uint64_t kDTVSigMon_CryptSeen = 0x0000000200ULL; 151 153 152 154 /// We've seen a PAT matching our requirements 153 155 static const uint64_t kDTVSigMon_PATMatch = 0x0000001000ULL; … … class SignalMonitor : public QObject 167 169 static const uint64_t kDTVSigMon_SDTMatch = 0x0000080000ULL; 168 170 /// We've seen a FireWire STB power state matching our requirements 169 171 static const uint64_t kFWSigMon_PowerMatch = 0x0000100000ULL; 172 /// We can encrypt the stream 173 static const uint64_t kDTVSigMon_CryptMatch = 0x0000200000ULL; 170 174 171 175 static const uint64_t kDTVSigMon_WaitForPAT = 0x0001000000ULL; 172 176 static const uint64_t kDTVSigMon_WaitForPMT = 0x0002000000ULL; … … class SignalMonitor : public QObject 176 180 static const uint64_t kDTVSigMon_WaitForSDT = 0x0020000000ULL; 177 181 static const uint64_t kDTVSigMon_WaitForSig = 0x0040000000ULL; 178 182 static const uint64_t kFWSigMon_WaitForPower= 0x0080000000ULL; 183 static const uint64_t kDTVSigMon_WaitForCrypt= 0x1000000000ULL; 179 184 180 static const uint64_t kDTVSigMon_WaitForAll = 0x 00FF000000ULL;185 static const uint64_t kDTVSigMon_WaitForAll = 0x10FF000000ULL; 181 186 182 187 /// Wait for the Signal to Noise Ratio to rise above a threshhold 183 188 static const uint64_t kDVBSigMon_WaitForSNR = 0x0100000000ULL; … … inline QString sm_flags_to_string(uint64_t flags) 228 233 str += "SDT,"; 229 234 if (SignalMonitor::kFWSigMon_PowerSeen & flags) 230 235 str += "STB,"; 236 if (SignalMonitor::kDTVSigMon_CryptSeen & flags) 237 str += "Crypt,"; 231 238 232 239 str += ") Match("; 233 240 if (SignalMonitor::kDTVSigMon_PATMatch & flags) … … inline QString sm_flags_to_string(uint64_t flags) 248 255 str += "SDT,"; 249 256 if (SignalMonitor::kFWSigMon_PowerMatch & flags) 250 257 str += "STB,"; 258 if (SignalMonitor::kDTVSigMon_CryptMatch & flags) 259 str += "Crypt,"; 251 260 252 261 str += ") Wait("; 253 262 if (SignalMonitor::kDTVSigMon_WaitForPAT & flags) … … inline QString sm_flags_to_string(uint64_t flags) 266 275 str += "Sig,"; 267 276 if (SignalMonitor::kFWSigMon_WaitForPower& flags) 268 277 str += "STB,"; 278 if (SignalMonitor::kDTVSigMon_WaitForCrypt & flags) 279 str += "Crypt,"; 269 280 270 281 if (SignalMonitor::kDVBSigMon_WaitForSNR & flags) 271 282 str += "SNR,"; -
mythtv/libs/libmythtv/signalmonitorvalue.h
diff --git a/mythtv/libs/libmythtv/signalmonitorvalue.h b/mythtv/libs/libmythtv/signalmonitorvalue.h index 67d1d52..ef0e296 100644
a b 1 // -*- Mode: c++ -*- 1 2 #ifndef SIGNALMONITORVALUES_H 2 3 #define SIGNALMONITORVALUES_H 3 4 -
mythtv/libs/libmythtv/siscan.h
diff --git a/mythtv/libs/libmythtv/siscan.h b/mythtv/libs/libmythtv/siscan.h index 9af8abc..044eb96 100644
a b class SIScan : public QObject, 85 85 void HandlePAT(const ProgramAssociationTable*); 86 86 void HandleCAT(const ConditionalAccessTable*) { } 87 87 void HandlePMT(uint, const ProgramMapTable*) { } 88 void HandleEncryptionStatus(uint, bool) { } 88 89 89 90 // ATSC Main 90 91 void HandleSTT(const SystemTimeTable*) {} -
mythtv/libs/libmythtv/tv_play.cpp
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp index 34ff5eb..2959ecf 100644
a b void TV::UpdateOSDSignal(const QStringList& strlist) 4686 4686 float snr = 0.0f; 4687 4687 uint ber = 0xffffffff; 4688 4688 int pos = -1; 4689 QString pat(""), pmt(""), mgt(""), vct(""), nit(""), sdt("") ;4689 QString pat(""), pmt(""), mgt(""), vct(""), nit(""), sdt(""), crypt(""); 4690 4690 QString err = QString::null, msg = QString::null; 4691 4691 for (it = slist.begin(); it != slist.end(); ++it) 4692 4692 { … … void TV::UpdateOSDSignal(const QStringList& strlist) 4736 4736 sdt = it->IsGood() ? "s" : "_"; 4737 4737 else if ("matching_sdt" == it->GetShortName()) 4738 4738 sdt = it->IsGood() ? "S" : sdt; 4739 else if ("seen_crypt" == it->GetShortName()) 4740 crypt = it->IsGood() ? "c" : "_"; 4741 else if ("matching_crypt" == it->GetShortName()) 4742 crypt = it->IsGood() ? "C" : crypt; 4739 4743 } 4740 4744 if (sig) 4741 4745 infoMap["signal"] = QString::number(sig); // use normalized value … … void TV::UpdateOSDSignal(const QStringList& strlist) 4753 4757 if ((pos >= 0) && (pos < 100)) 4754 4758 sigDesc += " | " + tr("Rotor %1\%").arg(pos,2); 4755 4759 4756 sigDesc = sigDesc + QString(" | (%1%2%3%4%5%6%7 ) %8")4760 sigDesc = sigDesc + QString(" | (%1%2%3%4%5%6%7%8) %9") 4757 4761 .arg(slock).arg(pat).arg(pmt).arg(mgt).arg(vct) 4758 .arg(nit).arg(sdt).arg( sigMsg);4762 .arg(nit).arg(sdt).arg(crypt).arg(sigMsg); 4759 4763 4760 4764 if (!err.isEmpty()) 4761 4765 sigDesc = err;