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;
423 vct.reserve(tvct.size() + cvct.size());
425 for (
const auto *i : tvct)
428 for (
const auto *i : cvct)
431 for (
size_t i = 0; i < tvct.size(); i++)
433 for (
uint j = 0; j < vct[i]->ChannelCount(); j++)
435 if (vct[i]->ProgramNumber(j) == pnum)
438 vct[i]->Descriptors(j), vct[i]->DescriptorsLength(j),
442 desc.insert(desc.end(), ldesc.begin(), ldesc.end());
446 if (0 != vct[i]->GlobalDescriptorsLength())
449 vct[i]->GlobalDescriptors(),
450 vct[i]->GlobalDescriptorsLength(),
454 desc.insert(desc.end(), vdesc.begin(), vdesc.end());
463 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"CreatePMTSingleProgram()");
464 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PMT in input stream");
469 LOG(VB_RECORD, LOG_ERR,
LOC +
"no PAT yet...");
474 uint programNumber = 1;
500 gdesc.insert(gdesc.end(), vdesc.begin(), vdesc.end());
504 std::vector<uint> pids;
505 std::vector<uint>
types;
506 std::vector<desc_list_t> pdesc;
511 std::vector<uint> videoPIDs;
512 std::vector<uint> audioPIDs;
513 std::vector<uint> dataPIDs;
536 audioPIDs.push_back(pid);
545#ifdef DEBUG_MPEG_RADIO
552 videoPIDs.push_back(pid);
567 if (!is_audio && !is_video)
568 dataPIDs.push_back(pid);
570 pdesc.push_back(desc);
577 LOG(VB_RECORD, LOG_ERR,
LOC +
578 QString(
"Only %1 video streams seen in PMT, but %2 are required.")
585 LOG(VB_RECORD, LOG_ERR,
LOC +
586 QString(
"Only %1 audio streams seen in PMT, but %2 are required.")
594 for (
auto & i : cdesc)
605 for (
uint pid : audioPIDs)
610 for (
size_t i = 1; i < videoPIDs.size(); i++)
613 for (
uint pid : dataPIDs)
642 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PMT for output stream");
654 const int table_id = psip.
TableID();
736 listener->HandleSplice(&sit);
751 listener->HandlePAT(pat);
757 bool send_single_program =
false;
763 LOG(VB_RECORD, LOG_WARNING,
LOC +
764 "ProcessPAT: PAT is missing program, setting timeout");
771 LOG(VB_GENERAL, LOG_ERR,
LOC +
"ProcessPAT: Program not found in PAT. "
772 "Rescan your transports.");
776 else if (foundProgram)
779 LOG(VB_RECORD, LOG_INFO,
LOC +
780 "ProcessPAT: Good PAT seen after a bad PAT");
787 if (send_single_program)
792 listener->HandleSingleProgramPAT(pat_sp,
false);
800 listener->HandleCAT(
cat);
804 cat->Descriptors(),
cat->DescriptorsLength(),
806 for (
auto & i : cdesc)
830 listener->HandleSingleProgramPMT(pmt_sp,
false);
840 double avg_offset = 0.0;
850 struct timeval tm {};
851 if (gettimeofday(&tm,
nullptr) != 0)
854 double utc_time = tm.tv_sec + (tm.tv_usec * 0.000001);
855 double si_time = _si_utc_time;
872 bool morePSIPTables =
true;
873 while (morePSIPTables)
887 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"Dropping Stuffing table");
903 if (!buggy && !psip->
IsGood())
905 LOG(VB_RECORD, LOG_ERR,
LOC +
906 QString(
"PSIP packet failed CRC check. pid(0x%1) type(0x%2)")
907 .arg(tspacket->
PID(),0,16).arg(psip->
TableID(),0,16));
914 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Table not current 0x%1")
915 .arg(psip->
TableID(),2,16,QChar(
'0')));
921 LOG(VB_RECORD, LOG_ERR,
LOC +
922 "PSIP packet is scrambled, not ATSC/DVB compliant");
928 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"PSIP table 0x%1 is invalid")
929 .arg(psip->
TableID(),2,16,QChar(
'0')));
942 listener->HandleSingleProgramPAT(pat_sp,
false);
950 listener->HandleSingleProgramPMT(pmt_sp,
false);
971 listener->FindPSKeyFrames(buffer, len);
981 LOG(VB_RECORD, LOG_DEBUG,
LOC +
982 QString(
"Resyncing @ %1+1 w/len %2 -> %3")
983 .arg(pos).arg(len).arg(newpos));
991 const auto *pkt =
reinterpret_cast<const TSPacket*
>(&buffer[pos]);
1037 LOG(VB_RECORD, LOG_DEBUG, QString(
"Invalid adaptation field, type %3, size %4")
1051 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1052 QString(
"PID %1 (0x%2) has PCR %3μs")
1055 .arg(duration_cast<std::chrono::microseconds>
1056 (tspacket.
GetPCR().time_since_epoch()).count()));
1066 listener->ProcessVideoTSPacket(tspacket);
1076 listener->ProcessAudioTSPacket(tspacket);
1086 listener->ProcessTSPacket(tspacket);
1147 pid_map_t::const_iterator it =
m_pidsAudio.find(pid);
1153 uint sz = pids.size();
1159 pids[it.key()] = std::max(pids[it.key()], *it);
1162 pids[it.key()] = std::max(pids[it.key()], *it);
1165 pids[it.key()] = std::max(pids[it.key()], *it);
1167 return pids.size() - sz;
1175 pid_map_t::const_iterator it;
1236 pat_cache_t::const_iterator it =
m_cachedPats.constFind(tsid << 8);
1240 uint last_section = (*it)->LastSection();
1244 for (
uint i = 1; i <= last_section; i++)
1255 for (
uint i = 0; i <= 255; i++)
1272 cat_cache_t::const_iterator it =
m_cachedCats.constFind(tsid << 8);
1276 uint last_section = (*it)->LastSection();
1280 for (
uint i = 1; i <= last_section; i++)
1291 for (
uint i = 0; i <= 255; i++)
1308 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(pnum << 8);
1312 uint last_section = (*it)->LastSection();
1316 for (
uint i = 1; i <= last_section; i++)
1327 for (
uint i = 0; i <= 255; i++)
1368 uint key = (tsid << 8) | section_num;
1369 pat_cache_t::const_iterator it =
m_cachedPats.constFind(key);
1382 for (
uint i=0; i < 256; i++)
1386 pats.push_back(pat);
1401 pats.push_back(pat);
1412 uint key = (tsid << 8) | section_num;
1413 cat_cache_t::const_iterator it =
m_cachedCats.constFind(key);
1426 for (
uint i=0; i < 256; i++)
1430 cats.push_back(
cat);
1445 cats.push_back(
cat);
1452 uint program_num,
uint section_num)
const
1457 uint key = (program_num << 8) | section_num;
1458 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(key);
1468 std::vector<const ProgramMapTable*> pmts;
1474 pmts.push_back(pmt);
1488 pmts[pmt->ProgramNumber()].push_back(pmt);
1504 psip_refcnt_map_t::iterator it;
1513 for (
auto & pat : pats)
1521 for (pat_map_t::iterator it = pats.begin(); it != pats.end(); ++it)
1528 for (
auto &
cat : cats)
1536 for (cat_map_t::iterator it = cats.begin(); it != cats.end(); ++it)
1543 for (
auto & pmt : pmts)
1551 for (pmt_map_t::iterator it = pmts.begin(); it != pmts.end(); ++it)
1598 psip_refcnt_map_t::iterator it;
1653 if (((
void*)val) == ((
void*)listener))
1665 if (((
void*)val) == ((
void*)*it))
1678 if (((
void*)val) == ((
void*)listener))
1690 if (((
void*)val) == ((
void*)*it))
1704 if (((
void*)val) == ((
void*)listener))
1706 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"AddAVListener 0x%1 already present")
1707 .arg((uint64_t)val, 0, 16));
1714 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"AddAVListener 0x%1 added")
1715 .arg((uint64_t)val, 0, 16));
1725 if (((
void*)val) == ((
void*)*it))
1729 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"RemoveAVListener 0x%1 found and removed")
1730 .arg((uint64_t)val, 0, 16));
1736 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"RemoveAVListener 0x%1 NOT found")
1737 .arg((uint64_t)val, 0, 16));
1745 if (((
void*)val) == ((
void*)listener))
1757 if (((
void*)val) == ((
void*)*it))
1770 if (((
void*)val) == ((
void*)listener))
1782 if (((
void*)val) == ((
void*)*it))
1795 LOG(VB_GENERAL, LOG_DEBUG,
LOC + QString(
"AddEncryptionTestPID(%1, 0x%2)")
1796 .arg(pnum) .arg(pid, 0, 16));
1813 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1814 QString(
"Tearing down up decryption monitoring for program %1")
1818 QMap<uint, uint_vec_t>::iterator list;
1819 uint_vec_t::iterator it;
1822 for (
uint pid : pids)
1825 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1826 QString(
"Removing 0x%1 PID Enc monitoring").arg(pid,0,16));
1834 it =
find((*list).begin(), (*list).end(), pnum);
1836 if (it != (*list).end())
1839 if ((*list).empty())
1854 QMap<uint, CryptInfo>::const_iterator it =
1865 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1866 QString(
"Setting up decryption monitoring for program %1")
1880 if (is_vid || is_aud)
1925 std::map<uint,bool> pnumEncrypted;
1926 const uint pid = tspacket.
PID();
1933 info.m_decryptedPackets = 0;
1937 if (++
info.m_encryptedPackets >=
info.m_encryptedMin)
1942 info.m_encryptedPackets = 0;
1943 if (++
info.m_decryptedPackets >
info.m_decryptedMin)
1947 if (status ==
info.m_status)
1950 info.m_status = status;
1953 QString(
"PID 0x%1 status: %2") .arg(pid,0,16).arg(
toString(status)));
1957 for (
uint pnum : pnums)
1964 std::array<uint,3> enc_cnt { 0, 0, 0 };
1965 for (
uint pid2 : pids)
1971 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1972 QString(
"\tpnum %1 PID 0x%2 status: %3")
1973 .arg(pnum).arg(pid2,0,16) .arg(
toString(stat)));
1980 else if (enc_cnt[
kEncDecrypted] >= std::min((
size_t) 2, pids.size()))
1987 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Program %1 status: %2")
1993 pnumEncrypted[pnum] = encrypted;
1996 pnum_del_list.push_back(pnum);
2000 encryptionLock.unlock();
2002 for (
auto & pe : pnumEncrypted)
2006 listener->HandleEncryptionStatus(pe.first, pe.second);
2011 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