11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
23PROMEKI_NAMESPACE_BEGIN
102 using EmitCallback = Function<Error(
const BufferView &)>;
115 void setTransportStreamId(uint16_t v);
118 uint16_t transportStreamId()
const {
return _transportStreamId; }
126 void setProgramNumber(uint16_t v);
129 uint16_t programNumber()
const {
return _programNumber; }
136 void setPmtPid(uint16_t v);
139 uint16_t pmtPid()
const {
return _pmtPid; }
156 void setPcrPid(uint16_t v);
159 uint16_t pcrPid()
const {
return _pcrPid; }
174 void setPatPmtIntervalMs(
int v);
177 int patPmtIntervalMs()
const {
return _patPmtIntervalMs; }
188 void setPcrIntervalMs(
int v);
191 int pcrIntervalMs()
const {
return _pcrIntervalMs; }
224 Error addStream(uint16_t pid, MpegTs::StreamType streamType,
225 const BufferView &descriptors = BufferView(),
226 MpegTs::StreamKind kind = MpegTs::StreamKind::Auto);
232 List<uint16_t> registeredPids()
const;
238 bool hasStream(uint16_t pid)
const;
281 Error writeAccessUnit(uint16_t pid,
const BufferView &payload, uint64_t pts90k, uint64_t dts90k,
282 bool isKeyframe,
const EmitCallback &emit);
316 Error markNextAccessUnitDiscontinuous(uint16_t pid);
326 Error emitNullPacket(
const EmitCallback &emit);
350 void setMuxRateBps(int64_t bps);
353 int64_t muxRateBps()
const {
return _muxRateBps; }
358 MpegTs::StreamType streamType = MpegTs::StreamTypeReserved;
359 MpegTs::StreamKind kind = MpegTs::StreamKind::Auto;
360 uint8_t pesStreamId = 0;
362 uint8_t continuityCounter = 0;
363 bool pendingDiscontinuity =
false;
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;
371 Error emitPatPmtIfDue(uint64_t now27mhz,
bool force,
const EmitCallback &emit);
372 Error writePsiSectionPacket(uint16_t pid,
const Buffer §ion, uint8_t &cc,
const EmitCallback &emit);
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;
385 List<StreamRec> _streams;
386 size_t _audioStreamCount = 0;
387 size_t _videoStreamCount = 0;
389 bool _forcePatPmt =
true;
390 bool _havePsiTime =
false;
391 bool _havePcrTime =
false;
392 uint64_t _lastPsiTime27mhz = 0;
393 uint64_t _lastPcrTime27mhz = 0;
396 int64_t _muxRateBps = 0;
397 bool _haveCbrAnchor =
false;
398 uint64_t _cbrAnchor27mhz = 0;
399 int64_t _bytesSinceAnchor = 0;