MythTV  master
dtvrecorder.h
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
9 #ifndef DTVRECORDER_H
10 #define DTVRECORDER_H
11 
12 #include <vector>
13 
14 #include <QAtomicInt>
15 #include <QString>
16 
20 #include "libmythtv/scantype.h"
21 
22 class MPEGStreamData;
23 class TSPacket;
24 class StreamID;
25 
26 class DTVRecorder :
27  public RecorderBase,
28  public MPEGStreamListener,
30  public DVBMainStreamListener,
32  public TSPacketListener,
33  public TSPacketListenerAV,
34  public PSStreamListener
35 {
36  public:
37  explicit DTVRecorder(TVRec *rec);
38  ~DTVRecorder() override;
39 
40  void SetOption(const QString &name, const QString &value) override; // RecorderBase
41  void SetOption(const QString &name, int value) override; // RecorderBase
43  RecordingProfile *profile, const QString &videodev,
44  const QString &audiodev, const QString &vbidev) override; // RecorderBase
45 
46  bool IsErrored(void) override // RecorderBase
47  { return !m_error.isEmpty(); }
48 
49  long long GetFramesWritten(void) override // RecorderBase
50  { return m_framesWrittenCount; }
51 
52  void SetVideoFilters(QString &/*filters*/) override {;} // RecorderBase
53  void Initialize(void) override {;} // RecorderBase
54  int GetVideoFd(void) override // RecorderBase
55  { return m_streamFd; }
56 
57  virtual void SetStreamData(MPEGStreamData* data);
58  MPEGStreamData *GetStreamData(void) const { return m_streamData; }
59 
60  void Reset(void) override; // RecorderBase
61  void ClearStatistics(void) override; // RecorderBase
62  RecordingQuality *GetRecordingQuality(const RecordingInfo *r) const override; // RecorderBase
63 
64  // MPEG Stream Listener
65  void HandlePAT(const ProgramAssociationTable *_pat) override; // MPEGStreamListener
66  void HandleCAT(const ConditionalAccessTable */*cat*/) override {} // MPEGStreamListener
67  void HandlePMT(uint progNum, const ProgramMapTable *_pmt) override; // MPEGStreamListener
68  void HandleEncryptionStatus(uint /*pnum*/, bool /*encrypted*/) override { } // MPEGStreamListener
69 
70  // MPEG Single Program Stream Listener
71  void HandleSingleProgramPAT(ProgramAssociationTable *pat, bool insert) override; // MPEGSingleProgramStreamListener
72  void HandleSingleProgramPMT(ProgramMapTable *pmt, bool insert) override; // MPEGSingleProgramStreamListener
73 
74  // ATSC Main
75  void HandleSTT(const SystemTimeTable */*stt*/) override { UpdateCAMTimeOffset(); } // ATSCMainStreamListener
76  void HandleVCT(uint /*tsid*/, const VirtualChannelTable */*vct*/) override {} // ATSCMainStreamListener
77  void HandleMGT(const MasterGuideTable */*mgt*/) override {} // ATSCMainStreamListener
78 
79  // DVBMainStreamListener
80  void HandleTDT(const TimeDateTable */*tdt*/) override { UpdateCAMTimeOffset(); } // DVBMainStreamListener
81  void HandleNIT(const NetworkInformationTable */*nit*/) override {} // DVBMainStreamListener
82  void HandleSDT(uint /*tsid*/, const ServiceDescriptionTable */*sdt*/) override {} // DVBMainStreamListener
83 
84  // TSPacketListener
85  bool ProcessTSPacket(const TSPacket &tspacket) override; // TSPacketListener
86 
87  // TSPacketListenerAV
88  bool ProcessVideoTSPacket(const TSPacket& tspacket) override; // TSPacketListenerAV
89  bool ProcessAudioTSPacket(const TSPacket& tspacket) override; // TSPacketListenerAV
90 
91  // Common audio/visual processing
92  bool ProcessAVTSPacket(const TSPacket &tspacket);
93 
94  protected:
95  virtual void InitStreamData(void);
96 
97  void FinishRecording(void) override; // RecorderBase
98  void ResetForNewFile(void) override; // RecorderBase
99 
100  void HandleKeyframe(int64_t extra);
101  void HandleTimestamps(int stream_id, int64_t pts, int64_t dts);
102  void UpdateFramesWritten(void);
103 
104  void BufferedWrite(const TSPacket &tspacket, bool insert = false);
105 
106  // MPEG TS "audio only" support
107  bool FindAudioKeyframes(const TSPacket *tspacket);
108 
109  // MPEG2 TS support
110  bool FindMPEG2Keyframes(const TSPacket* tspacket);
111 
112  // MPEG4 AVC / H.264 TS support
113  bool FindH2645Keyframes(const TSPacket* tspacket);
114  void HandleH2645Keyframe(void);
115 
116  // MPEG2 PS support (Hauppauge PVR-x50/PVR-500)
117  void FindPSKeyFrames(const uint8_t *buffer, uint len) override; // PSStreamListener
118 
119  // For handling other (non audio/video) packets
120  bool FindOtherKeyframes(const TSPacket *tspacket);
121 
122  inline bool CheckCC(uint pid, uint new_cnt);
123 
124  virtual QString GetSIStandard(void) const { return "mpeg"; }
125  virtual void SetCAMPMT(const ProgramMapTable */*pmt*/) {}
126  virtual void UpdateCAMTimeOffset(void) {}
127 
128  // file handle for stream
129  int m_streamFd {-1};
130 
131  QString m_recordingType {"all"};
132 
133  // used for scanning pes headers for keyframes
135  QElapsedTimer m_audioTimer;
136  uint32_t m_startCode {0xffffffff};
137  int m_firstKeyframe {-1};
138  unsigned long long m_lastGopSeen {0};
139  unsigned long long m_lastSeqSeen {0};
140  unsigned long long m_lastKeyframeSeen {0};
141  unsigned int m_audioBytesRemaining {0};
142  unsigned int m_videoBytesRemaining {0};
143  unsigned int m_otherBytesRemaining {0};
144 
145  // MPEG2 parser information
147  int m_repeatPict {0};
148 
149  // H.264 support
150  bool m_pesSynced {false};
151  bool m_seenSps {false};
153 
156 
158 
159  // state tracking variables
161  QString m_error;
162 
164 
165  // keyframe finding buffer
166  bool m_bufferPackets {false};
167  std::vector<unsigned char> m_payloadBuffer;
168 
169  // general recorder stuff
170  mutable QRecursiveMutex m_pidLock;
175  bool m_hasNoAV {false};
176 
177  // TS recorder stuff
178  bool m_recordMpts {false};
179  bool m_recordMptsOnly {false};
181  std::array<uint8_t,0x1fff + 1> m_streamId {0};
182  std::array<uint8_t,0x1fff + 1> m_pidStatus {0};
183  std::array<uint8_t,0x1fff + 1> m_continuityCounter {0};
184  std::vector<TSPacket> m_scratch;
185 
186  // Statistics
188  bool m_usePts {false}; // vs use dts
189  std::array<uint64_t,256> m_tsCount {0};
190  std::array<int64_t,256> m_tsLast {};
191  std::array<int64_t,256> m_tsFirst {};
192  std::array<QDateTime,256>m_tsFirstDt {};
193  mutable QAtomicInt m_packetCount {0};
194  mutable QAtomicInt m_continuityErrorCount {0};
195  unsigned long long m_framesSeenCount {0};
196  unsigned long long m_framesWrittenCount {0};
198  double m_totalDuration {0.0};
200  double m_tdBase {0.0};
207  uint64_t m_tdTickCount {0};
210 
211  // Music Choice
212  // Comcast Music Choice uses 3 frames every 6 seconds and no key frames
213  bool m_musicChoice {false};
214 
215  bool m_useIForKeyframe {true};
216 
217  // constants
222  static const unsigned char kPayloadStartSeen = 0x2;
223 };
224 
225 inline bool DTVRecorder::CheckCC(uint pid, uint new_cnt)
226 {
227  bool ok = ((((m_continuityCounter[pid] + 1) & 0xf) == new_cnt) ||
228  (m_continuityCounter[pid] == new_cnt) ||
229  (m_continuityCounter[pid] == 0xFF));
230 
231  m_continuityCounter[pid] = new_cnt & 0xf;
232 
233  return ok;
234 }
235 
236 #endif // DTVRECORDER_H
DTVRecorder::FindPSKeyFrames
void FindPSKeyFrames(const uint8_t *buffer, uint len) override
Definition: dtvrecorder.cpp:1122
DTVRecorder::m_pesSynced
bool m_pesSynced
Definition: dtvrecorder.h:150
DTVRecorder::HandleSingleProgramPMT
void HandleSingleProgramPMT(ProgramMapTable *pmt, bool insert) override
Definition: dtvrecorder.cpp:1409
DTVRecorder::m_pidStatus
std::array< uint8_t, 0x1fff+1 > m_pidStatus
Definition: dtvrecorder.h:182
DTVRecorder::HandleCAT
void HandleCAT(const ConditionalAccessTable *) override
Definition: dtvrecorder.h:66
VirtualChannelTable
This table contains information about the channels transmitted on this multiplex.
Definition: atsctables.h:193
PSStreamListener
Definition: streamlisteners.h:103
SCAN_t
SCAN_t
Definition: scantype.h:6
ATSCMainStreamListener
Definition: streamlisteners.h:112
DTVRecorder::m_inputPmt
ProgramMapTable * m_inputPmt
PMT on input side.
Definition: dtvrecorder.h:174
DTVRecorder::HandleEncryptionStatus
void HandleEncryptionStatus(uint, bool) override
Definition: dtvrecorder.h:68
DTVRecorder::GetVideoFd
int GetVideoFd(void) override
Returns file descriptor of recorder device.
Definition: dtvrecorder.h:54
DTVRecorder::CheckCC
bool CheckCC(uint pid, uint new_cnt)
Definition: dtvrecorder.h:225
recorderbase.h
TimeDateTable
This table gives the current DVB stream time.
Definition: dvbtables.h:381
DTVRecorder::m_bufferPackets
bool m_bufferPackets
Definition: dtvrecorder.h:166
DTVRecorder::m_framesWrittenCount
unsigned long long m_framesWrittenCount
Definition: dtvrecorder.h:196
DTVRecorder::m_payloadBuffer
std::vector< unsigned char > m_payloadBuffer
Definition: dtvrecorder.h:167
DTVRecorder::UpdateCAMTimeOffset
virtual void UpdateCAMTimeOffset(void)
Definition: dtvrecorder.h:126
MythTimer
A QElapsedTimer based timer to replace use of QTime as a timer.
Definition: mythtimer.h:13
DTVRecorder::kMaxKeyFrameDistance
static const uint kMaxKeyFrameDistance
If the number of regular frames detected since the last detected keyframe exceeds this value,...
Definition: dtvrecorder.h:221
DTVRecorder::ResetForNewFile
void ResetForNewFile(void) override
Definition: dtvrecorder.cpp:140
DTVRecorder::HandleSDT
void HandleSDT(uint, const ServiceDescriptionTable *) override
Definition: dtvrecorder.h:82
DTVRecorder::m_audioTimer
QElapsedTimer m_audioTimer
Definition: dtvrecorder.h:135
RecordingInfo
Holds information on a TV Program one might wish to record.
Definition: recordinginfo.h:35
DTVRecorder::m_inputPat
ProgramAssociationTable * m_inputPat
PAT on input side.
Definition: dtvrecorder.h:172
DTVRecorder::SetVideoFilters
void SetVideoFilters(QString &) override
Tells recorder which filters to use.
Definition: dtvrecorder.h:52
DTVRecorder::m_startCode
uint32_t m_startCode
Definition: dtvrecorder.h:136
DTVRecorder::m_scanType
SCAN_t m_scanType
Definition: dtvrecorder.h:209
SCAN_t::UNKNOWN_SCAN
@ UNKNOWN_SCAN
ProgramMapTable
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
Definition: mpegtables.h:694
DTVRecorder::ProcessVideoTSPacket
bool ProcessVideoTSPacket(const TSPacket &tspacket) override
Definition: dtvrecorder.cpp:1609
DTVRecorder::m_packetCount
QAtomicInt m_packetCount
Definition: dtvrecorder.h:193
DTVRecorder::FindOtherKeyframes
bool FindOtherKeyframes(const TSPacket *tspacket)
Non-Audio/Video data.
Definition: dtvrecorder.cpp:806
DTVRecorder::m_videoBytesRemaining
unsigned int m_videoBytesRemaining
Definition: dtvrecorder.h:142
DTVRecorder::SetOptionsFromProfile
void SetOptionsFromProfile(RecordingProfile *profile, const QString &videodev, const QString &audiodev, const QString &vbidev) override
Sets basic recorder options.
Definition: dtvrecorder.cpp:112
DTVRecorder::Reset
void Reset(void) override
Reset the recorder to the startup state.
Definition: dtvrecorder.cpp:204
DTVRecorder::HandlePAT
void HandlePAT(const ProgramAssociationTable *_pat) override
Definition: dtvrecorder.cpp:1308
DTVRecorder::m_lastGopSeen
unsigned long long m_lastGopSeen
Definition: dtvrecorder.h:138
DTVRecorder::SetStreamData
virtual void SetStreamData(MPEGStreamData *data)
Definition: dtvrecorder.cpp:218
DTVRecorder::BufferedWrite
void BufferedWrite(const TSPacket &tspacket, bool insert=false)
Definition: dtvrecorder.cpp:259
DTVRecorder::IsErrored
bool IsErrored(void) override
Tells us whether an unrecoverable error has been encountered.
Definition: dtvrecorder.h:46
DTVRecorder::m_tsCount
std::array< uint64_t, 256 > m_tsCount
Definition: dtvrecorder.h:189
DTVRecorder::m_framesSeenCount
unsigned long long m_framesSeenCount
Definition: dtvrecorder.h:195
H2645Parser.h
TSPacketListener
Definition: streamlisteners.h:62
MPEGSingleProgramStreamListener
Definition: streamlisteners.h:93
streamlisteners.h
DTVRecorder::HandleNIT
void HandleNIT(const NetworkInformationTable *) override
Definition: dtvrecorder.h:81
DTVRecorder::GetSIStandard
virtual QString GetSIStandard(void) const
Definition: dtvrecorder.h:124
DTVRecorder::FinishRecording
void FinishRecording(void) override
Flushes the ringbuffer, and if this is not a live LiveTV recording saves the position map and filesiz...
Definition: dtvrecorder.cpp:126
DTVRecorder::SetCAMPMT
virtual void SetCAMPMT(const ProgramMapTable *)
Definition: dtvrecorder.h:125
DTVRecorder::m_tsFirst
std::array< int64_t, 256 > m_tsFirst
Definition: dtvrecorder.h:191
DTVRecorder::m_recordingType
QString m_recordingType
Definition: dtvrecorder.h:131
DTVRecorder::m_continuityCounter
std::array< uint8_t, 0x1fff+1 > m_continuityCounter
Definition: dtvrecorder.h:183
DTVRecorder::kPayloadStartSeen
static const unsigned char kPayloadStartSeen
Definition: dtvrecorder.h:222
StreamID
Contains listing of PMT Stream ID's for various A/V Stream types.
Definition: mpegtables.h:109
DTVRecorder::HandleSTT
void HandleSTT(const SystemTimeTable *) override
Definition: dtvrecorder.h:75
DTVRecorder::m_hasNoAV
bool m_hasNoAV
Definition: dtvrecorder.h:175
DTVRecorder::m_totalDuration
double m_totalDuration
Total milliseconds that have passed since the start of the recording.
Definition: dtvrecorder.h:198
DTVRecorder::HandleSingleProgramPAT
void HandleSingleProgramPAT(ProgramAssociationTable *pat, bool insert) override
Definition: dtvrecorder.cpp:1389
DTVRecorder::ProcessAVTSPacket
bool ProcessAVTSPacket(const TSPacket &tspacket)
Common code for processing either audio or video packets.
Definition: dtvrecorder.cpp:1667
hardwareprofile.scan.profile
profile
Definition: scan.py:97
DTVRecorder::m_recordMptsOnly
bool m_recordMptsOnly
Definition: dtvrecorder.h:179
DTVRecorder::m_lastKeyframeSeen
unsigned long long m_lastKeyframeSeen
Definition: dtvrecorder.h:140
DTVRecorder::m_progressiveSequence
int m_progressiveSequence
Definition: dtvrecorder.h:146
DTVRecorder::HandleKeyframe
void HandleKeyframe(int64_t extra)
This save the current frame to the position maps and handles ringbuffer switching.
Definition: dtvrecorder.cpp:832
DTVRecorder::m_tdTickCount
uint64_t m_tdTickCount
Count of the number of equivalent interlaced fields that have passed since m_tdBase.
Definition: dtvrecorder.h:207
MPEGStreamListener
Definition: streamlisteners.h:81
TSPacketListenerAV
Definition: streamlisteners.h:71
TSPacket
Used to access the data of a Transport Stream packet.
Definition: tspacket.h:205
DTVRecorder::m_firstKeyframe
int m_firstKeyframe
Definition: dtvrecorder.h:137
DTVRecorder::DTVRecorder
DTVRecorder(TVRec *rec)
Definition: dtvrecorder.cpp:51
MPEGStreamData
Encapsulates data about MPEG stream and emits events for each table.
Definition: mpegstreamdata.h:85
ServiceDescriptionTable
This table tells the decoder on which PIDs to find A/V data.
Definition: dvbtables.h:108
DTVRecorder::GetFramesWritten
long long GetFramesWritten(void) override
Returns number of frames written to disk.
Definition: dtvrecorder.h:49
DTVRecorder::FindAudioKeyframes
bool FindAudioKeyframes(const TSPacket *tspacket)
Definition: dtvrecorder.cpp:766
DTVRecorder::Initialize
void Initialize(void) override
This is called between SetOptionsFromProfile() and run() to initialize any devices,...
Definition: dtvrecorder.h:53
DTVRecorder::m_h2645Parser
H2645Parser * m_h2645Parser
Definition: dtvrecorder.h:152
DTVRecorder::HandleH2645Keyframe
void HandleH2645Keyframe(void)
This save the current frame to the position maps and handles ringbuffer switching.
Definition: dtvrecorder.cpp:1091
DTVRecorder::m_seenSps
bool m_seenSps
Definition: dtvrecorder.h:151
DTVRecorder::GetStreamData
MPEGStreamData * GetStreamData(void) const
Definition: dtvrecorder.h:58
DTVRecorder::m_streamId
std::array< uint8_t, 0x1fff+1 > m_streamId
Definition: dtvrecorder.h:181
DTVRecorder::HandleVCT
void HandleVCT(uint, const VirtualChannelTable *) override
Definition: dtvrecorder.h:76
DTVRecorder::ClearStatistics
void ClearStatistics(void) override
Definition: dtvrecorder.cpp:184
DTVRecorder::ProcessTSPacket
bool ProcessTSPacket(const TSPacket &tspacket) override
Definition: dtvrecorder.cpp:1547
DTVRecorder::SetOption
void SetOption(const QString &name, const QString &value) override
Set an specific option.
Definition: dtvrecorder.cpp:91
RecordingQuality
Definition: recordingquality.h:34
DTVRecorder
This is a specialization of RecorderBase used to handle MPEG-2, MPEG-4, MPEG-4 AVC,...
Definition: dtvrecorder.h:26
DTVRecorder::m_recordMptsTimer
MythTimer m_recordMptsTimer
Definition: dtvrecorder.h:180
DTVRecorder::m_tdBase
double m_tdBase
Milliseconds from the start to m_tdTickCount = 0.
Definition: dtvrecorder.h:200
DTVRecorder::m_tdTickFramerate
MythAVRational m_tdTickFramerate
Definition: dtvrecorder.h:208
ProgramAssociationTable
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
Definition: mpegtables.h:617
DTVRecorder::m_lastSeqSeen
unsigned long long m_lastSeqSeen
Definition: dtvrecorder.h:139
DTVRecorder::~DTVRecorder
~DTVRecorder() override
Definition: dtvrecorder.cpp:66
DTVRecorder::m_streamFd
int m_streamFd
Definition: dtvrecorder.h:129
DTVRecorder::m_repeatPict
int m_repeatPict
Definition: dtvrecorder.h:147
DTVRecorder::m_audioBytesRemaining
unsigned int m_audioBytesRemaining
Definition: dtvrecorder.h:141
DTVRecorder::m_hasWrittenOtherKeyframe
bool m_hasWrittenOtherKeyframe
Definition: dtvrecorder.h:157
DTVRecorder::HandleMGT
void HandleMGT(const MasterGuideTable *) override
Definition: dtvrecorder.h:77
DTVRecorder::m_otherBytesRemaining
unsigned int m_otherBytesRemaining
Definition: dtvrecorder.h:143
MasterGuideTable
This table tells the decoder on which PIDs to find other tables, and their sizes and each table's cur...
Definition: atsctables.h:79
DTVRecorder::ProcessAudioTSPacket
bool ProcessAudioTSPacket(const TSPacket &tspacket) override
Definition: dtvrecorder.cpp:1643
DVBMainStreamListener
Definition: streamlisteners.h:172
DTVRecorder::FindMPEG2Keyframes
bool FindMPEG2Keyframes(const TSPacket *tspacket)
Locates the keyframes and saves them to the position map.
Definition: dtvrecorder.cpp:405
DTVRecorder::UpdateFramesWritten
void UpdateFramesWritten(void)
Definition: dtvrecorder.cpp:733
DTVRecorder::m_waitForKeyframeOption
bool m_waitForKeyframeOption
Wait for the a GOP/SEQ-start before sending data.
Definition: dtvrecorder.h:155
DTVRecorder::HandleTDT
void HandleTDT(const TimeDateTable *) override
Definition: dtvrecorder.h:80
scantype.h
DTVRecorder::m_streamData
MPEGStreamData * m_streamData
Definition: dtvrecorder.h:163
DTVRecorder::m_error
QString m_error
non-empty iff irrecoverable recording error detected
Definition: dtvrecorder.h:161
DTVRecorder::m_useIForKeyframe
bool m_useIForKeyframe
Definition: dtvrecorder.h:215
DTVRecorder::m_recordMpts
bool m_recordMpts
Definition: dtvrecorder.h:178
RecorderBase
This is the abstract base class for supporting recorder hardware.
Definition: recorderbase.h:51
DTVRecorder::HandlePMT
void HandlePMT(uint progNum, const ProgramMapTable *_pmt) override
Definition: dtvrecorder.cpp:1360
TVRec
This is the coordinating class of the Recorder Subsystem.
Definition: tv_rec.h:142
ConditionalAccessTable
The CAT is used to transmit additional ConditionalAccessDescriptor instances, in addition to the ones...
Definition: mpegtables.h:857
DTVRecorder::m_continuityErrorCount
QAtomicInt m_continuityErrorCount
Definition: dtvrecorder.h:194
mpeg::chrono::pts
std::chrono::duration< CHRONO_TYPE, std::ratio< 1, 90000 > > pts
Definition: mythchrono.h:55
DTVRecorder::m_usePts
bool m_usePts
Definition: dtvrecorder.h:188
DTVRecorder::m_scratch
std::vector< TSPacket > m_scratch
Definition: dtvrecorder.h:184
DTVRecorder::m_pesTimer
MythTimer m_pesTimer
Definition: dtvrecorder.h:134
MythAVRational
C++ wrapper for FFmpeg libavutil AVRational.
Definition: mythavrational.h:14
SystemTimeTable
This table contains the GPS time at the time of transmission.
Definition: atsctables.h:684
H2645Parser
Definition: H2645Parser.h:39
DTVRecorder::m_minimumRecordingQuality
int m_minimumRecordingQuality
Definition: dtvrecorder.h:187
RecordingProfile
Definition: recordingprofile.h:41
DTVRecorder::m_pidLock
QRecursiveMutex m_pidLock
Definition: dtvrecorder.h:170
DTVRecorder::FindH2645Keyframes
bool FindH2645Keyframes(const TSPacket *tspacket)
Definition: dtvrecorder.cpp:872
DTVRecorder::m_musicChoice
bool m_musicChoice
Definition: dtvrecorder.h:213
DTVRecorder::HandleTimestamps
void HandleTimestamps(int stream_id, int64_t pts, int64_t dts)
Definition: dtvrecorder.cpp:649
DTVRecorder::GetRecordingQuality
RecordingQuality * GetRecordingQuality(const RecordingInfo *r) const override
Returns a report about the current recordings quality.
Definition: dtvrecorder.cpp:1706
DTVRecorder::InitStreamData
virtual void InitStreamData(void)
Definition: dtvrecorder.cpp:231
DTVRecorder::m_tsLast
std::array< int64_t, 256 > m_tsLast
Definition: dtvrecorder.h:190
DTVRecorder::m_tsFirstDt
std::array< QDateTime, 256 > m_tsFirstDt
Definition: dtvrecorder.h:192
uint
unsigned int uint
Definition: freesurround.h:24
NetworkInformationTable
This table tells the decoder on which PIDs to find other tables.
Definition: dvbtables.h:28