ZLMediaKit/srt/Statistic.cpp

98 lines
2.2 KiB
C++
Raw Normal View History

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