MythTV master
dtvsignalmonitor.cpp
Go to the documentation of this file.
1#include <algorithm> // for lower_bound
2#include <unistd.h>
3
6
7#include "dtvchannel.h"
8#include "dtvsignalmonitor.h"
9#include "mpeg/atsctables.h"
10#include "mpeg/dvbtables.h"
11#include "mpeg/mpegtables.h"
12#include "mpeg/scanstreamdata.h"
13
14// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
15#define DBG_SM(FUNC, MSG) LOG(VB_CHANNEL, LOG_INFO, \
16 QString("DTVSigMon[%1]: %2 %3").arg(m_inputid).arg(FUNC, MSG))
17
18#define LOC QString("DTVSigMon[%1]: ").arg(m_inputid)
19
20// inserts tid&crc value into an ordered list
21// returns true if item is inserted
22static bool insert_crc(QList<uint64_t> &seen_crc, const PSIPTable &psip)
23{
24 uint64_t key = (((uint64_t)psip.TableID()) << 32) | psip.CRC();
25
26 QList<uint64_t>::iterator it =
27 std::lower_bound(seen_crc.begin(), seen_crc.end(), key);
28
29 if ((it == seen_crc.end()) || (*it != key))
30 {
31 seen_crc.insert(it, key);
32 return true;
33 }
34
35 return false;
36}
37
43 DTVChannel *_channel,
44 bool _release_stream,
45 uint64_t wait_for_mask)
46 : SignalMonitor(db_cardnum, _channel, _release_stream, wait_for_mask),
47 m_seenPAT(QObject::tr("Seen")+" PAT", "seen_pat", 1, true, 0, 1, 0ms),
48 m_seenPMT(QObject::tr("Seen")+" PMT", "seen_pmt", 1, true, 0, 1, 0ms),
49 m_seenMGT(QObject::tr("Seen")+" MGT", "seen_mgt", 1, true, 0, 1, 0ms),
50 m_seenVCT(QObject::tr("Seen")+" VCT", "seen_vct", 1, true, 0, 1, 0ms),
51 m_seenNIT(QObject::tr("Seen")+" NIT", "seen_nit", 1, true, 0, 1, 0ms),
52 m_seenSDT(QObject::tr("Seen")+" SDT", "seen_sdt", 1, true, 0, 1, 0ms),
53 m_seenCrypt(QObject::tr("Seen")+" Crypt", "seen_crypt", 1, true, 0, 1, 0ms),
54 m_matchingPAT(QObject::tr("Matching")+" PAT", "matching_pat", 1, true, 0, 1, 0ms),
55 m_matchingPMT(QObject::tr("Matching")+" PMT", "matching_pmt", 1, true, 0, 1, 0ms),
56 m_matchingMGT(QObject::tr("Matching")+" MGT", "matching_mgt", 1, true, 0, 1, 0ms),
57 m_matchingVCT(QObject::tr("Matching")+" VCT", "matching_vct", 1, true, 0, 1, 0ms),
58 m_matchingNIT(QObject::tr("Matching")+" NIT", "matching_nit", 1, true, 0, 1, 0ms),
59 m_matchingSDT(QObject::tr("Matching")+" SDT", "matching_sdt", 1, true, 0, 1, 0ms),
60 m_matchingCrypt(QObject::tr("Matching")+" Crypt", "matching_crypt",
61 1, true, 0, 1, 0ms)
62{
63}
64
66{
68}
69
71{
72 return dynamic_cast<DTVChannel*>(m_channel);
73}
74
75QStringList DTVSignalMonitor::GetStatusList(void) const
76{
77 QStringList list = SignalMonitor::GetStatusList();
78 QMutexLocker locker(&m_statusLock);
79
80 // mpeg tables
82 {
85 }
87 {
88#define DEBUG_PMT 0
89#if DEBUG_PMT
90 static int seenGood = -1;
91 static int matchingGood = -1;
92#endif
95#if DEBUG_PMT
96 if ((seenGood != (int)m_seenPMT.IsGood()) ||
97 (matchingGood != (int)m_matchingPMT.IsGood()))
98 {
99 DBG_SM("GetStatusList", QString("WaitForPMT seen(%1) matching(%2)")
100 .arg(m_seenPMT.IsGood())
101 .arg(m_matchingPMT.IsGood()));
102 seenGood = (int)m_seenPMT.IsGood();
103 matchingGood = (int)m_matchingPMT.IsGood();
104 }
105#endif
106 }
107 // atsc tables
109 {
112 }
114 {
117 }
118 // dvb tables
120 {
123 }
125 {
128 }
130 {
133 }
134 if (!m_error.isEmpty())
135 {
136 list<<"error"<<m_error;
137 }
138 return list;
139}
140
141void DTVSignalMonitor::AddFlags(uint64_t _flags)
142{
145}
146
147void DTVSignalMonitor::RemoveFlags(uint64_t _flags)
148{
151}
152
154{
155 QMutexLocker locker(&m_statusLock);
170}
171
173{
174 std::vector<uint> add_eit;
175 std::vector<uint> del_eit;
176
177 if (GetStreamData()->HasEITPIDChanges(m_eitPids) &&
178 GetStreamData()->GetEITPIDChanges(m_eitPids, add_eit, del_eit))
179 {
180 for (uint eit : del_eit)
181 {
182 uint_vec_t::iterator it;
183 it = find(m_eitPids.begin(), m_eitPids.end(), eit);
184 if (it != m_eitPids.end())
185 m_eitPids.erase(it);
187 }
188
189 for (uint eit : add_eit)
190 {
191 m_eitPids.push_back(eit);
193 }
194 }
195}
196
198{
199 DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), "");
200 m_seenTableCrc.clear();
202 if (atsc && (m_majorChannel != major || m_minorChannel != minor))
203 {
208 m_majorChannel = major;
210 atsc->SetDesiredChannel(major, minor);
212 }
213}
214
216{
217 DBG_SM(QString("SetProgramNumber(%1)").arg(progNum), "");
218 m_seenTableCrc.clear();
219 if (m_programNumber != progNum)
220 {
223 m_programNumber = progNum;
224 if (GetStreamData())
227 }
228}
229
230void 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_seenTableCrc.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
251 if (dvb != nullptr)
252 {
253 dvb->SetDesiredService(network_id, transport_id, m_programNumber);
256 }
257}
258
260{
261 if (m_streamData)
263
266 if (atsc)
267 {
268 atsc->RemoveATSCMainListener(this);
269 atsc->RemoveATSCAuxListener(this);
270 }
271 if (dvb)
272 dvb->RemoveDVBMainListener(this);
273
274 m_streamData = 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 LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("HandlePAT() ") +
315 QString("Received PAT for tsid %1 waiting for tsid %2")
316 .arg(tsid).arg(m_transportID));
317
318 // Only one entry in the PAT, just use this program
319 int spts_program = 0;
320 if (pat->ProgramCount() == 1)
321 {
322 spts_program = pat->ProgramNumber(0);
323 pmt_pid = pat->ProgramPID(0);
324 }
325
326 // Two entries in the PAT, but if one is a pointer to the NIT PID
327 // instead of a real program then the other is the single program.
328 if (pat->ProgramCount() == 2)
329 {
330 if (pat->ProgramNumber(0) == 0)
331 {
332 spts_program = pat->ProgramNumber(1);
333 pmt_pid = pat->ProgramPID(1);
334 }
335 else if (pat->ProgramNumber(1) == 0)
336 {
337 spts_program = pat->ProgramNumber(0);
338 pmt_pid = pat->ProgramPID(0);
339 }
340 }
341
342 if (spts_program > 0)
343 {
344 LOG(VB_GENERAL, LOG_INFO, LOC +
345 QString("Program %1 found in PAT of SPTS").arg(spts_program));
346 SetProgramNumber(spts_program);
348 GetStreamData()->AddListeningPID(pmt_pid);
349 }
350
351 if (insert_crc(m_seenTableCrc, *pat))
352 {
353 QString errStr = QString("Program #%1 not found in PAT!")
354 .arg(m_programNumber);
355 LOG(VB_GENERAL, LOG_ERR, LOC + errStr + "\n" + pat->toString());
356 }
357 }
358}
359
360void DTVSignalMonitor::HandlePMT(uint /*program_num*/, const ProgramMapTable *pmt)
361{
363
364 if (m_programNumber < 0)
365 return; // don't print error messages during channel scan.
366
367 if (pmt->ProgramNumber() != (uint)m_programNumber)
368 {
369 if (insert_crc(m_seenTableCrc, *pmt))
370 {
371 LOG(VB_CHANNEL, LOG_DEBUG, LOC +
372 QString("Wrong PMT; pmt->ProgramNumber(%1) desired(%2)")
373 .arg(pmt->ProgramNumber()).arg(m_programNumber));
374 }
375 return; // Not the PMT we are looking for...
376 }
377
378 LOG(VB_CHANNEL, LOG_DEBUG, LOC +
379 QString("Found PMT; pmt->ProgramNumber(%1)")
380 .arg(pmt->ProgramNumber()));
381
382 if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard())) {
383 LOG(VB_GENERAL, LOG_NOTICE, LOC +
384 QString("PMT says program %1 is encrypted").arg(m_programNumber));
386 }
387
388 // if PMT contains audio and/or video stream set as matching.
389 uint hasAudio = 0;
390 uint hasVideo = 0;
391
392 for (uint i = 0; i < pmt->StreamCount(); i++)
393 {
394 if (pmt->IsVideo(i, GetDTVChannel()->GetSIStandard()))
395 hasVideo++;
396 if (pmt->IsAudio(i, GetDTVChannel()->GetSIStandard()))
397 hasAudio++;
398 }
399
400 if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) &&
401 (hasAudio >= GetStreamData()->GetAudioStreamsRequired()))
402 {
403 if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard()) &&
406
408 }
409 else
410 {
411 LOG(VB_GENERAL, LOG_ERR, LOC +
412 QString("We want %1 audio and %2 video streams")
413 .arg(GetStreamData()->GetAudioStreamsRequired())
414 .arg(GetStreamData()->GetVideoStreamsRequired()) +
415 QString("\n\t\t\tBut have %1 audio and %2 video streams")
416 .arg(hasAudio).arg(hasVideo));
417 }
418}
419
421{
422 LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
423 .arg(GetStreamData()->TimeOffset()));
424}
425
427{
429
431 if (!atsc)
432 return;
433
434 for (uint i=0; i<mgt->TableCount(); i++)
435 {
436 if ((TableClass::TVCTc == mgt->TableClass(i)) ||
437 (TableClass::CVCTc == mgt->TableClass(i)))
438 {
439 atsc->AddListeningPID(mgt->TablePID(i));
441 }
442 }
443}
444
446 uint /*pid*/, const TerrestrialVirtualChannelTable* tvct)
447{
449 int idx = tvct->Find(m_majorChannel, m_minorChannel);
450
451 if (m_minorChannel < 0)
452 return; // don't print error message during channel scan.
453
454 if (idx < 0)
455 {
456 if (insert_crc(m_seenTableCrc, *tvct))
457 {
458 LOG(VB_GENERAL, LOG_ERR, LOC +
459 QString("Could not find channel %1_%2 in TVCT")
460 .arg(m_majorChannel).arg(m_minorChannel));
461 LOG(VB_GENERAL, LOG_DEBUG, LOC + tvct->toString());
462 }
464 if (atsc)
465 atsc->SetVersionTVCT(tvct->TransportStreamID(),-1);
466 return;
467 }
468
469 DBG_SM("HandleTVCT()", QString("tvct->ProgramNumber(idx %1): prog num %2")
470 .arg(idx).arg(tvct->ProgramNumber(idx)));
471
474}
475
477{
479 int idx = cvct->Find(m_majorChannel, m_minorChannel);
480
481 if (idx < 0)
482 {
483 if (insert_crc(m_seenTableCrc, *cvct))
484 {
485 LOG(VB_GENERAL, LOG_ERR, LOC +
486 QString("Could not find channel %1_%2 in CVCT")
487 .arg(m_majorChannel).arg(m_minorChannel));
488 LOG(VB_GENERAL, LOG_DEBUG, LOC + cvct->toString());
489 }
491 if (atsc)
492 atsc->SetVersionCVCT(cvct->TransportStreamID(),-1);
493 return;
494 }
495
496 DBG_SM("HandleCVCT()", QString("cvct->ProgramNumber(idx %1): prog num %2")
497 .arg(idx).arg(cvct->ProgramNumber(idx)));
498
501}
502
504{
505 LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Time Offset: %1")
506 .arg(GetStreamData()->TimeOffset()));
507}
508
510{
511 DBG_SM("HandleNIT()", QString("net_id = %1").arg(nit->NetworkID()));
513 if (!GetDVBStreamData())
514 return;
515}
516
518{
520
523
524 // if the multiplex is not properly configured with ONID and TSID then take
525 // whatever SDT we see first
526 if ((m_networkID == 0) && (m_transportID == 0))
527 {
530
531 // FIXME assert if TableID == SDTo
532 }
533
534 if (sdt->OriginalNetworkID() != m_networkID || sdt->TSID() != m_transportID)
535 {
537 if (dvb)
538 dvb->SetVersionSDT(sdt->TSID(), -1, 0);
539 }
540 else
541 {
542 DBG_SM("HandleSDT()", QString("tsid = %1 orig_net_id = %2")
543 .arg(sdt->TSID()).arg(sdt->OriginalNetworkID()));
546 }
547}
548
549void DTVSignalMonitor::HandleEncryptionStatus(uint /*program_number*/, bool enc_status)
550{
552 if (!enc_status)
554}
555
557{
558 return dynamic_cast<ATSCStreamData*>(m_streamData);
559}
560
562{
563 return dynamic_cast<DVBStreamData*>(m_streamData);
564}
565
567{
568 return dynamic_cast<ScanStreamData*>(m_streamData);
569}
570
572{
573 return dynamic_cast<const ATSCStreamData*>(m_streamData);
574}
575
577{
578 return dynamic_cast<const DVBStreamData*>(m_streamData);
579}
580
582{
583 return dynamic_cast<const ScanStreamData*>(m_streamData);
584}
585
587{
588 QMutexLocker locker(&m_statusLock);
590 return false;
592 return false;
594 return false;
596 return false;
598 return false;
600 return false;
602 return false;
604 return false;
605
606 return true;
607}
Overall structure.
Encapsulates data about ATSC stream and emits events for most tables.
void RemoveATSCMainListener(ATSCMainStreamListener *val)
void SetVersionTVCT(uint tsid, int version)
void SetVersionCVCT(uint tsid, int version)
void RemoveATSCAuxListener(ATSCAuxStreamListener *val)
void AddATSCAuxListener(ATSCAuxStreamListener *val)
void AddATSCMainListener(ATSCMainStreamListener *val)
void SetDesiredChannel(int major, int minor)
This table contains information about the cable channels transmitted on this multiplex.
Definition: atsctables.h:423
Class providing a generic interface to digital tuning hardware.
Definition: dtvchannel.h:34
bool IsAllGood(void) const override
void HandlePMT(uint program_num, const ProgramMapTable *pmt) override
SignalMonitorValue m_matchingVCT
void SetDVBService(uint network_id, uint transport_id, int service_id)
SignalMonitorValue m_matchingPAT
void HandlePAT(const ProgramAssociationTable *pat) override
SignalMonitorValue m_matchingCrypt
void UpdateListeningForEIT(void)
void AddFlags(uint64_t _flags) override
void HandleNIT(const NetworkInformationTable *nit) override
void HandleTDT(const TimeDateTable *tdt) override
std::vector< uint > m_eitPids
QStringList GetStatusList(void) const override
Returns QStringList containing all signals and their current values.
DTVChannel * GetDTVChannel(void)
SignalMonitorValue m_matchingPMT
SignalMonitorValue m_seenPMT
~DTVSignalMonitor() override
SignalMonitorValue m_matchingMGT
void HandleSTT(const SystemTimeTable *stt) override
void HandleMGT(const MasterGuideTable *mgt) override
SignalMonitorValue m_matchingSDT
SignalMonitorValue m_seenSDT
SignalMonitorValue m_seenVCT
void UpdateMonitorValues(void)
SignalMonitorValue m_seenPAT
ATSCStreamData * GetATSCStreamData()
Returns the ATSC stream data if it exists.
void SetChannel(int major, int minor)
void RemoveFlags(uint64_t _flags) override
SignalMonitorValue m_seenMGT
void HandleCVCT(uint pid, const CableVirtualChannelTable *cvct) override
void HandleSDT(uint tsid, const ServiceDescriptionTable *sdt) override
MPEGStreamData * GetStreamData()
Returns the MPEG stream data if it exists.
MPEGStreamData * m_streamData
SignalMonitorValue m_seenNIT
void SetProgramNumber(int progNum)
DTVSignalMonitor(int db_cardnum, DTVChannel *_channel, bool _release_stream, uint64_t wait_for_mask)
SignalMonitorValue m_seenCrypt
ScanStreamData * GetScanStreamData()
Returns the scan stream data if it exists.
DVBStreamData * GetDVBStreamData()
Returns the DVB stream data if it exists.
void HandleEncryptionStatus(uint pnum, bool enc_status) override
QList< uint64_t > m_seenTableCrc
SignalMonitorValue m_matchingNIT
void HandleTVCT(uint pid, const TerrestrialVirtualChannelTable *tvct) override
virtual void SetStreamData(MPEGStreamData *data)
Sets the MPEG stream data for DTVSignalMonitor to use, and connects the table signals to the monitor.
void RemoveDVBMainListener(DVBMainStreamListener *val)
void SetDesiredService(uint netid, uint tsid, int serviceid)
void AddDVBMainListener(DVBMainStreamListener *val)
void SetVersionSDT(uint tsid, int version, uint last_section)
Definition: dvbstreamdata.h:68
Encapsulates data about MPEG stream and emits events for each table.
void AddMPEGListener(MPEGStreamListener *val)
void SetDesiredProgram(int p)
void TestDecryption(const ProgramMapTable *pmt)
void RemoveMPEGListener(MPEGStreamListener *val)
virtual void RemoveListeningPID(uint pid)
void SetVersionPAT(uint tsid, int version, uint last_section)
virtual void AddListeningPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
This table tells the decoder on which PIDs to find other tables, and their sizes and each table's cur...
Definition: atsctables.h:83
uint TableCount() const
Definition: atsctables.h:123
uint TablePID(uint i) const
Definition: atsctables.h:135
int TableClass(uint i) const
Definition: atsctables.cpp:28
This table tells the decoder on which PIDs to find other tables.
Definition: dvbtables.h:34
uint NetworkID(void) const
network_id 16 3.0 0x0000
Definition: dvbtables.h:62
uint CRC(void) const
Definition: pespacket.h:189
@ DVB_SDT_PID
Definition: mpegtables.h:216
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
Definition: mpegtables.h:410
uint TableID(void) const
Definition: mpegtables.h:496
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
Definition: mpegtables.h:599
QString toString(void) const override
Definition: mpegtables.cpp:841
uint ProgramCount(void) const
Definition: mpegtables.h:619
uint TransportStreamID(void) const
Definition: mpegtables.h:617
uint FindPID(uint progNum) const
Definition: mpegtables.h:638
uint ProgramNumber(uint i) const
Definition: mpegtables.h:626
uint ProgramPID(uint i) const
Definition: mpegtables.h:629
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
Definition: mpegtables.h:676
bool IsEncrypted(const QString &sistandard) const
Returns true iff PMT contains CA descriptor for a vid/aud stream.
Definition: mpegtables.cpp:556
uint StreamCount(void) const
Definition: mpegtables.h:733
uint ProgramNumber(void) const
Definition: mpegtables.h:712
bool IsAudio(uint i, const QString &sistandard) const
Returns true iff the stream at index i is an audio stream.
Definition: mpegtables.cpp:540
bool IsVideo(uint i, const QString &sistandard) const
Returns true iff the stream at index i is a video stream.
Definition: mpegtables.cpp:518
This table tells the decoder on which PIDs to find A/V data.
Definition: dvbtables.h:114
uint TSID() const
transport_stream_id 16 3.0 0x0000
Definition: dvbtables.h:141
uint OriginalNetworkID() const
original_network_id 16 8.0
Definition: dvbtables.h:144
bool IsGood() const
Returns true if the value is equal to the threshold, or on the right side of the threshold (depends o...
QString GetName(void) const
Returns the long name of this value.
void SetValue(int _value)
QString GetStatus() const
Returns a signal monitor value as one long string.
Signal monitoring base class.
Definition: signalmonitor.h:31
static const uint64_t kDTVSigMon_WaitForVCT
static const uint64_t kDTVSigMon_VCTMatch
We've seen a VCT matching our requirements.
QRecursiveMutex m_statusLock
virtual void RemoveFlags(uint64_t _flags)
static const uint64_t kDTVSigMon_CryptSeen
We've seen something indicating whether the data stream is encrypted.
static const uint64_t kDTVSigMon_WaitForNIT
static const uint64_t kDTVSigMon_PMTMatch
We've seen a PMT matching our requirements.
virtual QStringList GetStatusList(void) const
Returns QStringList containing all signals and their current values.
static const uint64_t kDVBSigMon_WaitForPos
Wait for rotor to complete turning the antenna.
static const uint64_t kDTVSigMon_CVCTSeen
We've seen a CVCT, the cable version of the VCT.
static const uint64_t kDTVSigMon_WaitForSDT
static const uint64_t kDTVSigMon_NITSeen
We've seen a NIT, which tells us where to find SDT and other DVB tables.
ChannelBase * m_channel
virtual bool IsAllGood(void) const
Definition: signalmonitor.h:81
static const uint64_t kDTVSigMon_MGTMatch
We've seen an MGT matching our requirements.
static const uint64_t kDTVSigMon_CryptMatch
We've seen unencrypted data in data stream.
static const uint64_t kDTVSigMon_WaitForPMT
static const uint64_t kDTVSigMon_SDTSeen
We've seen a SDT, which maps DVB Channels to MPEG program numbers, and provides additional data.
static const uint64_t kDTVSigMon_WaitForPAT
static const uint64_t kDTVSigMon_WaitForCrypt
static const uint64_t kDTVSigMon_PATMatch
We've seen a PAT matching our requirements.
static const uint64_t kDTVSigMon_CVCTMatch
We've seen a CVCT matching our requirements.
static const uint64_t kDTVSigMon_WaitForMGT
static const uint64_t kDTVSigMon_TVCTMatch
We've seen a TVCT matching our requirements.
virtual void AddFlags(uint64_t _flags)
static const uint64_t kDTVSigMon_TVCTSeen
We've seen a TVCT, the terrestrial version of the VCT.
static const uint64_t kDTVSigMon_VCTSeen
We've seen a VCT, which maps ATSC Channels to MPEG program numbers, and provides additional data.
static const uint64_t kDTVSigMon_MGTSeen
We've seen a MGT, which tells us on which PIDs to find VCT and other ATSC tables.
static const uint64_t kDTVSigMon_SDTMatch
We've seen an SDT matching our requirements.
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_NITMatch
We've seen an NIT matching our requirements.
volatile uint64_t m_flags
static const uint64_t kDTVSigMon_PATSeen
We've seen a PAT, which maps MPEG program numbers to pids where we find PMTs.
This table contains the GPS time at the time of transmission.
Definition: atsctables.h:688
This table contains information about the terrestrial channels transmitted on this multiplex.
Definition: atsctables.h:354
This table gives the current DVB stream time.
Definition: dvbtables.h:387
uint TransportStreamID() const
Definition: atsctables.h:225
QString toString(void) const override
Definition: atsctables.cpp:203
int Find(int major, int minor) const
Definition: atsctables.cpp:487
uint ProgramNumber(uint i) const
Definition: atsctables.h:274
#define minor(X)
Definition: compat.h:74
#define LOC
#define DBG_SM(FUNC, MSG)
static bool insert_crc(QList< uint64_t > &seen_crc, const PSIPTable &psip)
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)
unsigned int uint
Definition: freesurround.h:24
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:95