From 760c4b4da98b4bee78f4509f8496f6e170cdb88b Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Wed, 27 Sep 2017 13:25:24 +0200 Subject: [PATCH] Trigger rtt and stats update on report block rather than receiver report. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReportBlock is the the real receiver report. Triggering rtt update on ReportBlock support clients that send receiver report blocks attached to SenderReport rather than ReceiverReport. Bug: webrtc:7996 Change-Id: Ie826fa09fd1bf0e5256e995649f66811b5192761 Reviewed-on: https://webrtc-review.googlesource.com/4040 Reviewed-by: Åsa Persson Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#20014} --- modules/rtp_rtcp/source/rtcp_receiver.cc | 16 +++++----- modules/rtp_rtcp/source/rtcp_receiver.h | 6 ++-- .../rtp_rtcp/source/rtcp_receiver_unittest.cc | 31 +++++++++++++++---- modules/rtp_rtcp/source/rtp_rtcp_impl.cc | 6 ++-- 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc index 2e634f5f63..55764330fc 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver.cc +++ b/modules/rtp_rtcp/source/rtcp_receiver.cc @@ -123,7 +123,7 @@ RTCPReceiver::RTCPReceiver( xr_rrtr_status_(false), xr_rr_rtt_ms_(0), oldest_tmmbr_info_ms_(0), - last_received_rr_ms_(0), + last_received_rb_ms_(0), last_increased_sequence_number_ms_(0), stats_callback_(nullptr), packet_type_counter_observer_(packet_type_counter_observer), @@ -146,9 +146,9 @@ void RTCPReceiver::IncomingPacket(const uint8_t* packet, size_t packet_size) { TriggerCallbacksFromRtcpPacket(packet_information); } -int64_t RTCPReceiver::LastReceivedReceiverReport() const { +int64_t RTCPReceiver::LastReceivedReportBlockMs() const { rtc::CritScope lock(&rtcp_receiver_lock_); - return last_received_rr_ms_; + return last_received_rb_ms_; } void RTCPReceiver::SetRemoteSSRC(uint32_t ssrc) { @@ -422,8 +422,6 @@ void RTCPReceiver::HandleReceiverReport(const CommonHeader& rtcp_block, return; } - last_received_rr_ms_ = clock_->TimeInMilliseconds(); - const uint32_t remote_ssrc = receiver_report.sender_ssrc(); packet_information->remote_ssrc = remote_ssrc; @@ -455,6 +453,8 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block, if (registered_ssrcs_.count(report_block.source_ssrc()) == 0) return; + last_received_rb_ms_ = clock_->TimeInMilliseconds(); + ReportBlockWithRtt* report_block_info = &received_report_blocks_[report_block.source_ssrc()][remote_ssrc]; report_block_info->report_block.sender_ssrc = remote_ssrc; @@ -534,13 +534,13 @@ RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation( bool RTCPReceiver::RtcpRrTimeout(int64_t rtcp_interval_ms) { rtc::CritScope lock(&rtcp_receiver_lock_); - if (last_received_rr_ms_ == 0) + if (last_received_rb_ms_ == 0) return false; int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; - if (clock_->TimeInMilliseconds() > last_received_rr_ms_ + time_out_ms) { + if (clock_->TimeInMilliseconds() > last_received_rb_ms_ + time_out_ms) { // Reset the timer to only trigger one log. - last_received_rr_ms_ = 0; + last_received_rb_ms_ = 0; return true; } return false; diff --git a/modules/rtp_rtcp/source/rtcp_receiver.h b/modules/rtp_rtcp/source/rtcp_receiver.h index c4a7855e3f..c3de36c54f 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver.h +++ b/modules/rtp_rtcp/source/rtcp_receiver.h @@ -61,7 +61,7 @@ class RTCPReceiver { void IncomingPacket(const uint8_t* packet, size_t packet_size); - int64_t LastReceivedReceiverReport() const; + int64_t LastReceivedReportBlockMs() const; void SetSsrcs(uint32_t main_ssrc, const std::set& registered_ssrcs); void SetRemoteSSRC(uint32_t ssrc); @@ -245,8 +245,8 @@ class RTCPReceiver { std::map received_cnames_ RTC_GUARDED_BY(rtcp_receiver_lock_); - // The last time we received an RTCP RR. - int64_t last_received_rr_ms_ RTC_GUARDED_BY(rtcp_receiver_lock_); + // The last time we received an RTCP Report block for this module. + int64_t last_received_rb_ms_ RTC_GUARDED_BY(rtcp_receiver_lock_); // The time we last received an RTCP RR telling we have successfully // delivered RTP packet to the remote side. diff --git a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc index f40b44234d..fb09ee1b7b 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc @@ -274,7 +274,6 @@ TEST_F(RtcpReceiverTest, InjectRrPacket) { OnReceivedRtcpReceiverReport(IsEmpty(), _, now)); InjectRtcpPacket(rr); - EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport()); std::vector report_blocks; rtcp_receiver_.StatisticsReceived(&report_blocks); EXPECT_TRUE(report_blocks.empty()); @@ -293,7 +292,7 @@ TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { OnReceivedRtcpReceiverReport(IsEmpty(), _, now)); InjectRtcpPacket(rr); - EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport()); + EXPECT_EQ(0, rtcp_receiver_.LastReceivedReportBlockMs()); std::vector received_blocks; rtcp_receiver_.StatisticsReceived(&received_blocks); EXPECT_TRUE(received_blocks.empty()); @@ -313,7 +312,27 @@ TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { OnReceivedRtcpReceiverReport(SizeIs(1), _, now)); InjectRtcpPacket(rr); - EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport()); + EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs()); + std::vector received_blocks; + rtcp_receiver_.StatisticsReceived(&received_blocks); + EXPECT_EQ(1u, received_blocks.size()); +} + +TEST_F(RtcpReceiverTest, InjectSrPacketWithOneReportBlock) { + int64_t now = system_clock_.TimeInMilliseconds(); + + rtcp::ReportBlock rb; + rb.SetMediaSsrc(kReceiverMainSsrc); + rtcp::SenderReport sr; + sr.SetSenderSsrc(kSenderSsrc); + sr.AddReportBlock(rb); + + EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1))); + EXPECT_CALL(bandwidth_observer_, + OnReceivedRtcpReceiverReport(SizeIs(1), _, now)); + InjectRtcpPacket(sr); + + EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs()); std::vector received_blocks; rtcp_receiver_.StatisticsReceived(&received_blocks); EXPECT_EQ(1u, received_blocks.size()); @@ -345,7 +364,7 @@ TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { OnReceivedRtcpReceiverReport(SizeIs(2), _, now)); InjectRtcpPacket(rr1); - EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport()); + EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs()); std::vector received_blocks; rtcp_receiver_.StatisticsReceived(&received_blocks); EXPECT_THAT(received_blocks, @@ -419,7 +438,7 @@ TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) { OnReceivedRtcpReceiverReport(SizeIs(1), _, now)); InjectRtcpPacket(rr1); - EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport()); + EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs()); std::vector received_blocks; rtcp_receiver_.StatisticsReceived(&received_blocks); @@ -486,7 +505,7 @@ TEST_F(RtcpReceiverTest, GetRtt) { EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _)); InjectRtcpPacket(rr); - EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport()); + EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs()); EXPECT_EQ( 0, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); } diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc index 4b3acfb2bc..b9e9c0af12 100644 --- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc +++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc @@ -178,10 +178,10 @@ void ModuleRtpRtcpImpl::Process() { bool process_rtt = now >= last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs; if (rtcp_sender_.Sending()) { - // Process RTT if we have received a receiver report and we haven't + // Process RTT if we have received a report block and we haven't // processed RTT for at least |kRtpRtcpRttProcessTimeMs| milliseconds. - if (rtcp_receiver_.LastReceivedReceiverReport() > - last_rtt_process_time_ && process_rtt) { + if (rtcp_receiver_.LastReceivedReportBlockMs() > last_rtt_process_time_ && + process_rtt) { std::vector receive_blocks; rtcp_receiver_.StatisticsReceived(&receive_blocks); int64_t max_rtt = 0;