2014-05-12 09:27:50 +00:00
|
|
|
/*
|
|
|
|
The MIT License (MIT)
|
|
|
|
|
|
|
|
Copyright (c) 2013-2014 winlin
|
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <srs_app_kbps.hpp>
|
|
|
|
|
|
|
|
#include <srs_kernel_error.hpp>
|
|
|
|
#include <srs_kernel_log.hpp>
|
|
|
|
#include <srs_protocol_io.hpp>
|
2014-05-12 10:06:13 +00:00
|
|
|
#include <srs_kernel_utility.hpp>
|
|
|
|
|
2014-05-14 05:56:12 +00:00
|
|
|
SrsKbpsSample::SrsKbpsSample()
|
|
|
|
{
|
|
|
|
bytes = time = 0;
|
|
|
|
kbps = 0;
|
|
|
|
}
|
|
|
|
|
2014-05-12 10:06:13 +00:00
|
|
|
SrsKbpsSlice::SrsKbpsSlice()
|
|
|
|
{
|
|
|
|
io.in = NULL;
|
|
|
|
io.out = NULL;
|
|
|
|
last_bytes = io_bytes_base = starttime = bytes = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
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()
|
|
|
|
{
|
|
|
|
int64_t now = srs_get_system_time_ms();
|
|
|
|
int64_t total_bytes = get_total_bytes();
|
|
|
|
|
|
|
|
if (sample_30s.time <= 0) {
|
|
|
|
sample_30s.kbps = 0;
|
|
|
|
sample_30s.time = now;
|
|
|
|
sample_30s.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
if (sample_1m.time <= 0) {
|
|
|
|
sample_1m.kbps = 0;
|
|
|
|
sample_1m.time = now;
|
|
|
|
sample_1m.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
if (sample_5m.time <= 0) {
|
|
|
|
sample_5m.kbps = 0;
|
|
|
|
sample_5m.time = now;
|
|
|
|
sample_5m.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
if (sample_60m.time <= 0) {
|
|
|
|
sample_60m.kbps = 0;
|
|
|
|
sample_60m.time = now;
|
|
|
|
sample_60m.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (now - sample_30s.time > 30 * 1000) {
|
|
|
|
sample_30s.kbps = (total_bytes - sample_30s.bytes) * 8 / (now - sample_30s.time);
|
|
|
|
sample_30s.time = now;
|
|
|
|
sample_30s.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
if (now - sample_1m.time > 60 * 1000) {
|
|
|
|
sample_1m.kbps = (total_bytes - sample_1m.bytes) * 8 / (now - sample_1m.time);
|
|
|
|
sample_1m.time = now;
|
|
|
|
sample_1m.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
if (now - sample_5m.time > 300 * 1000) {
|
|
|
|
sample_5m.kbps = (total_bytes - sample_5m.bytes) * 8 / (now - sample_5m.time);
|
|
|
|
sample_5m.time = now;
|
|
|
|
sample_5m.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
if (now - sample_60m.time > 3600 * 1000) {
|
|
|
|
sample_60m.kbps = (total_bytes - sample_60m.bytes) * 8 / (now - sample_60m.time);
|
|
|
|
sample_60m.time = now;
|
|
|
|
sample_60m.bytes = total_bytes;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-12 09:27:50 +00:00
|
|
|
SrsKbps::SrsKbps()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
|
|
|
is.starttime = srs_get_system_time_ms();
|
|
|
|
}
|
|
|
|
// save the old in bytes.
|
|
|
|
if (is.io.in) {
|
|
|
|
is.bytes += is.last_bytes - is.io_bytes_base;
|
|
|
|
}
|
|
|
|
// use new io.
|
|
|
|
is.io.in = in;
|
|
|
|
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) {
|
|
|
|
os.starttime = srs_get_system_time_ms();
|
|
|
|
}
|
|
|
|
// save the old in bytes.
|
|
|
|
if (os.io.out) {
|
|
|
|
os.bytes += os.last_bytes - os.io_bytes_base;
|
|
|
|
}
|
|
|
|
// use new io.
|
|
|
|
os.io.out = out;
|
|
|
|
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()
|
|
|
|
{
|
2014-05-12 10:06:13 +00:00
|
|
|
int64_t duration = srs_get_system_time_ms() - is.starttime;
|
|
|
|
if (duration <= 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
2014-05-14 05:56:12 +00:00
|
|
|
int64_t bytes = get_send_bytes();
|
2014-05-12 10:06:13 +00:00
|
|
|
return bytes * 8 / duration;
|
2014-05-12 09:27:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int SrsKbps::get_recv_kbps()
|
|
|
|
{
|
2014-05-12 10:06:13 +00:00
|
|
|
int64_t duration = srs_get_system_time_ms() - os.starttime;
|
|
|
|
if (duration <= 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
2014-05-14 05:56:12 +00:00
|
|
|
int64_t bytes = get_recv_bytes();
|
2014-05-12 10:06:13 +00:00
|
|
|
return bytes * 8 / duration;
|
|
|
|
}
|
|
|
|
|
2014-05-14 05:56:12 +00:00
|
|
|
int SrsKbps::get_send_kbps_sample_high()
|
|
|
|
{
|
|
|
|
return os.sample_30s.kbps;
|
|
|
|
}
|
|
|
|
|
|
|
|
int SrsKbps::get_recv_kbps_sample_high()
|
|
|
|
{
|
|
|
|
return is.sample_30s.kbps;
|
|
|
|
}
|
|
|
|
|
|
|
|
int SrsKbps::get_send_kbps_sample_medium()
|
|
|
|
{
|
|
|
|
return os.sample_5m.kbps;
|
|
|
|
}
|
|
|
|
|
|
|
|
int SrsKbps::get_recv_kbps_sample_medium()
|
|
|
|
{
|
|
|
|
return is.sample_5m.kbps;
|
|
|
|
}
|
|
|
|
|
2014-05-12 10:06:13 +00:00
|
|
|
int64_t SrsKbps::get_send_bytes()
|
|
|
|
{
|
2014-05-14 05:56:12 +00:00
|
|
|
return os.get_total_bytes();
|
2014-05-12 10:06:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int64_t SrsKbps::get_recv_bytes()
|
|
|
|
{
|
2014-05-14 05:56:12 +00:00
|
|
|
return is.get_total_bytes();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SrsKbps::sample()
|
|
|
|
{
|
|
|
|
if (os.io.out) {
|
|
|
|
os.last_bytes = os.io.out->get_send_bytes();
|
|
|
|
}
|
|
|
|
|
|
|
|
// resample
|
|
|
|
os.sample();
|
|
|
|
|
2014-05-12 10:06:13 +00:00
|
|
|
if (is.io.in) {
|
|
|
|
is.last_bytes = is.io.in->get_recv_bytes();
|
|
|
|
}
|
2014-05-14 05:56:12 +00:00
|
|
|
|
|
|
|
// resample
|
|
|
|
is.sample();
|
2014-05-12 09:27:50 +00:00
|
|
|
}
|
|
|
|
|