21#define LOC QString("MPEGStream[%1](0x%2): ").arg(m_cardId).arg((intptr_t)this, QT_POINTER_SIZE, 16, QChar('0'))
42 m_cacheTables(cacheTables),
44 m_desiredProgram(desiredProgram)
73 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"SetDesiredProgram(%2)").arg(
p));
75 for (
uint i =
p ? 0 : pats.size(); i < pats.size() && !pid; i++)
87 for (
auto & pmt : pmts)
89 if (pmt->ProgramNumber() == (
uint)
p)
134 for (
auto it = old.begin(); it != old.end(); ++it)
206 bool &moreTablePackets)
209 moreTablePackets =
true;
219 LOG(VB_RECORD, LOG_ERR,
LOC +
220 QString(
"Discarding broken PSIP packet. Packet's length at "
221 "position %1 isn't in the buffer of %2 bytes.")
232 if (!buggy && !partial->
IsGood())
234 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"Discarding broken PSIP packet on PID 0x%1")
235 .arg(tspacket->
PID(),2,16,QChar(
'0')));
244 uint packetStart = partial->
PSIOffset() + 1 + psip->SectionLength();
245 if (packetStart < partial->TSSizeInBuffer())
247 if (partial->
pesdata()[psip->SectionLength()] != 0xff)
268 psip->SectionLength());
276 LOG(VB_RECORD, LOG_ERR,
LOC +
277 QString(
"TSPacket pid(0x%3) ").arg(tspacket->
PID(),2,16,QChar(
'0')) +
278 QString(
"Discarding broken PSIP packet. ") +
279 QString(
"Packet with %1 bytes doesn't fit into a buffer of %2 bytes.")
285 moreTablePackets =
false;
296 moreTablePackets =
false;
305 moreTablePackets =
false;
311 const unsigned int extra_offset = 4;
313 const unsigned char* pesdata = tspacket->
data() + offset;
319 pes_length = (pesdata[2] & 0x0f) << 8 | pesdata[3];
323 if (pes_length == 0 || (pes_length + offset + extra_offset) >
TSPacket::kSize)
326 moreTablePackets =
false;
337 (pesdata[psip->SectionLength() + 1] != 0xff))
342 pesp->SetPSIOffset(offset + psip->SectionLength());
347 moreTablePackets =
false;
354 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"CreatePATSingleProgram()");
355 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PAT in input stream");
359 LOG(VB_RECORD, LOG_ERR,
LOC +
"Desired program not set yet");
363 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"desired_program(%1) pid(0x%2)").
371 LOG(VB_GENERAL, LOG_ERR,
LOC +
"No program found in PAT. "
372 "This recording will not play in MythTV.");
374 LOG(VB_GENERAL, LOG_ERR,
LOC +
375 QString(
"Desired program #%1 not found in PAT."
376 "\n\t\t\tCannot create single program PAT.")
384 std::vector<uint> pnums;
385 std::vector<uint> pids;
397 LOG(VB_GENERAL, LOG_ERR,
LOC +
398 "MPEGStreamData::CreatePATSingleProgram: "
399 "Failed to create Program Association Table.");
405 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"pmt_pid(0x%1)")
407 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PAT for output stream");
422 std::vector<const VirtualChannelTable*> vct;
424 for (
const auto *i : tvct)
427 for (
const auto *i : cvct)
430 for (
size_t i = 0; i < tvct.size(); i++)
432 for (
uint j = 0; j < vct[i]->ChannelCount(); j++)
434 if (vct[i]->ProgramNumber(j) == pnum)
437 vct[i]->Descriptors(j), vct[i]->DescriptorsLength(j),
441 desc.insert(desc.end(), ldesc.begin(), ldesc.end());
445 if (0 != vct[i]->GlobalDescriptorsLength())
448 vct[i]->GlobalDescriptors(),
449 vct[i]->GlobalDescriptorsLength(),
453 desc.insert(desc.end(), vdesc.begin(), vdesc.end());
462 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"CreatePMTSingleProgram()");
463 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PMT in input stream");
468 LOG(VB_RECORD, LOG_ERR,
LOC +
"no PAT yet...");
473 uint programNumber = 1;
499 gdesc.insert(gdesc.end(), vdesc.begin(), vdesc.end());
503 std::vector<uint> pids;
504 std::vector<uint>
types;
505 std::vector<desc_list_t> pdesc;
507 std::vector<uint> videoPIDs;
508 std::vector<uint> audioPIDs;
509 std::vector<uint> dataPIDs;
527 audioPIDs.push_back(pid);
536#ifdef DEBUG_MPEG_RADIO
543 videoPIDs.push_back(pid);
558 if (!is_audio && !is_video)
559 dataPIDs.push_back(pid);
561 pdesc.push_back(desc);
568 LOG(VB_RECORD, LOG_ERR,
LOC +
569 QString(
"Only %1 video streams seen in PMT, but %2 are required.")
576 LOG(VB_RECORD, LOG_ERR,
LOC +
577 QString(
"Only %1 audio streams seen in PMT, but %2 are required.")
585 for (
auto & i : cdesc)
596 for (
uint pid : audioPIDs)
601 for (
size_t i = 1; i < videoPIDs.size(); i++)
604 for (
uint pid : dataPIDs)
633 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PMT for output stream");
645 const int table_id = psip.
TableID();
727 listener->HandleSplice(&sit);
742 listener->HandlePAT(pat);
748 bool send_single_program =
false;
754 LOG(VB_RECORD, LOG_WARNING,
LOC +
755 "ProcessPAT: PAT is missing program, setting timeout");
762 LOG(VB_GENERAL, LOG_ERR,
LOC +
"ProcessPAT: Program not found in PAT. "
763 "Rescan your transports.");
767 else if (foundProgram)
770 LOG(VB_RECORD, LOG_INFO,
LOC +
771 "ProcessPAT: Good PAT seen after a bad PAT");
778 if (send_single_program)
783 listener->HandleSingleProgramPAT(pat_sp,
false);
791 listener->HandleCAT(
cat);
795 cat->Descriptors(),
cat->DescriptorsLength(),
797 for (
auto & i : cdesc)
821 listener->HandleSingleProgramPMT(pmt_sp,
false);
831 double avg_offset = 0.0;
841 struct timeval tm {};
842 if (gettimeofday(&tm,
nullptr) != 0)
845 double utc_time = tm.tv_sec + (tm.tv_usec * 0.000001);
846 double si_time = _si_utc_time;
863 bool morePSIPTables =
true;
864 while (morePSIPTables)
878 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"Dropping Stuffing table");
894 if (!buggy && !psip->
IsGood())
896 LOG(VB_RECORD, LOG_ERR,
LOC +
897 QString(
"PSIP packet failed CRC check. pid(0x%1) type(0x%2)")
898 .arg(tspacket->
PID(),0,16).arg(psip->
TableID(),0,16));
905 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Table not current 0x%1")
906 .arg(psip->
TableID(),2,16,QChar(
'0')));
912 LOG(VB_RECORD, LOG_ERR,
LOC +
913 "PSIP packet is scrambled, not ATSC/DVB compliant");
919 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"PSIP table 0x%1 is invalid")
920 .arg(psip->
TableID(),2,16,QChar(
'0')));
933 listener->HandleSingleProgramPAT(pat_sp,
false);
941 listener->HandleSingleProgramPMT(pmt_sp,
false);
962 listener->FindPSKeyFrames(buffer, len);
972 LOG(VB_RECORD, LOG_DEBUG,
LOC +
973 QString(
"Resyncing @ %1+1 w/len %2 -> %3")
974 .arg(pos).arg(len).arg(newpos));
982 const auto *pkt =
reinterpret_cast<const TSPacket*
>(&buffer[pos]);
1028 LOG(VB_RECORD, LOG_DEBUG, QString(
"Invalid adaptation field, type %3, size %4")
1042 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1043 QString(
"PID %1 (0x%2) has PCR %3μs")
1046 .arg(duration_cast<std::chrono::microseconds>
1047 (tspacket.
GetPCR().time_since_epoch()).count()));
1057 listener->ProcessVideoTSPacket(tspacket);
1067 listener->ProcessAudioTSPacket(tspacket);
1077 listener->ProcessTSPacket(tspacket);
1138 pid_map_t::const_iterator it =
m_pidsAudio.find(pid);
1144 uint sz = pids.size();
1150 pids[it.key()] = std::max(pids[it.key()], *it);
1153 pids[it.key()] = std::max(pids[it.key()], *it);
1156 pids[it.key()] = std::max(pids[it.key()], *it);
1158 return pids.size() - sz;
1166 pid_map_t::const_iterator it;
1227 pat_cache_t::const_iterator it =
m_cachedPats.constFind(tsid << 8);
1231 uint last_section = (*it)->LastSection();
1235 for (
uint i = 1; i <= last_section; i++)
1246 for (
uint i = 0; i <= 255; i++)
1263 cat_cache_t::const_iterator it =
m_cachedCats.constFind(tsid << 8);
1267 uint last_section = (*it)->LastSection();
1271 for (
uint i = 1; i <= last_section; i++)
1282 for (
uint i = 0; i <= 255; i++)
1299 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(pnum << 8);
1303 uint last_section = (*it)->LastSection();
1307 for (
uint i = 1; i <= last_section; i++)
1318 for (
uint i = 0; i <= 255; i++)
1359 uint key = (tsid << 8) | section_num;
1360 pat_cache_t::const_iterator it =
m_cachedPats.constFind(key);
1372 for (
uint i=0; i < 256; i++)
1376 pats.push_back(pat);
1390 pats.push_back(pat);
1401 uint key = (tsid << 8) | section_num;
1402 cat_cache_t::const_iterator it =
m_cachedCats.constFind(key);
1414 for (
uint i=0; i < 256; i++)
1418 cats.push_back(
cat);
1432 cats.push_back(
cat);
1439 uint program_num,
uint section_num)
const
1444 uint key = (program_num << 8) | section_num;
1445 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(key);
1455 std::vector<const ProgramMapTable*> pmts;
1460 pmts.push_back(pmt);
1474 pmts[pmt->ProgramNumber()].push_back(pmt);
1490 psip_refcnt_map_t::iterator it;
1499 for (
auto & pat : pats)
1507 for (pat_map_t::iterator it = pats.begin(); it != pats.end(); ++it)
1514 for (
auto &
cat : cats)
1522 for (cat_map_t::iterator it = cats.begin(); it != cats.end(); ++it)
1529 for (
auto & pmt : pmts)
1537 for (pmt_map_t::iterator it = pmts.begin(); it != pmts.end(); ++it)
1584 psip_refcnt_map_t::iterator it;
1639 if (((
void*)val) == ((
void*)listener))
1651 if (((
void*)val) == ((
void*)*it))
1664 if (((
void*)val) == ((
void*)listener))
1676 if (((
void*)val) == ((
void*)*it))
1690 if (((
void*)val) == ((
void*)listener))
1692 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"AddAVListener 0x%1 already present")
1693 .arg((uint64_t)val, 0, 16));
1700 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"AddAVListener 0x%1 added")
1701 .arg((uint64_t)val, 0, 16));
1711 if (((
void*)val) == ((
void*)*it))
1715 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"RemoveAVListener 0x%1 found and removed")
1716 .arg((uint64_t)val, 0, 16));
1722 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"RemoveAVListener 0x%1 NOT found")
1723 .arg((uint64_t)val, 0, 16));
1731 if (((
void*)val) == ((
void*)listener))
1743 if (((
void*)val) == ((
void*)*it))
1756 if (((
void*)val) == ((
void*)listener))
1768 if (((
void*)val) == ((
void*)*it))
1781 LOG(VB_GENERAL, LOG_DEBUG,
LOC + QString(
"AddEncryptionTestPID(%1, 0x%2)")
1782 .arg(pnum) .arg(pid, 0, 16));
1799 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1800 QString(
"Tearing down up decryption monitoring for program %1")
1804 QMap<uint, uint_vec_t>::iterator list;
1805 uint_vec_t::iterator it;
1808 for (
uint pid : pids)
1811 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1812 QString(
"Removing 0x%1 PID Enc monitoring").arg(pid,0,16));
1820 it =
find((*list).begin(), (*list).end(), pnum);
1822 if (it != (*list).end())
1825 if ((*list).empty())
1840 QMap<uint, CryptInfo>::const_iterator it =
1851 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1852 QString(
"Setting up decryption monitoring for program %1")
1866 if (is_vid || is_aud)
1911 std::map<uint,bool> pnumEncrypted;
1912 const uint pid = tspacket.
PID();
1919 info.m_decryptedPackets = 0;
1923 if (++
info.m_encryptedPackets >=
info.m_encryptedMin)
1928 info.m_encryptedPackets = 0;
1929 if (++
info.m_decryptedPackets >
info.m_decryptedMin)
1933 if (status ==
info.m_status)
1936 info.m_status = status;
1939 QString(
"PID 0x%1 status: %2") .arg(pid,0,16).arg(
toString(status)));
1943 for (
uint pnum : pnums)
1950 std::array<uint,3> enc_cnt { 0, 0, 0 };
1951 for (
uint pid2 : pids)
1957 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1958 QString(
"\tpnum %1 PID 0x%2 status: %3")
1959 .arg(pnum).arg(pid2,0,16) .arg(
toString(stat)));
1966 else if (enc_cnt[
kEncDecrypted] >= std::min((
size_t) 2, pids.size()))
1973 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Program %1 status: %2")
1979 pnumEncrypted[pnum] = encrypted;
1982 pnum_del_list.push_back(pnum);
1986 encryptionLock.unlock();
1988 for (
auto & pe : pnumEncrypted)
1992 listener->HandleEncryptionStatus(pe.first, pe.second);
1997 for (
size_t i = 0; i < pnum_del_list.size(); i++)
std::vector< const TerrestrialVirtualChannelTable * > tvct_vec_t
std::vector< const CableVirtualChannelTable * > cvct_vec_t
QMap< uint, pmt_vec_t > pmt_map_t
std::vector< const ProgramMapTable * > pmt_vec_t
Encapsulates data about ATSC stream and emits events for most tables.
cvct_vec_t GetCachedCVCTs(bool current=true) const
void ReturnCachedTVCTTables(tvct_vec_t &tvcts) const
void ReturnCachedCVCTTables(cvct_vec_t &cvcts) const
tvct_vec_t GetCachedTVCTs(bool current=true) const
The CAT is used to transmit additional ConditionalAccessDescriptor instances, in addition to the ones...
static desc_list_t ParseAndExclude(const unsigned char *data, uint len, int excluded_descid)
static desc_list_t ParseOnlyInclude(const unsigned char *data, uint len, int excluded_descid)
static const unsigned char * Find(const desc_list_t &parsed, uint desc_tag)
QMap< uint, uint_vec_t > m_encryptionPnumToPids
void AddMPEGListener(MPEGStreamListener *val)
void AddPSStreamListener(PSStreamListener *val)
void SetDesiredProgram(int p)
const ProgramMapTable * PMTSingleProgram(void) const
bool HasAllCATSections(uint tsid) const
void ProcessPMT(const ProgramMapTable *pmt)
pmt_vec_t GetCachedPMTs(void) const
std::array< double, 16 > m_siTimeOffsets
virtual bool IsNotListeningPID(uint pid) const
pid_psip_map_t m_partialPsipPacketCache
void CachePAT(const ProgramAssociationTable *pat)
cat_const_ptr_t GetCachedCAT(uint tsid, uint section_num) const
void TestDecryption(const ProgramMapTable *pmt)
QRecursiveMutex m_listenerLock
bool HasCachedAllPMT(uint pnum) const
bool HasCachedAnyPMT(uint pnum) const
psip_refcnt_map_t m_cachedSlatedForDeletion
void CachePMT(const ProgramMapTable *pmt)
QMap< uint, uint_vec_t > m_encryptionPidToPnums
void AddWritingListener(TSPacketListener *val)
void SetAudioStreamsRequired(uint num)
bool IsProgramEncrypted(uint pnum) const
void UpdateTimeOffset(uint64_t si_utc_time)
virtual bool ProcessTSPacket(const TSPacket &tspacket)
virtual void HandleTSTables(const TSPacket *tspacket)
Assembles PSIP packets and processes them.
virtual void ReturnCachedPATTables(pat_vec_t &pats) const
pat_const_ptr_t GetCachedPAT(uint tsid, uint section_num) const
bool HasCachedAnyCAT(void) const
pmt_map_t GetCachedPMTMap(void) const
void SetPMTSingleProgram(ProgramMapTable *pmt)
TableStatusMap m_catStatus
QRecursiveMutex m_cacheLock
virtual bool DeleteCachedTable(const PSIPTable *psip) const
MPEGStreamData(int desiredProgram, int cardnum, bool cacheTables)
Initializes MPEGStreamData.
void ProcessCAT(const ConditionalAccessTable *cat)
void ProcessEncryptedPacket(const TSPacket &tspacket)
counts en/decrypted packets to decide if a stream is en/decrypted
PSIPTable * GetPartialPSIP(uint pid)
psip_refcnt_map_t m_cachedRefCnt
void CacheCAT(const ConditionalAccessTable *_cat)
void SetEITHelper(EITHelper *eit_helper) override
pmt_const_ptr_t GetCachedPMT(uint program_num, uint section_num) const
void AddMPEGSPListener(MPEGSingleProgramStreamListener *val)
pid_map_t m_pidsConditionalAccess
bool HasCachedAnyPAT(void) const
ts_av_listener_vec_t m_tsAvListeners
ps_listener_vec_t m_psListeners
TableStatusMap m_pmtStatus
void ProcessPAT(const ProgramAssociationTable *pat)
QRecursiveMutex m_encryptionLock
bool m_normalizeStreamType
void RemoveWritingListener(TSPacketListener *val)
QMap< uint, CryptInfo > m_encryptionPidToInfo
void SavePartialPSIP(uint pid, PSIPTable *packet)
PIDPriority GetPIDPriority(uint pid) const
virtual bool IsAudioPID(uint pid) const
bool HasCachedAnyPMTs(void) const
virtual bool IsRedundant(uint pid, const PSIPTable &psip) const
Returns true if table already seen.
virtual void ReturnCachedCATTables(cat_vec_t &cats) const
bool IsProgramDecrypted(uint pnum) const
void SetRecordingType(const QString &recording_type)
bool CreatePMTSingleProgram(const ProgramMapTable &pmt)
ts_listener_vec_t m_tsWritingListeners
void RemoveMPEGListener(MPEGStreamListener *val)
bool IsEncryptionTestPID(uint pid) const
virtual void RemoveListeningPID(uint pid)
void RemovePSStreamListener(PSStreamListener *val)
uint m_pidPmtSingleProgram
mpeg_sp_listener_vec_t m_mpegSpListeners
void AddEncryptionTestPID(uint pnum, uint pid, bool isvideo)
virtual void AddAudioPID(uint pid, PIDPriority priority=kPIDPriorityHigh)
bool HasCachedAllPMTs(void) const
virtual void ReturnCachedTable(const PSIPTable *psip) const
pid_map_t m_pidsNotListening
const ProgramAssociationTable * PATSingleProgram(void) const
static int ResyncStream(const unsigned char *buffer, int curr_pos, int len)
double TimeOffset(void) const
Current Offset from computer time to DVB time in seconds.
bool HasProgram(uint progNum) const
TableStatusMap m_patStatus
bool IsVideoPID(uint pid) const
void SetVideoStreamsRequired(uint num)
virtual void AddWritingPID(uint pid, PIDPriority priority=kPIDPriorityHigh)
bool m_stripPmtDescriptors
bool HasAllPATSections(uint tsid) const
ProgramMapTable * m_pmtSingleProgram
virtual int ProcessData(const unsigned char *buffer, int len)
void RemoveEncryptionTestPIDs(uint pnum)
void SetEITRate(float rate) override
QMap< uint, CryptStatus > m_encryptionPnumToStatus
bool HasCachedAllPAT(uint tsid) const
uint m_pidVideoSingleProgram
bool HasCachedAllCAT(uint tsid) const
void DeletePartialPSIP(uint pid)
virtual void ReturnCachedPMTTables(pmt_vec_t &pmts) const
uint m_pmtSingleProgramNumVideo
bool CreatePATSingleProgram(const ProgramAssociationTable &pat)
bool HasAllPMTSections(uint prog_num) const
virtual bool IsListeningPID(uint pid) const
void RemoveAVListener(TSPacketListenerAV *val)
void RemoveMPEGSPListener(MPEGSingleProgramStreamListener *val)
cat_vec_t GetCachedCATs(void) const
virtual void AddListeningPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
void SetPATSingleProgram(ProgramAssociationTable *pat)
uint m_pmtSingleProgramNumAudio
virtual void AddConditionalAccessPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
void ResetDecryptionMonitoringState(void)
MythTimer m_invalidPatTimer
PSIPTable * AssemblePSIP(const TSPacket *tspacket, bool &moreTablePackets)
PSIP packet assembler.
virtual bool IsWritingPID(uint pid) const
mpeg_listener_vec_t m_mpegListeners
pat_vec_t GetCachedPATs(void) const
~MPEGStreamData() override
virtual bool IsConditionalAccessPID(uint pid) const
virtual bool HandleTables(uint pid, const PSIPTable &psip)
Process PSIP packets.
void IncrementRefCnt(const PSIPTable *psip) const
uint GetPIDs(pid_map_t &pids) const
pid_map_t m_pidsListening
void AddAVListener(TSPacketListenerAV *val)
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
void start(void)
starts measuring elapsed time.
bool AddTSPacket(const TSPacket *tspacket, int cardid, bool &broken)
const TSHeader * tsheader() const
const unsigned char * pesdata() const
void SetPSIOffset(uint offset)
uint TSSizeInBuffer() const
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
uint LastSection(void) const
bool HasCRC(void) const override
1 bit Cyclic Redundancy Check present
bool IsCurrent(void) const
bool VerifyPSIP(bool verify_crc) const
uint TableIDExtension(void) const
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
uint FindAnyPID(void) const
QString toString(void) const override
uint ProgramCount(void) const
uint TransportStreamID(void) const
uint FindPID(uint progNum) const
static ProgramAssociationTable * Create(uint tsid, uint version, const std::vector< uint > &pnum, const std::vector< uint > &pid)
uint ProgramNumber(uint i) const
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
bool IsProgramEncrypted(void) const
Returns true iff PMT's ProgramInfo contains CA descriptor.
uint StreamCount(void) const
uint PCRPID(void) const
stream that contains program clock reference.
uint StreamPID(uint i) const
QString toString(void) const override
uint StreamType(uint i) const
int FindPID(uint pid) const
Locates stream index of pid.
const unsigned char * ProgramInfo(void) const
const unsigned char * StreamInfo(uint i) const
uint ProgramNumber(void) const
uint ProgramInfoLength(void) const
uint StreamInfoLength(uint i) const
bool IsStreamEncrypted(uint pid) const
Returns true iff PMT contains CA descriptor.
static ProgramMapTable * Create(uint programNumber, uint basepid, uint pcrpid, uint version, std::vector< uint > pids, std::vector< uint > types)
static uint Normalize(uint stream_id, const desc_list_t &desc, const QString &sistandard)
static bool IsAudio(uint type)
Returns true iff audio is MPEG1/2, AAC, AC3 or DTS audio stream.
static bool IsVideo(uint type)
Returns true iff video is an MPEG1/2/3, H264 or open cable video stream.
Used to access the data of a Transport Stream packet.
static constexpr unsigned int kPayloadSize
unsigned int AFCOffset(void) const
QString toString(void) const
unsigned int StartOfFieldPointer(void) const
static constexpr unsigned int kSize
Contains listing of Table ID's for various tables (PAT=0,PMT=2,etc).
void SetSectionSeen(uint32_t key, int32_t version, uint32_t section, uint32_t last_section, uint32_t segment_last_section=0xffff)
bool IsSectionSeen(uint32_t key, int32_t version, uint32_t section) const
bool HasAllSections(uint32_t key) const
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)
static const struct wl_interface * types[]
std::vector< const unsigned char * > desc_list_t
static desc_list_t extract_atsc_desc(const tvct_vec_t &tvct, const cvct_vec_t &cvct, uint pnum)
static QString toString(CryptStatus status)
QMap< uint, pat_vec_t > pat_map_t
std::vector< uint > uint_vec_t
QMap< unsigned int, PSIPTable * > pid_psip_map_t
QMap< uint, PIDPriority > pid_map_t
QMap< uint, cat_vec_t > cat_map_t
std::vector< const ProgramAssociationTable * > pat_vec_t
std::vector< const ConditionalAccessTable * > cat_vec_t
ProgramMapTable const * pmt_const_ptr_t
static bool VERBOSE_LEVEL_CHECK(uint64_t mask, LogLevel_t level)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
static constexpr uint8_t SYNC_BYTE