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;
1225 pat_cache_t::const_iterator it =
m_cachedPats.constFind(tsid << 8);
1229 uint last_section = (*it)->LastSection();
1233 for (
uint i = 1; i <= last_section; i++)
1244 for (
uint i = 0; i <= 255; i++)
1261 cat_cache_t::const_iterator it =
m_cachedCats.constFind(tsid << 8);
1265 uint last_section = (*it)->LastSection();
1269 for (
uint i = 1; i <= last_section; i++)
1280 for (
uint i = 0; i <= 255; i++)
1297 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(pnum << 8);
1301 uint last_section = (*it)->LastSection();
1305 for (
uint i = 1; i <= last_section; i++)
1316 for (
uint i = 0; i <= 255; i++)
1357 uint key = (tsid << 8) | section_num;
1358 pat_cache_t::const_iterator it =
m_cachedPats.constFind(key);
1370 for (
uint i=0; i < 256; i++)
1374 pats.push_back(pat);
1388 pats.push_back(pat);
1399 uint key = (tsid << 8) | section_num;
1400 cat_cache_t::const_iterator it =
m_cachedCats.constFind(key);
1412 for (
uint i=0; i < 256; i++)
1416 cats.push_back(
cat);
1430 cats.push_back(
cat);
1437 uint program_num,
uint section_num)
const
1442 uint key = (program_num << 8) | section_num;
1443 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(key);
1453 std::vector<const ProgramMapTable*> pmts;
1458 pmts.push_back(pmt);
1472 pmts[pmt->ProgramNumber()].push_back(pmt);
1488 psip_refcnt_map_t::iterator it;
1497 for (
auto & pat : pats)
1505 for (pat_map_t::iterator it = pats.begin(); it != pats.end(); ++it)
1512 for (
auto &
cat : cats)
1520 for (cat_map_t::iterator it = cats.begin(); it != cats.end(); ++it)
1527 for (
auto & pmt : pmts)
1535 for (pmt_map_t::iterator it = pmts.begin(); it != pmts.end(); ++it)
1582 psip_refcnt_map_t::iterator it;
1637 if (((
void*)val) == ((
void*)listener))
1649 if (((
void*)val) == ((
void*)*it))
1662 if (((
void*)val) == ((
void*)listener))
1674 if (((
void*)val) == ((
void*)*it))
1688 if (((
void*)val) == ((
void*)listener))
1690 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"AddAVListener 0x%1 already present")
1691 .arg((uint64_t)val, 0, 16));
1698 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"AddAVListener 0x%1 added")
1699 .arg((uint64_t)val, 0, 16));
1709 if (((
void*)val) == ((
void*)*it))
1713 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"RemoveAVListener 0x%1 found and removed")
1714 .arg((uint64_t)val, 0, 16));
1720 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"RemoveAVListener 0x%1 NOT found")
1721 .arg((uint64_t)val, 0, 16));
1729 if (((
void*)val) == ((
void*)listener))
1741 if (((
void*)val) == ((
void*)*it))
1754 if (((
void*)val) == ((
void*)listener))
1766 if (((
void*)val) == ((
void*)*it))
1779 LOG(VB_GENERAL, LOG_DEBUG,
LOC + QString(
"AddEncryptionTestPID(%1, 0x%2)")
1780 .arg(pnum) .arg(pid, 0, 16));
1797 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1798 QString(
"Tearing down up decryption monitoring for program %1")
1802 QMap<uint, uint_vec_t>::iterator list;
1803 uint_vec_t::iterator it;
1806 for (
uint pid : pids)
1809 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1810 QString(
"Removing 0x%1 PID Enc monitoring").arg(pid,0,16));
1818 it =
find((*list).begin(), (*list).end(), pnum);
1820 if (it != (*list).end())
1823 if ((*list).empty())
1838 QMap<uint, CryptInfo>::const_iterator it =
1849 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1850 QString(
"Setting up decryption monitoring for program %1")
1864 if (is_vid || is_aud)
1909 std::map<uint,bool> pnumEncrypted;
1910 const uint pid = tspacket.
PID();
1917 info.m_decryptedPackets = 0;
1921 if (++
info.m_encryptedPackets >=
info.m_encryptedMin)
1926 info.m_encryptedPackets = 0;
1927 if (++
info.m_decryptedPackets >
info.m_decryptedMin)
1931 if (status ==
info.m_status)
1934 info.m_status = status;
1937 QString(
"PID 0x%1 status: %2") .arg(pid,0,16).arg(
toString(status)));
1941 for (
uint pnum : pnums)
1948 std::array<uint,3> enc_cnt { 0, 0, 0 };
1949 for (
uint pid2 : pids)
1955 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1956 QString(
"\tpnum %1 PID 0x%2 status: %3")
1957 .arg(pnum).arg(pid2,0,16) .arg(
toString(stat)));
1964 else if (enc_cnt[
kEncDecrypted] >= std::min((
size_t) 2, pids.size()))
1971 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Program %1 status: %2")
1977 pnumEncrypted[pnum] = encrypted;
1980 pnum_del_list.push_back(pnum);
1984 encryptionLock.unlock();
1986 for (
auto & pe : pnumEncrypted)
1990 listener->HandleEncryptionStatus(pe.first, pe.second);
1995 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