MythTV master
mpegstreamdata.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2// Copyright (c) 2003-2004, Daniel Thor Kristjansson
3#ifndef MPEGSTREAMDATA_H_
4#define MPEGSTREAMDATA_H_
5
6// C++
7#include <cstdint> // uint64_t
8#include <vector>
9
10// Qt
11#include <QMap>
12
15#include "libmythtv/mythtvexp.h"
16
17#include "streamlisteners.h"
18#include "tablestatus.h"
19#include "tspacket.h"
20
21class EITHelper;
22class PSIPTable;
23
24using uint_vec_t = std::vector<uint>;
25
26using pid_psip_map_t = QMap<unsigned int, PSIPTable*>;
27using psip_refcnt_map_t = QMap<const PSIPTable*, int>;
28
31using pat_vec_t = std::vector<const ProgramAssociationTable *>;
32using pat_map_t = QMap<uint, pat_vec_t>;
33using pat_cache_t = QMap<uint, ProgramAssociationTable*>;
34
37using cat_vec_t = std::vector<const ConditionalAccessTable *>;
38using cat_map_t = QMap<uint, cat_vec_t>;
39using cat_cache_t = QMap<uint, ConditionalAccessTable*>;
43using pmt_vec_t = std::vector<const ProgramMapTable*>;
44using pmt_map_t = QMap<uint, pmt_vec_t>;
45using pmt_cache_t = QMap<uint, ProgramMapTable*>;
46
47using uchar_vec_t = std::vector<unsigned char>;
48
49using mpeg_listener_vec_t = std::vector<MPEGStreamListener*>;
50using ts_listener_vec_t = std::vector<TSPacketListener*>;
51using ts_av_listener_vec_t = std::vector<TSPacketListenerAV*>;
52using mpeg_sp_listener_vec_t = std::vector<MPEGSingleProgramStreamListener*>;
53using ps_listener_vec_t = std::vector<PSStreamListener*>;
54
55enum CryptStatus : std::uint8_t
56{
60};
61
63{
64 public:
65 CryptInfo() = default;
66 CryptInfo(uint e, uint d) : m_encryptedMin(e), m_decryptedMin(d) { }
67
68 public:
70 uint m_encryptedPackets {0};
71 uint m_decryptedPackets {0};
72 uint m_encryptedMin {1000};
73 uint m_decryptedMin {8};
74};
75
76enum PIDPriority : std::uint8_t
77{
82};
83using pid_map_t = QMap<uint, PIDPriority>;
84
86{
87 public:
88 MPEGStreamData(int desiredProgram, int cardnum, bool cacheTables);
89 ~MPEGStreamData() override;
90
91 void SetCaching(bool cacheTables) { m_cacheTables = cacheTables; }
92 void SetListeningDisabled(bool lt) { m_listeningDisabled = lt; }
93
94 virtual void Reset(void) { Reset(-1); }
95 virtual void Reset(int desiredProgram);
96
98 double TimeOffset(void) const;
99
100 // EIT Source
101 void SetEITHelper(EITHelper *eit_helper) override; // EITSource
102 void SetEITRate(float rate) override; // EITSource
103 virtual bool HasEITPIDChanges(const uint_vec_t& /*in_use_pids*/) const
104 { return false; }
105 virtual bool GetEITPIDChanges(const uint_vec_t& /*in_use_pids*/,
106 uint_vec_t& /*add_pids*/,
107 uint_vec_t& /*del_pids*/) const
108 { return false; }
109
110 // Table processing
111 void SetIgnoreCRC(bool haveCRCbug) { m_haveCrcBug = haveCRCbug; }
112 virtual bool IsRedundant(uint pid, const PSIPTable &psip) const;
113 virtual bool HandleTables(uint pid, const PSIPTable &psip);
114 virtual void HandleTSTables(const TSPacket* tspacket);
115 virtual bool ProcessTSPacket(const TSPacket& tspacket);
116 virtual int ProcessData(const unsigned char *buffer, int len);
117 inline void HandleAdaptationFieldControl(const TSPacket* tspacket);
118
119 // Listening
120 virtual void AddListeningPID(
121 uint pid, PIDPriority priority = kPIDPriorityNormal)
122 { m_pidsListening[pid] = priority; }
123 virtual void AddNotListeningPID(uint pid)
124 { m_pidsNotListening[pid] = kPIDPriorityNormal; }
125 virtual void AddWritingPID(
126 uint pid, PIDPriority priority = kPIDPriorityHigh)
127 { m_pidsWriting[pid] = priority; }
128 virtual void AddAudioPID(
129 uint pid, PIDPriority priority = kPIDPriorityHigh)
130 { m_pidsAudio[pid] = priority; }
132 uint pid, PIDPriority priority = kPIDPriorityNormal)
133 { m_pidsConditionalAccess[pid] = priority; }
134
135 virtual void RemoveListeningPID(uint pid) { m_pidsListening.remove(pid); }
136 virtual void RemoveNotListeningPID(uint pid)
137 { m_pidsNotListening.remove(pid); }
138 virtual void RemoveWritingPID(uint pid) { m_pidsWriting.remove(pid); }
139 virtual void RemoveAudioPID(uint pid) { m_pidsAudio.remove(pid); }
140
141 virtual bool IsListeningPID(uint pid) const;
142 virtual bool IsNotListeningPID(uint pid) const;
143 virtual bool IsWritingPID(uint pid) const;
144 bool IsVideoPID(uint pid) const
145 { return m_pidVideoSingleProgram == pid; }
146 virtual bool IsAudioPID(uint pid) const;
147 virtual bool IsConditionalAccessPID(uint pid) const;
148
149 const pid_map_t& ListeningPIDs(void) const
150 { return m_pidsListening; }
151 const pid_map_t& AudioPIDs(void) const
152 { return m_pidsAudio; }
153 const pid_map_t& WritingPIDs(void) const
154 { return m_pidsWriting; }
155
156 uint GetPIDs(pid_map_t &pids) const;
157
158 // PID Priorities
159 PIDPriority GetPIDPriority(uint pid) const;
160
161 // Table versions
162 void SetVersionPAT(uint tsid, int version, uint last_section)
163 {
164 m_patStatus.SetVersion(tsid, version, last_section);
165 }
166 void SetVersionPMT(uint pnum, int version, uint last_section)
167 {
168 m_pmtStatus.SetVersion(pnum, version, last_section);
169 }
170
171 // Sections seen
172 bool HasAllPATSections(uint tsid) const;
173
174 bool HasAllCATSections(uint tsid) const;
175
176 bool HasAllPMTSections(uint prog_num) const;
177
178 // Caching
179 bool HasProgram(uint progNum) const;
180
181 bool HasCachedAllPAT(uint tsid) const;
182 bool HasCachedAnyPAT(uint tsid) const;
183 bool HasCachedAnyPAT(void) const;
184
185 bool HasCachedAllCAT(uint tsid) const;
186 bool HasCachedAnyCAT(uint tsid) const;
187 bool HasCachedAnyCAT(void) const;
188
189 bool HasCachedAllPMT(uint pnum) const;
190 bool HasCachedAnyPMT(uint pnum) const;
191 bool HasCachedAllPMTs(void) const;
192 bool HasCachedAnyPMTs(void) const;
193
194 pat_const_ptr_t GetCachedPAT(uint tsid, uint section_num) const;
195 pat_vec_t GetCachedPATs(uint tsid) const;
196 pat_vec_t GetCachedPATs(void) const;
198
199 cat_const_ptr_t GetCachedCAT(uint tsid, uint section_num) const;
200 cat_vec_t GetCachedCATs(uint tsid) const;
201 cat_vec_t GetCachedCATs(void) const;
203
204 pmt_const_ptr_t GetCachedPMT(uint program_num, uint section_num) const;
205 pmt_vec_t GetCachedPMTs(void) const;
206 pmt_map_t GetCachedPMTMap(void) const;
207
208 virtual void ReturnCachedTable(const PSIPTable *psip) const;
209 virtual void ReturnCachedPATTables(pat_vec_t &pats) const;
210 virtual void ReturnCachedPATTables(pat_map_t &pats) const;
211 virtual void ReturnCachedCATTables(cat_vec_t &cats) const;
212 virtual void ReturnCachedCATTables(cat_map_t &cats) const;
213 virtual void ReturnCachedPMTTables(pmt_vec_t &pmts) const;
214 virtual void ReturnCachedPMTTables(pmt_map_t &pmts) const;
215
216 // Encryption Monitoring
217 void AddEncryptionTestPID(uint pnum, uint pid, bool isvideo);
218 void RemoveEncryptionTestPIDs(uint pnum);
219 bool IsEncryptionTestPID(uint pid) const;
220
221 void TestDecryption(const ProgramMapTable* pmt);
222 void ResetDecryptionMonitoringState(void);
223
224 bool IsProgramDecrypted(uint pnum) const;
225 bool IsProgramEncrypted(uint pnum) const;
226
227 // "signals"
228 void AddMPEGListener(MPEGStreamListener *val);
229 void RemoveMPEGListener(MPEGStreamListener *val);
230
231 void AddWritingListener(TSPacketListener *val);
232 void RemoveWritingListener(TSPacketListener *val);
233
234 // Single Program Stuff, signals with processed tables
235 void AddMPEGSPListener(MPEGSingleProgramStreamListener *val);
236 void RemoveMPEGSPListener(MPEGSingleProgramStreamListener *val);
237 void AddAVListener(TSPacketListenerAV *val);
238 void RemoveAVListener(TSPacketListenerAV *val);
239
240 // Program Stream Stuff
241 void AddPSStreamListener(PSStreamListener *val);
242 void RemovePSStreamListener(PSStreamListener *val);
243
244 public:
245 // Single program stuff, sets
246 void SetDesiredProgram(int p);
247 inline void SetPATSingleProgram(ProgramAssociationTable *pat);
248 inline void SetPMTSingleProgram(ProgramMapTable *pmt);
250 { m_pmtSingleProgramNumVideo = num; }
252 { return m_pmtSingleProgramNumVideo; }
254 { m_pmtSingleProgramNumAudio = num; }
256 { return m_pmtSingleProgramNumAudio; }
257 void SetRecordingType(const QString &recording_type);
258
259 // Single program stuff, gets
260 int DesiredProgram(void) const { return m_desiredProgram; }
261 uint VideoPIDSingleProgram(void) const { return m_pidVideoSingleProgram; }
262 QString GetRecordingType(void) const { return m_recordingType; }
263
265 { return m_patSingleProgram; }
267 { return m_pmtSingleProgram; }
268
270 { return m_patSingleProgram; }
272 { return m_pmtSingleProgram; }
273
274 // Single program stuff, mostly used internally
275 int VersionPATSingleProgram(void) const;
276 int VersionPMTSingleProgram(void) const;
277
278 bool CreatePATSingleProgram(const ProgramAssociationTable &pat);
279 bool CreatePMTSingleProgram(const ProgramMapTable &pmt);
280
281 protected:
282 // Table processing -- for internal use
283 PSIPTable* AssemblePSIP(const TSPacket* tspacket, bool& moreTablePackets);
284 bool AssemblePSIP(PSIPTable& psip, TSPacket* tspacket);
285 void SavePartialPSIP(uint pid, PSIPTable* packet);
287 { return m_partialPsipPacketCache[pid]; }
289 { m_partialPsipPacketCache.remove(pid); }
290 void DeletePartialPSIP(uint pid);
291 void ProcessPAT(const ProgramAssociationTable *pat);
292 void ProcessCAT(const ConditionalAccessTable *cat);
293 void ProcessPMT(const ProgramMapTable *pmt);
294 void ProcessEncryptedPacket(const TSPacket &tspacket);
295
296 static int ResyncStream(const unsigned char *buffer, int curr_pos, int len);
297
298 void UpdateTimeOffset(uint64_t si_utc_time);
299
300 // Caching
301 void IncrementRefCnt(const PSIPTable *psip) const;
302 virtual bool DeleteCachedTable(const PSIPTable *psip) const;
303 void CachePAT(const ProgramAssociationTable *pat);
304 void CacheCAT(const ConditionalAccessTable *_cat);
305 void CachePMT(const ProgramMapTable *pmt);
306
307 protected:
309 QString m_siStandard {"mpeg"};
310
311 bool m_haveCrcBug {false};
312
313 mutable QMutex m_siTimeLock;
314 uint m_siTimeOffsetCnt {0};
315 uint m_siTimeOffsetIndx {0};
316 std::array<double,16> m_siTimeOffsets {0.0};
317
318 // Generic EIT stuff used for ATSC and DVB
319 EITHelper *m_eitHelper {nullptr};
320 float m_eitRate {1.0F};
321
322 // Listening
328 bool m_listeningDisabled {false};
329
330 // Encryption monitoring
331 mutable QRecursiveMutex m_encryptionLock;
332 QMap<uint, CryptInfo> m_encryptionPidToInfo;
333 QMap<uint, uint_vec_t> m_encryptionPnumToPids;
334 QMap<uint, uint_vec_t> m_encryptionPidToPnums;
335 QMap<uint, CryptStatus> m_encryptionPnumToStatus;
336
337 // Signals
338 mutable QRecursiveMutex m_listenerLock;
344
345 // Table versions
349
350 // PSIP construction
352
353 // Caching
355 mutable QRecursiveMutex m_cacheLock;
361
362 // Single program variables
364 QString m_recordingType {"all"};
365 bool m_stripPmtDescriptors {false};
366 bool m_normalizeStreamType {true};
367 uint m_pidVideoSingleProgram {0xffffffff};
368 uint m_pidPmtSingleProgram {0xffffffff};
369 uint m_pmtSingleProgramNumVideo {1};
370 uint m_pmtSingleProgramNumAudio {0};
371 ProgramAssociationTable *m_patSingleProgram {nullptr};
372 ProgramMapTable *m_pmtSingleProgram {nullptr};
373
374 // PAT Timeout handling.
375 private:
376 bool m_invalidPatSeen {false};
377 bool m_invalidPatWarning {false};
379};
380
381#include "mpegtables.h"
382
384{
385 delete m_patSingleProgram;
386 m_patSingleProgram = pat;
387}
388
390{
391 delete m_pmtSingleProgram;
392 m_pmtSingleProgram = pmt;
393}
394
396{
397 return (m_patSingleProgram) ? int(m_patSingleProgram->Version()) : -1;
398}
399
401{
402 return (m_pmtSingleProgram) ? int(m_pmtSingleProgram->Version()) : -1;
403}
404
406{
407 // TODO
408 //AdaptationFieldControl afc(tspacket.data()+4);
409}
410
411#endif
QMap< uint, pmt_vec_t > pmt_map_t
std::vector< const ProgramMapTable * > pmt_vec_t
The CAT is used to transmit additional ConditionalAccessDescriptor instances, in addition to the ones...
Definition: mpegtables.h:839
CryptInfo()=default
CryptInfo(uint e, uint d)
Encapsulates data about MPEG stream and emits events for each table.
QMap< uint, uint_vec_t > m_encryptionPnumToPids
const ProgramMapTable * PMTSingleProgram(void) const
bool AssemblePSIP(PSIPTable &psip, TSPacket *tspacket)
pid_psip_map_t m_partialPsipPacketCache
uint GetVideoStreamsRequired() const
ProgramMapTable * PMTSingleProgram(void)
QRecursiveMutex m_listenerLock
const pid_map_t & WritingPIDs(void) const
psip_refcnt_map_t m_cachedSlatedForDeletion
cat_map_t GetCachedCATMap(void) const
QMap< uint, uint_vec_t > m_encryptionPidToPnums
void SetAudioStreamsRequired(uint num)
ProgramAssociationTable * PATSingleProgram(void)
virtual bool GetEITPIDChanges(const uint_vec_t &, uint_vec_t &, uint_vec_t &) const
void SetPMTSingleProgram(ProgramMapTable *pmt)
TableStatusMap m_catStatus
QRecursiveMutex m_cacheLock
const pid_map_t & ListeningPIDs(void) const
PSIPTable * GetPartialPSIP(uint pid)
psip_refcnt_map_t m_cachedRefCnt
virtual void RemoveNotListeningPID(uint pid)
void ClearPartialPSIP(uint pid)
pid_map_t m_pidsConditionalAccess
ts_av_listener_vec_t m_tsAvListeners
ProgramAssociationTable * m_patSingleProgram
ps_listener_vec_t m_psListeners
uint VideoPIDSingleProgram(void) const
pat_map_t GetCachedPATMap(void) const
pid_map_t m_pidsWriting
int DesiredProgram(void) const
TableStatusMap m_pmtStatus
void HandleAdaptationFieldControl(const TSPacket *tspacket)
QRecursiveMutex m_encryptionLock
virtual void AddNotListeningPID(uint pid)
void SetVersionPMT(uint pnum, int version, uint last_section)
QMap< uint, CryptInfo > m_encryptionPidToInfo
pmt_cache_t m_cachedPmts
pid_map_t m_pidsAudio
ts_listener_vec_t m_tsWritingListeners
virtual void RemoveListeningPID(uint pid)
mpeg_sp_listener_vec_t m_mpegSpListeners
virtual void AddAudioPID(uint pid, PIDPriority priority=kPIDPriorityHigh)
pid_map_t m_pidsNotListening
const ProgramAssociationTable * PATSingleProgram(void) const
void SetIgnoreCRC(bool haveCRCbug)
virtual void Reset(void)
TableStatusMap m_patStatus
virtual void RemoveAudioPID(uint pid)
bool IsVideoPID(uint pid) const
void SetVideoStreamsRequired(uint num)
virtual void AddWritingPID(uint pid, PIDPriority priority=kPIDPriorityHigh)
uint GetAudioStreamsRequired() const
virtual bool HasEITPIDChanges(const uint_vec_t &) const
void SetCaching(bool cacheTables)
int VersionPATSingleProgram(void) const
ProgramMapTable * m_pmtSingleProgram
int VersionPMTSingleProgram(void) const
QMap< uint, CryptStatus > m_encryptionPnumToStatus
virtual void RemoveWritingPID(uint pid)
void SetVersionPAT(uint tsid, int version, uint last_section)
virtual void AddListeningPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
void SetPATSingleProgram(ProgramAssociationTable *pat)
void SetListeningDisabled(bool lt)
const pid_map_t & AudioPIDs(void) const
virtual void AddConditionalAccessPID(uint pid, PIDPriority priority=kPIDPriorityNormal)
QString GetRecordingType(void) const
pat_cache_t m_cachedPats
MythTimer m_invalidPatTimer
mpeg_listener_vec_t m_mpegListeners
cat_cache_t m_cachedCats
pid_map_t m_pidsListening
A QElapsedTimer based timer to replace use of QTime as a timer.
Definition: mythtimer.h:14
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
Definition: mpegtables.h:410
uint Version(void) const
Definition: mpegtables.h:522
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
Definition: mpegtables.h:599
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
Definition: mpegtables.h:676
Used to access the data of a Transport Stream packet.
Definition: tspacket.h:208
unsigned int uint
Definition: freesurround.h:24
static const iso6937table * d
QMap< uint, ProgramAssociationTable * > pat_cache_t
QMap< uint, ProgramMapTable * > pmt_cache_t
QMap< uint, pat_vec_t > pat_map_t
std::vector< uint > uint_vec_t
std::vector< unsigned char > uchar_vec_t
QMap< unsigned int, PSIPTable * > pid_psip_map_t
std::vector< TSPacketListenerAV * > ts_av_listener_vec_t
QMap< uint, PIDPriority > pid_map_t
std::vector< MPEGStreamListener * > mpeg_listener_vec_t
QMap< uint, ConditionalAccessTable * > cat_cache_t
std::vector< PSStreamListener * > ps_listener_vec_t
QMap< uint, cat_vec_t > cat_map_t
std::vector< const ProgramAssociationTable * > pat_vec_t
std::vector< MPEGSingleProgramStreamListener * > mpeg_sp_listener_vec_t
std::vector< TSPacketListener * > ts_listener_vec_t
std::vector< const ConditionalAccessTable * > cat_vec_t
ProgramMapTable const * pmt_const_ptr_t
PIDPriority
@ kPIDPriorityNone
@ kPIDPriorityHigh
@ kPIDPriorityLow
@ kPIDPriorityNormal
CryptStatus
@ kEncUnknown
@ kEncEncrypted
@ kEncDecrypted
QMap< const PSIPTable *, int > psip_refcnt_map_t
#define MTV_PUBLIC
Definition: mythtvexp.h:15
string version
Definition: giantbomb.py:185