Add max limit of number for overuses. When limit is reached always apply the rampup delay.

BUG=1577
R=mflodman@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@6451 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/video_engine/overuse_frame_detector.cc b/webrtc/video_engine/overuse_frame_detector.cc
index ac9519f..764c258 100644
--- a/webrtc/video_engine/overuse_frame_detector.cc
+++ b/webrtc/video_engine/overuse_frame_detector.cc
@@ -42,8 +42,8 @@
 // Expontential back-off factor, to prevent annoying up-down behaviour.
 const double kRampUpBackoffFactor = 2.0;
 
-// The initial average encode time (set to a fairly small value).
-const float kInitialAvgEncodeTimeMs = 5.0f;
+// Max number of overuses detected before always applying the rampup delay.
+const int kMaxOverusesBeforeApplyRampupDelay = 7;
 
 // The maximum exponent to use in VCMExpFilter.
 const float kSampleDiffMs = 33.0f;
@@ -115,6 +115,7 @@
  public:
   EncodeTimeAvg()
       : kWeightFactor(0.5f),
+        kInitialAvgEncodeTimeMs(5.0f),
         filtered_encode_time_ms_(new VCMExpFilter(kWeightFactor)) {
     filtered_encode_time_ms_->Apply(1.0f, kInitialAvgEncodeTimeMs);
   }
@@ -132,6 +133,7 @@
 
  private:
   const float kWeightFactor;
+  const float kInitialAvgEncodeTimeMs;
   scoped_ptr<VCMExpFilter> filtered_encode_time_ms_;
 };
 
@@ -378,6 +380,7 @@
       last_capture_time_(0),
       last_overuse_time_(0),
       checks_above_threshold_(0),
+      num_overuse_detections_(0),
       last_rampup_time_(0),
       in_quick_rampup_(false),
       current_rampup_delay_ms_(kStandardRampUpDelayMs),
@@ -514,7 +517,8 @@
     // back and forth between this load, the system doesn't seem to handle it.
     bool check_for_backoff = last_rampup_time_ > last_overuse_time_;
     if (check_for_backoff) {
-      if (now - last_rampup_time_ < kStandardRampUpDelayMs) {
+      if (now - last_rampup_time_ < kStandardRampUpDelayMs ||
+          num_overuse_detections_ > kMaxOverusesBeforeApplyRampupDelay) {
         // Going up was not ok for very long, back off.
         current_rampup_delay_ms_ *= kRampUpBackoffFactor;
         if (current_rampup_delay_ms_ > kMaxRampUpDelayMs)
@@ -528,6 +532,7 @@
     last_overuse_time_ = now;
     in_quick_rampup_ = false;
     checks_above_threshold_ = 0;
+    ++num_overuse_detections_;
 
     if (observer_ != NULL)
       observer_->OveruseDetected();
@@ -541,11 +546,12 @@
 
   int rampup_delay =
       in_quick_rampup_ ? kQuickRampUpDelayMs : current_rampup_delay_ms_;
-  LOG(LS_INFO) << " Frame stats: capture avg: " << capture_deltas_.Mean()
-               << " capture stddev " << capture_deltas_.StdDev()
-               << " encode usage " << encode_usage_->Value()
-               << " encode rsd " << encode_rsd_->Value()
-               << " rampup delay " << rampup_delay;
+  LOG(LS_VERBOSE) << " Frame stats: capture avg: " << capture_deltas_.Mean()
+                  << " capture stddev " << capture_deltas_.StdDev()
+                  << " encode usage " << encode_usage_->Value()
+                  << " encode rsd " << encode_rsd_->Value()
+                  << " overuse detections " << num_overuse_detections_
+                  << " rampup delay " << rampup_delay;
   return 0;
 }
 
diff --git a/webrtc/video_engine/overuse_frame_detector.h b/webrtc/video_engine/overuse_frame_detector.h
index ef6d6ab..efd23dc 100644
--- a/webrtc/video_engine/overuse_frame_detector.h
+++ b/webrtc/video_engine/overuse_frame_detector.h
@@ -124,6 +124,7 @@
 
   int64_t last_overuse_time_;
   int checks_above_threshold_;
+  int num_overuse_detections_;
 
   int64_t last_rampup_time_;
   bool in_quick_rampup_;