Add ability to cap the video jitter estimate to a max value.

Bug: webrtc:10572
Change-Id: I21112824dc02afa71db61bb8c2f02723e8b325b6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/133963
Commit-Queue: Michael Horowitz <mhoro@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27744}
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
index c846477..a327c1b 100644
--- a/modules/video_coding/frame_buffer2.cc
+++ b/modules/video_coding/frame_buffer2.cc
@@ -299,10 +299,14 @@
     }
 
     float rtt_mult = protection_mode_ == kProtectionNackFEC ? 0.0 : 1.0;
+    float jitter_est_cap_ms = 300.0;
     if (RttMultExperiment::RttMultEnabled()) {
       rtt_mult = RttMultExperiment::GetRttMultValue();
+      // TODO(mhoro): add RttMultExperiment::GetJitterEstCapValue();
+      jitter_est_cap_ms = 300.0;
     }
-    timing_->SetJitterDelay(jitter_estimator_->GetJitterEstimate(rtt_mult));
+    timing_->SetJitterDelay(
+        jitter_estimator_->GetJitterEstimate(rtt_mult, jitter_est_cap_ms));
     timing_->UpdateCurrentDelay(render_time_ms, now_ms);
   } else {
     if (RttMultExperiment::RttMultEnabled() || add_rtt_to_playout_delay_)
diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc
index 0fb2572..fe0123e 100644
--- a/modules/video_coding/frame_buffer2_unittest.cc
+++ b/modules/video_coding/frame_buffer2_unittest.cc
@@ -83,7 +83,8 @@
                void(int64_t frameDelayMs,
                     uint32_t frameSizeBytes,
                     bool incompleteFrame));
-  MOCK_METHOD1(GetJitterEstimate, int(double rttMultiplier));
+  MOCK_METHOD2(GetJitterEstimate,
+               int(double rttMultiplier, double jitterEstCapMs));
 };
 
 class FrameObjectFake : public EncodedFrame {
@@ -403,12 +404,12 @@
   uint16_t pid = Rand();
   uint32_t ts = Rand();
 
-  EXPECT_CALL(jitter_estimator_, GetJitterEstimate(1.0));
+  EXPECT_CALL(jitter_estimator_, GetJitterEstimate(1.0, 300.0));
   InsertFrame(pid, 0, ts, false, true);
   ExtractFrame();
 
   buffer_->SetProtectionMode(kProtectionNackFEC);
-  EXPECT_CALL(jitter_estimator_, GetJitterEstimate(0.0));
+  EXPECT_CALL(jitter_estimator_, GetJitterEstimate(0.0, 300.0));
   InsertFrame(pid + 1, 0, ts, false, true);
   ExtractFrame();
 }
diff --git a/modules/video_coding/jitter_buffer.cc b/modules/video_coding/jitter_buffer.cc
index 3d3b967..7a7f632 100644
--- a/modules/video_coding/jitter_buffer.cc
+++ b/modules/video_coding/jitter_buffer.cc
@@ -582,7 +582,8 @@
 uint32_t VCMJitterBuffer::EstimatedJitterMs() {
   rtc::CritScope cs(&crit_sect_);
   const double rtt_mult = 1.0f;
-  return jitter_estimate_.GetJitterEstimate(rtt_mult);
+  const double jitter_est_cap_ms = 300.0f;
+  return jitter_estimate_.GetJitterEstimate(rtt_mult, jitter_est_cap_ms);
 }
 
 void VCMJitterBuffer::SetNackSettings(size_t max_nack_list_size,
diff --git a/modules/video_coding/jitter_estimator.cc b/modules/video_coding/jitter_estimator.cc
index e380f9e..a4fb696 100644
--- a/modules/video_coding/jitter_estimator.cc
+++ b/modules/video_coding/jitter_estimator.cc
@@ -384,7 +384,8 @@
 
 // Returns the current filtered estimate if available,
 // otherwise tries to calculate an estimate.
-int VCMJitterEstimator::GetJitterEstimate(double rttMultiplier) {
+int VCMJitterEstimator::GetJitterEstimate(double rttMultiplier,
+                                          double jitterEstCapMs) {
   double jitterMS = CalculateEstimate() + OPERATING_SYSTEM_JITTER;
   uint64_t now = clock_->TimeInMicroseconds();
 
@@ -393,8 +394,10 @@
 
   if (_filterJitterEstimate > jitterMS)
     jitterMS = _filterJitterEstimate;
-  if (_nackCount >= _nackLimit)
+  if (_nackCount >= _nackLimit) {
     jitterMS += _rttFilter.RttMs() * rttMultiplier;
+    jitterMS = std::min(jitterMS, jitterEstCapMs);
+  }
 
   static const double kJitterScaleLowThreshold = 5.0;
   static const double kJitterScaleHighThreshold = 10.0;
diff --git a/modules/video_coding/jitter_estimator.h b/modules/video_coding/jitter_estimator.h
index 8bffa05..60c1780 100644
--- a/modules/video_coding/jitter_estimator.h
+++ b/modules/video_coding/jitter_estimator.h
@@ -47,7 +47,7 @@
   //          - rttMultiplier  : RTT param multiplier (when applicable).
   //
   // Return value              : Jitter estimate in milliseconds.
-  virtual int GetJitterEstimate(double rttMultiplier);
+  virtual int GetJitterEstimate(double rttMultiplier, double jitterEstCapMs);
 
   // Updates the nack counter.
   void FrameNacked();
diff --git a/modules/video_coding/jitter_estimator_tests.cc b/modules/video_coding/jitter_estimator_tests.cc
index fba2bf7..3f5221a 100644
--- a/modules/video_coding/jitter_estimator_tests.cc
+++ b/modules/video_coding/jitter_estimator_tests.cc
@@ -67,7 +67,7 @@
     estimator_->UpdateEstimate(gen.Delay(), gen.FrameSize());
     AdvanceClock(time_delta_us);
     if (i > 2)
-      EXPECT_EQ(estimator_->GetJitterEstimate(0), 0);
+      EXPECT_EQ(estimator_->GetJitterEstimate(0, 300), 0);
     gen.Advance();
   }
 }
@@ -98,7 +98,7 @@
       estimator_->UpdateEstimate(gen.Delay(), gen.FrameSize());
       AdvanceClock(time_delta_us);
       context.percentiles.Add(
-          static_cast<uint32_t>(estimator_->GetJitterEstimate(0)));
+          static_cast<uint32_t>(estimator_->GetJitterEstimate(0, 300)));
       gen.Advance();
     }
   }