From 25f17c32e96562bc72059913ca71a17ac525cb00 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 7 May 2021 18:42:36 +0800 Subject: [PATCH] RTC: Refine fast timer --- trunk/src/app/srs_app_rtc_conn.cpp | 16 ++++++++++++++-- trunk/src/app/srs_app_rtc_conn.hpp | 2 ++ trunk/src/app/srs_app_rtc_server.cpp | 1 + trunk/src/app/srs_app_rtc_source.cpp | 4 +++- trunk/src/app/srs_app_threads.cpp | 1 + 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 8ef6081e5..b336e21cb 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -535,6 +535,7 @@ srs_error_t SrsRtcPlayStream::start() } // The timer for play, process TWCC in the future. + // @see SrsRtcPlayStream::on_timer() _srs_hybrid->timer1s()->subscribe(this); if ((err = pli_worker_->start()) != srs_success) { @@ -1056,6 +1057,7 @@ srs_error_t SrsRtcPublishStream::start() } // For publisher timer, such as TWCC and RR. + // @see SrsRtcPublishStream::on_timer() _srs_hybrid->timer100ms()->subscribe(this); if ((err = source->on_publish()) != srs_success) { @@ -1716,6 +1718,8 @@ SrsRtcConnection::SrsRtcConnection(SrsRtcServer* s, const SrsContextId& cid) pp_address_change = new SrsErrorPithyPrint(); pli_epp = new SrsErrorPithyPrint(); + nack_enabled_ = false; + _srs_rtc_manager->subscribe(this); } @@ -1969,14 +1973,18 @@ srs_error_t SrsRtcConnection::initialize(SrsRequest* r, bool dtls, bool srtp, st } // The RTC connection start a timer, handle nacks. + // @see SrsRtcConnection::on_timer() _srs_hybrid->timer20ms()->subscribe(this); // TODO: FIXME: Support reload. session_timeout = _srs_config->get_rtc_stun_timeout(req->vhost); last_stun_time = srs_get_system_time(); - srs_trace("RTC init session, user=%s, url=%s, encrypt=%u/%u, DTLS(role=%s, version=%s), timeout=%dms", username.c_str(), - r->get_stream_url().c_str(), dtls, srtp, cfg->dtls_role.c_str(), cfg->dtls_version.c_str(), srsu2msi(session_timeout)); + nack_enabled_ = _srs_config->get_rtc_nack_enabled(req->vhost); + + srs_trace("RTC init session, user=%s, url=%s, encrypt=%u/%u, DTLS(role=%s, version=%s), timeout=%dms, nack=%d", + username.c_str(), r->get_stream_url().c_str(), dtls, srtp, cfg->dtls_role.c_str(), cfg->dtls_version.c_str(), + srsu2msi(session_timeout), nack_enabled_); return err; } @@ -2347,6 +2355,10 @@ srs_error_t SrsRtcConnection::on_timer(srs_utime_t interval) { srs_error_t err = srs_success; + if (!nack_enabled_) { + return err; + } + ++_srs_pps_conn->sugar; // If circuit-breaker is enabled, disable nack. diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index ab3d0a4e0..66eaada69 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -454,6 +454,8 @@ private: SrsErrorPithyPrint* pp_address_change; // Pithy print for PLI request. SrsErrorPithyPrint* pli_epp; +private: + bool nack_enabled_; public: SrsRtcConnection(SrsRtcServer* s, const SrsContextId& cid); virtual ~SrsRtcConnection(); diff --git a/trunk/src/app/srs_app_rtc_server.cpp b/trunk/src/app/srs_app_rtc_server.cpp index 1fa107b60..2e9bc9f65 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -281,6 +281,7 @@ srs_error_t SrsRtcServer::initialize() srs_error_t err = srs_success; // The RTC server start a timer, do routines of RTC server. + // @see SrsRtcServer::on_timer() _srs_hybrid->timer5s()->subscribe(this); // Initialize the black hole. diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 6f9916261..c696cb0da 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -504,8 +504,10 @@ srs_error_t SrsRtcStream::on_publish() return srs_error_wrap(err, "bridger on publish"); } - // For SrsRtcStream::on_timer() + // The PLI interval for RTC2RTMP. pli_for_rtmp_ = _srs_config->get_rtc_pli_for_rtmp(req->vhost); + + // @see SrsRtcStream::on_timer() _srs_hybrid->timer100ms()->subscribe(this); } diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index ae44a7f16..77ee3d1b7 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -71,6 +71,7 @@ srs_error_t SrsCircuitBreaker::initialize() dying_pulse_ = _srs_config->get_dying_pulse(); // Update the water level for circuit breaker. + // @see SrsCircuitBreaker::on_timer() _srs_hybrid->timer1s()->subscribe(this); srs_trace("CircuitBreaker: enabled=%d, high=%dx%d, critical=%dx%d, dying=%dx%d", enabled_,