#ifndef MS_RTC_RTP_RTP_STREAM_RECV_HPP
#define MS_RTC_RTP_RTP_STREAM_RECV_HPP
#include "handles/TimerHandleInterface.hpp"
#include "RTC/NackGenerator.hpp"
#include "RTC/RTCP/XrDelaySinceLastRr.hpp"
#include "RTC/RTP/RtpStream.hpp"
#include "RTC/RateCalculator.hpp"
#include <vector>
namespace RTC
{
namespace RTP
{
class RtpStreamRecv : public RTP::RtpStream,
public RTC::NackGenerator::Listener,
public TimerHandleInterface::Listener
{
public:
class Listener : public RTP::RtpStream::Listener
{
public:
virtual void OnRtpStreamSendRtcpPacket(
RTP::RtpStreamRecv* rtpStream, RTC::RTCP::Packet* packet) = 0;
virtual void OnRtpStreamNeedWorstRemoteFractionLost(
RTP::RtpStreamRecv* rtpStream, uint8_t& worstRemoteFractionLost) = 0;
};
public:
class TransmissionCounter
{
public:
TransmissionCounter(
SharedInterface* shared, uint8_t spatialLayers, uint8_t temporalLayers, size_t windowSize);
void Update(const RTP::Packet* packet);
uint32_t GetBitrate(uint64_t nowMs);
uint32_t GetBitrate(uint64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer);
uint32_t GetSpatialLayerBitrate(uint64_t nowMs, uint8_t spatialLayer);
uint32_t GetLayerBitrate(uint64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer);
size_t GetPacketCount() const;
size_t GetBytes() const;
private:
std::vector<std::vector<RTC::RtpDataCounter>> spatialLayerCounters;
};
public:
RtpStreamRecv(
RTP::RtpStreamRecv::Listener* listener,
SharedInterface* shared,
RTP::RtpStream::Params& params,
unsigned int sendNackDelayMs,
bool useRtpInactivityCheck);
~RtpStreamRecv() override;
flatbuffers::Offset<FBS::RtpStream::Stats> FillBufferStats(
flatbuffers::FlatBufferBuilder& builder) override;
bool ReceivePacket(RTP::Packet* packet);
bool ReceiveRtxPacket(RTP::Packet* packet);
RTC::RTCP::ReceiverReport* GetRtcpReceiverReport();
RTC::RTCP::ReceiverReport* GetRtxRtcpReceiverReport();
void ReceiveRtcpSenderReport(RTC::RTCP::SenderReport* report);
void ReceiveRtxRtcpSenderReport(RTC::RTCP::SenderReport* report);
void ReceiveRtcpXrDelaySinceLastRr(RTC::RTCP::DelaySinceLastRr::SsrcInfo* ssrcInfo);
void RequestKeyFrame();
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
{
return this->transmissionCounter.GetBitrate(nowMs, spatialLayer, temporalLayer);
}
uint32_t GetSpatialLayerBitrate(uint64_t nowMs, uint8_t spatialLayer) override
{
return this->transmissionCounter.GetSpatialLayerBitrate(nowMs, spatialLayer);
}
uint32_t GetLayerBitrate(uint64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer) override
{
return this->transmissionCounter.GetLayerBitrate(nowMs, spatialLayer, temporalLayer);
}
bool HasRtpInactivityCheckEnabled() const
{
return this->useRtpInactivityCheck;
}
private:
void CalculateJitter(uint32_t rtpTimestamp);
void UpdateScore();
public:
void UserOnSequenceNumberReset() override;
protected:
void OnTimer(TimerHandleInterface* timer) override;
protected:
void OnNackGeneratorNackRequired(const std::vector<uint16_t>& seqNumbers) override;
void OnNackGeneratorKeyFrameRequired() override;
private:
unsigned int sendNackDelayMs{ 0u };
bool useRtpInactivityCheck{ false };
uint32_t expectedPrior{ 0u };
uint32_t expectedPriorScore{ 0u };
uint32_t receivedPrior{ 0u };
uint32_t receivedPriorScore{ 0u };
uint32_t lastSrTimestamp{ 0u };
uint64_t lastSrReceived{ 0u };
int32_t transit{ 0u };
uint8_t firSeqNumber{ 0u };
int32_t reportedPacketsLost{ 0 };
std::unique_ptr<RTC::NackGenerator> nackGenerator;
TimerHandleInterface* inactivityCheckPeriodicTimer{ nullptr };
bool inactive{ false };
TransmissionCounter transmissionCounter;
RTC::RtpDataCounter mediaTransmissionCounter;
std::unique_ptr<RTP::Codecs::DependencyDescriptor::TemplateDependencyStructure>
templateDependencyStructure;
};
} }
#endif