2022-06-03 13:25:32 +08:00
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
|
|
#include "Statistic.hpp"
|
|
|
|
|
namespace SRT {
|
2022-06-03 20:18:34 +08:00
|
|
|
|
void PacketRecvRateContext::inputPacket(TimePoint& ts) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
if(_pkt_map.size()>100){
|
|
|
|
|
_pkt_map.erase(_pkt_map.begin());
|
|
|
|
|
}
|
2022-06-03 20:18:34 +08:00
|
|
|
|
auto tmp = DurationCountMicroseconds(ts - _start);
|
|
|
|
|
_pkt_map.emplace(tmp,tmp);
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
uint32_t PacketRecvRateContext::getPacketRecvRate() {
|
2022-06-03 20:18:34 +08:00
|
|
|
|
if (_pkt_map.size() < 2) {
|
|
|
|
|
return 50000;
|
|
|
|
|
}
|
|
|
|
|
int64_t dur = 1000;
|
|
|
|
|
for (auto it = _pkt_map.begin(); it != _pkt_map.end(); ++it) {
|
|
|
|
|
auto next = it;
|
|
|
|
|
++next;
|
|
|
|
|
if (next != _pkt_map.end()) {
|
|
|
|
|
if ((next->first - it->first) < dur) {
|
|
|
|
|
dur = next->first - it->first;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-03 20:18:34 +08:00
|
|
|
|
double rate = 1e6 / (double)dur;
|
|
|
|
|
if(rate <=1000){
|
|
|
|
|
return 50000;
|
|
|
|
|
}
|
|
|
|
|
return rate;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-03 20:18:34 +08:00
|
|
|
|
void EstimatedLinkCapacityContext::inputPacket(TimePoint& ts) {
|
|
|
|
|
if (_pkt_map.size() > 16) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
_pkt_map.erase(_pkt_map.begin());
|
|
|
|
|
}
|
2022-06-03 20:18:34 +08:00
|
|
|
|
auto tmp = DurationCountMicroseconds(ts - _start);
|
|
|
|
|
_pkt_map.emplace(tmp, tmp);
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
uint32_t EstimatedLinkCapacityContext::getEstimatedLinkCapacity() {
|
|
|
|
|
decltype(_pkt_map.begin()) next;
|
2022-06-03 20:18:34 +08:00
|
|
|
|
std::vector<int64_t> tmp;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
|
|
|
|
|
for(auto it = _pkt_map.begin();it != _pkt_map.end();++it){
|
|
|
|
|
next = it;
|
|
|
|
|
++next;
|
|
|
|
|
if(next != _pkt_map.end()){
|
|
|
|
|
tmp.push_back(next->first -it->first);
|
|
|
|
|
}else{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
std::sort(tmp.begin(),tmp.end());
|
|
|
|
|
if(tmp.empty()){
|
2022-06-03 17:49:43 +08:00
|
|
|
|
return 1000;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-03 17:49:43 +08:00
|
|
|
|
if(tmp.size()<16){
|
|
|
|
|
return 1000;
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-03 20:18:34 +08:00
|
|
|
|
double dur =tmp[0]/1e6;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
|
|
|
|
|
return (uint32_t)(1.0/dur);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-03 20:18:34 +08:00
|
|
|
|
void RecvRateContext::inputPacket(TimePoint& ts, size_t size ) {
|
2022-06-03 13:25:32 +08:00
|
|
|
|
if (_pkt_map.size() > 100) {
|
|
|
|
|
_pkt_map.erase(_pkt_map.begin());
|
|
|
|
|
}
|
2022-06-03 20:18:34 +08:00
|
|
|
|
auto tmp = DurationCountMicroseconds(ts - _start);
|
|
|
|
|
|
|
|
|
|
_pkt_map.emplace(tmp, tmp);
|
2022-06-03 13:25:32 +08:00
|
|
|
|
}
|
|
|
|
|
uint32_t RecvRateContext::getRecvRate() {
|
|
|
|
|
if(_pkt_map.size()<2){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto first = _pkt_map.begin();
|
|
|
|
|
auto last = _pkt_map.rbegin();
|
2022-06-03 20:18:34 +08:00
|
|
|
|
double dur = (last->first - first->first)/1000000.0;
|
2022-06-03 13:25:32 +08:00
|
|
|
|
|
|
|
|
|
size_t bytes = 0;
|
|
|
|
|
for(auto it : _pkt_map){
|
|
|
|
|
bytes += it.second;
|
|
|
|
|
}
|
|
|
|
|
double rate = (double)bytes/dur;
|
|
|
|
|
return (uint32_t)rate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace SRT
|