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, del_eit;
177 
178  if (GetStreamData()->HasEITPIDChanges(m_eit_pids) &&
179  GetStreamData()->GetEITPIDChanges(m_eit_pids, add_eit, del_eit))
180  {
181  for (size_t i = 0; i < del_eit.size(); i++)
182  {
183  uint_vec_t::iterator it;
184  it = find(m_eit_pids.begin(), m_eit_pids.end(), del_eit[i]);
185  if (it != m_eit_pids.end())
186  m_eit_pids.erase(it);
187  GetStreamData()->RemoveListeningPID(del_eit[i]);
188  }
189 
190  for (size_t i = 0; i < add_eit.size(); i++)
191  {
192  m_eit_pids.push_back(add_eit[i]);
193  GetStreamData()->AddListeningPID(add_eit[i]);
194  }
195  }
196 }
197 
199 {
200  DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), "");
201  m_seen_table_crc.clear();
202  if (GetATSCStreamData() && (m_majorChannel != major || m_minorChannel != minor))
203  {
208  m_majorChannel = major;
212  }
213 }
214 
216 {
217  DBG_SM(QString("SetProgramNumber(%1)").arg(progNum), "");
218  m_seen_table_crc.clear();
219  if (m_programNumber != progNum)
220  {
223  m_programNumber = progNum;
224  if (GetStreamData())
227  }
228 }
229 
230 void DTVSignalMonitor::SetDVBService(uint network_id, uint transport_id, int service_id)
231 {
232  DBG_SM(QString("SetDVBService(transport_id: %1, network_id: %2, "
233  "service_id: %3)").arg(transport_id).arg(network_id).arg(service_id), "");
234  m_seen_table_crc.clear();
235 
236  if (network_id == m_networkID && transport_id == m_transportID &&
237  service_id == m_programNumber)
238  {
239  return;
240  }
241 
245 
246  m_transportID = transport_id;
247  m_networkID = network_id;
248  m_programNumber = service_id;
249 
250  if (GetDVBStreamData())
251  {
252  GetDVBStreamData()->SetDesiredService(network_id, transport_id, m_programNumber);
255  }
256 }
257 
259 {
260  if (m_stream_data)
262 
265  if (atsc)
266  {
267  atsc->RemoveATSCMainListener(this);
268  atsc->RemoveATSCAuxListener(this);
269  }
270  if (dvb)
271  dvb->RemoveDVBMainListener(this);
272 
273  m_stream_data = data;
274  if (!data)
275  return;
276 
277  data->AddMPEGListener(this);
278 
279  atsc = GetATSCStreamData();
280  dvb = GetDVBStreamData();
281  if (atsc)
282  {
283  atsc->AddATSCMainListener(this);
284  atsc->AddATSCAuxListener(this);
285  }
286  if (dvb)
287  dvb->AddDVBMainListener(this);
288 }
289 
290 
292 {
294  int pmt_pid = pat->FindPID(m_programNumber);
295  if (GetStreamData() && pmt_pid)
296  {
298  GetStreamData()->AddListeningPID(pmt_pid);
300  return;
301  }
302 
303  if (m_programNumber >= 0)
304  {
305  // BEGIN HACK HACK HACK
306  // Reset version in case we're physically on the wrong transport
307  // due to tuning hardware being in a transitional state or we
308  // are in the middle of something like a DiSEqC rotor turn.
309  uint tsid = pat->TransportStreamID();
310  GetStreamData()->SetVersionPAT(tsid, -1,0);
311  // END HACK HACK HACK
312 
313  if (insert_crc(m_seen_table_crc, *pat))
314  {
315  QString errStr = QString("Program #%1 not found in PAT!")
316  .arg(m_programNumber);
317  LOG(VB_GENERAL, LOG_ERR, LOC + errStr + "\n" + pat->toString());
318  }
319  // only one entry in the PAT, just use it
320  if (pat->ProgramCount() == 1)
321  {
322  LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
323  "in the PAT, so we'll just use it");
327  }
328  // two entries, but one is a pointer to the NIT PID instead
329  // of a real program, use the other
330  if ((pat->ProgramCount() == 2) && ((pat->ProgramNumber(0) == 0) || (pat->ProgramNumber(1) == 0)))
331  {
332  LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
333  "in the PAT, so we'll just use it");
334  uint pid = pat->FindAnyPID();
335  SetProgramNumber(pat->FindProgram(pid));
338  }
339  }
340 }
341 
342 void DTVSignalMonitor::HandlePMT(uint /*program_num*/, const ProgramMapTable *pmt)
343 {
345 
346  if (m_programNumber < 0)
347  return; // don't print error messages during channel scan.
348 
349  if (pmt->ProgramNumber() != (uint)m_programNumber)
350  {
351  if (insert_crc(m_seen_table_crc, *pmt))
352  {
353  LOG(VB_GENERAL, LOG_ERR, LOC +
354  QString("Wrong PMT; pmt->pn(%1) desired(%2)")
355  .arg(pmt->ProgramNumber()).arg(m_programNumber));
356  }
357  return; // Not the PMT we are looking for...
358  }
359 
360  if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard())) {
361  LOG(VB_GENERAL, LOG_NOTICE, LOC +
362  QString("PMT says program %1 is encrypted").arg(m_programNumber));
364  }
365 
366  // if PMT contains audio and/or video stream set as matching.
367  uint hasAudio = 0;
368  uint hasVideo = 0;
369 
370  for (uint i = 0; i < pmt->StreamCount(); i++)
371  {
372  if (pmt->IsVideo(i, GetDTVChannel()->GetSIStandard()))
373  hasVideo++;
374  if (pmt->IsAudio(i, GetDTVChannel()->GetSIStandard()))
375  hasAudio++;
376  }
377 
378  if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) &&
379  (hasAudio >= GetStreamData()->GetAudioStreamsRequired()))
380  {
381  if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard()) &&
384 
386  }
387  else
388  {
389  LOG(VB_GENERAL, LOG_ERR, LOC +
390  QString("We want %1 audio and %2 video streams")
391  .arg(GetStreamData()->GetAudioStreamsRequired())
392  .arg(GetStreamData()->GetVideoStreamsRequired()) +
393  QString("\n\t\t\tBut have %1 audio and %2 video streams")
394  .arg(hasAudio).arg(hasVideo));
395  }
396 }
397 
399 {
400  LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
401  .arg(GetStreamData()->TimeOffset()));
402 }
403 
405 {
407 
408  if (!GetATSCStreamData())
409  return;
410 
411  for (uint i=0; i<mgt->TableCount(); i++)
412  {
413  if ((TableClass::TVCTc == mgt->TableClass(i)) ||
414  (TableClass::CVCTc == mgt->TableClass(i)))
415  {
418  }
419  }
420 }
421 
423  uint /*pid*/, const TerrestrialVirtualChannelTable* tvct)
424 {
426  int idx = tvct->Find(m_majorChannel, m_minorChannel);
427 
428  if (m_minorChannel < 0)
429  return; // don't print error message during channel scan.
430 
431  if (idx < 0)
432  {
433  if (insert_crc(m_seen_table_crc, *tvct))
434  {
435  LOG(VB_GENERAL, LOG_ERR, LOC +
436  QString("Could not find channel %1_%2 in TVCT")
437  .arg(m_majorChannel).arg(m_minorChannel));
438  LOG(VB_GENERAL, LOG_ERR, LOC + tvct->toString());
439  }
441  return;
442  }
443 
444  DBG_SM("HandleTVCT()", QString("tvct->ProgramNumber(idx %1): prog num %2")
445  .arg(idx).arg(tvct->ProgramNumber(idx)));
446 
447  SetProgramNumber(tvct->ProgramNumber(idx));
449 }
450 
452 {
454  int idx = cvct->Find(m_majorChannel, m_minorChannel);
455 
456  if (idx < 0)
457  {
458  if (insert_crc(m_seen_table_crc, *cvct))
459  {
460  LOG(VB_GENERAL, LOG_ERR, LOC +
461  QString("Could not find channel %1_%2 in CVCT")
462  .arg(m_majorChannel).arg(m_minorChannel));
463  LOG(VB_GENERAL, LOG_ERR, LOC + cvct->toString());
464  }
466  return;
467  }
468 
469  DBG_SM("HandleCVCT()", QString("cvct->ProgramNumber(idx %1): prog num %2")
470  .arg(idx).arg(cvct->ProgramNumber(idx)));
471 
472  SetProgramNumber(cvct->ProgramNumber(idx));
474 }
475 
477 {
478  LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
479  .arg(GetStreamData()->TimeOffset()));
480 }
481 
483 {
484  DBG_SM("HandleNIT()", QString("net_id = %1").arg(nit->NetworkID()));
486  if (!GetDVBStreamData())
487  return;
488 }
489 
491 {
493 
495  m_detectedTransportID = sdt->TSID();
496 
497  // if the multiplex is not properly configured with ONID and TSID then take
498  // whatever SDT we see first
499  if ((m_networkID == 0) && (m_transportID == 0))
500  {
503 
504  // FIXME assert if TableID == SDTo
505  }
506 
507  if (sdt->OriginalNetworkID() != m_networkID || sdt->TSID() != m_transportID)
508  {
509  GetDVBStreamData()->SetVersionSDT(sdt->TSID(), -1, 0);
510  }
511  else
512  {
513  DBG_SM("HandleSDT()", QString("tsid = %1 orig_net_id = %2")
514  .arg(sdt->TSID()).arg(sdt->OriginalNetworkID()));
517  }
518 }
519 
520 void DTVSignalMonitor::HandleEncryptionStatus(uint /*program_number*/, bool enc_status)
521 {
523  if (!enc_status)
525 }
526 
528 {
529  return dynamic_cast<ATSCStreamData*>(m_stream_data);
530 }
531 
533 {
534  return dynamic_cast<DVBStreamData*>(m_stream_data);
535 }
536 
538 {
539  return dynamic_cast<ScanStreamData*>(m_stream_data);
540 }
541 
543 {
544  return dynamic_cast<const ATSCStreamData*>(m_stream_data);
545 }
546 
548 {
549  return dynamic_cast<const DVBStreamData*>(m_stream_data);
550 }
551 
553 {
554  return dynamic_cast<const ScanStreamData*>(m_stream_data);
555 }
556 
558 {
559  QMutexLocker locker(&m_statusLock);
561  return false;
563  return false;
565  return false;
567  return false;
569  return false;
571  return false;
573  return false;
575  return false;
576 
577  return true;
578 }
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:62
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)
unsigned int uint
Definition: compat.h:140
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.
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)