From a0dedba2ab9239fcc66a1ae7dfcef824ea0f38b6 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 2 Sep 2020 11:30:20 +0800 Subject: [PATCH] RTC: Fix NACK bug --- trunk/src/app/srs_app_rtc_conn.cpp | 57 ++++++++++------------------- trunk/src/app/srs_app_rtc_queue.cpp | 4 +- trunk/src/app/srs_app_rtc_queue.hpp | 3 +- 3 files changed, 24 insertions(+), 40 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 45ee5adda..3829e1287 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -2078,46 +2078,29 @@ srs_error_t SrsRtcConnection::send_rtcp(char *data, int nb_data) void SrsRtcConnection::check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks) { - // @see: https://tools.ietf.org/html/rfc4585#section-6.1 - vector nack_seqs; - nack->get_nack_seqs(nack_seqs); + SrsRtcpNack rtcpNack(ssrc); - vector::iterator iter = nack_seqs.begin(); - while (iter != nack_seqs.end()) { - char buf[kRtpPacketSize]; - SrsBuffer stream(buf, sizeof(buf)); - // FIXME: Replace magic number. - stream.write_1bytes(0x81); - stream.write_1bytes(kRtpFb); - stream.write_2bytes(3); - stream.write_4bytes(ssrc); // TODO: FIXME: Should be 1? - stream.write_4bytes(ssrc); // TODO: FIXME: Should be 0? - uint16_t pid = *iter; - uint16_t blp = 0; - while (iter + 1 != nack_seqs.end() && (*(iter + 1) - pid <= 15)) { - blp |= (1 << (*(iter + 1) - pid - 1)); - ++iter; - } + rtcpNack.set_media_ssrc(ssrc); + nack->get_nack_seqs(rtcpNack); - stream.write_2bytes(pid); - stream.write_2bytes(blp); - - if (_srs_blackhole->blackhole) { - _srs_blackhole->sendto(stream.data(), stream.pos()); - } - - char protected_buf[kRtpPacketSize]; - int nb_protected_buf = stream.pos(); - - // FIXME: Merge nack rtcp into one packets. - if (transport_->protect_rtcp(stream.data(), protected_buf, nb_protected_buf) == srs_success) { - // TODO: FIXME: Check error. - sendonly_skt->sendto(protected_buf, nb_protected_buf, 0); - } - - ++iter; - ++sent_nacks; + sent_nacks = rtcpNack.get_lost_sns().size(); + if(!sent_nacks){ + return; } + + char buf[kRtcpPacketSize]; + SrsBuffer stream(buf, sizeof(buf)); + + // TODO: FIXME: Check error. + rtcpNack.encode(&stream); + + // TODO: FIXME: Check error. + char protected_buf[kRtpPacketSize]; + int nb_protected_buf = stream.pos(); + transport_->protect_rtcp(stream.data(), protected_buf, nb_protected_buf); + + // TODO: FIXME: Check error. + sendonly_skt->sendto(protected_buf, nb_protected_buf, 0); } srs_error_t SrsRtcConnection::send_rtcp_rr(uint32_t ssrc, SrsRtpRingBuffer* rtp_queue, const uint64_t& last_send_systime, const SrsNtp& last_send_ntp) diff --git a/trunk/src/app/srs_app_rtc_queue.cpp b/trunk/src/app/srs_app_rtc_queue.cpp index f569e178c..3e562b6e8 100644 --- a/trunk/src/app/srs_app_rtc_queue.cpp +++ b/trunk/src/app/srs_app_rtc_queue.cpp @@ -230,7 +230,7 @@ void SrsRtpNackForReceiver::check_queue_size() } } -void SrsRtpNackForReceiver::get_nack_seqs(vector& seqs) +void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs) { // TODO: FIXME: Use packet as tick count, not clock. srs_utime_t now = srs_update_system_time(); @@ -261,7 +261,7 @@ void SrsRtpNackForReceiver::get_nack_seqs(vector& seqs) if (now - nack_info.pre_req_nack_time_ >= opts_.nack_interval && nack_info.req_nack_count_ <= opts_.max_count) { ++nack_info.req_nack_count_; nack_info.pre_req_nack_time_ = now; - seqs.push_back(seq); + seqs.add_lost_sn(seq); } ++iter; diff --git a/trunk/src/app/srs_app_rtc_queue.hpp b/trunk/src/app/srs_app_rtc_queue.hpp index be945dd25..c45af2a21 100644 --- a/trunk/src/app/srs_app_rtc_queue.hpp +++ b/trunk/src/app/srs_app_rtc_queue.hpp @@ -31,6 +31,7 @@ #include #include +#include class SrsRtpPacket2; class SrsRtpQueue; @@ -132,7 +133,7 @@ public: SrsRtpNackInfo* find(uint16_t seq); void check_queue_size(); public: - void get_nack_seqs(std::vector& seqs); + void get_nack_seqs(SrsRtcpNack& seqs); public: void update_rtt(int rtt); private: