// // Created by Grishka on 25/02/2019. // #ifndef LIBTGVOIP_SCREAMCONGESTIONCONTROLLER_H #define LIBTGVOIP_SCREAMCONGESTIONCONTROLLER_H #include "../Buffers.h" #include #include namespace tgvoip{ namespace video{ class ScreamCongestionController{ public: ScreamCongestionController(); void AdjustBitrate(); void ProcessAcks(float oneWayDelay, uint32_t bytesNewlyAcked, uint32_t lossCount, double rtt); void ProcessPacketSent(uint32_t size); void ProcessPacketLost(uint32_t size); double GetPacingInterval(); void UpdateMediaRate(uint32_t frameSize); uint32_t GetBitrate(); private: void UpdateVariables(float qdelay); void UpdateCWnd(float qdelay); void AdjustQDelayTarget(float qdelay); void CalculateSendWindow(float qdelay); void UpdateBytesInFlightHistory(); struct ValueSample{ uint32_t sample; double time; }; float qdelayTarget; float qdelayFractionAvg=0.0f; HistoricBuffer qdelayFractionHist; float qdelayTrend=0.0f; float qdelayTrendMem=0.0f; HistoricBuffer qdelayNormHist; bool inFastIncrease=true; uint32_t cwnd; uint32_t bytesNewlyAcked=0; uint32_t maxBytesInFlight=0; uint32_t sendWnd=0; uint32_t targetBitrate=0; uint32_t targetBitrateLastMax=1; float rateTransmit=0.0f; float rateAck=0.0f; float rateMedia=0.0f; float rateMediaMedian=0.0f; float sRTT=0.0f; uint32_t rtpQueueSize=0; uint32_t rtpSize=1024; //0; float lossEventRate=0.0f; bool lossPending=false; float prevOneWayDelay=0.0f; double ignoreLossesUntil=0.0; uint32_t prevLossCount=0; double lastTimeQDelayTrendWasGreaterThanLo=0.0; double lastVariablesUpdateTime=0.0; double lastRateAdjustmentTime=0.0; double lastCWndUpdateTime=0.0; uint32_t bytesInFlight=0; std::vector bytesInFlightHistory; uint32_t bytesSent=0; uint32_t bytesAcked=0; uint32_t bytesMedia=0; double rateTransmitUpdateTime=0.0; double rateMediaUpdateTime=0.0; HistoricBuffer rateMediaHistory; }; } } #endif //LIBTGVOIP_SCREAMCONGESTIONCONTROLLER_H