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
79 static constexpr uint32_t MaxDropout = 3000;
80
85 static constexpr uint32_t MaxMisorder = 100;
86
88 static constexpr uint32_t SeqMod = 1u << 16;
89
101 struct ObserveResult {
107 bool probation = false;
108
114 bool duplicate = false;
115
120 bool ssrcInit = false;
121
127 uint32_t extendedSeq = 0;
128
133 uint32_t jitterRtpTsUnits = 0;
134 };
135
146 struct Stats {
150 uint32_t extendedHighestSeq = 0;
151
159 uint32_t cycles = 0;
160
167 int32_t cumulativeLost = 0;
168
174 uint8_t fractionLost = 0;
175
179 uint32_t expectedPackets = 0;
180
184 uint32_t receivedPackets = 0;
185
189 uint32_t duplicatePackets = 0;
190
195 uint32_t reorderedPackets = 0;
196
199 uint32_t interarrivalJitter = 0;
200 };
201
202 RtpSeqTracker() = default;
203
217 void initSource(uint16_t seq, uint32_t clockRateHz);
218
243 ObserveResult observe(uint16_t seq, uint32_t rtpTs, const TimeStamp &arrivalSteady);
244
254 Stats snapshot() const;
255
265 void commitRrInterval();
266
277 void reset();
278
285 uint32_t clockRateHz() const;
286
297 void setClockRateHz(uint32_t rate);
298
299 private:
300 void initSourceLocked(uint16_t seq);
301 void updateJitterLocked(uint32_t rtpTs, const TimeStamp &arrivalSteady);
302
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;
320};
321
322PROMEKI_NAMESPACE_END
323
324#endif // PROMEKI_ENABLE_NETWORK