11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
30PROMEKI_NAMESPACE_BEGIN
102 enum class AacFraming {
108 using EmitCallback = MpegTsMuxer::EmitCallback;
114 using FrameCallback = Function<Error(Frame &&)>;
119 MpegTsFramer(
const MpegTsFramer &) =
delete;
120 MpegTsFramer &operator=(
const MpegTsFramer &) =
delete;
125 void setVideoPid(uint16_t v) { _videoPid = v; }
128 uint16_t videoPid()
const {
return _videoPid; }
131 void setAudioPid(uint16_t v) { _audioPid = v; }
134 uint16_t audioPid()
const {
return _audioPid; }
137 void setProgramNumber(uint16_t v) { _programNumber = v; }
140 uint16_t programNumber()
const {
return _programNumber; }
143 void setPmtPid(uint16_t v) { _pmtPid = v; }
146 uint16_t pmtPid()
const {
return _pmtPid; }
149 void setPatPmtIntervalMs(
int v) { _patPmtIntervalMs = v; }
152 int patPmtIntervalMs()
const {
return _patPmtIntervalMs; }
155 void setPcrIntervalMs(
int v) { _pcrIntervalMs = v; }
158 int pcrIntervalMs()
const {
return _pcrIntervalMs; }
161 void setMuxRateBps(int64_t v) { _muxRateBps = v; }
164 int64_t muxRateBps()
const {
return _muxRateBps; }
167 void setAacFraming(AacFraming v) { _aacFraming = v; }
170 AacFraming aacFraming()
const {
return _aacFraming; }
179 void setWriterFrameRate(
const FrameRate &fps) { _writerFrameRate = fps; }
182 const FrameRate &writerFrameRate()
const {
return _writerFrameRate; }
196 Error configureStreams(
const MediaDesc &desc);
199 bool haveVideoStream()
const {
return _haveVideoStream; }
202 bool haveAudioStream()
const {
return _haveAudioStream; }
217 Error markNextAccessUnitDiscontinuous(uint16_t pid);
231 Error writeFrame(
const Frame &frame,
const EmitCallback &emit);
237 int64_t writerAccessUnitsEmitted()
const {
return _writerAccessUnitsEmitted; }
251 void setFrameCallback(FrameCallback cb) { _frameCallback = std::move(cb); }
262 Error pushBytes(
const BufferView &data);
289 size_t drainFrames(Frame::List &out);
292 MpegTsMuxer *muxer();
295 MpegTsDemuxer *demuxer();
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);
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;
319 UniquePtr<MpegTsMuxer> _muxer;
320 UniquePtr<MpegTsDemuxer> _demuxer;
323 bool _haveVideoStream =
false;
324 bool _haveAudioStream =
false;
325 uint64_t _writerFrameIndex = 0;
326 uint64_t _writerAudioPts90k = 0;
327 int64_t _writerAccessUnitsEmitted = 0;
332 uint32_t _writer302MBlockPhase = 0;
335 FrameCallback _frameCallback;
336 Frame::List _readQueue;
337 Map<uint16_t, ImageDesc> _readerImageDesc;
338 Map<uint16_t, bool> _readerDimsProbed;