#ifndef MS_RTC_RATE_CALCULATOR_HPP
#define MS_RTC_RATE_CALCULATOR_HPP
#include "common.hpp"
#include "RTC/RTP/Packet.hpp"
#include "SharedInterface.hpp"
#include <vector>
namespace RTC
{
class RateCalculator
{
public:
static constexpr size_t DefaultWindowSize{ 1000u };
static constexpr float DefaultBpsScale{ 8000.0f };
static constexpr uint16_t DefaultWindowItems{ 100u };
public:
explicit RateCalculator(
size_t windowSizeMs = DefaultWindowSize,
float scale = DefaultBpsScale,
uint16_t windowItems = DefaultWindowItems);
void Update(size_t size, uint64_t nowMs);
uint32_t GetRate(uint64_t nowMs);
size_t GetBytes() const
{
return this->bytes;
}
void Reset();
private:
void RemoveOldData(uint64_t nowMs);
private:
struct BufferItem
{
size_t count{ 0u };
uint64_t time{ 0u };
};
private:
size_t windowSizeMs{ DefaultWindowSize };
float scale{ DefaultBpsScale };
uint16_t windowItems{ DefaultWindowItems };
size_t itemSizeMs{ 0u };
std::vector<BufferItem> buffer;
std::optional<uint64_t> newestItemStartTime{ std::nullopt };
int32_t newestItemIndex{ -1 };
std::optional<uint64_t> oldestItemStartTime{ std::nullopt };
int32_t oldestItemIndex{ -1 };
size_t totalCount{ 0u };
size_t bytes{ 0u };
uint32_t lastRate{ 0u };
std::optional<uint64_t> lastTime{ std::nullopt };
};
class RtpDataCounter
{
public:
explicit RtpDataCounter(
SharedInterface* shared, bool ignorePaddingOnlyPackets, size_t windowSizeMs = 2500)
: shared(shared), ignorePaddingOnlyPackets(ignorePaddingOnlyPackets), rate(windowSizeMs)
{
}
public:
void Update(const RTC::RTP::Packet* packet);
uint32_t GetBitrate(uint64_t nowMs)
{
return this->rate.GetRate(nowMs);
}
size_t GetPacketCount() const
{
return this->packets;
}
size_t GetBytes() const
{
return this->rate.GetBytes();
}
private:
SharedInterface* shared{ nullptr };
bool ignorePaddingOnlyPackets{ false };
RateCalculator rate;
size_t packets{ 0u };
};
}
#endif