libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
rtpseqreorderbuffer.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/duration.h>
15#include <promeki/error.h>
16#include <promeki/map.h>
17#include <promeki/mutex.h>
18#include <promeki/namespace.h>
19#include <promeki/rtppacket.h>
20#include <promeki/timestamp.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
77class RtpSeqReorderBuffer {
78 public:
80 struct Config {
86 size_t maxWindow = 64;
87
98 Duration playoutDelay = Duration::fromMilliseconds(0);
99 };
100
103 struct Stats {
104 uint64_t inserted = 0;
105 uint64_t emittedInOrder = 0;
106 uint64_t emittedOnDeadline = 0;
107 uint64_t droppedOnOverflow = 0;
108 uint64_t droppedAsDuplicate = 0;
109 };
110
111 RtpSeqReorderBuffer() = default;
112 explicit RtpSeqReorderBuffer(const Config &c);
113
133 void insert(RtpPacket pkt, uint32_t extendedSeq,
134 const TimeStamp &arrivalSteady, RtpPacket::Queue &out);
135
146 void flush(RtpPacket::Queue &out);
147
153 void clear();
154
157 Stats snapshot() const;
158
160 Config config() const;
161
163 size_t size() const;
164
165 private:
166 struct Entry {
167 RtpPacket pkt;
168 TimeStamp arrival;
169 };
170
172 using EntryMap = Map<uint32_t, Entry>;
173
174 // Drains any in-order tail starting at the next-
175 // expected seq. Caller must hold @c _mutex.
176 void drainInOrderLocked(RtpPacket::Queue &out);
177
178 // Emits the head entry as a deadline-fill case.
179 // Caller must hold @c _mutex.
180 void emitHeadLocked(RtpPacket::Queue &out, bool deadline);
181
182 mutable Mutex _mutex;
183 Config _config;
184 EntryMap _buf;
185 bool _haveExpected = false;
186 uint32_t _expectedSeq = 0;
187 Stats _stats;
188};
189
190PROMEKI_NAMESPACE_END
191
192#endif // PROMEKI_ENABLE_NETWORK