11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
31PROMEKI_NAMESPACE_BEGIN
35class RtpSeqReorderBuffer;
90class RtpSession :
public ObjectBase {
91 PROMEKI_OBJECT(RtpSession, ObjectBase)
97 RtpSession(ObjectBase *parent =
nullptr);
100 ~RtpSession()
override;
113 Error start(
const SocketAddress &localAddr);
126 Error start(PacketTransport *transport);
132 bool isRunning()
const {
return _running; }
144 void setRemote(
const SocketAddress &dest) { _remote = dest; }
147 const SocketAddress &remote()
const {
return _remote; }
158 Error sendPacket(
const Buffer &payload, uint32_t timestamp, uint8_t payloadType,
bool marker =
false);
196 Error sendPackets(RtpPacketBatch &batch);
220 struct StreamReceiver {
225 RtpPacket::Queue *outQueue =
nullptr;
229 RtpSeqTracker *seqTracker =
nullptr;
234 RtpSeqReorderBuffer *reorderBuffer =
nullptr;
246 uint32_t clockRateHz = 0;
258 uint8_t payloadType = 0;
307 Error startReceiving(List<StreamReceiver> receivers,
308 const String &threadName =
"rtp-rx");
318 void stopReceiving();
321 bool isReceiving()
const {
return _receiving.value(); }
333 void setReceivePollIntervalMs(
unsigned int timeoutMs) {
334 _receivePollMs = timeoutMs == 0 ? 200 : timeoutMs;
338 unsigned int receivePollIntervalMs()
const {
return _receivePollMs; }
353 Error setPacingRate(uint64_t bytesPerSec);
356 uint32_t ssrc()
const {
return _ssrc; }
359 void setSsrc(uint32_t ssrc) { _ssrc = ssrc; }
362 uint16_t sequenceNumber()
const {
return _sequenceNumber; }
365 void setPayloadType(uint8_t pt) { _payloadType = pt; }
368 uint8_t payloadType()
const {
return _payloadType; }
371 void setClockRate(uint32_t hz) { _clockRate = hz; }
374 uint32_t clockRate()
const {
return _clockRate; }
413 void setRtpAnchor(NtpTime captureNtp, uint32_t rtpTs);
423 NtpTime anchorNtp()
const;
429 uint32_t anchorRtpTs()
const;
462 void noteRtpEmission(uint32_t rtpTs);
473 bool hasEmissionRecord()
const;
476 const String &cname()
const {
return _cname; }
479 void setCname(
const String &cname) { _cname = cname; }
502 Error emitRtcpSr(uint32_t senderPacketCount, uint32_t senderOctetCount);
522 Error emitRtcpRr(
const RtcpPacket::ReportBlock &block);
568 ReceivedSr receivedSr()
const;
579 uint32_t srObservedCount()
const;
590 TimeStamp firstSrAt()
const;
607 NtpTime currentSrNtp()
const;
620 PacketTransport *transport()
const {
return _transport; }
630 PROMEKI_SIGNAL(packetReceived, Buffer, uint32_t, uint8_t,
bool);
633 PROMEKI_SIGNAL(ssrcCollision, uint32_t);
649 PROMEKI_SIGNAL(ssrcChange, uint32_t, uint32_t, uint8_t);
662 PROMEKI_SIGNAL(byeReceived, uint32_t);
666 friend class ReceiveThread;
686 void handleRtcp(
const uint8_t *data,
size_t size);
688 void fillHeader(RtpPacket &pkt, uint8_t pt,
bool marker, uint32_t timestamp);
700 void fillTransportHeader(RtpPacket &pkt);
703 PacketTransport *_transport =
nullptr;
704 PacketTransport::UPtr _ownedTransport;
705 bool _running =
false;
706 SocketAddress _remote;
708 uint16_t _sequenceNumber = 0;
709 uint8_t _payloadType = 96;
710 uint32_t _clockRate = 90000;
726 mutable Mutex _rtcpMutex;
728 uint32_t _anchorRtpTs = 0;
729 uint32_t _lastEmissionRtpTs = 0;
730 bool _hasEmission =
false;
736 uint32_t _srObservedCount = 0;
743 TimeStamp _firstSrAt;
753 ReceivedSr _lastReceivedSr;
760 using ReceiveThreadUPtr = UniquePtr<ReceiveThread>;
761 ReceiveThreadUPtr _receiveThread;
762 List<StreamReceiver> _streamReceivers;
763 Atomic<bool> _receiving;
764 unsigned int _receivePollMs = 200;
770 struct SsrcPinState {
771 uint32_t expectedSsrc = 0;
773 uint32_t mismatchCount = 0;
774 TimeStamp mismatchFirstTime;
776 List<SsrcPinState> _ssrcPinStates;