11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
23PROMEKI_NAMESPACE_BEGIN
94 MpegTs::StreamType streamType = MpegTs::StreamTypeReserved;
106 uint32_t registrationFormat = 0;
112 bool randomAccess =
false;
113 bool dataAlignment =
false;
114 bool discontinuity =
false;
124 using StreamCallback = Function<Error(
const AccessUnit &)>;
135 using ProgramCallback = Function<void()>;
148 using PcrCallback = Function<void(uint16_t pid, uint64_t pcr27mhz)>;
154 void setStreamCallback(StreamCallback cb) { _streamCallback = std::move(cb); }
157 void setProgramCallback(ProgramCallback cb) { _programCallback = std::move(cb); }
167 void setPcrCallback(PcrCallback cb) { _pcrCallback = std::move(cb); }
181 Error push(
const BufferView &data);
199 uint16_t pmtPid()
const {
return _pmtPid; }
205 uint16_t programNumber()
const {
return _programNumber; }
212 uint16_t pcrPid()
const {
return _pcrPid; }
220 MpegTs::StreamType streamType = MpegTs::StreamTypeReserved;
227 uint32_t registrationFormat = 0;
236 List<StreamInfo> streams()
const;
243 uint64_t continuityErrors()
const {
return _continuityErrors; }
250 uint64_t bytesDiscarded()
const {
return _bytesDiscarded; }
266 size_t expectedTotal = 0;
270 MpegTs::StreamType streamType = MpegTs::StreamTypeReserved;
273 size_t expectedTotal = 0;
274 bool inProgress =
false;
275 bool unbounded =
false;
280 bool randomAccess =
false;
281 bool dataAlignment =
false;
282 bool discontinuity =
false;
283 uint8_t continuityCounter = 0;
287 Error processPacket(
const uint8_t *p);
288 Error processPsiPacket(
const uint8_t *payload,
size_t payloadLen, uint16_t pid,
bool pusi);
289 Error dispatchPsiSection(uint16_t pid,
const uint8_t *section,
size_t len);
290 Error parsePat(
const uint8_t *section,
size_t len);
291 Error parsePmt(
const uint8_t *section,
size_t len);
292 Error finalizePes(uint16_t pid, PesReasm &pr);
293 Error startNewPes(uint16_t pid, PesReasm &pr,
const uint8_t *pesStart,
size_t pesAvail,
294 bool randomAccess,
bool discontinuity);
296 StreamCallback _streamCallback;
297 ProgramCallback _programCallback;
298 PcrCallback _pcrCallback;
302 uint8_t _carry[MpegTs::PacketSize];
303 size_t _carrySize = 0;
305 uint16_t _programNumber = 0;
306 uint16_t _pmtPid = MpegTs::PidNull;
307 uint16_t _pcrPid = MpegTs::PidNull;
308 bool _havePat =
false;
309 bool _havePmt =
false;
311 Map<uint16_t, MpegTs::StreamType> _streamTypeByPid;
312 Map<uint16_t, uint32_t> _registrationByPid;
313 Map<uint16_t, PesReasm> _pes;
314 Map<uint16_t, PsiReasm> _psi;
316 uint64_t _continuityErrors = 0;
317 uint64_t _bytesDiscarded = 0;