2021-05-31 05:42:20 +00:00
|
|
|
//
|
2022-06-20 11:22:25 +00:00
|
|
|
// Copyright (c) 2013-2022 The SRS Authors
|
2021-05-31 05:42:20 +00:00
|
|
|
//
|
2022-01-13 10:40:17 +00:00
|
|
|
// SPDX-License-Identifier: MIT or MulanPSL-2.0
|
2021-05-31 05:42:20 +00:00
|
|
|
//
|
2014-05-12 09:27:50 +00:00
|
|
|
|
2015-05-23 01:58:00 +00:00
|
|
|
#include <srs_protocol_kbps.hpp>
|
2014-05-12 09:27:50 +00:00
|
|
|
|
2014-05-12 10:06:13 +00:00
|
|
|
#include <srs_kernel_utility.hpp>
|
2014-07-13 02:33:18 +00:00
|
|
|
|
2018-12-23 12:47:17 +00:00
|
|
|
SrsKbpsSlice::SrsKbpsSlice(SrsWallClock* c)
|
2014-05-12 10:06:13 +00:00
|
|
|
{
|
2018-12-23 12:47:17 +00:00
|
|
|
clk = c;
|
2019-02-02 10:20:19 +00:00
|
|
|
io = NULL;
|
2014-06-19 07:28:05 +00:00
|
|
|
last_bytes = io_bytes_base = starttime = bytes = delta_bytes = 0;
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SrsKbpsSlice::~SrsKbpsSlice()
|
|
|
|
{
|
|
|
|
}
|
2014-05-12 09:27:50 +00:00
|
|
|
|
2014-05-14 05:56:12 +00:00
|
|
|
int64_t SrsKbpsSlice::get_total_bytes()
|
|
|
|
{
|
|
|
|
return bytes + last_bytes - io_bytes_base;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SrsKbpsSlice::sample()
|
|
|
|
{
|
2019-04-19 00:39:38 +00:00
|
|
|
srs_utime_t now = clk->now();
|
2014-05-14 05:56:12 +00:00
|
|
|
int64_t total_bytes = get_total_bytes();
|
|
|
|
|
2018-12-23 13:19:17 +00:00
|
|
|
if (sample_30s.time < 0) {
|
|
|
|
sample_30s.update(total_bytes, now, 0);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
2018-12-23 13:19:17 +00:00
|
|
|
if (sample_1m.time < 0) {
|
|
|
|
sample_1m.update(total_bytes, now, 0);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
2018-12-23 13:19:17 +00:00
|
|
|
if (sample_5m.time < 0) {
|
|
|
|
sample_5m.update(total_bytes, now, 0);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
2018-12-23 13:19:17 +00:00
|
|
|
if (sample_60m.time < 0) {
|
|
|
|
sample_60m.update(total_bytes, now, 0);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
|
|
|
|
2019-04-19 00:39:38 +00:00
|
|
|
if (now - sample_30s.time >= 30 * SRS_UTIME_SECONDS) {
|
2021-02-06 10:05:04 +00:00
|
|
|
int kbps = (int)((total_bytes - sample_30s.total) * 8 / srsu2ms(now - sample_30s.time));
|
2018-12-23 13:19:17 +00:00
|
|
|
sample_30s.update(total_bytes, now, kbps);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
2019-04-19 00:39:38 +00:00
|
|
|
if (now - sample_1m.time >= 60 * SRS_UTIME_SECONDS) {
|
2021-02-06 10:05:04 +00:00
|
|
|
int kbps = (int)((total_bytes - sample_1m.total) * 8 / srsu2ms(now - sample_1m.time));
|
2018-12-23 13:19:17 +00:00
|
|
|
sample_1m.update(total_bytes, now, kbps);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
2019-04-19 00:39:38 +00:00
|
|
|
if (now - sample_5m.time >= 300 * SRS_UTIME_SECONDS) {
|
2021-02-06 10:05:04 +00:00
|
|
|
int kbps = (int)((total_bytes - sample_5m.total) * 8 / srsu2ms(now - sample_5m.time));
|
2018-12-23 13:19:17 +00:00
|
|
|
sample_5m.update(total_bytes, now, kbps);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
2019-04-19 00:39:38 +00:00
|
|
|
if (now - sample_60m.time >= 3600 * SRS_UTIME_SECONDS) {
|
2021-02-06 10:05:04 +00:00
|
|
|
int kbps = (int)((total_bytes - sample_60m.total) * 8 / srsu2ms(now - sample_60m.time));
|
2018-12-23 13:19:17 +00:00
|
|
|
sample_60m.update(total_bytes, now, kbps);
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-01 09:36:27 +00:00
|
|
|
ISrsKbpsDelta::ISrsKbpsDelta()
|
2014-06-19 07:28:05 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-01-01 09:36:27 +00:00
|
|
|
ISrsKbpsDelta::~ISrsKbpsDelta()
|
2014-06-19 07:28:05 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2018-12-23 12:47:17 +00:00
|
|
|
SrsKbps::SrsKbps(SrsWallClock* c) : is(c), os(c)
|
2018-12-23 12:30:12 +00:00
|
|
|
{
|
2018-12-23 12:47:17 +00:00
|
|
|
clk = c;
|
2018-12-23 12:30:12 +00:00
|
|
|
}
|
|
|
|
|
2014-05-12 09:27:50 +00:00
|
|
|
SrsKbps::~SrsKbps()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-06-19 03:22:24 +00:00
|
|
|
void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out)
|
2014-05-12 09:27:50 +00:00
|
|
|
{
|
2014-05-12 10:06:13 +00:00
|
|
|
// set input stream
|
|
|
|
// now, set start time.
|
|
|
|
if (is.starttime == 0) {
|
2019-04-19 00:39:38 +00:00
|
|
|
is.starttime = clk->now();
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
// save the old in bytes.
|
2019-02-02 10:20:19 +00:00
|
|
|
if (is.io) {
|
|
|
|
is.bytes += is.io->get_recv_bytes() - is.io_bytes_base;
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
// use new io.
|
2019-02-02 10:20:19 +00:00
|
|
|
is.io = in;
|
2014-05-12 10:06:13 +00:00
|
|
|
is.last_bytes = is.io_bytes_base = 0;
|
|
|
|
if (in) {
|
|
|
|
is.last_bytes = is.io_bytes_base = in->get_recv_bytes();
|
|
|
|
}
|
2014-05-14 05:56:12 +00:00
|
|
|
// resample
|
|
|
|
is.sample();
|
2014-05-12 10:06:13 +00:00
|
|
|
|
|
|
|
// set output stream
|
|
|
|
// now, set start time.
|
|
|
|
if (os.starttime == 0) {
|
2019-04-19 00:39:38 +00:00
|
|
|
os.starttime = clk->now();
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
// save the old in bytes.
|
2019-02-02 10:20:19 +00:00
|
|
|
if (os.io) {
|
|
|
|
os.bytes += os.io->get_send_bytes() - os.io_bytes_base;
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
// use new io.
|
2019-02-02 10:20:19 +00:00
|
|
|
os.io = out;
|
2014-05-12 10:06:13 +00:00
|
|
|
os.last_bytes = os.io_bytes_base = 0;
|
|
|
|
if (out) {
|
|
|
|
os.last_bytes = os.io_bytes_base = out->get_send_bytes();
|
|
|
|
}
|
2014-05-14 05:56:12 +00:00
|
|
|
// resample
|
|
|
|
os.sample();
|
2014-05-12 09:27:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int SrsKbps::get_send_kbps()
|
|
|
|
{
|
2020-09-27 08:21:15 +00:00
|
|
|
int duration = srsu2ms(clk->now() - is.starttime);
|
2014-05-12 10:06:13 +00:00
|
|
|
if (duration <= 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
2020-09-27 08:21:15 +00:00
|
|
|
|
2014-05-14 05:56:12 +00:00
|
|
|
int64_t bytes = get_send_bytes();
|
2020-09-27 08:21:15 +00:00
|
|
|
return (int)(bytes * 8 / duration);
|
2014-05-12 09:27:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int SrsKbps::get_recv_kbps()
|
|
|
|
{
|
2020-09-27 08:21:15 +00:00
|
|
|
int duration = srsu2ms(clk->now() - os.starttime);
|
2014-05-12 10:06:13 +00:00
|
|
|
if (duration <= 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
2020-09-27 08:21:15 +00:00
|
|
|
|
2014-05-14 05:56:12 +00:00
|
|
|
int64_t bytes = get_recv_bytes();
|
2020-09-27 08:21:15 +00:00
|
|
|
return (int)(bytes * 8 / duration);
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
|
2014-06-19 07:28:05 +00:00
|
|
|
int SrsKbps::get_send_kbps_30s()
|
2014-05-14 05:56:12 +00:00
|
|
|
{
|
2021-02-06 10:05:04 +00:00
|
|
|
return os.sample_30s.rate;
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
|
|
|
|
2014-06-19 07:28:05 +00:00
|
|
|
int SrsKbps::get_recv_kbps_30s()
|
2014-05-14 05:56:12 +00:00
|
|
|
{
|
2021-02-06 10:05:04 +00:00
|
|
|
return is.sample_30s.rate;
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
|
|
|
|
2014-06-19 07:28:05 +00:00
|
|
|
int SrsKbps::get_send_kbps_5m()
|
2014-05-14 05:56:12 +00:00
|
|
|
{
|
2021-02-06 10:05:04 +00:00
|
|
|
return os.sample_5m.rate;
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
|
|
|
|
2014-06-19 07:28:05 +00:00
|
|
|
int SrsKbps::get_recv_kbps_5m()
|
2014-05-14 05:56:12 +00:00
|
|
|
{
|
2021-02-06 10:05:04 +00:00
|
|
|
return is.sample_5m.rate;
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
|
|
|
|
2019-01-01 09:36:27 +00:00
|
|
|
void SrsKbps::add_delta(int64_t in, int64_t out)
|
2019-01-01 06:04:50 +00:00
|
|
|
{
|
|
|
|
// update the total bytes
|
2019-01-01 09:36:27 +00:00
|
|
|
is.last_bytes += in;
|
|
|
|
os.last_bytes += out;
|
2019-01-01 06:04:50 +00:00
|
|
|
|
|
|
|
// we donot sample, please use sample() to do resample.
|
|
|
|
}
|
|
|
|
|
|
|
|
void SrsKbps::sample()
|
|
|
|
{
|
|
|
|
// update the total bytes
|
2019-02-02 10:20:19 +00:00
|
|
|
if (os.io) {
|
|
|
|
os.last_bytes = os.io->get_send_bytes();
|
2019-01-01 06:04:50 +00:00
|
|
|
}
|
|
|
|
|
2019-02-02 10:20:19 +00:00
|
|
|
if (is.io) {
|
|
|
|
is.last_bytes = is.io->get_recv_bytes();
|
2019-01-01 06:04:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// resample
|
|
|
|
is.sample();
|
|
|
|
os.sample();
|
|
|
|
}
|
|
|
|
|
2014-05-12 10:06:13 +00:00
|
|
|
int64_t SrsKbps::get_send_bytes()
|
|
|
|
{
|
2017-01-11 03:22:16 +00:00
|
|
|
// we must calc the send bytes dynamically,
|
|
|
|
// to not depends on the sample(which used to calc the kbps).
|
|
|
|
// @read https://github.com/ossrs/srs/issues/588
|
|
|
|
|
|
|
|
// session start bytes.
|
|
|
|
int64_t bytes = os.bytes;
|
|
|
|
|
2017-01-11 03:37:26 +00:00
|
|
|
// When exists active session, use it to get the last bytes.
|
2019-02-02 10:20:19 +00:00
|
|
|
if (os.io) {
|
|
|
|
bytes += os.io->get_send_bytes() - os.io_bytes_base;
|
2017-01-11 03:37:26 +00:00
|
|
|
return bytes;
|
2017-01-11 03:22:16 +00:00
|
|
|
}
|
|
|
|
|
2017-01-11 03:37:26 +00:00
|
|
|
// When no active session, the last_bytes record the last valid bytes.
|
|
|
|
// TODO: Maybe the bellow bytes is zero, because the ios.io.out is NULL.
|
|
|
|
bytes += os.last_bytes - os.io_bytes_base;
|
2017-03-25 09:21:39 +00:00
|
|
|
|
2017-01-11 03:22:16 +00:00
|
|
|
return bytes;
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int64_t SrsKbps::get_recv_bytes()
|
|
|
|
{
|
2017-01-11 03:22:16 +00:00
|
|
|
// we must calc the send bytes dynamically,
|
|
|
|
// to not depends on the sample(which used to calc the kbps).
|
|
|
|
// @read https://github.com/ossrs/srs/issues/588
|
|
|
|
|
|
|
|
// session start bytes.
|
|
|
|
int64_t bytes = is.bytes;
|
|
|
|
|
2017-01-11 03:37:26 +00:00
|
|
|
// When exists active session, use it to get the last bytes.
|
2019-02-02 10:20:19 +00:00
|
|
|
if (is.io) {
|
|
|
|
bytes += is.io->get_recv_bytes() - is.io_bytes_base;
|
2017-01-11 03:37:26 +00:00
|
|
|
return bytes;
|
2017-01-11 03:22:16 +00:00
|
|
|
}
|
|
|
|
|
2017-01-11 03:37:26 +00:00
|
|
|
// When no active session, the last_bytes record the last valid bytes.
|
|
|
|
// TODO: Maybe the bellow bytes is zero, because the ios.io.out is NULL.
|
|
|
|
bytes += is.last_bytes - is.io_bytes_base;
|
2017-03-25 09:21:39 +00:00
|
|
|
|
2017-01-11 03:22:16 +00:00
|
|
|
return bytes;
|
2014-05-14 05:56:12 +00:00
|
|
|
}
|
|
|
|
|
2019-01-01 09:36:27 +00:00
|
|
|
void SrsKbps::remark(int64_t* in, int64_t* out)
|
2015-03-08 11:59:10 +00:00
|
|
|
{
|
|
|
|
sample();
|
2019-01-01 09:36:27 +00:00
|
|
|
|
|
|
|
int64_t inv = is.get_total_bytes() - is.delta_bytes;
|
2015-03-08 11:59:10 +00:00
|
|
|
is.delta_bytes = is.get_total_bytes();
|
2019-01-01 09:36:27 +00:00
|
|
|
if (in) {
|
|
|
|
*in = inv;
|
|
|
|
}
|
|
|
|
|
|
|
|
int64_t outv = os.get_total_bytes() - os.delta_bytes;
|
|
|
|
os.delta_bytes = os.get_total_bytes();
|
|
|
|
if (out) {
|
|
|
|
*out = outv;
|
|
|
|
}
|
2015-03-08 11:59:10 +00:00
|
|
|
}
|
|
|
|
|
2017-01-11 03:37:26 +00:00
|
|
|
int SrsKbps::size_memory()
|
|
|
|
{
|
|
|
|
return sizeof(SrsKbps);
|
|
|
|
}
|
|
|
|
|