1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-15 04:42:04 +00:00
srs/trunk/src/protocol/srs_protocol_kbps.cpp

298 lines
7.1 KiB
C++
Raw Normal View History

2017-03-25 09:21:39 +00:00
/**
* The MIT License (MIT)
*
2019-12-30 02:10:35 +00:00
* Copyright (c) 2013-2020 Winlin
2017-03-25 09:21:39 +00:00
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
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>
SrsKbpsSample::SrsKbpsSample()
{
2018-12-23 13:19:17 +00:00
bytes = time = -1;
kbps = 0;
}
2018-12-23 13:19:17 +00:00
SrsKbpsSample::~SrsKbpsSample()
{
}
SrsKbpsSample* SrsKbpsSample::update(int64_t b, srs_utime_t t, int k)
2018-12-23 13:19:17 +00:00
{
bytes = b;
time = t;
kbps = k;
return this;
}
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;
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
int64_t SrsKbpsSlice::get_total_bytes()
{
return bytes + last_bytes - io_bytes_base;
}
void SrsKbpsSlice::sample()
{
srs_utime_t now = clk->now();
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);
}
2018-12-23 13:19:17 +00:00
if (sample_1m.time < 0) {
sample_1m.update(total_bytes, now, 0);
}
2018-12-23 13:19:17 +00:00
if (sample_5m.time < 0) {
sample_5m.update(total_bytes, now, 0);
}
2018-12-23 13:19:17 +00:00
if (sample_60m.time < 0) {
sample_60m.update(total_bytes, now, 0);
}
if (now - sample_30s.time >= 30 * SRS_UTIME_SECONDS) {
int kbps = (int)((total_bytes - sample_30s.bytes) * 8 / srsu2ms(now - sample_30s.time));
2018-12-23 13:19:17 +00:00
sample_30s.update(total_bytes, now, kbps);
}
if (now - sample_1m.time >= 60 * SRS_UTIME_SECONDS) {
int kbps = (int)((total_bytes - sample_1m.bytes) * 8 / srsu2ms(now - sample_1m.time));
2018-12-23 13:19:17 +00:00
sample_1m.update(total_bytes, now, kbps);
}
if (now - sample_5m.time >= 300 * SRS_UTIME_SECONDS) {
int kbps = (int)((total_bytes - sample_5m.bytes) * 8 / srsu2ms(now - sample_5m.time));
2018-12-23 13:19:17 +00:00
sample_5m.update(total_bytes, now, kbps);
}
if (now - sample_60m.time >= 3600 * SRS_UTIME_SECONDS) {
int kbps = (int)((total_bytes - sample_60m.bytes) * 8 / srsu2ms(now - sample_60m.time));
2018-12-23 13:19:17 +00:00
sample_60m.update(total_bytes, now, kbps);
}
}
2019-01-01 09:36:27 +00:00
ISrsKbpsDelta::ISrsKbpsDelta()
{
}
2019-01-01 09:36:27 +00:00
ISrsKbpsDelta::~ISrsKbpsDelta()
{
}
2018-12-23 12:30:12 +00:00
SrsWallClock::SrsWallClock()
2014-05-12 09:27:50 +00:00
{
}
2018-12-23 12:30:12 +00:00
SrsWallClock::~SrsWallClock()
{
}
srs_utime_t SrsWallClock::now()
2018-12-23 12:30:12 +00:00
{
return srs_get_system_time();
2018-12-23 12:30:12 +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()
{
}
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) {
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();
}
// resample
is.sample();
2014-05-12 10:06:13 +00:00
// set output stream
// now, set start time.
if (os.starttime == 0) {
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();
}
// resample
os.sample();
2014-05-12 09:27:50 +00:00
}
int SrsKbps::get_send_kbps()
{
srs_utime_t duration = clk->now() - is.starttime;
2014-05-12 10:06:13 +00:00
if (duration <= 0) {
return 0;
}
int64_t bytes = get_send_bytes();
return (int)(bytes * 8 / srsu2ms(duration));
2014-05-12 09:27:50 +00:00
}
int SrsKbps::get_recv_kbps()
{
srs_utime_t duration = clk->now() - os.starttime;
2014-05-12 10:06:13 +00:00
if (duration <= 0) {
return 0;
}
int64_t bytes = get_recv_bytes();
return (int)(bytes * 8 / srsu2ms(duration));
2014-05-12 10:06:13 +00:00
}
int SrsKbps::get_send_kbps_30s()
{
return os.sample_30s.kbps;
}
int SrsKbps::get_recv_kbps_30s()
{
return is.sample_30s.kbps;
}
int SrsKbps::get_send_kbps_5m()
{
return os.sample_5m.kbps;
}
int SrsKbps::get_recv_kbps_5m()
{
return is.sample_5m.kbps;
}
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()
{
// 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;
// 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;
return bytes;
}
// 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
return bytes;
2014-05-12 10:06:13 +00:00
}
int64_t SrsKbps::get_recv_bytes()
{
// 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;
// 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;
return bytes;
}
// 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
return bytes;
}
2019-01-01 09:36:27 +00:00
void SrsKbps::remark(int64_t* in, int64_t* out)
{
sample();
2019-01-01 09:36:27 +00:00
int64_t inv = is.get_total_bytes() - is.delta_bytes;
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;
}
}
int SrsKbps::size_memory()
{
return sizeof(SrsKbps);
}