libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
rtpseqtracker.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 <promeki/mutex.h>
15#include <promeki/namespace.h>
16#include <promeki/timestamp.h>
17
18PROMEKI_NAMESPACE_BEGIN
19
71class RtpSeqTracker {
72 public:
74 static constexpr unsigned int MinSequential = 2;
75
89 static constexpr uint32_t MaxDropout = 32768;
90
101 static constexpr uint32_t MaxMisorder = 1000;
102
104 static constexpr uint32_t SeqMod = 1u << 16;
105
117 struct ObserveResult {
123 bool probation = false;
124
130 bool duplicate = false;
131
136 bool ssrcInit = false;
137
143 uint32_t extendedSeq = 0;
144
149 uint32_t jitterRtpTsUnits = 0;
150 };
151
162 struct Stats {
166 uint32_t extendedHighestSeq = 0;
167
175 uint32_t cycles = 0;
176
183 int32_t cumulativeLost = 0;
184
190 uint8_t fractionLost = 0;
191
195 uint32_t expectedPackets = 0;
196
200 uint32_t receivedPackets = 0;
201
205 uint32_t duplicatePackets = 0;
206
211 uint32_t reorderedPackets = 0;
212
215 uint32_t interarrivalJitter = 0;
216 };
217
218 RtpSeqTracker() = default;
219
233 void initSource(uint16_t seq, uint32_t clockRateHz);
234
259 ObserveResult observe(uint16_t seq, uint32_t rtpTs, const TimeStamp &arrivalSteady);
260
270 Stats snapshot() const;
271
281 void commitRrInterval();
282
293 void reset();
294
301 uint32_t clockRateHz() const;
302
313 void setClockRateHz(uint32_t rate);
314
315 private:
316 void initSourceLocked(uint16_t seq);
317 void updateJitterLocked(uint32_t rtpTs, const TimeStamp &arrivalSteady);
318
319 mutable Mutex _mutex;
320 bool _initialised = false;
321 unsigned int _probation = MinSequential;
322 uint16_t _baseSeq = 0;
323 uint16_t _maxSeq = 0;
324 uint32_t _badSeq = SeqMod + 1;
325 uint32_t _cycles = 0;
326 uint32_t _received = 0;
327 uint32_t _expectedPrior = 0;
328 uint32_t _receivedPrior = 0;
329 uint32_t _duplicates = 0;
330 uint32_t _reordered = 0;
331 uint8_t _fractionLost = 0;
332 uint32_t _clockRateHz = 0;
333 uint32_t _jitter = 0;
334 bool _haveJitterPrev = false;
335 uint32_t _prevTransit = 0;
336};
337
338PROMEKI_NAMESPACE_END
339
340#endif // PROMEKI_ENABLE_NETWORK