11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
33PROMEKI_NAMESPACE_BEGIN
51struct RtpVideoDepacketizerContext {
55 Queue<RxVideoFrame> *payloadQueue =
nullptr;
58 const Atomic<uint32_t> *resetEpoch =
nullptr;
63 const bool *active =
nullptr;
71 RtpPayload *payload =
nullptr;
81 ImageDesc *readerImageDesc =
nullptr;
98 ClockDomain clockDomain;
102 const bool *hasSr =
nullptr;
105 const RtpStreamClock *streamClock =
nullptr;
109 Atomic<int64_t> *packetsReceived =
nullptr;
110 Atomic<int64_t> *bytesReceived =
nullptr;
111 Atomic<int64_t> *lastPacketArrivalNs =
nullptr;
112 Atomic<int64_t> *framesReassembled =
nullptr;
113 Atomic<int64_t> *framesDroppedValidate =
nullptr;
114 Atomic<int64_t> *framesWaitingParamSets =
nullptr;
115 Atomic<int64_t> *framesDroppedSsrcReset =
nullptr;
119 Histogram *rxPacketInterval =
nullptr;
120 Histogram *rxFrameInterval =
nullptr;
121 Histogram *rxFrameAssembleTime =
nullptr;
125 Function<void()> noteFrameReceived;
129 Function<void()> refreshStreamClock;
134 Function<TimeStamp(
const NtpTime &)> ntpToSteady;
157class RtpVideoDepacketizerThread :
public RtpDepacketizerThread {
166 RtpVideoDepacketizerThread(RtpVideoDepacketizerContext ctx,
168 uint32_t clockRateHz);
170 ~RtpVideoDepacketizerThread()
override;
172 RtpVideoDepacketizerThread(
const RtpVideoDepacketizerThread &) =
delete;
173 RtpVideoDepacketizerThread &operator=(
const RtpVideoDepacketizerThread &) =
delete;
177 void handlePacketForTest(
const RtpPacket &pkt) { handlePacket(pkt); }
180 void flushForTest() { emitFrame(); }
183 void handlePacket(
const RtpPacket &pkt)
override;
184 void onStop()
override;
189 RtpVideoDepacketizerContext _ctx;
190 RtpPacket::List _reasmPackets;
191 uint32_t _reasmTimestamp = 0;
192 bool _reasmHasTimestamp =
false;
193 TimeStamp _frameStartTime;
194 bool _hasFrameStart =
false;
195 TimeStamp _lastPacketTime;
196 bool _hasLastPacket =
false;
197 TimeStamp _lastFrameTime;
198 bool _hasLastFrame =
false;
199 FrameNumber _streamFrameIndex{0};
200 JpegGeometryProbe _jpegProbe;
201 uint32_t _lastEpoch = 0;