Remove locks in SendSideBandwidthEstimation since those are only accessed while owning locks in
BitrateControllerImpl (excluding AvailableBandwidth).

 + Refactor BitrateController logic around LowRate allocation so access to SendSideBandwidthEstimation
is clear.
 + Refactor NormalRateAllocation away from OnNetworkChange.
 + Annotate BitrateController locks.

R=henrik.lundin@webrtc.org, stefan@webrtc.org
BUG=3065

Review URL: https://webrtc-codereview.appspot.com/10129004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5749 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
index f4f085c..3810406 100644
--- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
+++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
@@ -18,7 +18,8 @@
 
 namespace webrtc {
 
-class RtcpBandwidthObserverImpl : public RtcpBandwidthObserver {
+class BitrateControllerImpl::RtcpBandwidthObserverImpl
+    : public RtcpBandwidthObserver {
  public:
   explicit RtcpBandwidthObserverImpl(BitrateControllerImpl* owner)
       : owner_(owner) {
@@ -76,90 +77,14 @@
   BitrateControllerImpl* owner_;
 };
 
-class LowRateStrategy {
- public:
-  LowRateStrategy(
-      SendSideBandwidthEstimation* bandwidth_estimation,
-      BitrateControllerImpl::BitrateObserverConfList* bitrate_observers)
-      : bandwidth_estimation_(bandwidth_estimation),
-        bitrate_observers_(bitrate_observers) {}
-
-  virtual ~LowRateStrategy() {}
-
-  virtual void LowRateAllocation(uint32_t bitrate,
-                                 uint8_t fraction_loss,
-                                 uint32_t rtt,
-                                 uint32_t sum_min_bitrates) = 0;
-
- protected:
-  SendSideBandwidthEstimation* bandwidth_estimation_;
-  BitrateControllerImpl::BitrateObserverConfList* bitrate_observers_;
-};
-
-class EnforceMinRateStrategy : public LowRateStrategy {
- public:
-  EnforceMinRateStrategy(
-      SendSideBandwidthEstimation* bandwidth_estimation,
-      BitrateControllerImpl::BitrateObserverConfList* bitrate_observers)
-      : LowRateStrategy(bandwidth_estimation, bitrate_observers) {}
-
-  void LowRateAllocation(uint32_t bitrate,
-                         uint8_t fraction_loss,
-                         uint32_t rtt,
-                         uint32_t sum_min_bitrates) {
-    // Min bitrate to all observers.
-    BitrateControllerImpl::BitrateObserverConfList::iterator it;
-    for (it = bitrate_observers_->begin(); it != bitrate_observers_->end();
-        ++it) {
-      it->first->OnNetworkChanged(it->second->min_bitrate_, fraction_loss,
-                                  rtt);
-    }
-    // Set sum of min to current send bitrate.
-    bandwidth_estimation_->SetSendBitrate(sum_min_bitrates);
-  }
-};
-
-class NoEnforceMinRateStrategy : public LowRateStrategy {
- public:
-  NoEnforceMinRateStrategy(
-      SendSideBandwidthEstimation* bandwidth_estimation,
-      BitrateControllerImpl::BitrateObserverConfList* bitrate_observers)
-      : LowRateStrategy(bandwidth_estimation, bitrate_observers) {}
-
-  void LowRateAllocation(uint32_t bitrate,
-                         uint8_t fraction_loss,
-                         uint32_t rtt,
-                         uint32_t sum_min_bitrates) {
-    // Allocate up to |min_bitrate_| to one observer at a time, until
-    // |bitrate| is depleted.
-    uint32_t remainder = bitrate;
-    BitrateControllerImpl::BitrateObserverConfList::iterator it;
-    for (it = bitrate_observers_->begin(); it != bitrate_observers_->end();
-        ++it) {
-      uint32_t allocation = std::min(remainder, it->second->min_bitrate_);
-      it->first->OnNetworkChanged(allocation, fraction_loss, rtt);
-      remainder -= allocation;
-    }
-    // Set |bitrate| to current send bitrate.
-    bandwidth_estimation_->SetSendBitrate(bitrate);
-  }
-};
-
 BitrateController* BitrateController::CreateBitrateController(
     bool enforce_min_bitrate) {
   return new BitrateControllerImpl(enforce_min_bitrate);
 }
 
 BitrateControllerImpl::BitrateControllerImpl(bool enforce_min_bitrate)
-    : critsect_(CriticalSectionWrapper::CreateCriticalSection()) {
-  if (enforce_min_bitrate) {
-    low_rate_strategy_.reset(new EnforceMinRateStrategy(
-        &bandwidth_estimation_, &bitrate_observers_));
-  } else {
-    low_rate_strategy_.reset(new NoEnforceMinRateStrategy(
-        &bandwidth_estimation_, &bitrate_observers_));
-  }
-}
+    : critsect_(CriticalSectionWrapper::CreateCriticalSection()),
+      enforce_min_bitrate_(enforce_min_bitrate) {}
 
 BitrateControllerImpl::~BitrateControllerImpl() {
   BitrateObserverConfList::iterator it =
@@ -240,13 +165,7 @@
 
 void BitrateControllerImpl::EnforceMinBitrate(bool enforce_min_bitrate) {
   CriticalSectionScoped cs(critsect_);
-  if (enforce_min_bitrate) {
-    low_rate_strategy_.reset(new EnforceMinRateStrategy(
-        &bandwidth_estimation_, &bitrate_observers_));
-  } else {
-    low_rate_strategy_.reset(new NoEnforceMinRateStrategy(
-        &bandwidth_estimation_, &bitrate_observers_));
-  }
+  enforce_min_bitrate_ = enforce_min_bitrate;
 }
 
 void BitrateControllerImpl::SetBweMinBitrate(uint32_t min_bitrate) {
@@ -281,28 +200,34 @@
   }
 }
 
-// We have the lock here.
 void BitrateControllerImpl::OnNetworkChanged(const uint32_t bitrate,
                                              const uint8_t fraction_loss,
                                              const uint32_t rtt) {
   // Sanity check.
-  uint32_t number_of_observers = bitrate_observers_.size();
-  if (number_of_observers == 0) {
+  if (bitrate_observers_.empty())
     return;
-  }
+
   uint32_t sum_min_bitrates = 0;
   BitrateObserverConfList::iterator it;
   for (it = bitrate_observers_.begin(); it != bitrate_observers_.end(); ++it) {
     sum_min_bitrates += it->second->min_bitrate_;
   }
-  if (bitrate <= sum_min_bitrates) {
-    return low_rate_strategy_->LowRateAllocation(bitrate, fraction_loss, rtt,
-                                                 sum_min_bitrates);
-  }
+  if (bitrate <= sum_min_bitrates)
+    return LowRateAllocation(bitrate, fraction_loss, rtt, sum_min_bitrates);
+  else
+    return NormalRateAllocation(bitrate, fraction_loss, rtt, sum_min_bitrates);
+}
+
+void BitrateControllerImpl::NormalRateAllocation(uint32_t bitrate,
+                                                 uint8_t fraction_loss,
+                                                 uint32_t rtt,
+                                                 uint32_t sum_min_bitrates) {
+  uint32_t number_of_observers = bitrate_observers_.size();
   uint32_t bitrate_per_observer = (bitrate - sum_min_bitrates) /
       number_of_observers;
   // Use map to sort list based on max bitrate.
   ObserverSortingMap list_max_bitrates;
+  BitrateObserverConfList::iterator it;
   for (it = bitrate_observers_.begin(); it != bitrate_observers_.end(); ++it) {
     list_max_bitrates.insert(std::pair<uint32_t, ObserverConfiguration*>(
         it->second->max_bitrate_,
@@ -333,7 +258,37 @@
   }
 }
 
+void BitrateControllerImpl::LowRateAllocation(uint32_t bitrate,
+                                              uint8_t fraction_loss,
+                                              uint32_t rtt,
+                                              uint32_t sum_min_bitrates) {
+  if (enforce_min_bitrate_) {
+    // Min bitrate to all observers.
+    BitrateControllerImpl::BitrateObserverConfList::iterator it;
+    for (it = bitrate_observers_.begin(); it != bitrate_observers_.end();
+         ++it) {
+      it->first->OnNetworkChanged(it->second->min_bitrate_, fraction_loss, rtt);
+    }
+    // Set sum of min to current send bitrate.
+    bandwidth_estimation_.SetSendBitrate(sum_min_bitrates);
+  } else {
+    // Allocate up to |min_bitrate_| to one observer at a time, until
+    // |bitrate| is depleted.
+    uint32_t remainder = bitrate;
+    BitrateControllerImpl::BitrateObserverConfList::iterator it;
+    for (it = bitrate_observers_.begin(); it != bitrate_observers_.end();
+         ++it) {
+      uint32_t allocation = std::min(remainder, it->second->min_bitrate_);
+      it->first->OnNetworkChanged(allocation, fraction_loss, rtt);
+      remainder -= allocation;
+    }
+    // Set |bitrate| to current send bitrate.
+    bandwidth_estimation_.SetSendBitrate(bitrate);
+  }
+}
+
 bool BitrateControllerImpl::AvailableBandwidth(uint32_t* bandwidth) const {
+  CriticalSectionScoped cs(critsect_);
   return bandwidth_estimation_.AvailableBandwidth(bandwidth);
 }
 
diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_impl.h b/webrtc/modules/bitrate_controller/bitrate_controller_impl.h
index a5bba44..4e40997 100644
--- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.h
+++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.h
@@ -27,12 +27,28 @@
 
 namespace webrtc {
 
-class RtcpBandwidthObserverImpl;
-class LowRateStrategy;
-
 class BitrateControllerImpl : public BitrateController {
  public:
-  friend class RtcpBandwidthObserverImpl;
+  explicit BitrateControllerImpl(bool enforce_min_bitrate);
+  virtual ~BitrateControllerImpl();
+
+  virtual bool AvailableBandwidth(uint32_t* bandwidth) const OVERRIDE;
+
+  virtual RtcpBandwidthObserver* CreateRtcpBandwidthObserver() OVERRIDE;
+
+  virtual void SetBitrateObserver(BitrateObserver* observer,
+                                  const uint32_t start_bitrate,
+                                  const uint32_t min_bitrate,
+                                  const uint32_t max_bitrate) OVERRIDE;
+
+  virtual void RemoveBitrateObserver(BitrateObserver* observer) OVERRIDE;
+
+  virtual void EnforceMinBitrate(bool enforce_min_bitrate) OVERRIDE;
+
+  virtual void SetBweMinBitrate(uint32_t min_bitrate) OVERRIDE;
+
+ private:
+  class RtcpBandwidthObserverImpl;
 
   struct BitrateConfiguration {
     BitrateConfiguration(uint32_t start_bitrate,
@@ -59,25 +75,7 @@
       BitrateObserverConfiguration;
   typedef std::list<BitrateObserverConfiguration> BitrateObserverConfList;
 
-  explicit BitrateControllerImpl(bool enforce_min_bitrate);
-  virtual ~BitrateControllerImpl();
 
-  virtual bool AvailableBandwidth(uint32_t* bandwidth) const OVERRIDE;
-
-  virtual RtcpBandwidthObserver* CreateRtcpBandwidthObserver() OVERRIDE;
-
-  virtual void SetBitrateObserver(BitrateObserver* observer,
-                                  const uint32_t start_bitrate,
-                                  const uint32_t min_bitrate,
-                                  const uint32_t max_bitrate) OVERRIDE;
-
-  virtual void RemoveBitrateObserver(BitrateObserver* observer) OVERRIDE;
-
-  virtual void EnforceMinBitrate(bool enforce_min_bitrate) OVERRIDE;
-
-  virtual void SetBweMinBitrate(uint32_t min_bitrate) OVERRIDE;
-
- private:
   // Called by BitrateObserver's direct from the RTCP module.
   void OnReceivedEstimatedBitrate(const uint32_t bitrate);
 
@@ -86,18 +84,32 @@
                                     const int number_of_packets,
                                     const uint32_t now_ms);
 
-  typedef std::multimap<uint32_t, ObserverConfiguration*> ObserverSortingMap;
-
-  BitrateObserverConfList::iterator
-      FindObserverConfigurationPair(const BitrateObserver* observer);
   void OnNetworkChanged(const uint32_t bitrate,
                         const uint8_t fraction_loss,  // 0 - 255.
-                        const uint32_t rtt);
+                        const uint32_t rtt)
+      EXCLUSIVE_LOCKS_REQUIRED(*critsect_);
+
+  void NormalRateAllocation(uint32_t bitrate,
+                            uint8_t fraction_loss,
+                            uint32_t rtt,
+                            uint32_t sum_min_bitrates)
+      EXCLUSIVE_LOCKS_REQUIRED(*critsect_);
+
+  void LowRateAllocation(uint32_t bitrate,
+                         uint8_t fraction_loss,
+                         uint32_t rtt,
+                         uint32_t sum_min_bitrates)
+      EXCLUSIVE_LOCKS_REQUIRED(*critsect_);
+
+  typedef std::multimap<uint32_t, ObserverConfiguration*> ObserverSortingMap;
+
+  BitrateObserverConfList::iterator FindObserverConfigurationPair(
+      const BitrateObserver* observer) EXCLUSIVE_LOCKS_REQUIRED(*critsect_);
 
   CriticalSectionWrapper* critsect_;
-  SendSideBandwidthEstimation bandwidth_estimation_;
-  BitrateObserverConfList bitrate_observers_;
-  scoped_ptr<LowRateStrategy> low_rate_strategy_;
+  SendSideBandwidthEstimation bandwidth_estimation_ GUARDED_BY(*critsect_);
+  BitrateObserverConfList bitrate_observers_ GUARDED_BY(*critsect_);
+  bool enforce_min_bitrate_ GUARDED_BY(*critsect_);
 };
 }  // namespace webrtc
 #endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_BITRATE_CONTROLLER_IMPL_H_
diff --git a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc
index e01ca40..a089590 100644
--- a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc
+++ b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc
@@ -17,8 +17,7 @@
 namespace webrtc {
 
 SendSideBandwidthEstimation::SendSideBandwidthEstimation()
-    : critsect_(CriticalSectionWrapper::CreateCriticalSection()),
-      accumulate_lost_packets_Q8_(0),
+    : accumulate_lost_packets_Q8_(0),
       accumulate_expected_packets_(0),
       bitrate_(0),
       min_bitrate_configured_(0),
@@ -27,21 +26,16 @@
       last_round_trip_time_(0),
       bwe_incoming_(0),
       time_last_increase_(0),
-      time_last_decrease_(0) {
-}
+      time_last_decrease_(0) {}
 
-SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {
-    delete critsect_;
-}
+SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {}
 
 void SendSideBandwidthEstimation::SetSendBitrate(const uint32_t bitrate) {
-  CriticalSectionScoped cs(critsect_);
   bitrate_ = bitrate;
 }
 
 void SendSideBandwidthEstimation::SetMinMaxBitrate(const uint32_t min_bitrate,
                                                    const uint32_t max_bitrate) {
-  CriticalSectionScoped cs(critsect_);
   min_bitrate_configured_ = min_bitrate;
   if (max_bitrate == 0) {
     // no max configured use 1Gbit/s
@@ -52,7 +46,6 @@
 }
 
 void SendSideBandwidthEstimation::SetMinBitrate(uint32_t min_bitrate) {
-  CriticalSectionScoped cs(critsect_);
   min_bitrate_configured_ = min_bitrate;
 }
 
@@ -62,8 +55,6 @@
     uint8_t* fraction_lost,
     uint16_t* rtt) {
   *new_bitrate = 0;
-  CriticalSectionScoped cs(critsect_);
-
   bwe_incoming_ = bandwidth;
 
   if (bitrate_ == 0) {
@@ -86,8 +77,6 @@
     const uint32_t now_ms,
     uint8_t* loss,
     uint32_t* new_bitrate) {
-  CriticalSectionScoped cs(critsect_);
-
   if (bitrate_ == 0) {
     // SendSideBandwidthEstimation off
     return false;
@@ -130,7 +119,6 @@
 
 bool SendSideBandwidthEstimation::AvailableBandwidth(
     uint32_t* bandwidth) const {
-  CriticalSectionScoped cs(critsect_);
   if (bitrate_ == 0) {
     return false;
   }
diff --git a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h
index 1d4786c..79b9e2d 100644
--- a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h
+++ b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h
@@ -56,8 +56,6 @@
   enum { kLimitNumPackets = 20 };
   enum { kAvgPacketSizeBytes = 1000 };
 
-  CriticalSectionWrapper* critsect_;
-
   // incoming filters
   int accumulate_lost_packets_Q8_;
   int accumulate_expected_packets_;