Go to the documentation of this file.
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
539 #endif // 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;
858 #define DONE_WITH_PSIP_PACKET() { delete psip; \
859 if (morePSIPTables) goto HAS_ANOTHER_PSIP; else return; }
866 bool morePSIPTables =
false;
877 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"Dropping Stuffing table");
893 if (!buggy && !psip->
IsGood())
895 LOG(VB_RECORD, LOG_ERR,
LOC +
896 QString(
"PSIP packet failed CRC check. pid(0x%1) type(0x%2)")
897 .arg(tspacket->
PID(),0,16).arg(psip->
TableID(),0,16));
904 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Table not current 0x%1")
905 .arg(psip->
TableID(),2,16,QChar(
'0')));
911 LOG(VB_RECORD, LOG_ERR,
LOC +
912 "PSIP packet is scrambled, not ATSC/DVB compiant");
918 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"PSIP table 0x%1 is invalid")
919 .arg(psip->
TableID(),2,16,QChar(
'0')));
932 listener->HandleSingleProgramPAT(pat_sp,
false);
940 listener->HandleSingleProgramPMT(pmt_sp,
false);
949 #undef DONE_WITH_PSIP_PACKET
960 listener->FindPSKeyFrames(buffer, len);
970 LOG(VB_RECORD, LOG_DEBUG,
LOC +
971 QString(
"Resyncing @ %1+1 w/len %2 -> %3")
972 .arg(pos).arg(len).arg(newpos));
980 const auto *pkt =
reinterpret_cast<const TSPacket*
>(&buffer[pos]);
1023 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1024 QString(
"PID %1 (0x%2) has PCR %3μs")
1027 .arg(duration_cast<std::chrono::microseconds>
1028 (tspacket.
GetPCR().time_since_epoch()).count()));
1036 listener->ProcessVideoTSPacket(tspacket);
1044 listener->ProcessAudioTSPacket(tspacket);
1052 listener->ProcessTSPacket(tspacket);
1113 pid_map_t::const_iterator it =
m_pidsAudio.find(pid);
1119 uint sz = pids.size();
1125 pids[it.key()] = std::max(pids[it.key()], *it);
1128 pids[it.key()] = std::max(pids[it.key()], *it);
1131 pids[it.key()] = std::max(pids[it.key()], *it);
1133 return pids.size() - sz;
1141 pid_map_t::const_iterator it;
1200 pat_cache_t::const_iterator it =
m_cachedPats.constFind(tsid << 8);
1204 uint last_section = (*it)->LastSection();
1208 for (
uint i = 1; i <= last_section; i++)
1219 for (
uint i = 0; i <= 255; i++)
1236 cat_cache_t::const_iterator it =
m_cachedCats.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 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(pnum << 8);
1276 uint last_section = (*it)->LastSection();
1280 for (
uint i = 1; i <= last_section; i++)
1291 for (
uint i = 0; i <= 255; i++)
1310 for (
uint i = 0; i < pat->ProgramCount(); i++)
1312 uint prognum = pat->ProgramNumber(i);
1332 uint key = (tsid << 8) | section_num;
1333 pat_cache_t::const_iterator it =
m_cachedPats.constFind(key);
1345 for (
uint i=0; i < 256; i++)
1349 pats.push_back(pat);
1363 pats.push_back(pat);
1374 uint key = (tsid << 8) | section_num;
1375 cat_cache_t::const_iterator it =
m_cachedCats.constFind(key);
1387 for (
uint i=0; i < 256; i++)
1391 cats.push_back(
cat);
1405 cats.push_back(
cat);
1412 uint program_num,
uint section_num)
const
1417 uint key = (program_num << 8) | section_num;
1418 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(key);
1428 std::vector<const ProgramMapTable*> pmts;
1433 pmts.push_back(pmt);
1447 pmts[pmt->ProgramNumber()].push_back(pmt);
1463 psip_refcnt_map_t::iterator it;
1472 for (
auto & pat : pats)
1480 for (pat_map_t::iterator it = pats.begin(); it != pats.end(); ++it)
1487 for (
auto &
cat : cats)
1495 for (cat_map_t::iterator it = cats.begin(); it != cats.end(); ++it)
1502 for (
auto & pmt : pmts)
1510 for (pmt_map_t::iterator it = pmts.begin(); it != pmts.end(); ++it)
1557 psip_refcnt_map_t::iterator it;
1612 if (((
void*)val) == ((
void*)listener))
1624 if (((
void*)val) == ((
void*)*it))
1637 if (((
void*)val) == ((
void*)listener))
1649 if (((
void*)val) == ((
void*)*it))
1663 if (((
void*)val) == ((
void*)listener))
1665 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"AddAVListener 0x%1 already present")
1666 .arg((uint64_t)val, 0, 16));
1673 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"AddAVListener 0x%1 added")
1674 .arg((uint64_t)val, 0, 16));
1684 if (((
void*)val) == ((
void*)*it))
1688 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"RemoveAVListener 0x%1 found and removed")
1689 .arg((uint64_t)val, 0, 16));
1695 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"RemoveAVListener 0x%1 NOT found")
1696 .arg((uint64_t)val, 0, 16));
1704 if (((
void*)val) == ((
void*)listener))
1716 if (((
void*)val) == ((
void*)*it))
1729 if (((
void*)val) == ((
void*)listener))
1741 if (((
void*)val) == ((
void*)*it))
1754 LOG(VB_GENERAL, LOG_DEBUG,
LOC + QString(
"AddEncryptionTestPID(%1, 0x%2)")
1755 .arg(pnum) .arg(pid, 0, 16));
1772 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1773 QString(
"Tearing down up decryption monitoring for program %1")
1777 QMap<uint, uint_vec_t>::iterator list;
1778 uint_vec_t::iterator it;
1781 for (
uint pid : pids)
1784 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1785 QString(
"Removing 0x%1 PID Enc monitoring").arg(pid,0,16));
1793 it =
find((*list).begin(), (*list).end(), pnum);
1795 if (it != (*list).end())
1798 if ((*list).empty())
1813 QMap<uint, CryptInfo>::const_iterator it =
1824 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1825 QString(
"Setting up decryption monitoring for program %1")
1839 if (is_vid || is_aud)
1884 std::map<uint,bool> pnumEncrypted;
1885 const uint pid = tspacket.
PID();
1912 QString(
"PID 0x%1 status: %2") .arg(pid,0,16).arg(
toString(status)));
1916 for (
uint pnum : pnums)
1923 std::array<uint,3> enc_cnt { 0, 0, 0 };
1924 for (
uint pid2 : pids)
1930 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1931 QString(
"\tpnum %1 PID 0x%2 status: %3")
1932 .arg(pnum).arg(pid2,0,16) .arg(
toString(stat)));
1939 else if (enc_cnt[
kEncDecrypted] >= std::min((
size_t) 2, pids.size()))
1946 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Program %1 status: %2")
1952 pnumEncrypted[pnum] = encrypted;
1955 pnum_del_list.push_back(pnum);
1959 encryptionLock.unlock();
1961 for (
auto & pe : pnumEncrypted)
1965 listener->HandleEncryptionStatus(pe.first, pe.second);
1970 for (
size_t i = 0; i < pnum_del_list.size(); i++)
const unsigned char * ProgramInfo(void) const
psip_refcnt_map_t m_cachedRefCnt
uint FindAnyPID(void) const
std::vector< const ProgramAssociationTable * > pat_vec_t
pid_psip_map_t m_partialPsipPacketCache
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
void SetEITHelper(EITHelper *eit_helper) override
bool IsProgramDecrypted(uint pnum) const
pid_map_t m_pidsListening
QRecursiveMutex m_cacheLock
void SetVideoStreamsRequired(uint num)
virtual void ReturnCachedCATTables(cat_vec_t &cats) const
~MPEGStreamData() override
MythTimer m_invalidPatTimer
void ProcessEncryptedPacket(const TSPacket &tspacket)
counts en/decrypted packets to decide if a stream is en/decrypted
unsigned int StartOfFieldPointer(void) const
std::vector< const CableVirtualChannelTable * > cvct_vec_t
uint StreamCount(void) const
void SetDesiredProgram(int p)
void ProcessPMT(const ProgramMapTable *pmt)
void AddMPEGSPListener(MPEGSingleProgramStreamListener *val)
void SetSectionSeen(uint32_t key, int32_t version, uint32_t section, uint32_t last_section, uint32_t segment_last_section=0xffff)
bool HasAllSections(uint32_t key) const
virtual bool DeleteCachedTable(const PSIPTable *psip) const
bool IsCurrent(void) const
void CachePMT(const ProgramMapTable *pmt)
static QString toString(CryptStatus status)
const unsigned char * StreamInfo(uint i) const
PSIPTable * AssemblePSIP(const TSPacket *tspacket, bool &moreTablePackets)
PSIP packet assembler.
QMap< uint, CryptInfo > m_encryptionPidToInfo
QMap< unsigned int, PSIPTable * > pid_psip_map_t
QMap< uint, pat_vec_t > pat_map_t
cvct_vec_t GetCachedCVCTs(bool current=true) const
std::vector< const TerrestrialVirtualChannelTable * > tvct_vec_t
const unsigned char * pesdata() const
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
pat_vec_t GetCachedPATs(void) const
const TSHeader * tsheader() const
std::array< double, 16 > m_siTimeOffsets
virtual bool IsRedundant(uint pid, const PSIPTable &psip) const
Returns true if table already seen.
int FindPID(uint pid) const
Locates stream index of pid.
uint PCRPID(void) const
stream that contains program clock reference.
unsigned int AFCOffset(void) const
void RemoveMPEGListener(MPEGStreamListener *val)
bool IsVideoPID(uint pid) const
MPEGStreamData(int desiredProgram, int cardnum, bool cacheTables)
Initializes MPEGStreamData.
static const struct wl_interface * types[]
uint ProgramNumber(void) const
bool HasCachedAnyPAT(void) const
void start(void)
starts measuring elapsed time.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
std::vector< uint > uint_vec_t
bool m_normalizeStreamType
void AddEncryptionTestPID(uint pnum, uint pid, bool isvideo)
void ProcessCAT(const ConditionalAccessTable *cat)
virtual bool IsNotListeningPID(uint pid) const
void SetPMTSingleProgram(ProgramMapTable *pmt)
virtual bool IsAudioPID(uint pid) const
bool IsProgramEncrypted(uint pnum) const
const ProgramMapTable * PMTSingleProgram(void) const
uint GetPIDs(pid_map_t &pids) const
static int ResyncStream(const unsigned char *buffer, int curr_pos, int len)
static bool IsVideo(uint type)
Returns true iff video is an MPEG1/2/3, H264 or open cable video stream.
PIDPriority GetPIDPriority(uint pid) const
void CacheCAT(const ConditionalAccessTable *_cat)
void UpdateTimeOffset(uint64_t si_utc_time)
void SetPSIOffset(uint offset)
static desc_list_t ParseAndExclude(const unsigned char *data, uint len, int excluded_descid)
virtual void ReturnCachedPATTables(pat_vec_t &pats) const
virtual bool IsListeningPID(uint pid) const
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
bool HasCachedAllPMTs(void) const
std::vector< const ProgramMapTable * > pmt_vec_t
bool CreatePMTSingleProgram(const ProgramMapTable &pmt)
void ReturnCachedTVCTTables(tvct_vec_t &tvcts) const
virtual void ReturnCachedTable(const PSIPTable *psip) const
bool IsStreamEncrypted(uint pid) const
Returns true iff PMT contains CA descriptor.
bool HasCachedAllCAT(uint tsid) const
const ProgramAssociationTable * PATSingleProgram(void) const
ts_av_listener_vec_t m_tsAvListeners
void AddPSStreamListener(PSStreamListener *val)
uint TransportStreamID(void) const
bool IsEncryptionTestPID(uint pid) const
QString toString(void) const override
pid_map_t m_pidsNotListening
bool HasCachedAllPMT(uint pnum) const
void SetRecordingType(const QString &recording_type)
bool m_stripPmtDescriptors
static bool IsAudio(uint type)
Returns true iff audio is MPEG1/2, AAC, AC3 or DTS audio stream.
pat_const_ptr_t GetCachedPAT(uint tsid, uint section_num) const
Used to access the data of a Transport Stream packet.
Encapsulates data about ATSC stream and emits events for most tables.
#define DONE_WITH_PSIP_PACKET()
virtual int ProcessData(const unsigned char *buffer, int len)
uint StreamType(uint i) const
QRecursiveMutex m_listenerLock
virtual bool HandleTables(uint pid, const PSIPTable &psip)
Process PSIP packets.
cat_vec_t GetCachedCATs(void) const
ProgramMapTable const * pmt_const_ptr_t
uint m_pidPmtSingleProgram
std::vector< const unsigned char * > desc_list_t
bool CreatePATSingleProgram(const ProgramAssociationTable &pat)
void SetEITRate(float rate) override
static desc_list_t ParseOnlyInclude(const unsigned char *data, uint len, int excluded_descid)
virtual void AddConditionalAccessPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
void RemoveWritingListener(TSPacketListener *val)
uint m_pidVideoSingleProgram
pmt_vec_t GetCachedPMTs(void) const
QString toString(void) const override
void ReturnCachedCVCTTables(cvct_vec_t &cvcts) const
void ProcessPAT(const ProgramAssociationTable *pat)
pmt_map_t GetCachedPMTMap(void) const
ProgramMapTable * m_pmtSingleProgram
mpeg_listener_vec_t m_mpegListeners
TableStatusMap m_catStatus
void SetAudioStreamsRequired(uint num)
void CachePAT(const ProgramAssociationTable *pat)
void ResetDecryptionMonitoringState(void)
TableStatusMap m_pmtStatus
void DeletePartialPSIP(uint pid)
uint TSSizeInBuffer() const
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
uint LastSection(void) const
bool HasCRC(void) const override
1 bit Cyclic Redundancy Check present
std::vector< const ConditionalAccessTable * > cat_vec_t
QMap< uint, CryptStatus > m_encryptionPnumToStatus
static constexpr unsigned int kPayloadSize
tvct_vec_t GetCachedTVCTs(bool current=true) const
static ProgramMapTable * Create(uint programNumber, uint basepid, uint pcrpid, uint version, std::vector< uint > pids, std::vector< uint > types)
QMap< uint, PIDPriority > pid_map_t
Contains listing of Table ID's for various tables (PAT=0,PMT=2,etc).
void SavePartialPSIP(uint pid, PSIPTable *packet)
bool HasAllPATSections(uint tsid) const
void IncrementRefCnt(const PSIPTable *psip) const
pmt_const_ptr_t GetCachedPMT(uint program_num, uint section_num) const
void AddMPEGListener(MPEGStreamListener *val)
bool VerifyPSIP(bool verify_crc) const
void RemovePSStreamListener(PSStreamListener *val)
void AddAVListener(TSPacketListenerAV *val)
virtual void ReturnCachedPMTTables(pmt_vec_t &pmts) const
uint ProgramInfoLength(void) const
#define VERBOSE_LEVEL_CHECK(_MASK_, _LEVEL_)
virtual void AddWritingPID(uint pid, PIDPriority priority=kPIDPriorityHigh)
virtual bool IsConditionalAccessPID(uint pid) const
bool HasCachedAnyPMT(uint pnum) const
double TimeOffset(void) const
Current Offset from computer time to DVB time in seconds.
static desc_list_t extract_atsc_desc(const tvct_vec_t &tvct, const cvct_vec_t &cvct, uint pnum)
void AddWritingListener(TSPacketListener *val)
QMap< uint, cat_vec_t > cat_map_t
cat_const_ptr_t GetCachedCAT(uint tsid, uint section_num) const
uint TableIDExtension(void) const
QMap< uint, pmt_vec_t > pmt_map_t
uint m_pmtSingleProgramNumVideo
mpeg_sp_listener_vec_t m_mpegSpListeners
void SetPATSingleProgram(ProgramAssociationTable *pat)
The CAT is used to transmit additional ConditionalAccessDescriptor instances, in addition to the ones...
bool HasAllCATSections(uint tsid) const
psip_refcnt_map_t m_cachedSlatedForDeletion
bool AddTSPacket(const TSPacket *tspacket, int cardid, bool &broken)
virtual void AddAudioPID(uint pid, PIDPriority priority=kPIDPriorityHigh)
bool HasCachedAnyPMTs(void) const
virtual bool ProcessTSPacket(const TSPacket &tspacket)
QRecursiveMutex m_encryptionLock
ps_listener_vec_t m_psListeners
static ProgramAssociationTable * Create(uint tsid, uint version, const std::vector< uint > &pnum, const std::vector< uint > &pid)
bool HasCachedAllPAT(uint tsid) const
ts_listener_vec_t m_tsWritingListeners
virtual void AddListeningPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
uint FindPID(uint progNum) const
virtual void HandleTSTables(const TSPacket *tspacket)
Assembles PSIP packets and processes them.
TableStatusMap m_patStatus
bool IsSectionSeen(uint32_t key, int32_t version, uint32_t section) const
uint m_pmtSingleProgramNumAudio
uint StreamInfoLength(uint i) const
static uint Normalize(uint stream_id, const desc_list_t &desc, const QString &sistandard)
static const unsigned char * Find(const desc_list_t &parsed, uint desc_tag)
QMap< uint, uint_vec_t > m_encryptionPnumToPids
bool IsProgramEncrypted(void) const
Returns true iff PMT's ProgramInfo contains CA descriptor.
QMap< uint, uint_vec_t > m_encryptionPidToPnums
void RemoveAVListener(TSPacketListenerAV *val)
virtual bool IsWritingPID(uint pid) const
uint StreamPID(uint i) const
bool HasCachedAnyCAT(void) const
void TestDecryption(const ProgramMapTable *pmt)
PSIPTable * GetPartialPSIP(uint pid)
void RemoveMPEGSPListener(MPEGSingleProgramStreamListener *val)
virtual void RemoveListeningPID(uint pid)
bool HasProgram(uint progNum) 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)
pid_map_t m_pidsConditionalAccess
bool HasAllPMTSections(uint prog_num) const
static constexpr unsigned int kSize
void RemoveEncryptionTestPIDs(uint pnum)