Go to the documentation of this file.
20 #define LOC QString("MPEGStream[%1](0x%2): ").arg(m_cardId).arg((intptr_t)this, QT_POINTER_SIZE, 16, QChar('0'))
41 m_cacheTables(cacheTables),
43 m_desiredProgram(desiredProgram)
72 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"SetDesiredProgram(%2)").arg(
p));
74 for (
uint i = (
p) ? 0 : pats.size(); i < pats.size() && !pid; i++)
86 for (
auto & pmt : pmts)
88 if (pmt->ProgramNumber() == (
uint)
p)
133 for (
auto it = old.begin(); it != old.end(); ++it)
205 bool &moreTablePackets)
208 moreTablePackets =
true;
218 LOG(VB_RECORD, LOG_ERR,
LOC +
219 QString(
"Discarding broken PSIP packet. Packet's length at "
220 "position %1 isn't in the buffer of %2 bytes.")
231 if (!buggy && !partial->
IsGood())
233 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"Discarding broken PSIP packet on PID 0x%1")
234 .arg(tspacket->
PID(),2,16,QChar(
'0')));
243 uint packetStart = partial->
PSIOffset() + 1 + psip->SectionLength();
244 if (packetStart < partial->TSSizeInBuffer())
246 if (partial->
pesdata()[psip->SectionLength()] != 0xff)
267 psip->SectionLength());
275 LOG(VB_RECORD, LOG_ERR,
LOC +
276 QString(
"TSPacket pid(0x%3) ").arg(tspacket->
PID(),2,16,QChar(
'0')) +
277 QString(
"Discarding broken PSIP packet. ") +
278 QString(
"Packet with %1 bytes doesn't fit into a buffer of %2 bytes.")
284 moreTablePackets =
false;
295 moreTablePackets =
false;
304 moreTablePackets =
false;
310 const unsigned int extra_offset = 4;
312 const unsigned char* pesdata = tspacket->
data() + offset;
318 pes_length = (pesdata[2] & 0x0f) << 8 | pesdata[3];
322 if (pes_length == 0 || (pes_length + offset + extra_offset) >
TSPacket::kSize)
325 moreTablePackets =
false;
336 (pesdata[psip->SectionLength() + 1] != 0xff))
341 pesp->SetPSIOffset(offset + psip->SectionLength());
346 moreTablePackets =
false;
353 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"CreatePATSingleProgram()");
354 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PAT in input stream");
358 LOG(VB_RECORD, LOG_ERR,
LOC +
"Desired program not set yet");
362 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"desired_program(%1) pid(0x%2)").
370 LOG(VB_GENERAL, LOG_ERR,
LOC +
"No program found in PAT. "
371 "This recording will not play in MythTV.");
373 LOG(VB_GENERAL, LOG_ERR,
LOC +
374 QString(
"Desired program #%1 not found in PAT."
375 "\n\t\t\tCannot create single program PAT.")
383 std::vector<uint> pnums;
384 std::vector<uint> pids;
396 LOG(VB_GENERAL, LOG_ERR,
LOC +
397 "MPEGStreamData::CreatePATSingleProgram: "
398 "Failed to create Program Association Table.");
404 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"pmt_pid(0x%1)")
406 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PAT for output stream");
421 std::vector<const VirtualChannelTable*> vct;
423 for (
const auto *i : tvct)
426 for (
const auto *i : cvct)
429 for (
size_t i = 0; i < tvct.size(); i++)
431 for (
uint j = 0; j < vct[i]->ChannelCount(); j++)
433 if (vct[i]->ProgramNumber(j) == pnum)
436 vct[i]->Descriptors(j), vct[i]->DescriptorsLength(j),
440 desc.insert(desc.end(), ldesc.begin(), ldesc.end());
444 if (0 != vct[i]->GlobalDescriptorsLength())
447 vct[i]->GlobalDescriptors(),
448 vct[i]->GlobalDescriptorsLength(),
452 desc.insert(desc.end(), vdesc.begin(), vdesc.end());
461 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"CreatePMTSingleProgram()");
462 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PMT in input stream");
467 LOG(VB_RECORD, LOG_ERR,
LOC +
"no PAT yet...");
472 uint programNumber = 1;
498 gdesc.insert(gdesc.end(), vdesc.begin(), vdesc.end());
502 std::vector<uint> pids;
503 std::vector<uint>
types;
504 std::vector<desc_list_t> pdesc;
506 std::vector<uint> videoPIDs;
507 std::vector<uint> audioPIDs;
508 std::vector<uint> dataPIDs;
526 audioPIDs.push_back(pid);
535 #ifdef DEBUG_MPEG_RADIO
538 #endif // DEBUG_MPEG_RADIO
542 videoPIDs.push_back(pid);
557 if (!is_audio && !is_video)
558 dataPIDs.push_back(pid);
560 pdesc.push_back(desc);
567 LOG(VB_RECORD, LOG_ERR,
LOC +
568 QString(
"Only %1 video streams seen in PMT, but %2 are required.")
575 LOG(VB_RECORD, LOG_ERR,
LOC +
576 QString(
"Only %1 audio streams seen in PMT, but %2 are required.")
584 for (
auto & i : cdesc)
595 for (
uint pid : audioPIDs)
600 for (
size_t i = 1; i < videoPIDs.size(); i++)
603 for (
uint pid : dataPIDs)
632 LOG(VB_RECORD, LOG_DEBUG,
LOC +
"PMT for output stream");
644 const int table_id = psip.
TableID();
726 listener->HandleSplice(&sit);
741 listener->HandlePAT(pat);
747 bool send_single_program =
false;
753 LOG(VB_RECORD, LOG_WARNING,
LOC +
754 "ProcessPAT: PAT is missing program, setting timeout");
761 LOG(VB_GENERAL, LOG_ERR,
LOC +
"ProcessPAT: Program not found in PAT. "
762 "Rescan your transports.");
766 else if (foundProgram)
769 LOG(VB_RECORD, LOG_INFO,
LOC +
770 "ProcessPAT: Good PAT seen after a bad PAT");
777 if (send_single_program)
782 listener->HandleSingleProgramPAT(pat_sp,
false);
790 listener->HandleCAT(
cat);
794 cat->Descriptors(),
cat->DescriptorsLength(),
796 for (
auto & i : cdesc)
820 listener->HandleSingleProgramPMT(pmt_sp,
false);
830 double avg_offset = 0.0;
840 struct timeval tm {};
841 if (gettimeofday(&tm,
nullptr) != 0)
844 double utc_time = tm.tv_sec + (tm.tv_usec * 0.000001);
845 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 compliant");
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]);
1026 LOG(VB_RECORD, LOG_DEBUG, QString(
"Invalid adaptation field, type %3, size %4")
1040 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1041 QString(
"PID %1 (0x%2) has PCR %3μs")
1044 .arg(duration_cast<std::chrono::microseconds>
1045 (tspacket.
GetPCR().time_since_epoch()).count()));
1053 listener->ProcessVideoTSPacket(tspacket);
1061 listener->ProcessAudioTSPacket(tspacket);
1069 listener->ProcessTSPacket(tspacket);
1130 pid_map_t::const_iterator it =
m_pidsAudio.find(pid);
1136 uint sz = pids.size();
1142 pids[it.key()] = std::max(pids[it.key()], *it);
1145 pids[it.key()] = std::max(pids[it.key()], *it);
1148 pids[it.key()] = std::max(pids[it.key()], *it);
1150 return pids.size() - sz;
1158 pid_map_t::const_iterator it;
1217 pat_cache_t::const_iterator it =
m_cachedPats.constFind(tsid << 8);
1221 uint last_section = (*it)->LastSection();
1225 for (
uint i = 1; i <= last_section; i++)
1236 for (
uint i = 0; i <= 255; i++)
1253 cat_cache_t::const_iterator it =
m_cachedCats.constFind(tsid << 8);
1257 uint last_section = (*it)->LastSection();
1261 for (
uint i = 1; i <= last_section; i++)
1272 for (
uint i = 0; i <= 255; i++)
1289 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(pnum << 8);
1293 uint last_section = (*it)->LastSection();
1297 for (
uint i = 1; i <= last_section; i++)
1308 for (
uint i = 0; i <= 255; i++)
1327 for (
uint i = 0; i < pat->ProgramCount(); i++)
1329 uint prognum = pat->ProgramNumber(i);
1349 uint key = (tsid << 8) | section_num;
1350 pat_cache_t::const_iterator it =
m_cachedPats.constFind(key);
1362 for (
uint i=0; i < 256; i++)
1366 pats.push_back(pat);
1380 pats.push_back(pat);
1391 uint key = (tsid << 8) | section_num;
1392 cat_cache_t::const_iterator it =
m_cachedCats.constFind(key);
1404 for (
uint i=0; i < 256; i++)
1408 cats.push_back(
cat);
1422 cats.push_back(
cat);
1429 uint program_num,
uint section_num)
const
1434 uint key = (program_num << 8) | section_num;
1435 pmt_cache_t::const_iterator it =
m_cachedPmts.constFind(key);
1445 std::vector<const ProgramMapTable*> pmts;
1450 pmts.push_back(pmt);
1464 pmts[pmt->ProgramNumber()].push_back(pmt);
1480 psip_refcnt_map_t::iterator it;
1489 for (
auto & pat : pats)
1497 for (pat_map_t::iterator it = pats.begin(); it != pats.end(); ++it)
1504 for (
auto &
cat : cats)
1512 for (cat_map_t::iterator it = cats.begin(); it != cats.end(); ++it)
1519 for (
auto & pmt : pmts)
1527 for (pmt_map_t::iterator it = pmts.begin(); it != pmts.end(); ++it)
1574 psip_refcnt_map_t::iterator it;
1629 if (((
void*)val) == ((
void*)listener))
1641 if (((
void*)val) == ((
void*)*it))
1654 if (((
void*)val) == ((
void*)listener))
1666 if (((
void*)val) == ((
void*)*it))
1680 if (((
void*)val) == ((
void*)listener))
1682 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"AddAVListener 0x%1 already present")
1683 .arg((uint64_t)val, 0, 16));
1690 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"AddAVListener 0x%1 added")
1691 .arg((uint64_t)val, 0, 16));
1701 if (((
void*)val) == ((
void*)*it))
1705 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"RemoveAVListener 0x%1 found and removed")
1706 .arg((uint64_t)val, 0, 16));
1712 LOG(VB_RECORD, LOG_ERR,
LOC + QString(
"RemoveAVListener 0x%1 NOT found")
1713 .arg((uint64_t)val, 0, 16));
1721 if (((
void*)val) == ((
void*)listener))
1733 if (((
void*)val) == ((
void*)*it))
1746 if (((
void*)val) == ((
void*)listener))
1758 if (((
void*)val) == ((
void*)*it))
1771 LOG(VB_GENERAL, LOG_DEBUG,
LOC + QString(
"AddEncryptionTestPID(%1, 0x%2)")
1772 .arg(pnum) .arg(pid, 0, 16));
1789 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1790 QString(
"Tearing down up decryption monitoring for program %1")
1794 QMap<uint, uint_vec_t>::iterator list;
1795 uint_vec_t::iterator it;
1798 for (
uint pid : pids)
1801 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1802 QString(
"Removing 0x%1 PID Enc monitoring").arg(pid,0,16));
1810 it =
find((*list).begin(), (*list).end(), pnum);
1812 if (it != (*list).end())
1815 if ((*list).empty())
1830 QMap<uint, CryptInfo>::const_iterator it =
1841 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1842 QString(
"Setting up decryption monitoring for program %1")
1856 if (is_vid || is_aud)
1901 std::map<uint,bool> pnumEncrypted;
1902 const uint pid = tspacket.
PID();
1929 QString(
"PID 0x%1 status: %2") .arg(pid,0,16).arg(
toString(status)));
1933 for (
uint pnum : pnums)
1940 std::array<uint,3> enc_cnt { 0, 0, 0 };
1941 for (
uint pid2 : pids)
1947 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
1948 QString(
"\tpnum %1 PID 0x%2 status: %3")
1949 .arg(pnum).arg(pid2,0,16) .arg(
toString(stat)));
1956 else if (enc_cnt[
kEncDecrypted] >= std::min((
size_t) 2, pids.size()))
1963 LOG(VB_RECORD, LOG_DEBUG,
LOC + QString(
"Program %1 status: %2")
1969 pnumEncrypted[pnum] = encrypted;
1972 pnum_del_list.push_back(pnum);
1976 encryptionLock.unlock();
1978 for (
auto & pe : pnumEncrypted)
1982 listener->HandleEncryptionStatus(pe.first, pe.second);
1987 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.
static bool VERBOSE_LEVEL_CHECK(uint64_t mask, LogLevel_t level)
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).
QString toString(void) const
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
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
static constexpr uint8_t SYNC_BYTE
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)