libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
mpegtsmuxer.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/buffer.h>
16#include <promeki/bufferview.h>
17#include <promeki/error.h>
18#include <promeki/function.h>
19#include <promeki/list.h>
20#include <promeki/map.h>
21#include <promeki/mpegts.h>
22
23PROMEKI_NAMESPACE_BEGIN
24
90class MpegTsMuxer {
91 public:
102 using EmitCallback = Function<Error(const BufferView &)>;
103
105 MpegTsMuxer();
106
107 ~MpegTsMuxer();
108
115 void setTransportStreamId(uint16_t v);
116
118 uint16_t transportStreamId() const { return _transportStreamId; }
119
126 void setProgramNumber(uint16_t v);
127
129 uint16_t programNumber() const { return _programNumber; }
130
136 void setPmtPid(uint16_t v);
137
139 uint16_t pmtPid() const { return _pmtPid; }
140
156 void setPcrPid(uint16_t v);
157
159 uint16_t pcrPid() const { return _pcrPid; }
160
174 void setPatPmtIntervalMs(int v);
175
177 int patPmtIntervalMs() const { return _patPmtIntervalMs; }
178
188 void setPcrIntervalMs(int v);
189
191 int pcrIntervalMs() const { return _pcrIntervalMs; }
192
224 Error addStream(uint16_t pid, MpegTs::StreamType streamType,
225 const BufferView &descriptors = BufferView(),
226 MpegTs::StreamKind kind = MpegTs::StreamKind::Auto);
227
232 List<uint16_t> registeredPids() const;
233
238 bool hasStream(uint16_t pid) const;
239
281 Error writeAccessUnit(uint16_t pid, const BufferView &payload, uint64_t pts90k, uint64_t dts90k,
282 bool isKeyframe, const EmitCallback &emit);
283
292 void forcePatPmt();
293
316 Error markNextAccessUnitDiscontinuous(uint16_t pid);
317
326 Error emitNullPacket(const EmitCallback &emit);
327
350 void setMuxRateBps(int64_t bps);
351
353 int64_t muxRateBps() const { return _muxRateBps; }
354
355 private:
356 struct StreamRec {
357 uint16_t pid = 0;
358 MpegTs::StreamType streamType = MpegTs::StreamTypeReserved;
359 MpegTs::StreamKind kind = MpegTs::StreamKind::Auto;
360 uint8_t pesStreamId = 0;
361 Buffer descriptors;
362 uint8_t continuityCounter = 0;
363 bool pendingDiscontinuity = false;
364 };
365
366 StreamRec *findStream(uint16_t pid);
367 const StreamRec *findStream(uint16_t pid) const;
368 uint8_t pickPesStreamId(MpegTs::StreamType streamType, MpegTs::StreamKind kind,
369 size_t indexOfKind) const;
370
371 Error emitPatPmtIfDue(uint64_t now27mhz, bool force, const EmitCallback &emit);
372 Error writePsiSectionPacket(uint16_t pid, const Buffer &section, uint8_t &cc, const EmitCallback &emit);
373
374 uint16_t _transportStreamId = 1;
375 uint16_t _programNumber = MpegTs::DefaultProgramNumber;
376 uint16_t _pmtPid = MpegTs::DefaultPmtPid;
377 uint16_t _pcrPid = MpegTs::DefaultVideoPid;
378 int _patPmtIntervalMs = 100;
379 int _pcrIntervalMs = 20;
380 uint8_t _patVersion = 0;
381 uint8_t _pmtVersion = 0;
382 uint8_t _patCc = 0;
383 uint8_t _pmtCc = 0;
384
385 List<StreamRec> _streams;
386 size_t _audioStreamCount = 0; // counts ADTS/LATM/AC3/MP2 streams for stream_id allocation.
387 size_t _videoStreamCount = 0;
388
389 bool _forcePatPmt = true; // emit on the first writeAccessUnit call.
390 bool _havePsiTime = false;
391 bool _havePcrTime = false;
392 uint64_t _lastPsiTime27mhz = 0;
393 uint64_t _lastPcrTime27mhz = 0;
394
395 // CBR padding state.
396 int64_t _muxRateBps = 0;
397 bool _haveCbrAnchor = false;
398 uint64_t _cbrAnchor27mhz = 0;
399 int64_t _bytesSinceAnchor = 0;
400};
401
402PROMEKI_NAMESPACE_END
403
404#endif // PROMEKI_ENABLE_PROAV