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(inputid) \
17  .arg(channel->GetDevice()).arg(FUNC).arg(MSG))
18 
19 #define LOC QString("DTVSigMon[%1](%2): ") \
20  .arg(inputid).arg(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  stream_data(nullptr),
50  seenPAT(QObject::tr("Seen")+" PAT", "seen_pat", 1, true, 0, 1, 0),
51  seenPMT(QObject::tr("Seen")+" PMT", "seen_pmt", 1, true, 0, 1, 0),
52  seenMGT(QObject::tr("Seen")+" MGT", "seen_mgt", 1, true, 0, 1, 0),
53  seenVCT(QObject::tr("Seen")+" VCT", "seen_vct", 1, true, 0, 1, 0),
54  seenNIT(QObject::tr("Seen")+" NIT", "seen_nit", 1, true, 0, 1, 0),
55  seenSDT(QObject::tr("Seen")+" SDT", "seen_sdt", 1, true, 0, 1, 0),
56  seenCrypt(QObject::tr("Seen")+" Crypt", "seen_crypt", 1, true, 0, 1, 0),
57  matchingPAT(QObject::tr("Matching")+" PAT", "matching_pat", 1, true, 0, 1, 0),
58  matchingPMT(QObject::tr("Matching")+" PMT", "matching_pmt", 1, true, 0, 1, 0),
59  matchingMGT(QObject::tr("Matching")+" MGT", "matching_mgt", 1, true, 0, 1, 0),
60  matchingVCT(QObject::tr("Matching")+" VCT", "matching_vct", 1, true, 0, 1, 0),
61  matchingNIT(QObject::tr("Matching")+" NIT", "matching_nit", 1, true, 0, 1, 0),
62  matchingSDT(QObject::tr("Matching")+" SDT", "matching_sdt", 1, true, 0, 1, 0),
63  matchingCrypt(QObject::tr("Matching")+" Crypt", "matching_crypt",
64  1, true, 0, 1, 0),
65  majorChannel(-1), minorChannel(-1),
66  networkID(0), transportID(0),
67  detectedNetworkID(0), detectedTransportID(0),
68  programNumber(-1),
69  ignore_encrypted(false)
70 {
71 }
72 
74 {
75  SetStreamData(nullptr);
76 }
77 
79 {
80  return dynamic_cast<DTVChannel*>(channel);
81 }
82 
83 QStringList DTVSignalMonitor::GetStatusList(void) const
84 {
85  QStringList list = SignalMonitor::GetStatusList();
86  QMutexLocker locker(&statusLock);
87 
88  // mpeg tables
90  {
91  list<<seenPAT.GetName()<<seenPAT.GetStatus();
93  }
95  {
96 #define DEBUG_PMT 0
97 #if DEBUG_PMT
98  static int seenGood = -1;
99  static int matchingGood = -1;
100 #endif
101  list<<seenPMT.GetName()<<seenPMT.GetStatus();
103 #if DEBUG_PMT
104  if ((seenGood != (int)seenPMT.IsGood()) ||
105  (matchingGood != (int)matchingPMT.IsGood()))
106  {
107  DBG_SM("GetStatusList", QString("WaitForPMT seen(%1) matching(%2)")
108  .arg(seenPMT.IsGood())
109  .arg(matchingPMT.IsGood()));
110  seenGood = (int)seenPMT.IsGood();
111  matchingGood = (int)matchingPMT.IsGood();
112  }
113 #endif
114  }
115  // atsc tables
117  {
118  list<<seenMGT.GetName()<<seenMGT.GetStatus();
120  }
122  {
123  list<<seenVCT.GetName()<<seenVCT.GetStatus();
125  }
126  // dvb tables
128  {
129  list<<seenNIT.GetName()<<seenNIT.GetStatus();
131  }
133  {
134  list<<seenSDT.GetName()<<seenSDT.GetStatus();
136  }
138  {
141  }
142  if (error != "")
143  {
144  list<<"error"<<error;
145  }
146  return list;
147 }
148 
149 void DTVSignalMonitor::AddFlags(uint64_t _flags)
150 {
151  SignalMonitor::AddFlags(_flags);
153 }
154 
155 void DTVSignalMonitor::RemoveFlags(uint64_t _flags)
156 {
159 }
160 
162 {
163  QMutexLocker locker(&statusLock);
178 }
179 
181 {
182  vector<uint> add_eit, del_eit;
183 
184  if (GetStreamData()->HasEITPIDChanges(eit_pids) &&
185  GetStreamData()->GetEITPIDChanges(eit_pids, add_eit, del_eit))
186  {
187  for (uint i = 0; i < del_eit.size(); i++)
188  {
189  uint_vec_t::iterator it;
190  it = find(eit_pids.begin(), eit_pids.end(), del_eit[i]);
191  if (it != eit_pids.end())
192  eit_pids.erase(it);
193  GetStreamData()->RemoveListeningPID(del_eit[i]);
194  }
195 
196  for (uint i = 0; i < add_eit.size(); i++)
197  {
198  eit_pids.push_back(add_eit[i]);
199  GetStreamData()->AddListeningPID(add_eit[i]);
200  }
201  }
202 }
203 
205 {
206  DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), "");
207  seen_table_crc.clear();
208  if (GetATSCStreamData() && (majorChannel != major || minorChannel != minor))
209  {
214  majorChannel = major;
218  }
219 }
220 
222 {
223  DBG_SM(QString("SetProgramNumber(%1)").arg(progNum), "");
224  seen_table_crc.clear();
225  if (programNumber != progNum)
226  {
229  programNumber = progNum;
230  if (GetStreamData())
233  }
234 }
235 
236 void DTVSignalMonitor::SetDVBService(uint netid, uint tsid, int serviceid)
237 {
238  DBG_SM(QString("SetDVBService(transport_id: %1, network_id: %2, "
239  "service_id: %3)").arg(tsid).arg(netid).arg(serviceid), "");
240  seen_table_crc.clear();
241 
242  if (netid == networkID && tsid == transportID &&
243  serviceid == programNumber)
244  {
245  return;
246  }
247 
251 
252  transportID = tsid;
253  networkID = netid;
254  programNumber = serviceid;
255 
256  if (GetDVBStreamData())
257  {
261  }
262 }
263 
265 {
266  if (stream_data)
268 
271  if (atsc)
272  {
273  atsc->RemoveATSCMainListener(this);
274  atsc->RemoveATSCAuxListener(this);
275  }
276  if (dvb)
277  dvb->RemoveDVBMainListener(this);
278 
279  stream_data = data;
280  if (!data)
281  return;
282 
283  data->AddMPEGListener(this);
284 
285  atsc = GetATSCStreamData();
286  dvb = GetDVBStreamData();
287  if (atsc)
288  {
289  atsc->AddATSCMainListener(this);
290  atsc->AddATSCAuxListener(this);
291  }
292  if (dvb)
293  dvb->AddDVBMainListener(this);
294 }
295 
296 
298 {
300  int pmt_pid = pat->FindPID(programNumber);
301  if (GetStreamData() && pmt_pid)
302  {
304  GetStreamData()->AddListeningPID(pmt_pid);
305  insert_crc(seen_table_crc, *pat);
306  return;
307  }
308 
309  if (programNumber >= 0)
310  {
311  // BEGIN HACK HACK HACK
312  // Reset version in case we're physically on the wrong transport
313  // due to tuning hardware being in a transitional state or we
314  // are in the middle of something like a DiSEqC rotor turn.
315  uint tsid = pat->TransportStreamID();
316  GetStreamData()->SetVersionPAT(tsid, -1,0);
317  // END HACK HACK HACK
318 
319  if (insert_crc(seen_table_crc, *pat))
320  {
321  QString errStr = QString("Program #%1 not found in PAT!")
322  .arg(programNumber);
323  LOG(VB_GENERAL, LOG_ERR, LOC + errStr + "\n" + pat->toString());
324  }
325  // only one entry in the PAT, just use it
326  if (pat->ProgramCount() == 1)
327  {
328  LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
329  "in the PAT, so we'll just use it");
333  }
334  // two entries, but one is a pointer to the NIT PID instead
335  // of a real program, use the other
336  if ((pat->ProgramCount() == 2) && ((pat->ProgramNumber(0) == 0) || (pat->ProgramNumber(1) == 0)))
337  {
338  LOG(VB_GENERAL, LOG_ERR, LOC + "But there is only one program "
339  "in the PAT, so we'll just use it");
340  uint pid = pat->FindAnyPID();
341  SetProgramNumber(pat->FindProgram(pid));
344  }
345  }
346 }
347 
349 {
351 
352  if (programNumber < 0)
353  return; // don't print error messages during channel scan.
354 
355  if (pmt->ProgramNumber() != (uint)programNumber)
356  {
357  if (insert_crc(seen_table_crc, *pmt))
358  {
359  LOG(VB_GENERAL, LOG_ERR, LOC +
360  QString("Wrong PMT; pmt->pn(%1) desired(%2)")
361  .arg(pmt->ProgramNumber()).arg(programNumber));
362  }
363  return; // Not the PMT we are looking for...
364  }
365 
366  if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard())) {
367  LOG(VB_GENERAL, LOG_NOTICE, LOC +
368  QString("PMT says program %1 is encrypted").arg(programNumber));
370  }
371 
372  // if PMT contains audio and/or video stream set as matching.
373  uint hasAudio = 0;
374  uint hasVideo = 0;
375 
376  for (uint i = 0; i < pmt->StreamCount(); i++)
377  {
378  hasVideo += pmt->IsVideo(i, GetDTVChannel()->GetSIStandard());
379  hasAudio += pmt->IsAudio(i, GetDTVChannel()->GetSIStandard());
380  }
381 
382  if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) &&
383  (hasAudio >= GetStreamData()->GetAudioStreamsRequired()))
384  {
385  if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard()) &&
388 
390  }
391  else
392  {
393  LOG(VB_GENERAL, LOG_ERR, LOC +
394  QString("We want %1 audio and %2 video streams")
395  .arg(GetStreamData()->GetAudioStreamsRequired())
396  .arg(GetStreamData()->GetVideoStreamsRequired()) +
397  QString("\n\t\t\tBut have %1 audio and %2 video streams")
398  .arg(hasAudio).arg(hasVideo));
399  }
400 }
401 
403 {
404  LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
405  .arg(GetStreamData()->TimeOffset()));
406 }
407 
409 {
411 
412  if (!GetATSCStreamData())
413  return;
414 
415  for (uint i=0; i<mgt->TableCount(); i++)
416  {
417  if ((TableClass::TVCTc == mgt->TableClass(i)) ||
418  (TableClass::CVCTc == mgt->TableClass(i)))
419  {
422  }
423  }
424 }
425 
428 {
430  int idx = tvct->Find(majorChannel, minorChannel);
431 
432  if (minorChannel < 0)
433  return; // don't print error message during channel scan.
434 
435  if (idx < 0)
436  {
437  if (insert_crc(seen_table_crc, *tvct))
438  {
439  LOG(VB_GENERAL, LOG_ERR, LOC +
440  QString("Could not find channel %1_%2 in TVCT")
441  .arg(majorChannel).arg(minorChannel));
442  LOG(VB_GENERAL, LOG_ERR, LOC + tvct->toString());
443  }
445  return;
446  }
447 
448  DBG_SM("SetVCT()", QString("tvct->ProgramNumber(idx %1): prog num %2")
449  .arg(idx).arg(tvct->ProgramNumber(idx)));
450 
451  SetProgramNumber(tvct->ProgramNumber(idx));
453 }
454 
456 {
458  int idx = cvct->Find(majorChannel, minorChannel);
459 
460  if (idx < 0)
461  {
462  if (insert_crc(seen_table_crc, *cvct))
463  {
464  LOG(VB_GENERAL, LOG_ERR, LOC +
465  QString("Could not find channel %1_%2 in CVCT")
466  .arg(majorChannel).arg(minorChannel));
467  LOG(VB_GENERAL, LOG_ERR, LOC + cvct->toString());
468  }
470  return;
471  }
472 
473  DBG_SM("SetVCT()", QString("cvct->ProgramNumber(idx %1): prog num %2")
474  .arg(idx).arg(cvct->ProgramNumber(idx)));
475 
476  SetProgramNumber(cvct->ProgramNumber(idx));
478 }
479 
481 {
482  LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
483  .arg(GetStreamData()->TimeOffset()));
484 }
485 
487 {
488  DBG_SM("SetNIT()", QString("net_id = %1").arg(nit->NetworkID()));
490  if (!GetDVBStreamData())
491  return;
492 }
493 
495 {
497 
499  detectedTransportID = sdt->TSID();
500 
501  // if the multiplex is not properly configured with ONID and TSID then take
502  // whatever SDT we see first
503  if ((networkID == 0) && (transportID == 0))
504  {
507 
508  // FIXME assert if TableID == SDTo
509  }
510 
511  if (sdt->OriginalNetworkID() != networkID || sdt->TSID() != transportID)
512  {
513  GetDVBStreamData()->SetVersionSDT(sdt->TSID(), -1, 0);
514  }
515  else
516  {
517  DBG_SM("SetSDT()", QString("tsid = %1 orig_net_id = %2")
518  .arg(sdt->TSID()).arg(sdt->OriginalNetworkID()));
521  }
522 }
523 
525 {
527  if (!enc_status)
529 }
530 
532 {
533  return dynamic_cast<ATSCStreamData*>(stream_data);
534 }
535 
537 {
538  return dynamic_cast<DVBStreamData*>(stream_data);
539 }
540 
542 {
543  return dynamic_cast<ScanStreamData*>(stream_data);
544 }
545 
547 {
548  return dynamic_cast<const ATSCStreamData*>(stream_data);
549 }
550 
552 {
553  return dynamic_cast<const DVBStreamData*>(stream_data);
554 }
555 
557 {
558  return dynamic_cast<const ScanStreamData*>(stream_data);
559 }
560 
562 {
563  QMutexLocker locker(&statusLock);
565  return false;
567  return false;
569  return false;
571  return false;
573  return false;
575  return false;
577  return false;
579  return false;
580 
581  return true;
582 }
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.
SignalMonitorValue seenPAT
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
SignalMonitorValue matchingVCT
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
SignalMonitorValue seenVCT
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:487
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
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.
MPEGStreamData * stream_data
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
bool IsAudio(uint i, QString sistandard) const
Returns true iff the stream at index i is an audio stream.
Definition: mpegtables.cpp:536
void RemoveMPEGListener(MPEGStreamListener *)
static bool insert_crc(QList< uint64_t > &seen_crc, const PSIPTable &psip)
static const uint64_t kDTVSigMon_WaitForVCT
static const uint64_t kDTVSigMon_WaitForMGT
void AddATSCAuxListener(ATSCAuxStreamListener *)
static const uint64_t kDTVSigMon_CryptSeen
We've seen something indicating whether the data stream is encrypted.
void SetValue(int _value)
static const uint64_t kDTVSigMon_WaitForNIT
#define DBG_SM(FUNC, MSG)
QString toString(void) const override
Definition: atsctables.cpp:202
Overall structure.
SignalMonitorValue seenCrypt
int TableClass(uint i) const
Definition: atsctables.cpp:25
virtual void RemoveListeningPID(uint pid)
void AddDVBMainListener(DVBMainStreamListener *)
void RemoveFlags(uint64_t _flags) override
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
void SetDVBService(uint network_id, uint transport_id, int service_id)
VERBOSE_PREAMBLE false
Definition: verbosedefs.h:85
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
uint StreamCount(void) const
Definition: mpegtables.h:714
void HandleTVCT(uint, const TerrestrialVirtualChannelTable *) override
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.
SignalMonitorValue seenMGT
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 *)
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
uint TransportStreamID(void) const
Definition: mpegtables.h:598
SignalMonitorValue matchingSDT
static const uint64_t kDTVSigMon_VCTMatch
We've seen a VCT matching our requirements.
void RemoveATSCMainListener(ATSCMainStreamListener *)
void HandlePAT(const ProgramAssociationTable *) override
volatile uint64_t flags
static const uint64_t kDTVSigMon_PATMatch
We've seen a PAT matching our requirements.
uint CRC(void) const
Definition: pespacket.h:188
SignalMonitorValue seenSDT
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
SignalMonitorValue matchingPMT
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 seenNIT
QString toString(void) const override
Definition: mpegtables.cpp:806
QList< uint64_t > seen_table_crc
This table tells the decoder on which PIDs to find other tables, and their sizes and each table's cur...
Definition: atsctables.h:74
SignalMonitorValue matchingPAT
uint ProgramNumber(void) const
Definition: mpegtables.h:693
void RemoveDVBMainListener(DVBMainStreamListener *)
#define LOC
SignalMonitorValue seenPMT
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
bool IsEncrypted(QString sistandard) const
Returns true iff PMT contains CA descriptor for a vid/aud stream.
Definition: mpegtables.cpp:552
virtual ~DTVSignalMonitor()
void HandleMGT(const MasterGuideTable *) override
virtual void AddFlags(uint64_t _flags)
ChannelBase * channel
static const uint64_t kDTVSigMon_NITMatch
We've seen an NIT matching our requirements.
static const uint64_t kDTVSigMon_WaitForCrypt
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
SignalMonitorValue matchingMGT
static const uint64_t kDTVSigMon_TVCTMatch
We've seen a TVCT matching our requirements.
SignalMonitorValue matchingNIT
SignalMonitorValue matchingCrypt
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
bool IsVideo(uint i, QString sistandard) const
Returns true iff the stream at index i is a video stream.
Definition: mpegtables.cpp:514
uint TransportStreamID() const
Definition: atsctables.h:218
Encapsulates data about MPEG stream and emits events for each table.
vector< uint > eit_pids
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)