11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
18PROMEKI_NAMESPACE_BEGIN
74 static constexpr unsigned int MinSequential = 2;
79 static constexpr uint32_t MaxDropout = 3000;
85 static constexpr uint32_t MaxMisorder = 100;
88 static constexpr uint32_t SeqMod = 1u << 16;
101 struct ObserveResult {
107 bool probation =
false;
114 bool duplicate =
false;
120 bool ssrcInit =
false;
127 uint32_t extendedSeq = 0;
133 uint32_t jitterRtpTsUnits = 0;
150 uint32_t extendedHighestSeq = 0;
167 int32_t cumulativeLost = 0;
174 uint8_t fractionLost = 0;
179 uint32_t expectedPackets = 0;
184 uint32_t receivedPackets = 0;
189 uint32_t duplicatePackets = 0;
195 uint32_t reorderedPackets = 0;
199 uint32_t interarrivalJitter = 0;
202 RtpSeqTracker() =
default;
217 void initSource(uint16_t seq, uint32_t clockRateHz);
243 ObserveResult observe(uint16_t seq, uint32_t rtpTs,
const TimeStamp &arrivalSteady);
254 Stats snapshot()
const;
265 void commitRrInterval();
285 uint32_t clockRateHz()
const;
297 void setClockRateHz(uint32_t rate);
300 void initSourceLocked(uint16_t seq);
301 void updateJitterLocked(uint32_t rtpTs,
const TimeStamp &arrivalSteady);
303 mutable Mutex _mutex;
304 bool _initialised =
false;
305 unsigned int _probation = MinSequential;
306 uint16_t _baseSeq = 0;
307 uint16_t _maxSeq = 0;
308 uint32_t _badSeq = SeqMod + 1;
309 uint32_t _cycles = 0;
310 uint32_t _received = 0;
311 uint32_t _expectedPrior = 0;
312 uint32_t _receivedPrior = 0;
313 uint32_t _duplicates = 0;
314 uint32_t _reordered = 0;
315 uint8_t _fractionLost = 0;
316 uint32_t _clockRateHz = 0;
317 uint32_t _jitter = 0;
318 bool _haveJitterPrev =
false;
319 uint32_t _prevTransit = 0;