Ticket #2874: 2874-v4.patch
File 2874-v4.patch, 28.1 KB (added by , 17 years ago) |
---|
-
libs/libmythtv/dvbrecorder.h
84 84 void HandlePAT(const ProgramAssociationTable*); 85 85 void HandleCAT(const ConditionalAccessTable*) {} 86 86 void HandlePMT(uint pid, const ProgramMapTable*); 87 void HandleEncryptionStatus(uint /*pnum*/, bool /*encrypted*/) { } 87 88 88 89 // ATSC Main 89 90 void HandleSTT(const SystemTimeTable*); -
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 /*pnum*/, 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=0x0100000000ULL; 179 184 180 static const uint64_t kDTVSigMon_WaitForAll = 0x0 0FF000000ULL;185 static const uint64_t kDTVSigMon_WaitForAll = 0x01FF000000ULL; 181 186 182 187 /// Wait for the Signal to Noise Ratio to rise above a threshhold 183 static const uint64_t kDVBSigMon_WaitForSNR = 0x 0100000000ULL;188 static const uint64_t kDVBSigMon_WaitForSNR = 0x1000000000ULL; 184 189 /// Wait for the Bit Error Rate to fall below a threshhold 185 static const uint64_t kDVBSigMon_WaitForBER = 0x 0200000000ULL;190 static const uint64_t kDVBSigMon_WaitForBER = 0x2000000000ULL; 186 191 /// Wait for uncorrected FEC blocks to fall below a threshhold 187 static const uint64_t kDVBSigMon_WaitForUB = 0x 0400000000ULL;192 static const uint64_t kDVBSigMon_WaitForUB = 0x4000000000ULL; 188 193 /// Wait for rotor to complete turning the antenna 189 static const uint64_t kDVBSigMon_WaitForPos = 0x 0800000000ULL;194 static const uint64_t kDVBSigMon_WaitForPos = 0x8000000000ULL; 190 195 191 196 protected: 192 197 pthread_t monitor_thread; … … 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
1 1 // -*- Mode: c++ -*- 2 2 // Copyright (c) 2003-2004, Daniel Thor Kristjansson 3 3 4 #include <algorithm> // for find 5 using namespace std; 6 4 7 // POSIX headers 5 8 #include <sys/time.h> // for gettimeofday 6 9 … … 54 57 _local_utc_offset(0), _si_time_offset_cnt(0), 55 58 _si_time_offset_indx(0), 56 59 _eit_helper(NULL), _eit_rate(0.0f), 57 _ listener_lock(true),60 _encryption_lock(true), _listener_lock(true), 58 61 _cache_tables(cacheTables), _cache_lock(true), 59 62 // Single program stuff 60 63 _desired_program(desiredProgram), … … 172 175 _cached_pmts.clear(); 173 176 } 174 177 178 ResetDecryptionMonitoringState(); 179 175 180 AddListeningPID(MPEG_PAT_PID); 176 181 } 177 182 … … 777 782 bool MPEGStreamData::ProcessTSPacket(const TSPacket& tspacket) 778 783 { 779 784 bool ok = !tspacket.TransportError(); 785 786 if (IsEncryptionTestPID(tspacket.PID())) 787 { 788 ProcessEncryptedPacket(tspacket); 789 } 790 780 791 if (ok && !tspacket.ScramplingControl() && tspacket.HasPayload() && 781 792 IsListeningPID(tspacket.PID())) 782 793 { 783 794 HandleTSTables(&tspacket); 784 795 } 796 785 797 return ok; 786 798 } 787 799 … … 1239 1251 } 1240 1252 } 1241 1253 } 1254 1255 void MPEGStreamData::AddEncryptionTestPID(uint pnum, uint pid, bool isvideo) 1256 { 1257 QMutexLocker locker(&_encryption_lock); 1258 1259 //VERBOSE(VB_IMPORTANT, "AddEncryptionTestPID("<<pnum 1260 // <<", 0x"<<hex<<pid<<dec<<")"); 1261 1262 _encryption_pid_to_info[pid] = CryptInfo((isvideo) ? 10000 : 500, 8); 1263 1264 _encryption_pid_to_pnums[pid].push_back(pnum); 1265 _encryption_pnum_to_pids[pnum].push_back(pid); 1266 _encryption_pnum_to_status[pnum] = kEncUnknown; 1267 } 1268 1269 void MPEGStreamData::RemoveEncryptionTestPIDs(uint pnum) 1270 { 1271 QMutexLocker locker(&_encryption_lock); 1272 1273 //VERBOSE(VB_RECORD, 1274 // QString("Tearing down up decryption monitoring " 1275 // "for program %1").arg(pnum)); 1276 1277 QMap<uint, uint_vec_t>::iterator list; 1278 uint_vec_t::iterator it; 1279 1280 uint_vec_t pids = _encryption_pnum_to_pids[pnum]; 1281 for (uint i = 0; i < pids.size(); i++) 1282 { 1283 uint pid = pids[i]; 1284 1285 //VERBOSE(VB_IMPORTANT, QString("Removing 0x%1 PID Enc monitoring") 1286 // .arg(pid,0,16)); 1287 1288 list = _encryption_pid_to_pnums.find(pid); 1289 if (list != _encryption_pid_to_pnums.end()) 1290 { 1291 it = find((*list).begin(), (*list).end(), pnum); 1292 1293 if (it != (*list).end()) 1294 (*list).erase(it); 1295 1296 if ((*list).empty()) 1297 { 1298 _encryption_pid_to_pnums.erase(pid); 1299 _encryption_pid_to_info.erase(pid); 1300 } 1301 } 1302 } 1303 1304 _encryption_pnum_to_pids.erase(pnum); 1305 } 1306 1307 bool MPEGStreamData::IsEncryptionTestPID(uint pid) const 1308 { 1309 QMutexLocker locker(&_encryption_lock); 1310 1311 QMap<uint, CryptInfo>::const_iterator it = 1312 _encryption_pid_to_info.find(pid); 1313 1314 return it != _encryption_pid_to_info.end(); 1315 } 1316 1317 void MPEGStreamData::TestDecryption(const ProgramMapTable *pmt) 1318 { 1319 QMutexLocker locker(&_encryption_lock); 1320 1321 //VERBOSE(VB_RECORD, 1322 // QString("Setting up decryption monitoring " 1323 // "for program %1").arg(pmt->ProgramNumber())); 1324 1325 bool encrypted = pmt->IsProgramEncrypted(); 1326 for (uint i = 0; i < pmt->StreamCount(); i++) 1327 { 1328 if (!encrypted && !pmt->IsStreamEncrypted(i)) 1329 continue; 1330 1331 bool is_vid = pmt->IsVideo(i, _sistandard); 1332 bool is_aud = pmt->IsAudio(i, _sistandard); 1333 if (is_vid || is_aud) 1334 { 1335 AddEncryptionTestPID( 1336 pmt->ProgramNumber(), pmt->StreamPID(i), is_vid); 1337 } 1338 } 1339 } 1340 1341 void MPEGStreamData::ResetDecryptionMonitoringState(void) 1342 { 1343 QMutexLocker locker(&_encryption_lock); 1344 1345 _encryption_pid_to_info.clear(); 1346 _encryption_pid_to_pnums.clear(); 1347 _encryption_pnum_to_pids.clear(); 1348 } 1349 1350 bool MPEGStreamData::IsProgramDecrypted(uint pnum) const 1351 { 1352 QMutexLocker locker(&_encryption_lock); 1353 return _encryption_pnum_to_status[pnum] == kEncDecrypted; 1354 } 1355 1356 bool MPEGStreamData::IsProgramEncrypted(uint pnum) const 1357 { 1358 QMutexLocker locker(&_encryption_lock); 1359 return _encryption_pnum_to_status[pnum] == kEncEncrypted; 1360 } 1361 1362 static QString toString(CryptStatus status) 1363 { 1364 if (kEncDecrypted == status) 1365 return "Decrypted"; 1366 else if (kEncEncrypted == status) 1367 return "Encrypted"; 1368 else 1369 return "Unknown"; 1370 } 1371 1372 /** \fn MPEGStreamData::ProcessEncryptedPacket(const TSPacket& tspacket) 1373 * \brief counts en/decrypted packets to decide if a stream is en/decrypted 1374 */ 1375 void MPEGStreamData::ProcessEncryptedPacket(const TSPacket& tspacket) 1376 { 1377 QMutexLocker locker(&_encryption_lock); 1378 1379 const uint pid = tspacket.PID(); 1380 CryptInfo &info = _encryption_pid_to_info[pid]; 1381 1382 CryptStatus status = kEncUnknown; 1383 1384 if (tspacket.ScramplingControl()) 1385 { 1386 info.decrypted_packets = 0; 1387 1388 // If a fair amount of encrypted packets is passed assume that 1389 // the stream is not decryptable 1390 if (++info.encrypted_packets >= info.encrypted_min) 1391 status = kEncEncrypted; 1392 } 1393 else 1394 { 1395 info.encrypted_packets = 0; 1396 if (++info.decrypted_packets > info.decrypted_min) 1397 status = kEncDecrypted; 1398 } 1399 1400 if (status == info.status) 1401 return; // pid encryption status unchanged 1402 1403 info.status = status; 1404 1405 VERBOSE(VB_IMPORTANT, QString("PID 0x%1 status: %2") 1406 .arg(pid,0,16).arg(status)); 1407 1408 uint_vec_t pnum_del_list; 1409 const uint_vec_t &pnums = _encryption_pid_to_pnums[pid]; 1410 for (uint i = 0; i < pnums.size(); i++) 1411 { 1412 CryptStatus status = _encryption_pnum_to_status[pnums[i]]; 1413 1414 const uint_vec_t &pids = _encryption_pnum_to_pids[pnums[i]]; 1415 if (!pids.empty()) 1416 { 1417 uint enc_cnt[3] = { 0, 0, 0 }; 1418 for (uint j = 0; j < pids.size(); j++) 1419 { 1420 CryptStatus stat = _encryption_pid_to_info[pids[j]].status; 1421 enc_cnt[stat]++; 1422 1423 //VERBOSE(VB_IMPORTANT, 1424 // QString("\tpnum %1 PID 0x%2 status: %3") 1425 // .arg(pnums[i]).arg(pids[j],0,16) 1426 // .arg(toString(stat))); 1427 } 1428 status = kEncUnknown; 1429 1430 if (enc_cnt[kEncEncrypted]) 1431 status = kEncEncrypted; 1432 else if (enc_cnt[kEncDecrypted] >= 2) 1433 status = kEncDecrypted; 1434 } 1435 1436 if (status == _encryption_pnum_to_status[pnums[i]]) 1437 continue; // program encryption status unchanged 1438 1439 VERBOSE(VB_RECORD, QString("Program %1 status: %2") 1440 .arg(pnums[i]).arg(toString(status))); 1441 1442 _encryption_pnum_to_status[pnums[i]] = status; 1443 1444 _listener_lock.lock(); 1445 for (uint j = 0; j < _mpeg_listeners.size(); j++) 1446 { 1447 _mpeg_listeners[j]->HandleEncryptionStatus( 1448 pnums[i], toString(status)); 1449 } 1450 _listener_lock.unlock(); 1451 1452 if (status != kEncUnknown) 1453 pnum_del_list.push_back(pnums[i]); 1454 } 1455 1456 for (uint i = 0; i < pnum_del_list.size(); i++) 1457 RemoveEncryptionTestPIDs(pnums[i]); 1458 } -
libs/libmythtv/mpeg/mpegtables.h
528 528 bool IsVideo(uint i, QString sistandard) const; 529 529 bool IsAudio(uint i, QString sistandard) const; 530 530 bool IsEncrypted(void) const; 531 bool IsProgramEncrypted(void) const; 532 bool IsStreamEncrypted(uint pid) const; 531 533 /// Returns true iff PMT contains a still-picture video stream 532 534 bool IsStillPicture(QString sistandard) const; 533 535 /// Returns a string representation of type at stream index i -
libs/libmythtv/mpeg/streamlisteners.h
1 // -*- Mode: c++ -*- 1 2 #ifndef _STREAMLISTENERS_H_ 2 3 #define _STREAMLISTENERS_H_ 3 4 … … 42 43 virtual void HandlePAT(const ProgramAssociationTable*) = 0; 43 44 virtual void HandleCAT(const ConditionalAccessTable*) = 0; 44 45 virtual void HandlePMT(uint program_num, const ProgramMapTable*) = 0; 46 virtual void HandleEncryptionStatus(uint program_number, bool) = 0; 45 47 }; 46 48 47 49 class MPEGSingleProgramStreamListener -
libs/libmythtv/mpeg/mpegstreamdata.h
40 40 typedef vector<MPEGStreamListener*> mpeg_listener_vec_t; 41 41 typedef vector<MPEGSingleProgramStreamListener*> mpeg_sp_listener_vec_t; 42 42 43 typedef enum 44 { 45 kEncUnknown = 0, 46 kEncDecrypted = 1, 47 kEncEncrypted = 2, 48 } CryptStatus; 49 50 class CryptInfo 51 { 52 public: 53 CryptInfo() : 54 status(kEncUnknown), encrypted_packets(0), decrypted_packets(0), 55 encrypted_min(1000), decrypted_min(8) { } 56 CryptInfo(uint e, uint d) : 57 status(kEncUnknown), encrypted_packets(0), decrypted_packets(0), 58 encrypted_min(e), decrypted_min(d) { } 59 60 public: 61 CryptStatus status; 62 uint encrypted_packets; 63 uint decrypted_packets; 64 uint encrypted_min; 65 uint decrypted_min; 66 }; 67 43 68 void init_sections(sections_t §, uint last_section); 44 69 45 70 class MPEGStreamData : public EITSource … … 158 183 virtual void ReturnCachedPMTTables(pmt_vec_t&) const; 159 184 virtual void ReturnCachedPMTTables(pmt_map_t&) const; 160 185 186 // Encryption Monitoring 187 void AddEncryptionTestPID(uint pnum, uint pid, bool isvideo); 188 void RemoveEncryptionTestPIDs(uint pnum); 189 bool IsEncryptionTestPID(uint pid) const; 190 191 void TestDecryption(const ProgramMapTable* pmt); 192 void ResetDecryptionMonitoringState(void); 193 194 bool IsProgramDecrypted(uint pnum) const; 195 bool IsProgramEncrypted(uint pnum) const; 196 161 197 // "signals" 162 198 void AddMPEGListener(MPEGStreamListener*); 163 199 void RemoveMPEGListener(MPEGStreamListener*); … … 218 254 void DeletePartialPES(uint pid); 219 255 void ProcessPAT(const ProgramAssociationTable *pat); 220 256 void ProcessPMT(const ProgramMapTable *pmt); 257 void ProcessEncryptedPacket(const TSPacket&); 221 258 222 259 static int ResyncStream(unsigned char *buffer, int curr_pos, int len); 223 260 … … 251 288 QMap<uint, bool> _pids_writing; 252 289 QMap<uint, bool> _pids_audio; 253 290 291 // Encryption monitoring 292 mutable QMutex _encryption_lock; 293 QMap<uint, CryptInfo> _encryption_pid_to_info; 294 QMap<uint, uint_vec_t> _encryption_pnum_to_pids; 295 QMap<uint, uint_vec_t> _encryption_pid_to_pnums; 296 QMap<uint, CryptStatus> _encryption_pnum_to_status; 297 254 298 // Signals 255 299 mutable QMutex _listener_lock; 256 300 mpeg_listener_vec_t _mpeg_listeners; -
libs/libmythtv/mpeg/mpegtables.cpp
281 281 */ 282 282 bool ProgramMapTable::IsEncrypted(void) const 283 283 { 284 bool encrypted = IsProgramEncrypted(); 285 286 for (uint i = 0; !encrypted && i < StreamCount(); i++) 287 encrypted |= IsStreamEncrypted(i); 288 289 return encrypted; 290 } 291 292 /** \fn ProgramMapTable::IsProgramEncrypted(void) const 293 * \brief Returns true iff PMT's ProgramInfo contains CA descriptor. 294 */ 295 bool ProgramMapTable::IsProgramEncrypted(void) const 296 { 284 297 desc_list_t descs = MPEGDescriptor::ParseOnlyInclude( 285 298 ProgramInfo(), ProgramInfoLength(), DescriptorID::conditional_access); 286 299 … … 295 308 //VERBOSE(VB_IMPORTANT, "DTVsm: "<<cad.toString()); 296 309 } 297 310 298 for (uint i = 0; i < StreamCount(); i++) 311 return encrypted; 312 } 313 314 /** \fn ProgramMapTable::IsStreamEncrypted(uint i) const 315 * \brief Returns true iff PMT contains CA descriptor. 316 * 317 * \param i index of stream 318 */ 319 bool ProgramMapTable::IsStreamEncrypted(uint i) const 320 { 321 desc_list_t descs = MPEGDescriptor::ParseOnlyInclude( 322 StreamInfo(i), StreamInfoLength(i), DescriptorID::conditional_access); 323 324 bool encrypted = false; 325 QMap<uint,uint> encryption_system; 326 for (uint j = 0; j < descs.size(); j++) 299 327 { 300 desc_list_t descs = MPEGDescriptor::ParseOnlyInclude(301 StreamInfo(i), StreamInfoLength(i),302 DescriptorID::conditional_access);328 ConditionalAccessDescriptor cad(descs[j]); 329 encryption_system[cad.PID()] = cad.SystemID(); 330 encrypted |= cad.SystemID(); 303 331 304 for (uint j = 0; j < descs.size(); j++) 305 { 306 ConditionalAccessDescriptor cad(descs[j]); 307 encryption_system[cad.PID()] = cad.SystemID(); 308 encrypted |= cad.SystemID(); 309 310 //VERBOSE(VB_IMPORTANT, "DTVsm: "<<cad.toString()); 311 } 332 //VERBOSE(VB_IMPORTANT, "DTVsm: "<<cad.toString()); 312 333 } 313 334 314 335 return encrypted; -
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 /*pnum*/, bool /*encrypted*/) { } 88 89 89 90 // ATSC Main 90 91 void HandleSTT(const SystemTimeTable*) {} -
libs/libmythtv/dtvsignalmonitor.h
47 47 uint GetDetectedNetworkID(void) const { return detectedNetworkID; } 48 48 uint GetDetectedTransportID(void) const { return detectedTransportID; } 49 49 50 void SetFTAOnly(bool fta) { ignoreEncrypted = fta; }51 bool GetFTAOnly() const { return ignoreEncrypted; }52 53 50 /// Sets rotor target pos from 0.0 to 1.0 54 51 virtual void SetRotorTarget(float) {} 55 52 … … 86 83 void HandlePAT(const ProgramAssociationTable*); 87 84 void HandleCAT(const ConditionalAccessTable*) {} 88 85 void HandlePMT(uint, const ProgramMapTable*); 86 void HandleEncryptionStatus(uint, bool enc_status); 89 87 90 88 // ATSC Main 91 89 void HandleSTT(const SystemTimeTable*); … … 119 117 SignalMonitorValue seenVCT; 120 118 SignalMonitorValue seenNIT; 121 119 SignalMonitorValue seenSDT; 120 SignalMonitorValue seenCrypt; 122 121 SignalMonitorValue matchingPAT; 123 122 SignalMonitorValue matchingPMT; 124 123 SignalMonitorValue matchingMGT; 125 124 SignalMonitorValue matchingVCT; 126 125 SignalMonitorValue matchingNIT; 127 126 SignalMonitorValue matchingSDT; 127 SignalMonitorValue matchingCrypt; 128 128 129 129 // ATSC tuning info 130 130 int majorChannel; … … 138 138 // MPEG/DVB/ATSC tuning info 139 139 int programNumber; 140 140 141 bool ignoreEncrypted;142 141 QString error; 143 142 }; 144 143 -
libs/libmythtv/tv_rec.cpp
1664 1664 sd->SetCaching(true); 1665 1665 } 1666 1666 1667 bool fta = CardUtil::IgnoreEncrypted(1668 GetCaptureCardNum(), channel->GetCurrentInput());1669 1670 1667 QString sistandard = dtvchan->GetSIStandard(); 1671 1668 1672 1669 // Check if this is an ATSC Channel … … 1690 1687 sm->SetStreamData(sd); 1691 1688 sm->SetChannel(major, minor); 1692 1689 sd->SetVideoStreamsRequired(1); 1693 sm->SetFTAOnly(fta);1694 1690 1695 1691 // Try to get pid of VCT from cache and 1696 1692 // require MGT if we don't have VCT pid. … … 1746 1742 sm->SetDVBService(netid, tsid, progNum); 1747 1743 sd->SetVideoStreamsRequired(neededVideo); 1748 1744 sd->SetAudioStreamsRequired(neededAudio); 1749 sm->SetFTAOnly(fta);1750 1745 1751 1746 sm->AddFlags(SignalMonitor::kDTVSigMon_WaitForPMT | 1752 1747 SignalMonitor::kDTVSigMon_WaitForSDT | … … 1784 1779 sm->SetStreamData(sd); 1785 1780 sm->SetProgramNumber(progNum); 1786 1781 sd->SetVideoStreamsRequired(1); 1787 sm->SetFTAOnly(fta);1788 1782 sm->AddFlags(SignalMonitor::kDTVSigMon_WaitForPAT | 1789 1783 SignalMonitor::kDTVSigMon_WaitForPMT | 1790 1784 SignalMonitor::kDVBSigMon_WaitForPos); -
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), 42 46 programNumber(-1), 43 ignoreEncrypted(true),44 47 error("") 45 48 { 46 49 } … … 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; … … 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) … … 177 187 DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), ""); 178 188 if (GetATSCStreamData() && (majorChannel != major || minorChannel != minor)) 179 189 { 180 RemoveFlags(kDTVSigMon_PATSeen | kDTVSigMon_PATMatch | 181 kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 182 kDTVSigMon_VCTSeen | kDTVSigMon_VCTMatch); 190 RemoveFlags(kDTVSigMon_PATSeen | kDTVSigMon_PATMatch | 191 kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 192 kDTVSigMon_VCTSeen | kDTVSigMon_VCTMatch | 193 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 183 194 majorChannel = major; 184 195 minorChannel = minor; 185 196 GetATSCStreamData()->SetDesiredChannel(major, minor); … … 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); … … 211 223 return; 212 224 } 213 225 214 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 215 kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch); 226 RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch | 227 kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch | 228 kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch); 216 229 217 230 transportID = tsid; 218 231 networkID = netid; … … 298 311 { 299 312 AddFlags(kDTVSigMon_PMTSeen); 300 313 314 if (pmt->IsEncrypted()) 315 GetStreamData()->TestDecryption(pmt); 316 301 317 if (programNumber < 0) 302 318 return; // don't print error messages during channel scan. 303 319 … … 309 325 return; // Not the PMT we are looking for... 310 326 } 311 327 312 if (ignoreEncrypted && pmt->IsEncrypted())313 {314 VERBOSE(VB_IMPORTANT, LOC + "Ignoring encrypted program");315 return;316 }317 318 328 // if PMT contains audio and/or video stream set as matching. 319 329 uint hasAudio = 0; 320 330 uint hasVideo = 0; … … 328 338 if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) && 329 339 (hasAudio >= GetStreamData()->GetAudioStreamsRequired())) 330 340 { 341 #ifdef USING_DVB 342 DVBChannel* dvbchan = dynamic_cast<DVBChannel*>(GetDTVChannel()); 343 if (dvbchan) 344 dvbchan->SetPMT(pmt); 345 #endif // USING_DVB 346 347 if (pmt->IsEncrypted()) 348 AddFlags(kDTVSigMon_WaitForCrypt); 349 331 350 AddFlags(kDTVSigMon_PMTMatch); 332 351 } 333 352 else … … 442 461 } 443 462 } 444 463 464 void DTVSignalMonitor::HandleEncryptionStatus(uint, bool enc_status) 465 { 466 AddFlags(kDTVSigMon_CryptSeen); 467 if (!enc_status) 468 AddFlags(kDTVSigMon_CryptMatch); 469 } 470 445 471 ATSCStreamData *DTVSignalMonitor::GetATSCStreamData() 446 472 { 447 473 return dynamic_cast<ATSCStreamData*>(stream_data); … … 489 515 return false; 490 516 if ((flags & kDTVSigMon_WaitForSDT) && !matchingSDT.IsGood()) 491 517 return false; 518 if ((flags & kDTVSigMon_WaitForCrypt) && !matchingCrypt.IsGood()) 519 return false; 492 520 493 521 return true; 494 522 }