libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
mpegtsframer.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstdint>
14#include <promeki/namespace.h>
15#include <promeki/audiodesc.h>
16#include <promeki/buffer.h>
17#include <promeki/bufferview.h>
18#include <promeki/error.h>
19#include <promeki/frame.h>
20#include <promeki/framerate.h>
21#include <promeki/function.h>
22#include <promeki/imagedesc.h>
23#include <promeki/list.h>
24#include <promeki/map.h>
25#include <promeki/mpegts.h>
26#include <promeki/mpegtsmuxer.h>
28#include <promeki/uniqueptr.h>
29
30PROMEKI_NAMESPACE_BEGIN
31
88class MpegTsFramer {
89 public:
102 enum class AacFraming {
103 Adts,
104 Latm
105 };
106
108 using EmitCallback = MpegTsMuxer::EmitCallback;
109
114 using FrameCallback = Function<Error(Frame &&)>;
115
116 MpegTsFramer();
117 ~MpegTsFramer();
118
119 MpegTsFramer(const MpegTsFramer &) = delete;
120 MpegTsFramer &operator=(const MpegTsFramer &) = delete;
121
122 // ---- Common configuration --------------------------
123
125 void setVideoPid(uint16_t v) { _videoPid = v; }
126
128 uint16_t videoPid() const { return _videoPid; }
129
131 void setAudioPid(uint16_t v) { _audioPid = v; }
132
134 uint16_t audioPid() const { return _audioPid; }
135
137 void setProgramNumber(uint16_t v) { _programNumber = v; }
138
140 uint16_t programNumber() const { return _programNumber; }
141
143 void setPmtPid(uint16_t v) { _pmtPid = v; }
144
146 uint16_t pmtPid() const { return _pmtPid; }
147
149 void setPatPmtIntervalMs(int v) { _patPmtIntervalMs = v; }
150
152 int patPmtIntervalMs() const { return _patPmtIntervalMs; }
153
155 void setPcrIntervalMs(int v) { _pcrIntervalMs = v; }
156
158 int pcrIntervalMs() const { return _pcrIntervalMs; }
159
161 void setMuxRateBps(int64_t v) { _muxRateBps = v; }
162
164 int64_t muxRateBps() const { return _muxRateBps; }
165
167 void setAacFraming(AacFraming v) { _aacFraming = v; }
168
170 AacFraming aacFraming() const { return _aacFraming; }
171
179 void setWriterFrameRate(const FrameRate &fps) { _writerFrameRate = fps; }
180
182 const FrameRate &writerFrameRate() const { return _writerFrameRate; }
183
196 Error configureStreams(const MediaDesc &desc);
197
199 bool haveVideoStream() const { return _haveVideoStream; }
200
202 bool haveAudioStream() const { return _haveAudioStream; }
203
204 // ---- Writer side -----------------------------------
205
210 void forcePatPmt();
211
217 Error markNextAccessUnitDiscontinuous(uint16_t pid);
218
231 Error writeFrame(const Frame &frame, const EmitCallback &emit);
232
237 int64_t writerAccessUnitsEmitted() const { return _writerAccessUnitsEmitted; }
238
239 // ---- Reader side -----------------------------------
240
251 void setFrameCallback(FrameCallback cb) { _frameCallback = std::move(cb); }
252
262 Error pushBytes(const BufferView &data);
263
272 Error flushReader();
273
289 size_t drainFrames(Frame::List &out);
290
292 MpegTsMuxer *muxer();
293
295 MpegTsDemuxer *demuxer();
296
297 private:
298 MpegTsMuxer *ensureMuxer();
299 MpegTsDemuxer *ensureDemuxer();
300 Error registerVideoStream(MpegTs::StreamType st, uint32_t registrationFormat,
301 const ImageDesc &imageDesc);
302 Error registerAudioStream(MpegTs::StreamType st, uint32_t registrationFormat,
303 const AudioDesc &audioDesc);
304 Error handleAccessUnit(const MpegTsDemuxer::AccessUnit &au);
305 void probeVideoDimensions(uint16_t pid, MpegTs::StreamType st, const BufferView &au);
306
307 // Configuration.
308 uint16_t _videoPid = MpegTs::DefaultVideoPid;
309 uint16_t _audioPid = MpegTs::DefaultAudioPid;
310 uint16_t _pmtPid = MpegTs::DefaultPmtPid;
311 uint16_t _programNumber = MpegTs::DefaultProgramNumber;
312 int _patPmtIntervalMs = 100;
313 int _pcrIntervalMs = 20;
314 int64_t _muxRateBps = 0;
315 AacFraming _aacFraming = AacFraming::Adts;
316 FrameRate _writerFrameRate;
317
318 // Lazy components.
319 UniquePtr<MpegTsMuxer> _muxer;
320 UniquePtr<MpegTsDemuxer> _demuxer;
321
322 // Writer state.
323 bool _haveVideoStream = false;
324 bool _haveAudioStream = false;
325 uint64_t _writerFrameIndex = 0;
326 uint64_t _writerAudioPts90k = 0;
327 int64_t _writerAccessUnitsEmitted = 0;
328 // SMPTE 302M block phase counter — wraps 0..191
329 // (one AES3 block = 192 frames). Carries the F-bit
330 // phase across @ref writeFrame calls so we stamp the
331 // first AES3 subframe of every block correctly.
332 uint32_t _writer302MBlockPhase = 0;
333
334 // Reader state.
335 FrameCallback _frameCallback;
336 Frame::List _readQueue;
337 Map<uint16_t, ImageDesc> _readerImageDesc; // per video PID, learned from SPS.
338 Map<uint16_t, bool> _readerDimsProbed;
339};
340
341PROMEKI_NAMESPACE_END
342
343#endif // PROMEKI_ENABLE_PROAV