11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
18PROMEKI_NAMESPACE_BEGIN
74 static constexpr unsigned int MinSequential = 2;
89 static constexpr uint32_t MaxDropout = 32768;
101 static constexpr uint32_t MaxMisorder = 1000;
104 static constexpr uint32_t SeqMod = 1u << 16;
117 struct ObserveResult {
123 bool probation =
false;
130 bool duplicate =
false;
136 bool ssrcInit =
false;
143 uint32_t extendedSeq = 0;
149 uint32_t jitterRtpTsUnits = 0;
166 uint32_t extendedHighestSeq = 0;
183 int32_t cumulativeLost = 0;
190 uint8_t fractionLost = 0;
195 uint32_t expectedPackets = 0;
200 uint32_t receivedPackets = 0;
205 uint32_t duplicatePackets = 0;
211 uint32_t reorderedPackets = 0;
215 uint32_t interarrivalJitter = 0;
218 RtpSeqTracker() =
default;
233 void initSource(uint16_t seq, uint32_t clockRateHz);
259 ObserveResult observe(uint16_t seq, uint32_t rtpTs,
const TimeStamp &arrivalSteady);
270 Stats snapshot()
const;
281 void commitRrInterval();
301 uint32_t clockRateHz()
const;
313 void setClockRateHz(uint32_t rate);
316 void initSourceLocked(uint16_t seq);
317 void updateJitterLocked(uint32_t rtpTs,
const TimeStamp &arrivalSteady);
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;