From d61536311b7f5c92ad36cad90674d0d51de64ca8 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 9 Sep 2020 14:07:13 +0800 Subject: [PATCH] RTC: Remove and refine NACK removing --- trunk/src/app/srs_app_rtc_conn.cpp | 4 ++-- trunk/src/app/srs_app_rtc_conn.hpp | 2 +- trunk/src/app/srs_app_rtc_queue.cpp | 23 ++--------------------- trunk/src/app/srs_app_rtc_queue.hpp | 6 +----- trunk/src/app/srs_app_rtc_source.cpp | 6 ++---- 5 files changed, 8 insertions(+), 33 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 80f9fe659..afc727d84 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -2109,12 +2109,12 @@ srs_error_t SrsRtcConnection::send_rtcp(char *data, int nb_data) return err; } -void SrsRtcConnection::check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks) +void SrsRtcConnection::check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks, uint32_t& timeout_nacks) { SrsRtcpNack rtcpNack(ssrc); rtcpNack.set_media_ssrc(ssrc); - nack->get_nack_seqs(rtcpNack); + nack->get_nack_seqs(rtcpNack, timeout_nacks); sent_nacks = rtcpNack.get_lost_sns().size(); if(!sent_nacks){ diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index 66e450105..0f593d8e7 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -475,7 +475,7 @@ public: public: // send rtcp srs_error_t send_rtcp(char *data, int nb_data); - void check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks); + void check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks, uint32_t& timeout_nacks); srs_error_t send_rtcp_rr(uint32_t ssrc, SrsRtpRingBuffer* rtp_queue, const uint64_t& last_send_systime, const SrsNtp& last_send_ntp); srs_error_t send_rtcp_xr_rrtr(uint32_t ssrc); srs_error_t send_rtcp_fb_pli(uint32_t ssrc, const SrsContextId& cid_of_subscriber); diff --git a/trunk/src/app/srs_app_rtc_queue.cpp b/trunk/src/app/srs_app_rtc_queue.cpp index 3e562b6e8..0122d57e4 100644 --- a/trunk/src/app/srs_app_rtc_queue.cpp +++ b/trunk/src/app/srs_app_rtc_queue.cpp @@ -188,7 +188,6 @@ SrsRtpNackForReceiver::SrsRtpNackForReceiver(SrsRtpRingBuffer* rtp, size_t queue max_queue_size_ = queue_size; rtp_ = rtp; pre_check_time_ = 0; - last_remove_packet_time_ = -1; rtt_ = 0; srs_info("max_queue_size=%u, nack opt: max_count=%d, max_alive_time=%us, first_nack_interval=%" PRId64 ", nack_interval=%" PRId64, @@ -230,7 +229,7 @@ void SrsRtpNackForReceiver::check_queue_size() } } -void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs) +void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs, uint32_t& timeout_nacks) { // TODO: FIXME: Use packet as tick count, not clock. srs_utime_t now = srs_update_system_time(); @@ -248,6 +247,7 @@ void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs) int alive_time = now - nack_info.generate_time_; if (alive_time > opts_.max_alive_time || nack_info.req_nack_count_ > opts_.max_count) { + ++timeout_nacks; rtp_->notify_drop_seq(seq); queue_.erase(iter++); continue; @@ -275,22 +275,3 @@ void SrsRtpNackForReceiver::update_rtt(int rtt) opts_.nack_interval = rtt_; } -#define PACKET_CLEAR_TIMEOUT (3000 * SRS_UTIME_MILLISECONDS) - -void SrsRtpNackForReceiver::remove_timeout_packets(void) -{ - srs_utime_t now = srs_get_system_time(); - if (last_remove_packet_time_ == -1) { - last_remove_packet_time_ = now; - return; - } - - srs_utime_t elapsed_time = now - last_remove_packet_time_; - last_remove_packet_time_ = now; - - if (elapsed_time > PACKET_CLEAR_TIMEOUT) { - rtp_->notify_nack_list_full(); - queue_.clear(); - } -} - diff --git a/trunk/src/app/srs_app_rtc_queue.hpp b/trunk/src/app/srs_app_rtc_queue.hpp index c45af2a21..4cc800cf3 100644 --- a/trunk/src/app/srs_app_rtc_queue.hpp +++ b/trunk/src/app/srs_app_rtc_queue.hpp @@ -133,13 +133,9 @@ public: SrsRtpNackInfo* find(uint16_t seq); void check_queue_size(); public: - void get_nack_seqs(SrsRtcpNack& seqs); + void get_nack_seqs(SrsRtcpNack& seqs, uint32_t& timeout_nacks); public: void update_rtt(int rtt); -private: - srs_utime_t last_remove_packet_time_; -public: - void remove_timeout_packets(void); }; #endif diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 2035e5cfb..4fcc03cb9 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1686,9 +1686,6 @@ srs_error_t SrsRtcRecvTrack::on_nack(SrsRtpPacket2* pkt) srs_error_t err = srs_success; uint16_t seq = pkt->header.get_sequence(); - - // TODO: check whether is necessary? - nack_receiver_->remove_timeout_packets(); SrsRtpNackInfo* nack_info = nack_receiver_->find(seq); if (nack_info) { // seq had been received. @@ -1718,7 +1715,8 @@ srs_error_t SrsRtcRecvTrack::check_send_nacks() srs_error_t err = srs_success; uint32_t sent_nacks = 0; - session_->check_send_nacks(nack_receiver_, track_desc_->ssrc_, sent_nacks); + uint32_t timeout_nacks = 0; + session_->check_send_nacks(nack_receiver_, track_desc_->ssrc_, sent_nacks, timeout_nacks); statistic_->nacks += sent_nacks; return err;