11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
24PROMEKI_NAMESPACE_BEGIN
62 uint32_t clockRate = 0;
70 *
this = StreamAnchor{};
75 bool isValid()
const {
return valid && clockRate > 0; }
87 TimeStamp captureTimeFor(uint32_t rtpTs)
const {
88 if (!isValid())
return TimeStamp();
89 const uint32_t delta = rtpTs - rtpTs0;
90 const int64_t ns = (
static_cast<int64_t
>(delta) * 1'000'000'000) /
91 static_cast<int64_t
>(clockRate);
92 return arrivalT0 + Duration::fromNanoseconds(ns);
127class RtpDepacketizerThread :
public Thread {
137 static constexpr size_t DefaultInputQueueDepth = 64;
153 RtpDepacketizerThread(
const String &name, uint32_t clockRateHz,
154 size_t depth = DefaultInputQueueDepth);
158 ~RtpDepacketizerThread()
override;
160 RtpDepacketizerThread(
const RtpDepacketizerThread &) =
delete;
161 RtpDepacketizerThread &operator=(
const RtpDepacketizerThread &) =
delete;
167 RtpPacket::Queue &inputQueue() {
return _inputQueue; }
170 const RtpPacket::Queue &inputQueue()
const {
return _inputQueue; }
184 bool isStopRequested()
const {
return _stopRequested.value(); }
188 uint32_t clockRateHz()
const {
return _clockRateHz; }
194 const StreamAnchor &anchor()
const {
return _anchor; }
210 virtual void handlePacket(
const RtpPacket &pkt) = 0;
215 virtual void onStart() {}
221 virtual void onStop() {}
233 void ensureAnchor(uint32_t rtpTs,
const TimeStamp &arrivalSteady);
245 TimeStamp captureTimeForRtpTs(uint32_t rtpTs)
const;
252 static constexpr unsigned int PopTimeoutMs = 50;
257 Atomic<bool> _stopRequested;
258 RtpPacket::Queue _inputQueue;
259 uint32_t _clockRateHz;
260 StreamAnchor _anchor;