From 4fe90d488512a3e5c07ca952b4b4b8379dafbd1e Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 29 Aug 2022 13:21:43 +0800 Subject: [PATCH] RTC: Stat the WebRTC clients bandwidth. v5.0.50 --- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_rtc_conn.cpp | 34 ++++++++++++++++++++++++++++ trunk/src/app/srs_app_rtc_conn.hpp | 10 +++++++- trunk/src/app/srs_app_rtc_server.cpp | 4 ++++ trunk/src/core/srs_core_version5.hpp | 2 +- 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index a4ef6608e..e06731a14 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,6 +7,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-08-29, RTC: Stat the WebRTC clients bandwidth. v5.0.50 * v5.0, 2022-08-29, HLS: Stat the HLS streaming clients bandwidth. v5.0.49 * v5.0, 2022-08-28, URL: Use SrsHttpUri to parse URL and query. v5.0.48 * v5.0, 2022-08-28, Fix [#2881](https://github.com/ossrs/srs/issues/2881): HTTP: Support merging api to server. v5.0.47 diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 2ec245eb8..88f93c11f 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -46,6 +46,7 @@ using namespace std; #include #include #include +#include SrsPps* _srs_pps_sstuns = NULL; SrsPps* _srs_pps_srtcps = NULL; @@ -1823,6 +1824,10 @@ SrsRtcConnection::SrsRtcConnection(SrsRtcServer* s, const SrsContextId& cid) nack_enabled_ = false; timer_nack_ = new SrsRtcConnectionNackTimer(this); + clock_ = new SrsWallClock(); + kbps_ = new SrsKbps(clock_); + kbps_->set_io(NULL, NULL); + _srs_rtc_manager->subscribe(this); } @@ -1867,6 +1872,9 @@ SrsRtcConnection::~SrsRtcConnection() srs_freep(req_); srs_freep(pp_address_change); srs_freep(pli_epp); + + srs_freep(kbps_); + srs_freep(clock_); } void SrsRtcConnection::on_before_dispose(ISrsResource* c) @@ -1942,6 +1950,11 @@ vector SrsRtcConnection::peer_addresses() return addresses; } +void SrsRtcConnection::remark(int64_t* in, int64_t* out) +{ + kbps_->remark(in, out); +} + const SrsContextId& SrsRtcConnection::get_id() { return cid_; @@ -2096,6 +2109,9 @@ srs_error_t SrsRtcConnection::on_stun(SrsUdpMuxSocket* skt, SrsStunPacket* r) { srs_error_t err = srs_success; + // Update stat when we received data. + kbps_->add_delta(skt->size(), 0); + if (!r->is_binding_request()) { return err; } @@ -2118,6 +2134,9 @@ srs_error_t SrsRtcConnection::on_stun(SrsUdpMuxSocket* skt, SrsStunPacket* r) srs_error_t SrsRtcConnection::on_dtls(char* data, int nb_data) { + // Update stat when we received data. + kbps_->add_delta(nb_data, 0); + return transport_->on_dtls(data, nb_data); } @@ -2125,6 +2144,9 @@ srs_error_t SrsRtcConnection::on_rtcp(char* data, int nb_data) { srs_error_t err = srs_success; + // Update stat when we received data. + kbps_->add_delta(nb_data, 0); + int nb_unprotected_buf = nb_data; if ((err = transport_->unprotect_rtcp(data, &nb_unprotected_buf)) != srs_success) { return srs_error_wrap(err, "rtcp unprotect"); @@ -2263,6 +2285,9 @@ srs_error_t SrsRtcConnection::on_rtp(char* data, int nb_data) { srs_error_t err = srs_success; + // Update stat when we received data. + kbps_->add_delta(nb_data, 0); + SrsRtcPublishStream* publisher = NULL; if ((err = find_publisher(data, nb_data, &publisher)) != srs_success) { return srs_error_wrap(err, "find"); @@ -2459,6 +2484,9 @@ srs_error_t SrsRtcConnection::send_rtcp(char *data, int nb_data) ++_srs_pps_srtcps->sugar; + // Update stat when we sending data. + kbps_->add_delta(0, nb_data); + int nb_buf = nb_data; if ((err = transport_->protect_rtcp(data, &nb_buf)) != srs_success) { return srs_error_wrap(err, "protect rtcp"); @@ -2663,6 +2691,9 @@ srs_error_t SrsRtcConnection::do_send_packet(SrsRtpPacket* pkt) ++_srs_pps_srtps->sugar; + // Update stat when we sending data. + kbps_->add_delta(0, iov->iov_len); + // TODO: FIXME: Handle error. sendonly_skt->sendto(iov->iov_base, iov->iov_len, 0); @@ -2734,6 +2765,9 @@ srs_error_t SrsRtcConnection::on_binding_request(SrsStunPacket* r) return srs_error_wrap(err, "stun binding response encode failed"); } + // Update stat when we sending data. + kbps_->add_delta(0, stream->pos()); + if ((err = sendonly_skt->sendto(stream->data(), stream->pos(), 0)) != srs_success) { return srs_error_wrap(err, "stun binding response send failed"); } diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index af45cc5d2..069a731b4 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -51,6 +51,8 @@ class SrsStatistic; class SrsRtcUserConfig; class SrsRtcSendTrack; class SrsRtcPublishStream; +class SrsKbps; +class SrsWallClock; const uint8_t kSR = 200; const uint8_t kRR = 201; @@ -433,7 +435,7 @@ private: // // For performance, we use non-public from resource, // see https://stackoverflow.com/questions/3747066/c-cannot-convert-from-base-a-to-derived-type-b-via-virtual-base-a -class SrsRtcConnection : public ISrsResource, public ISrsDisposingHandler, public ISrsExpire +class SrsRtcConnection : public ISrsResource, public ISrsDisposingHandler, public ISrsExpire, public ISrsKbpsDelta { friend class SrsSecurityTransport; friend class SrsRtcPlayStream; @@ -490,6 +492,9 @@ private: SrsErrorPithyPrint* pli_epp; private: bool nack_enabled_; +private: + SrsKbps* kbps_; + SrsWallClock* clock_; public: SrsRtcConnection(SrsRtcServer* s, const SrsContextId& cid); virtual ~SrsRtcConnection(); @@ -510,6 +515,9 @@ public: std::string username(); // Get all addresses client used. std::vector peer_addresses(); +// Interface ISrsKbpsDelta. +public: + virtual void remark(int64_t* in, int64_t* out); // Interface ISrsResource. public: virtual const SrsContextId& get_id(); diff --git a/trunk/src/app/srs_app_rtc_server.cpp b/trunk/src/app/srs_app_rtc_server.cpp index a8afa4e79..221c831b6 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -643,6 +643,10 @@ srs_error_t SrsRtcServer::on_timer(srs_utime_t interval) // Update stat if session is alive. if (session->is_alive()) { nn_rtc_conns++; + + ISrsKbpsDelta* conn = dynamic_cast(session); + SrsStatistic::instance()->kbps_add_delta(session->get_id().c_str(), conn); + continue; } diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 9295ac4db..eea783c96 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 49 +#define VERSION_REVISION 50 #endif