Trigger rtt and stats update on report block rather than receiver report.

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 <asapersson@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20014}
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc
index 2e634f5..5576433 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -123,7 +123,7 @@
       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 @@
   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 @@
     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 @@
   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 @@
 
 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 c4a7855..c3de36c 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -61,7 +61,7 @@
 
   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<uint32_t>& registered_ssrcs);
   void SetRemoteSSRC(uint32_t ssrc);
@@ -245,8 +245,8 @@
   std::map<uint32_t, std::string> 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 f40b442..fb09ee1 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -274,7 +274,6 @@
               OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
   InjectRtcpPacket(rr);
 
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
   std::vector<RTCPReportBlock> report_blocks;
   rtcp_receiver_.StatisticsReceived(&report_blocks);
   EXPECT_TRUE(report_blocks.empty());
@@ -293,7 +292,7 @@
               OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
   InjectRtcpPacket(rr);
 
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
+  EXPECT_EQ(0, rtcp_receiver_.LastReceivedReportBlockMs());
   std::vector<RTCPReportBlock> received_blocks;
   rtcp_receiver_.StatisticsReceived(&received_blocks);
   EXPECT_TRUE(received_blocks.empty());
@@ -313,7 +312,27 @@
               OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
   InjectRtcpPacket(rr);
 
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
+  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
+  std::vector<RTCPReportBlock> 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<RTCPReportBlock> received_blocks;
   rtcp_receiver_.StatisticsReceived(&received_blocks);
   EXPECT_EQ(1u, received_blocks.size());
@@ -345,7 +364,7 @@
               OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
   InjectRtcpPacket(rr1);
 
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
+  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
   std::vector<RTCPReportBlock> received_blocks;
   rtcp_receiver_.StatisticsReceived(&received_blocks);
   EXPECT_THAT(received_blocks,
@@ -419,7 +438,7 @@
               OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
   InjectRtcpPacket(rr1);
 
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
+  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
 
   std::vector<RTCPReportBlock> received_blocks;
   rtcp_receiver_.StatisticsReceived(&received_blocks);
@@ -486,7 +505,7 @@
   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 4b3acfb..b9e9c0a 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -178,10 +178,10 @@
 
   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<RTCPReportBlock> receive_blocks;
       rtcp_receiver_.StatisticsReceived(&receive_blocks);
       int64_t max_rtt = 0;