#ifndef MS_RTC_RTP_STREAM_SEND_HPP
#define MS_RTC_RTP_STREAM_SEND_HPP
#include "RTC/RateCalculator.hpp"
#include "RTC/RtpStream.hpp"
#include <deque>
namespace RTC
{
class RtpStreamSend : public RTC::RtpStream
{
public:
const static uint32_t MinRetransmissionDelay;
const static uint32_t MaxRetransmissionDelay;
public:
class Listener : public RTC::RtpStream::Listener
{
public:
virtual void OnRtpStreamRetransmitRtpPacket(
RTC::RtpStreamSend* rtpStream, RTC::RtpPacket* packet) = 0;
};
public:
struct StorageItem
{
void Reset();
std::shared_ptr<RTC::RtpPacket> packet{ nullptr };
uint32_t ssrc{ 0 };
uint16_t sequenceNumber{ 0 };
uint32_t timestamp{ 0 };
uint64_t resentAtMs{ 0u };
uint8_t sentTimes{ 0u };
};
private:
class StorageItemBuffer
{
public:
~StorageItemBuffer();
StorageItem* GetFirst() const;
StorageItem* Get(uint16_t seq) const;
size_t GetBufferSize() const;
void Insert(uint16_t seq, StorageItem* storageItem);
void RemoveFirst();
void Clear();
private:
uint16_t startSeq{ 0 };
std::deque<StorageItem*> buffer;
};
public:
RtpStreamSend(
RTC::RtpStreamSend::Listener* listener, RTC::RtpStream::Params& params, std::string& mid);
~RtpStreamSend() override;
void FillJsonStats(json& jsonObject) override;
void SetRtx(uint8_t payloadType, uint32_t ssrc) override;
bool ReceivePacket(std::shared_ptr<RTC::RtpPacket> packet);
void ReceiveNack(RTC::RTCP::FeedbackRtpNackPacket* nackPacket);
void ReceiveKeyFrameRequest(RTC::RTCP::FeedbackPs::MessageType messageType);
void ReceiveRtcpReceiverReport(RTC::RTCP::ReceiverReport* report);
void ReceiveRtcpXrReceiverReferenceTime(RTC::RTCP::ReceiverReferenceTime* report);
RTC::RTCP::SenderReport* GetRtcpSenderReport(uint64_t nowMs);
RTC::RTCP::DelaySinceLastRr::SsrcInfo* GetRtcpXrDelaySinceLastRr(uint64_t nowMs);
RTC::RTCP::SdesChunk* GetRtcpSdesChunk();
void Pause() override;
void Resume() override;
uint32_t GetBitrate(uint64_t nowMs) override
{
return this->transmissionCounter.GetBitrate(nowMs);
}
uint32_t GetBitrate(uint64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer) override;
uint32_t GetSpatialLayerBitrate(uint64_t nowMs, uint8_t spatialLayer) override;
uint32_t GetLayerBitrate(uint64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer) override;
private:
void StorePacket(std::shared_ptr<RTC::RtpPacket> packet);
void ClearOldPackets(const RtpPacket* packet);
void ClearBuffer();
void FillRetransmissionContainer(uint16_t seq, uint16_t bitmask);
void UpdateScore(RTC::RTCP::ReceiverReport* report);
private:
uint32_t lostPriorScore{ 0u }; uint32_t sentPriorScore{ 0u }; StorageItemBuffer storageItemBuffer;
std::string mid;
uint32_t retransmissionBufferSize;
uint16_t rtxSeq{ 0u };
RTC::RtpDataCounter transmissionCounter;
uint32_t lastRrTimestamp{ 0u }; uint64_t lastRrReceivedMs{ 0u }; };
}
#endif