libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
rtpvideodepacketizerthread.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
13#include <cstdint>
14#include <functional>
15#include <promeki/function.h>
16#include <promeki/atomic.h>
17#include <promeki/clockdomain.h>
18#include <promeki/eui64.h>
19#include <promeki/framenumber.h>
20#include <promeki/histogram.h>
21#include <promeki/imagedesc.h>
23#include <promeki/namespace.h>
24#include <promeki/queue.h>
26#include <promeki/rtppacket.h>
27#include <promeki/rtppayload.h>
30#include <promeki/string.h>
31#include <promeki/timestamp.h>
32
33PROMEKI_NAMESPACE_BEGIN
34
51struct RtpVideoDepacketizerContext {
55 Queue<RxVideoFrame> *payloadQueue = nullptr;
56
58 const Atomic<uint32_t> *resetEpoch = nullptr;
59
63 const bool *active = nullptr;
64
71 RtpPayload *payload = nullptr;
72
81 ImageDesc *readerImageDesc = nullptr;
82
87 String fmtp;
88
93 EUI64 ptpGrandmaster;
94
98 ClockDomain clockDomain;
99
102 const bool *hasSr = nullptr;
103
105 const RtpStreamClock *streamClock = nullptr;
106
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;
116
119 Histogram *rxPacketInterval = nullptr;
120 Histogram *rxFrameInterval = nullptr;
121 Histogram *rxFrameAssembleTime = nullptr;
122
125 Function<void()> noteFrameReceived;
126
129 Function<void()> refreshStreamClock;
130
134 Function<TimeStamp(const NtpTime &)> ntpToSteady;
135};
136
157class RtpVideoDepacketizerThread : public RtpDepacketizerThread {
158 public:
166 RtpVideoDepacketizerThread(RtpVideoDepacketizerContext ctx,
167 const String &name,
168 uint32_t clockRateHz);
169
170 ~RtpVideoDepacketizerThread() override;
171
172 RtpVideoDepacketizerThread(const RtpVideoDepacketizerThread &) = delete;
173 RtpVideoDepacketizerThread &operator=(const RtpVideoDepacketizerThread &) = delete;
174
177 void handlePacketForTest(const RtpPacket &pkt) { handlePacket(pkt); }
178
180 void flushForTest() { emitFrame(); }
181
182 protected:
183 void handlePacket(const RtpPacket &pkt) override;
184 void onStop() override;
185
186 private:
187 void emitFrame();
188
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;
202};
203
204PROMEKI_NAMESPACE_END
205
206#endif // PROMEKI_ENABLE_NETWORK