MythTV  master
dtvsignalmonitor.cpp
Go to the documentation of this file.
1 #include <unistd.h>
2 
3 #include <algorithm> // for lower_bound
4 using namespace std;
5 
6 #include "dtvchannel.h"
7 #include "dtvsignalmonitor.h"
8 #include "scanstreamdata.h"
9 #include "mpegtables.h"
10 #include "atsctables.h"
11 #include "dvbtables.h"
12 #include "compat.h"
13 
14 #undef DBG_SM
15 #define DBG_SM(FUNC, MSG) LOG(VB_CHANNEL, LOG_INFO, \
16  QString("DTVSigMon[%1](%2)::%3: %4").arg(m_inputid) \
17  .arg(m_channel->GetDevice()).arg(FUNC).arg(MSG))
18 
19 #define LOC QString("DTVSigMon[%1](%2): ") \
20  .arg(m_inputid).arg(m_channel->GetDevice())
21 
22 // inserts tid&crc value into an ordered list
23 // returns true if item is inserted
24 static bool insert_crc(QList<uint64_t> &seen_crc, const PSIPTable &psip)
25 {
26  uint64_t key = (((uint64_t)psip.TableID()) << 32) | psip.CRC();
27 
28  QList<uint64_t>::iterator it =
29  lower_bound(seen_crc.begin(), seen_crc.end(), key);
30 
31  if ((it == seen_crc.end()) || (*it != key))
32  {
33  seen_crc.insert(it, key);
34  return true;
35  }
36 
37  return false;
38 }
39 
45  DTVChannel *_channel,
46  bool _release_stream,
47  uint64_t wait_for_mask)
48  : SignalMonitor(db_cardnum, _channel, _release_stream, wait_for_mask),
49  m_seenPAT(QObject::tr("Seen")+" PAT", "seen_pat", 1, true, 0, 1, 0),
50  m_seenPMT(QObject::tr("Seen")+" PMT", "seen_pmt", 1, true, 0, 1, 0),
51  m_seenMGT(QObject::tr("Seen")+" MGT", "seen_mgt", 1, true, 0, 1, 0),
52  m_seenVCT(QObject::tr("Seen")+" VCT", "seen_vct", 1, true, 0, 1, 0),
53  m_seenNIT(QObject::tr("Seen")+" NIT", "seen_nit", 1, true, 0, 1, 0),
54  m_seenSDT(QObject::tr("Seen")+" SDT", "seen_sdt", 1, true, 0, 1, 0),
55  m_seenCrypt(QObject::tr("Seen")+" Crypt", "seen_crypt", 1, true, 0, 1, 0),
56  m_matchingPAT(QObject::tr("Matching")+" PAT", "matching_pat", 1, true, 0, 1, 0),
57  m_matchingPMT(QObject::tr("Matching")+" PMT", "matching_pmt", 1, true, 0, 1, 0),
58  m_matchingMGT(QObject::tr("Matching")+" MGT", "matching_mgt", 1, true, 0, 1, 0),
59  m_matchingVCT(QObject::tr("Matching")+" VCT", "matching_vct", 1, true, 0, 1, 0),
60  m_matchingNIT(QObject::tr("Matching")+" NIT", "matching_nit", 1, true, 0, 1, 0),
61  m_matchingSDT(QObject::tr("Matching")+" SDT", "matching_sdt", 1, true, 0, 1, 0),
62  m_matchingCrypt(QObject::tr("Matching")+" Crypt", "matching_crypt",
63  1, true, 0, 1, 0)
64 {
65 }
66 
68 {
70 }
71 
73 {
74  return dynamic_cast<DTVChannel*>(m_channel);
75 }
76 
77 QStringList DTVSignalMonitor::GetStatusList(void) const
78 {
79  QStringList list = SignalMonitor::GetStatusList();
80  QMutexLocker locker(&m_statusLock);
81 
82  // mpeg tables
84  {
87  }
89  {
90 #define DEBUG_PMT 0
91 #if DEBUG_PMT
92  static int seenGood = -1;
93  static int matchingGood = -1;
94 #endif
97 #if DEBUG_PMT
98  if ((seenGood != (int)m_seenPMT.IsGood()) ||
99  (matchingGood != (int)m_matchingPMT.IsGood()))
100  {
101  DBG_SM("GetStatusList", QString("WaitForPMT seen(%1) matching(%2)")
102  .arg(m_seenPMT.IsGood())
103  .arg(m_matchingPMT.IsGood()));
104  seenGood = (int)m_seenPMT.IsGood();
105  matchingGood = (int)m_matchingPMT.IsGood();
106  }
107 #endif
108  }
109  // atsc tables
111  {
114  }
116  {
119  }
120  // dvb tables
122  {
125  }
127  {
130  }
132  {
135  }
136  if (!m_error.isEmpty())
137  {
138  list<<"error"<<m_error;
139  }
140  return list;
141 }
142 
143 void DTVSignalMonitor::AddFlags(uint64_t _flags)
144 {
145  SignalMonitor::AddFlags(_flags);
147 }
148 
149 void DTVSignalMonitor::RemoveFlags(uint64_t _flags)
150 {
153 }
154 
156 {
157  QMutexLocker locker(&m_statusLock);
172 }
173 
175 {
176  vector<uint> add_eit;
177  vector<uint> del_eit;
178 
179  if (GetStreamData()->HasEITPIDChanges(m_eit_pids) &&
180  GetStreamData()->GetEITPIDChanges(m_eit_pids, add_eit, del_eit))
181  {
182  for (size_t i = 0; i < del_eit.size(); i++)
183  {
184  uint_vec_t::iterator it;
185  it = find(m_eit_pids.begin(), m_eit_pids.end(), del_eit[i]);
186  if (it != m_eit_pids.end())
187  m_eit_pids.erase(it);
188  GetStreamData()->RemoveListeningPID(del_eit[i]);
189  }
190 
191  for (size_t i = 0; i < add_eit.size(); i++)
192  {
193  m_eit_pids.push_back(add_eit[i]);
194  GetStreamData()->AddListeningPID(add_eit[i]);
195  }
196  }
197 }
198 
200 {
201  DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), "");
202  m_seen_table_crc.clear();
203  if (GetATSCStreamData() && (m_majorChannel != major || m_minorChannel != minor))
204  {
209  m_majorChannel = major;
213  }
214 }
215 
217 {
218  DBG_SM(QString("SetProgramNumber(%1)").arg(progNum), "");
219  m_seen_table_crc.clear();
220  if (m_programNumber != progNum)
221  {
224  m_programNumber = progNum;
225  if (GetStreamData())
228  }
229 }
230 
231 void DTVSignalMonitor::SetDVBService(uint network_id, uint transport_id, int service_id)
232 {
233  DBG_SM(QString("SetDVBService(transport_id: %1, network_id: %2, "
234  "service_id: %3)").arg(transport_id).arg(network_id).arg(service_id), "");
235  m_seen_table_crc.clear();
236 
237  if (network_id == m_networkID && transport_id == m_transportID &&
238  service_id == m_programNumber)
239  {
240  return;
241  }
242 
246 
247  m_transportID = transport_id;
248  m_networkID = network_id;
249  m_programNumber = service_id;
250 
251  if (GetDVBStreamData())
252  {
253  GetDVBStreamData()->SetDesiredService(network_id, transport_id, m_programNumber);
256  }
257 }
258 
260 {
261  if (m_stream_data)
263 
266  if (atsc)
267  {
268  atsc->RemoveATSCMainListener(this);
269  atsc->RemoveATSCAuxListener(this);
270  }
271  if (dvb)
272  dvb->RemoveDVBMainListener(this);
273 
274  m_stream_data = data;
275  if (!data)
276  return;
277 
278  data->AddMPEGListener(this);
279 
280  atsc = GetATSCStreamData();
281  dvb = GetDVBStreamData();
282  if (atsc)
283  {
284  atsc->AddATSCMainListener(this);
285  atsc->AddATSCAuxListener(this);
286  }
287  if (dvb)
288  dvb->AddDVBMainListener(this);
289 }
290 
291 
293 {
295  int pmt_pid = pat->FindPID(m_programNumber);
296  if (GetStreamData() && pmt_pid)
297  {
299  GetStreamData()->AddListeningPID(pmt_pid);
301  return;
302  }
303 
304  if (m_programNumber >= 0)
305  {
306  // BEGIN HACK HACK HACK
307  // Reset version in case we're physically on the wrong transport
308  // due to tuning hardware being in a transitional state or we
309  // are in the middle of something like a DiSEqC rotor turn.
310  uint tsid = pat->TransportStreamID();
311  GetStreamData()->SetVersionPAT(tsid, -1,0);
312  // END HACK HACK HACK
313 
314  if (insert_crc(m_seen_table_crc, *pat))
315  {
316  QString errStr = QString("Program #%1 not found in PAT!")
317  .arg(m_programNumber);
318  LOG(VB_GENERAL, LOG_ERR, LOC + errStr + "\n" + pat->toString());
319  }
320  // only one entry in the PAT, just use it
321  if (pat->ProgramCount() == 1)
322  {
323  LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
324  "in the PAT, so we'll just use it");
328  }
329  // two entries, but one is a pointer to the NIT PID instead
330  // of a real program, use the other
331  if ((pat->ProgramCount() == 2) && ((pat->ProgramNumber(0) == 0) || (pat->ProgramNumber(1) == 0)))
332  {
333  LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
334  "in the PAT, so we'll just use it");
335  uint pid = pat->FindAnyPID();
336  SetProgramNumber(pat->FindProgram(pid));
339  }
340  }
341 }
342 
343 void DTVSignalMonitor::HandlePMT(uint /*program_num*/, const ProgramMapTable *pmt)
344 {
346 
347  if (m_programNumber < 0)
348  return; // don't print error messages during channel scan.
349 
350  if (pmt->ProgramNumber() != (uint)m_programNumber)
351  {
352  if (insert_crc(m_seen_table_crc, *pmt))
353  {
354  LOG(VB_GENERAL, LOG_ERR, LOC +
355  QString("Wrong PMT; pmt->pn(%1) desired(%2)")
356  .arg(pmt->ProgramNumber()).arg(m_programNumber));
357  }
358  return; // Not the PMT we are looking for...
359  }
360 
361  if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard())) {
362  LOG(VB_GENERAL, LOG_NOTICE, LOC +
363  QString("PMT says program %1 is encrypted").arg(m_programNumber));
365  }
366 
367  // if PMT contains audio and/or video stream set as matching.
368  uint hasAudio = 0;
369  uint hasVideo = 0;
370 
371  for (uint i = 0; i < pmt->StreamCount(); i++)
372  {
373  if (pmt->IsVideo(i, GetDTVChannel()->GetSIStandard()))
374  hasVideo++;
375  if (pmt->IsAudio(i, GetDTVChannel()->GetSIStandard()))
376  hasAudio++;
377  }
378 
379  if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) &&
380  (hasAudio >= GetStreamData()->GetAudioStreamsRequired()))
381  {
382  if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard()) &&
385 
387  }
388  else
389  {
390  LOG(VB_GENERAL, LOG_ERR, LOC +
391  QString("We want %1 audio and %2 video streams")
392  .arg(GetStreamData()->GetAudioStreamsRequired())
393  .arg(GetStreamData()->GetVideoStreamsRequired()) +
394  QString("\n\t\t\tBut have %1 audio and %2 video streams")
395  .arg(hasAudio).arg(hasVideo));
396  }
397 }
398 
400 {
401  LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
402  .arg(GetStreamData()->TimeOffset()));
403 }
404 
406 {
408 
409  if (!GetATSCStreamData())
410  return;
411 
412  for (uint i=0; i<mgt->TableCount(); i++)
413  {
414  if ((TableClass::TVCTc == mgt->TableClass(i)) ||
415  (TableClass::CVCTc == mgt->TableClass(i)))
416  {
419  }
420  }
421 }
422 
424  uint /*pid*/, const TerrestrialVirtualChannelTable* tvct)
425 {
427  int idx = tvct->Find(m_majorChannel, m_minorChannel);
428 
429  if (m_minorChannel < 0)
430  return; // don't print error message during channel scan.
431 
432  if (idx < 0)
433  {
434  if (insert_crc(m_seen_table_crc, *tvct))
435  {
436  LOG(VB_GENERAL, LOG_ERR, LOC +
437  QString("Could not find channel %1_%2 in TVCT")
438  .arg(m_majorChannel).arg(m_minorChannel));
439  LOG(VB_GENERAL, LOG_ERR, LOC + tvct->toString());
440  }
442  return;
443  }
444 
445  DBG_SM("HandleTVCT()", QString("tvct->ProgramNumber(idx %1): prog num %2")
446  .arg(idx).arg(tvct->ProgramNumber(idx)));
447 
448  SetProgramNumber(tvct->ProgramNumber(idx));
450 }
451 
453 {
455  int idx = cvct->Find(m_majorChannel, m_minorChannel);
456 
457  if (idx < 0)
458  {
459  if (insert_crc(m_seen_table_crc, *cvct))
460  {
461  LOG(VB_GENERAL, LOG_ERR, LOC +
462  QString("Could not find channel %1_%2 in CVCT")
463  .arg(m_majorChannel).arg(m_minorChannel));
464  LOG(VB_GENERAL, LOG_ERR, LOC + cvct->toString());
465  }
467  return;
468  }
469 
470  DBG_SM("HandleCVCT()", QString("cvct->ProgramNumber(idx %1): prog num %2")
471  .arg(idx).arg(cvct->ProgramNumber(idx)));
472 
473  SetProgramNumber(cvct->ProgramNumber(idx));
475 }
476 
478 {
479  LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
480  .arg(GetStreamData()->TimeOffset()));
481 }
482 
484 {
485  DBG_SM("HandleNIT()", QString("net_id = %1").arg(nit->NetworkID()));
487  if (!GetDVBStreamData())
488  return;
489 }
490 
492 {
494 
496  m_detectedTransportID = sdt->TSID();
497 
498  // if the multiplex is not properly configured with ONID and TSID then take
499  // whatever SDT we see first
500  if ((m_networkID == 0) && (m_transportID == 0))
501  {
504 
505  // FIXME assert if TableID == SDTo
506  }
507 
508  if (sdt->OriginalNetworkID() != m_networkID || sdt->TSID() != m_transportID)
509  {
510  GetDVBStreamData()->SetVersionSDT(sdt->TSID(), -1, 0);
511  }
512  else
513  {
514  DBG_SM("HandleSDT()", QString("tsid = %1 orig_net_id = %2")
515  .arg(sdt->TSID()).arg(sdt->OriginalNetworkID()));
518  }
519 }
520 
521 void DTVSignalMonitor::HandleEncryptionStatus(uint /*program_number*/, bool enc_status)
522 {
524  if (!enc_status)
526 }
527 
529 {
530  return dynamic_cast<ATSCStreamData*>(m_stream_data);
531 }
532 
534 {
535  return dynamic_cast<DVBStreamData*>(m_stream_data);
536 }
537 
539 {
540  return dynamic_cast<ScanStreamData*>(m_stream_data);
541 }
542 
544 {
545  return dynamic_cast<const ATSCStreamData*>(m_stream_data);
546 }
547 
549 {
550  return dynamic_cast<const DVBStreamData*>(m_stream_data);
551 }
552 
554 {
555  return dynamic_cast<const ScanStreamData*>(m_stream_data);
556 }
557 
559 {
560  QMutexLocker locker(&m_statusLock);
562  return false;
564  return false;
566  return false;
568  return false;
570  return false;
572  return false;
574  return false;
576  return false;
577 
578  return true;
579 }
static const uint64_t kDTVSigMon_SDTSeen
We've seen a SDT, which maps DVB Channels to MPEG program numbers, and provides additional data.
void HandlePMT(uint, const ProgramMapTable *) override
QString GetStatus() const
Returns a signal monitor value as one long string.
static const uint64_t kDTVSigMon_MGTSeen
We've seen a MGT, which tells us on which PIDs to find VCT and other ATSC tables.
DTVChannel * GetDTVChannel(void)
void HandleNIT(const NetworkInformationTable *) override
QMutex m_statusLock
static const uint64_t kDTVSigMon_PATSeen
We've seen a PAT, which maps MPEG program numbers to pids where we find PMTs.
uint ProgramCount(void) const
Definition: mpegtables.h:600
DVBStreamData * GetDVBStreamData()
Returns the DVB stream data if it exists.
void SetVersionSDT(uint tsid, int version, uint last_section)
Definition: dvbstreamdata.h:67
void AddMPEGListener(MPEGStreamListener *)
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:91
QStringList GetStatusList(void) const override
Returns QStringList containing all signals and their current values.
static const uint64_t kDVBSigMon_WaitForPos
Wait for rotor to complete turning the antenna.
virtual void SetStreamData(MPEGStreamData *data)
Sets the MPEG stream data for DTVSignalMonitor to use, and connects the table signals to the monitor.
This table tells the decoder on which PIDs to find A/V data.
Definition: dvbtables.h:101
int Find(int major, int minor) const
Definition: atsctables.cpp:485
SignalMonitorValue m_seenSDT
QString GetName(void) const
Returns the long name of this value.
void TestDecryption(const ProgramMapTable *pmt)
ScanStreamData * GetScanStreamData()
Returns the scan stream data if it exists.
static const uint64_t kDTVSigMon_VCTSeen
We've seen a VCT, which maps ATSC Channels to MPEG program numbers, and provides additional data.
void SetVersionCVCT(uint tsid, int version)
static const uint64_t kDTVSigMon_WaitForPMT
bool IsEncrypted(const QString &sistandard) const
Returns true iff PMT contains CA descriptor for a vid/aud stream.
Definition: mpegtables.cpp:552
static const uint64_t kDTVSigMon_WaitForPAT
uint TableCount() const
Definition: atsctables.h:114
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
DTVSignalMonitor(int db_cardnum, DTVChannel *_channel, bool _release_stream, uint64_t wait_for_mask)
uint ProgramNumber(uint i) const
Definition: atsctables.h:267
uint ProgramNumber(uint i) const
Definition: mpegtables.h:607
static const uint64_t kDTVSigMon_CryptMatch
We've seen unencrypted data in data stream.
uint FindAnyPID(void) const
Definition: mpegtables.h:626
This table gives the current DVB stream time.
Definition: dvbtables.h:373
void SetVersionTVCT(uint tsid, int version)
static const uint64_t kDTVSigMon_PMTSeen
We've seen a PMT, which maps program to audio, video and other stream PIDs.
static const uint64_t kDTVSigMon_TVCTSeen
We've seen a TVCT, the terrestrial version of the VCT.
uint TSID() const
transport_stream_id 16 3.0 0x0000
Definition: dvbtables.h:129
uint NetworkID(void) const
network_id 16 3.0 0x0000
Definition: dvbtables.h:50
void RemoveMPEGListener(MPEGStreamListener *)
SignalMonitorValue m_seenPAT
static bool insert_crc(QList< uint64_t > &seen_crc, const PSIPTable &psip)
static const uint64_t kDTVSigMon_WaitForVCT
static const uint64_t kDTVSigMon_WaitForMGT
SignalMonitorValue m_matchingCrypt
QList< uint64_t > m_seen_table_crc
void AddATSCAuxListener(ATSCAuxStreamListener *)
static const uint64_t kDTVSigMon_CryptSeen
We've seen something indicating whether the data stream is encrypted.
void SetValue(int _value)
SignalMonitorValue m_matchingNIT
static const uint64_t kDTVSigMon_WaitForNIT
#define DBG_SM(FUNC, MSG)
QString toString(void) const override
Definition: atsctables.cpp:200
Overall structure.
int TableClass(uint i) const
Definition: atsctables.cpp:25
virtual void RemoveListeningPID(uint pid)
void AddDVBMainListener(DVBMainStreamListener *)
void RemoveFlags(uint64_t _flags) override
SignalMonitorValue m_matchingMGT
uint OriginalNetworkID() const
original_network_id 16 8.0
Definition: dvbtables.h:132
void SetChannel(int major, int minor)
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
Definition: mpegtables.h:371
vector< uint > m_eit_pids
void SetDVBService(uint network_id, uint transport_id, int service_id)
This table contains information about the cable channels transmitted on this multiplex.
Definition: atsctables.h:415
Class providing a generic interface to digital tuning hardware.
Definition: dtvchannel.h:34
SignalMonitorValue m_matchingPAT
uint StreamCount(void) const
Definition: mpegtables.h:714
ChannelBase * m_channel
void HandleTVCT(uint, const TerrestrialVirtualChannelTable *) override
uint GetAudioStreamsRequired() const
void SetDesiredProgram(int p)
uint TablePID(uint i) const
Definition: atsctables.h:128
void HandleEncryptionStatus(uint, bool enc_status) override
#define minor(X)
Definition: compat.h:138
void RemoveATSCAuxListener(ATSCAuxStreamListener *)
static const uint64_t kDTVSigMon_CVCTSeen
We've seen a CVCT, the cable version of the VCT.
static const uint64_t kDTVSigMon_SDTMatch
We've seen an SDT matching our requirements.
MPEGStreamData * GetStreamData()
Returns the MPEG stream data if it exists.
virtual QStringList GetStatusList(void) const
Returns QStringList containing all signals and their current values.
unsigned int uint
Definition: compat.h:140
void AddATSCMainListener(ATSCMainStreamListener *)
SignalMonitorValue m_seenMGT
SignalMonitorValue m_matchingSDT
void SetDesiredChannel(int major, int minor)
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
Definition: mpegtables.h:579
MPEGStreamData * m_stream_data
uint TransportStreamID(void) const
Definition: mpegtables.h:598
SignalMonitorValue m_seenVCT
SignalMonitorValue m_seenNIT
static const uint64_t kDTVSigMon_VCTMatch
We've seen a VCT matching our requirements.
void RemoveATSCMainListener(ATSCMainStreamListener *)
void HandlePAT(const ProgramAssociationTable *) override
static const uint64_t kDTVSigMon_PATMatch
We've seen a PAT matching our requirements.
uint CRC(void) const
Definition: pespacket.h:188
virtual void AddListeningPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
void HandleSTT(const SystemTimeTable *) override
static const uint64_t kDTVSigMon_NITSeen
We've seen a NIT, which tells us where to find SDT and other DVB tables.
void HandleTDT(const TimeDateTable *) override
ATSCStreamData * GetATSCStreamData()
Returns the ATSC stream data if it exists.
Signal monitoring base class.
Definition: signalmonitor.h:32
void AddFlags(uint64_t _flags) override
uint TableID(void) const
Definition: mpegtables.h:479
void UpdateListeningForEIT(void)
void SetVersionPAT(uint tsid, int version, uint last_section)
#define LOG(_MASK_, _LEVEL_, _STRING_)
Definition: mythlogging.h:41
bool IsAllGood(void) const override
SignalMonitorValue m_seenPMT
QString toString(void) const override
Definition: mpegtables.cpp:809
This table tells the decoder on which PIDs to find other tables, and their sizes and each table's cur...
Definition: atsctables.h:74
volatile uint64_t m_flags
uint ProgramNumber(void) const
Definition: mpegtables.h:693
void RemoveDVBMainListener(DVBMainStreamListener *)
SignalMonitorValue m_seenCrypt
#define LOC
SignalMonitorValue m_matchingVCT
uint FindPID(uint progNum) const
Definition: mpegtables.h:619
static const uint64_t kDTVSigMon_CVCTMatch
We've seen a CVCT matching our requirements.
static const uint64_t kDTVSigMon_WaitForSDT
static const uint64_t kDTVSigMon_MGTMatch
We've seen an MGT matching our requirements.
void UpdateMonitorValues(void)
void HandleCVCT(uint, const CableVirtualChannelTable *) override
virtual ~DTVSignalMonitor()
void HandleMGT(const MasterGuideTable *) override
virtual void AddFlags(uint64_t _flags)
SignalMonitorValue m_matchingPMT
static const uint64_t kDTVSigMon_NITMatch
We've seen an NIT matching our requirements.
static const uint64_t kDTVSigMon_WaitForCrypt
bool IsVideo(uint i, const QString &sistandard) const
Returns true iff the stream at index i is a video stream.
Definition: mpegtables.cpp:514
void SetDesiredService(uint netid, uint tsid, int serviceid)
bool IsGood() const
Returns true if the value is equal to the threshold, or on the right side of the threshold (depends o...
uint FindProgram(uint pid) const
Definition: mpegtables.h:633
void HandleSDT(uint, const ServiceDescriptionTable *) override
virtual void RemoveFlags(uint64_t _flags)
This table tells the decoder on which PIDs to find other tables.
Definition: dvbtables.h:21
This table contains the GPS time at the time of transmission.
Definition: atsctables.h:683
static const uint64_t kDTVSigMon_TVCTMatch
We've seen a TVCT matching our requirements.
This table contains information about the terrestrial channels transmitted on this multiplex.
Definition: atsctables.h:346
Encapsulates data about ATSC stream and emits events for most tables.
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
Definition: mpegtables.h:656
uint TransportStreamID() const
Definition: atsctables.h:218
Encapsulates data about MPEG stream and emits events for each table.
bool IsAudio(uint i, const QString &sistandard) const
Returns true iff the stream at index i is an audio stream.
Definition: mpegtables.cpp:536
virtual bool IsAllGood(void) const
Definition: signalmonitor.h:79
uint ProgramPID(uint i) const
Definition: mpegtables.h:610
static const uint64_t kDTVSigMon_PMTMatch
We've seen a PMT matching our requirements.
void SetProgramNumber(int progNum)