11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
32PROMEKI_NAMESPACE_BEGIN
65 struct RoutedAncFrame {
80 using AncFrameCallback = Function<void(
const RoutedAncFrame &)>;
86 uint8_t payloadType = 0;
87 PcapFlowKind kind = PcapFlowKind::Unknown;
91 uint64_t lostPackets = 0;
92 uint64_t duplicatePackets = 0;
93 uint64_t reorderedPackets = 0;
94 uint32_t timestampRegressions = 0;
95 Duration maxJitter = Duration::zero();
119 Kind kind = Kind::SsrcChange;
120 PcapFlowKind flowKind = PcapFlowKind::Unknown;
127 uint32_t previous = 0;
129 Duration jitter = Duration::zero();
130 DateTime captureTime;
134 using RtpAnomalyCallback = Function<void(
const RtpAnomaly &)>;
136 PcapFlowRouter() =
default;
143 Error setSdp(
const SdpSession &sdp);
156 void addAncFlow(
const SocketAddress &dst,
int payloadType = -1) {
157 _map.addAncFlow(dst.address(), dst.port(), payloadType);
161 void onAncFrame(AncFrameCallback cb) { _ancCb = std::move(cb); }
164 void onRtpAnomaly(RtpAnomalyCallback cb) { _anomalyCb = std::move(cb); }
177 void setJitterWarnThreshold(
const Duration &threshold) { _jitterWarn = threshold; }
185 Error processFile(
const String &path);
191 Error processBuffer(
const Buffer &buf);
194 const List<FlowStat> &flowStats()
const {
return _stats; }
197 const PcapSdpMap &sdpMap()
const {
return _map; }
208 bool haveSsrc =
false;
210 uint32_t timestamp = 0;
211 uint8_t payloadType = 0;
213 RtpPacket::List packets;
214 DateTime captureTime;
224 bool haveSsrc =
false;
225 uint8_t payloadType = 0;
227 uint32_t lastTimestamp = 0;
229 uint32_t lastExtendedSeq = 0;
230 bool haveSeq =
false;
232 int64_t prevArrivalNs = 0;
233 uint32_t prevRtpTs = 0;
234 int64_t jitterNs = 0;
235 bool haveJitterPrev =
false;
236 Duration maxJitter = Duration::zero();
237 bool jitterOver =
false;
238 uint32_t timestampRegressions = 0;
239 RtpSeqTracker tracker;
242 void handleDatagram(
const UdpDatagram &dg,
const DateTime &captureTime);
243 void routeAnc(
const UdpDatagram &dg,
const PcapFlow &flow,
const RtpPacket &pkt,
const DateTime &captureTime);
244 void flushAnc(AncReasm &r);
245 FlowStat &statFor(
const SocketAddress &dst, uint32_t ssrc, uint8_t pt, PcapFlowKind kind);
246 AncReasm &ancReasmFor(
const UdpDatagram &dg,
const PcapFlow &flow);
247 FlowHealth &healthFor(
const SocketAddress &dst);
248 void trackRtpHealth(
const SocketAddress &dst, PcapFlowKind kind,
const RtpPacket &pkt, FlowStat &st,
249 const DateTime &captureTime);
250 void emitAnomaly(RtpAnomaly::Kind kind, PcapFlowKind flowKind,
const SocketAddress &dst, uint32_t ssrc,
251 uint32_t previous, uint32_t count,
const DateTime &captureTime,
252 const Duration &jitter = Duration::zero());
254 Error runReader(
class PcapReader &reader);
258 AncFrameCallback _ancCb;
259 RtpAnomalyCallback _anomalyCb;
260 Duration _jitterWarn = Duration::zero();
261 List<FlowStat> _stats;
262 List<AncReasm> _ancFlows;
263 List<UniquePtr<FlowHealth>> _health;