Merge BitrateControllerImpl::RtcpBandwidthObserverImpl into BitrateControllerImpl

This allows to protect ssrc_to_last_received_extended_high_seq_num_ member and
make calls to OnReceivedRtcpReceiverReport thread-safe without introducing new critical section.

Bug: webrtc:7735
Change-Id: Iee23bb780d07b0f906f1f8eeddde2b74cc0a2b89
Reviewed-on: https://chromium-review.googlesource.com/518130
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#18540}
diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
index 2d76cc9..757ffb5 100644
--- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
+++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
@@ -12,7 +12,6 @@
 #include "webrtc/modules/bitrate_controller/bitrate_controller_impl.h"
 
 #include <algorithm>
-#include <map>
 #include <utility>
 
 #include "webrtc/base/checks.h"
@@ -28,64 +27,20 @@
   explicit RtcpBandwidthObserverImpl(BitrateControllerImpl* owner)
       : owner_(owner) {
   }
-  virtual ~RtcpBandwidthObserverImpl() {
-  }
+  ~RtcpBandwidthObserverImpl() override = default;
   // Received RTCP REMB or TMMBR.
   void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
-    owner_->OnReceiverEstimatedBitrate(bitrate);
+    owner_->OnReceivedEstimatedBitrate(bitrate);
   }
   // Received RTCP receiver block.
   void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
                                     int64_t rtt,
                                     int64_t now_ms) override {
-    if (report_blocks.empty())
-      return;
-
-    int fraction_lost_aggregate = 0;
-    int total_number_of_packets = 0;
-
-    // Compute the a weighted average of the fraction loss from all report
-    // blocks.
-    for (const RTCPReportBlock& report_block : report_blocks) {
-      std::map<uint32_t, uint32_t>::iterator seq_num_it =
-          ssrc_to_last_received_extended_high_seq_num_.find(
-              report_block.sourceSSRC);
-
-      int number_of_packets = 0;
-      if (seq_num_it != ssrc_to_last_received_extended_high_seq_num_.end()) {
-        number_of_packets =
-            report_block.extendedHighSeqNum - seq_num_it->second;
-      }
-
-      fraction_lost_aggregate += number_of_packets * report_block.fractionLost;
-      total_number_of_packets += number_of_packets;
-
-      // Update last received for this SSRC.
-      ssrc_to_last_received_extended_high_seq_num_[report_block.sourceSSRC] =
-          report_block.extendedHighSeqNum;
-    }
-    if (total_number_of_packets < 0) {
-      LOG(LS_WARNING) << "Received report block where extended high sequence "
-                         "number goes backwards, ignoring.";
-      return;
-    }
-    if (total_number_of_packets == 0)
-      fraction_lost_aggregate = 0;
-    else
-      fraction_lost_aggregate  = (fraction_lost_aggregate +
-          total_number_of_packets / 2) / total_number_of_packets;
-    if (fraction_lost_aggregate > 255)
-      return;
-
-    RTC_DCHECK_GE(total_number_of_packets, 0);
-
-    owner_->OnReceivedRtcpReceiverReport(fraction_lost_aggregate, rtt,
-                                         total_number_of_packets, now_ms);
+    owner_->OnReceivedRtcpReceiverReport(report_blocks, rtt, now_ms);
   }
 
  private:
-  std::map<uint32_t, uint32_t> ssrc_to_last_received_extended_high_seq_num_;
-  BitrateControllerImpl* owner_;
+  BitrateControllerImpl* const owner_;
 };
 
 BitrateController* BitrateController::CreateBitrateController(
@@ -175,7 +130,7 @@
 }
 
 // This is called upon reception of REMB or TMMBR.
-void BitrateControllerImpl::OnReceiverEstimatedBitrate(uint32_t bitrate) {
+void BitrateControllerImpl::OnReceivedEstimatedBitrate(uint32_t bitrate) {
   {
     rtc::CritScope cs(&critsect_);
     bandwidth_estimation_.UpdateReceiverEstimate(clock_->TimeInMilliseconds(),
@@ -220,14 +175,55 @@
 }
 
 void BitrateControllerImpl::OnReceivedRtcpReceiverReport(
-    uint8_t fraction_loss,
+    const ReportBlockList& report_blocks,
     int64_t rtt,
-    int number_of_packets,
     int64_t now_ms) {
+  if (report_blocks.empty())
+    return;
+
   {
     rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_.UpdateReceiverBlock(fraction_loss, rtt,
-                                              number_of_packets, now_ms);
+    int fraction_lost_aggregate = 0;
+    int total_number_of_packets = 0;
+
+    // Compute the a weighted average of the fraction loss from all report
+    // blocks.
+    for (const RTCPReportBlock& report_block : report_blocks) {
+      std::map<uint32_t, uint32_t>::iterator seq_num_it =
+          ssrc_to_last_received_extended_high_seq_num_.find(
+              report_block.sourceSSRC);
+
+      int number_of_packets = 0;
+      if (seq_num_it != ssrc_to_last_received_extended_high_seq_num_.end()) {
+        number_of_packets =
+            report_block.extendedHighSeqNum - seq_num_it->second;
+      }
+
+      fraction_lost_aggregate += number_of_packets * report_block.fractionLost;
+      total_number_of_packets += number_of_packets;
+
+      // Update last received for this SSRC.
+      ssrc_to_last_received_extended_high_seq_num_[report_block.sourceSSRC] =
+          report_block.extendedHighSeqNum;
+    }
+    if (total_number_of_packets < 0) {
+      LOG(LS_WARNING) << "Received report block where extended high sequence "
+                         "number goes backwards, ignoring.";
+      return;
+    }
+    if (total_number_of_packets == 0)
+      fraction_lost_aggregate = 0;
+    else
+      fraction_lost_aggregate =
+          (fraction_lost_aggregate + total_number_of_packets / 2) /
+          total_number_of_packets;
+    if (fraction_lost_aggregate > 255)
+      return;
+
+    RTC_DCHECK_GE(total_number_of_packets, 0);
+
+    bandwidth_estimation_.UpdateReceiverBlock(fraction_lost_aggregate, rtt,
+                                              total_number_of_packets, now_ms);
   }
   MaybeTriggerOnNetworkChanged();
 }