Ticket #2874: 2874-v1.patch
File 2874-v1.patch, 17.1 KB (added by , 17 years ago) |
---|
-
libs/libmythtv/dvbrecorder.h
78 78 bool IsOpen(void) const { return _stream_fd >= 0; } 79 79 void Close(void); 80 80 81 // MPEG Stream Listener 81 82 void HandlePAT(const ProgramAssociationTable*); 82 83 void HandleCAT(const ConditionalAccessTable*) {} 83 84 void HandlePMT(uint pid, const ProgramMapTable*); 85 void HandleEncryptionStatus(uint pid, bool encrypted) { } 84 86 85 87 void SetStreamData(MPEGStreamData*); 86 88 MPEGStreamData* GetStreamData(void) { return _stream_data; } -
libs/libmythtv/hdhrrecorder.h
46 46 void HandlePAT(const ProgramAssociationTable*); 47 47 void HandleCAT(const ConditionalAccessTable*) {} 48 48 void HandlePMT(uint pid, const ProgramMapTable*); 49 void HandleEncryptionStatus(uint pid, bool encrypted) { } 49 50 50 51 // MPEG Single Program Stream Listener 51 52 void HandleSingleProgramPAT(ProgramAssociationTable *pat); -
libs/libmythtv/signalmonitor.h
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; … … 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; … … 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; … … 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) … … 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) … … 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,"; -
libs/libmythtv/mpeg/mpegstreamdata.cpp
727 727 bool MPEGStreamData::ProcessTSPacket(const TSPacket& tspacket) 728 728 { 729 729 bool ok = !tspacket.TransportError(); 730 731 if (ok && IsEncryptionTestPID(tspacket.PID())) 732 { 733 QMutexLocker locker(&_listener_lock); 734 for (uint i = 0; i < _mpeg_listeners.size(); i++) 735 { 736 _mpeg_listeners[i]->HandleEncryptionStatus( 737 tspacket.PID(), tspacket.ScramplingControl()); 738 } 739 } 740 730 741 if (ok && !tspacket.ScramplingControl() && tspacket.HasPayload() && 731 742 IsListeningPID(tspacket.PID())) 732 743 { 733 744 HandleTSTables(&tspacket); 734 745 } 746 735 747 return ok; 736 748 } 737 749 … … 778 790 return it != _pids_audio.end(); 779 791 } 780 792 793 bool MPEGStreamData::IsEncryptionTestPID(uint pid) const 794 { 795 QMap<uint, bool>::const_iterator it = _pids_encryption.find(pid); 796 return it != _pids_encryption.end(); 797 } 798 781 799 void MPEGStreamData::SavePartialPES(uint pid, PESPacket* packet) 782 800 { 783 801 pid_pes_map_t::iterator it = _partial_pes_packet_cache.find(pid); -
libs/libmythtv/mpeg/streamlisteners.h
1 // -*- Mode: c++ -*- 1 2 #ifndef _STREAMLISTENERS_H_ 2 3 #define _STREAMLISTENERS_H_ 3 4 … … 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 encrypted) = 0; 44 46 }; 45 47 46 48 class MPEGSingleProgramStreamListener -
libs/libmythtv/mpeg/mpegstreamdata.h
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 { … … 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; -
libs/libmythtv/tv_play.cpp
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 { … … 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 … … 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; -
libs/libmythtv/siscan.h
85 85 void HandlePAT(const ProgramAssociationTable*); 86 86 void HandleCAT(const ConditionalAccessTable*) { } 87 87 void HandlePMT(uint, const ProgramMapTable*) { } 88 void HandleEncryptionStatus(uint pid, bool encrypted) { } 88 89 89 90 // ATSC Main 90 91 void HandleSTT(const SystemTimeTable*) {} -
libs/libmythtv/dtvsignalmonitor.h
86 86 void HandlePAT(const ProgramAssociationTable*); 87 87 void HandleCAT(const ConditionalAccessTable*) {} 88 88 void HandlePMT(uint, const ProgramMapTable*); 89 void HandleEncryptionStatus(uint pid, bool encrypted); 89 90 90 91 // ATSC Main 91 92 void HandleSTT(const SystemTimeTable*) {} … … 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; -
libs/libmythtv/dtvsignalmonitor.cpp
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" … … 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", 42 1, true, 0, 1, 0), 39 43 majorChannel(-1), minorChannel(-1), 40 44 networkID(0), transportID(0), 41 45 detectedNetworkID(0), detectedTransportID(0), … … 90 94 } 91 95 #endif 92 96 } 97 if (flags & kDTVSigMon_WaitForCrypt) 98 { 99 list<<seenCrypt.GetName()<<seenCrypt.GetStatus(); 100 list<<matchingCrypt.GetName()<<matchingCrypt.GetStatus(); 101 } 93 102 // atsc tables 94 103 if (flags & kDTVSigMon_WaitForMGT) 95 104 { … … 140 149 seenVCT.SetValue( (flags & kDTVSigMon_VCTSeen) ? 1 : 0); 141 150 seenNIT.SetValue( (flags & kDTVSigMon_NITSeen) ? 1 : 0); 142 151 seenSDT.SetValue( (flags & kDTVSigMon_SDTSeen) ? 1 : 0); 152 seenCrypt.SetValue( (flags & kDTVSigMon_CryptSeen)? 1 : 0); 143 153 matchingPAT.SetValue((flags & kDTVSigMon_PATMatch) ? 1 : 0); 144 154 matchingPMT.SetValue((flags & kDTVSigMon_PMTMatch) ? 1 : 0); 145 155 matchingMGT.SetValue((flags & kDTVSigMon_MGTMatch) ? 1 : 0); 146 156 matchingVCT.SetValue((flags & kDTVSigMon_VCTMatch) ? 1 : 0); 147 157 matchingNIT.SetValue((flags & kDTVSigMon_NITMatch) ? 1 : 0); 148 158 matchingSDT.SetValue((flags & kDTVSigMon_SDTMatch) ? 1 : 0); 159 matchingCrypt.SetValue((flags & kDTVSigMon_CryptMatch) ? 1 : 0); 149 160 } 150 161 151 162 void DTVSignalMonitor::UpdateListeningForEIT(void) … … 179 190 { 180 191 RemoveFlags(kDTVSigMon_PATSeen | kDTVSigMon_PATMatch | 181 192 kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 182 kDTVSigMon_VCTSeen | kDTVSigMon_VCTMatch); 193 kDTVSigMon_VCTSeen | kDTVSigMon_VCTMatch | 194 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 183 195 majorChannel = major; 184 196 minorChannel = minor; 185 197 GetATSCStreamData()->SetDesiredChannel(major, minor); … … 192 204 DBG_SM(QString("SetProgramNumber(%1)").arg(progNum), ""); 193 205 if (programNumber != progNum) 194 206 { 195 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch); 207 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 208 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 196 209 programNumber = progNum; 197 210 if (GetStreamData()) 198 211 GetStreamData()->SetDesiredProgram(programNumber); … … 212 225 } 213 226 214 227 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 215 kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch); 228 kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch | 229 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 216 230 217 231 transportID = tsid; 218 232 networkID = netid; … … 296 310 297 311 void DTVSignalMonitor::HandlePMT(uint, const ProgramMapTable *pmt) 298 312 { 313 bool test_decryption = false; 299 314 AddFlags(kDTVSigMon_PMTSeen); 300 315 301 316 if (programNumber < 0) … … 309 324 return; // Not the PMT we are looking for... 310 325 } 311 326 312 if ( ignoreEncrypted &&pmt->IsEncrypted())327 if (pmt->IsEncrypted()) 313 328 { 314 VERBOSE(VB_IMPORTANT, LOC + "Ignoring encrypted program"); 315 return; 329 if (ignoreEncrypted) 330 { 331 VERBOSE(VB_IMPORTANT, LOC + "Ignoring encrypted program"); 332 return; 333 } 334 else 335 { 336 DVBChannel *dvbchan = dynamic_cast<DVBChannel*>(GetDTVChannel()); 337 if (dvbchan) 338 dvbchan->SetPMT(pmt); 339 340 AddFlags(kDTVSigMon_WaitForCrypt); 341 test_decryption = true; 342 } 316 343 } 317 344 318 345 // if PMT contains audio and/or video stream set as matching. 319 346 uint hasAudio = 0; 320 347 uint hasVideo = 0; 348 bool needVideo = GetStreamData()->GetVideoStreamsRequired(); 321 349 322 350 for (uint i = 0; i < pmt->StreamCount(); i++) 323 351 { 324 hasVideo += pmt->IsVideo(i, GetDTVChannel()->GetSIStandard()); 325 hasAudio += pmt->IsAudio(i, GetDTVChannel()->GetSIStandard()); 352 if (pmt->IsVideo(i, GetDTVChannel()->GetSIStandard())) 353 { 354 hasVideo++; 355 if (needVideo && test_decryption) 356 { 357 test_decryption = false; 358 uint pid = pmt->StreamPID(i); 359 VERBOSE(VB_RECORD, LOC + 360 QString("Trying to decrypt the video stream " 361 "on PID 0x%1.").arg(pid,0,16)); 362 GetStreamData()->AddEncryptionTestPID(pid); 363 GetStreamData()->AddListeningPID(pid); 364 } 365 } 366 if (pmt->IsAudio(i, GetDTVChannel()->GetSIStandard())) 367 { 368 hasAudio++; 369 if (!needVideo && test_decryption) 370 { 371 test_decryption = false; 372 uint pid = pmt->StreamPID(i); 373 VERBOSE(VB_RECORD, LOC + 374 QString("Trying to decrypt the audio stream " 375 "on PID 0x%1.").arg(pid,0,16)); 376 GetStreamData()->AddEncryptionTestPID(pid); 377 GetStreamData()->AddListeningPID(pid); 378 } 379 } 326 380 } 327 381 328 382 if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) && … … 432 486 } 433 487 } 434 488 489 void DTVSignalMonitor::HandleEncryptionStatus(uint pid, bool encrypted) 490 { 491 AddFlags(kDTVSigMon_CryptSeen); 492 if (!encrypted) 493 { 494 VERBOSE(VB_RECORD, LOC + 495 QString("Stream on PID 0x%1 is unencrypted").arg(pid,0,16)); 496 497 GetStreamData()->RemoveEncryptionTestPID(pid); 498 GetStreamData()->RemoveListeningPID(pid); 499 500 AddFlags(kDTVSigMon_CryptMatch); 501 } 502 } 503 435 504 ATSCStreamData *DTVSignalMonitor::GetATSCStreamData() 436 505 { 437 506 return dynamic_cast<ATSCStreamData*>(stream_data); … … 479 548 return false; 480 549 if ((flags & kDTVSigMon_WaitForSDT) && !matchingSDT.IsGood()) 481 550 return false; 551 if ((flags & kDTVSigMon_WaitForCrypt) && !matchingCrypt.IsGood()) 552 return false; 482 553 483 554 return true; 484 555 }