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 {
174 RtpVideoDepacketizerThread(RtpVideoDepacketizerContext ctx,
176 uint32_t clockRateHz,
177 size_t queueDepth = DefaultInputQueueDepth);
179 ~RtpVideoDepacketizerThread()
override;
181 RtpVideoDepacketizerThread(
const RtpVideoDepacketizerThread &) =
delete;
182 RtpVideoDepacketizerThread &operator=(
const RtpVideoDepacketizerThread &) =
delete;
186 void handlePacketForTest(
const RtpPacket &pkt) { handlePacket(pkt); }
189 void flushForTest() { emitFrame(); }
192 void handlePacket(
const RtpPacket &pkt)
override;
193 void onStop()
override;
198 RtpVideoDepacketizerContext _ctx;
199 RtpPacket::List _reasmPackets;
200 uint32_t _reasmTimestamp = 0;
201 bool _reasmHasTimestamp =
false;
202 TimeStamp _frameStartTime;
203 bool _hasFrameStart =
false;
204 TimeStamp _lastPacketTime;
205 bool _hasLastPacket =
false;
206 TimeStamp _lastFrameTime;
207 bool _hasLastFrame =
false;
208 FrameNumber _streamFrameIndex{0};
209 JpegGeometryProbe _jpegProbe;
210 uint32_t _lastEpoch = 0;