Adding field trial to force target level percentile in NetEQ.

Bug: webrtc:9822
Change-Id: I636f75de10851729825311ee5783e836f3b583cd
Reviewed-on: https://webrtc-review.googlesource.com/c/101220
Commit-Queue: Minyue Li <minyue@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24975}
diff --git a/modules/audio_coding/neteq/delay_manager_unittest.cc b/modules/audio_coding/neteq/delay_manager_unittest.cc
index 6afed66..e4e865f 100644
--- a/modules/audio_coding/neteq/delay_manager_unittest.cc
+++ b/modules/audio_coding/neteq/delay_manager_unittest.cc
@@ -15,6 +15,7 @@
 #include <math.h>
 
 #include "modules/audio_coding/neteq/mock/mock_delay_peak_detector.h"
+#include "test/field_trial.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -34,11 +35,12 @@
   DelayManagerTest();
   virtual void SetUp();
   virtual void TearDown();
+  void RecreateDelayManager();
   void SetPacketAudioLength(int lengt_ms);
   void InsertNextPacket();
   void IncreaseTime(int inc_ms);
 
-  DelayManager* dm_;
+  std::unique_ptr<DelayManager> dm_;
   TickTimer tick_timer_;
   MockDelayPeakDetector detector_;
   uint16_t seq_no_;
@@ -46,11 +48,15 @@
 };
 
 DelayManagerTest::DelayManagerTest()
-    : dm_(NULL), detector_(&tick_timer_), seq_no_(0x1234), ts_(0x12345678) {}
+    : dm_(nullptr), detector_(&tick_timer_), seq_no_(0x1234), ts_(0x12345678) {}
 
 void DelayManagerTest::SetUp() {
+  RecreateDelayManager();
+}
+
+void DelayManagerTest::RecreateDelayManager() {
   EXPECT_CALL(detector_, Reset()).Times(1);
-  dm_ = new DelayManager(kMaxNumberOfPackets, &detector_, &tick_timer_);
+  dm_.reset(new DelayManager(kMaxNumberOfPackets, &detector_, &tick_timer_));
 }
 
 void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
@@ -71,7 +77,6 @@
 }
 void DelayManagerTest::TearDown() {
   EXPECT_CALL(detector_, Die());
-  delete dm_;
 }
 
 TEST_F(DelayManagerTest, CreateAndDestroy) {
@@ -326,6 +331,61 @@
   EXPECT_FALSE(dm_->SetMaximumDelay(60));
 }
 
+TEST_F(DelayManagerTest, TargetDelayGreaterThanOne) {
+  test::ScopedFieldTrials field_trial(
+      "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-0/");
+  RecreateDelayManager();
+  EXPECT_EQ(absl::make_optional<int>(1 << 30),
+            dm_->forced_limit_probability_for_test());
+
+  SetPacketAudioLength(kFrameSizeMs);
+  // First packet arrival.
+  InsertNextPacket();
+  // Advance time by one frame size.
+  IncreaseTime(kFrameSizeMs);
+  // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to 1 packet.
+  EXPECT_CALL(detector_, Update(1, 1)).WillOnce(Return(false));
+  InsertNextPacket();
+  constexpr int kExpectedTarget = 1;
+  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());  // In Q8.
+}
+
+TEST_F(DelayManagerTest, ForcedTargetDelayPercentile) {
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-95/");
+    RecreateDelayManager();
+    EXPECT_EQ(absl::make_optional<int>(53687091),
+              dm_->forced_limit_probability_for_test());  // 1/20 in Q30
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/");
+    RecreateDelayManager();
+    EXPECT_EQ(absl::make_optional<int>(536871),
+              dm_->forced_limit_probability_for_test());  // 1/2000 in Q30
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Disabled/");
+    RecreateDelayManager();
+    EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled--1/");
+    EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-100.1/");
+    RecreateDelayManager();
+    EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
+  }
+}
+
 // Test if the histogram is stretched correctly if the packet size is decreased.
 TEST(DelayManagerIATScalingTest, StretchTest) {
   using IATVector = DelayManager::IATVector;
@@ -437,4 +497,5 @@
   scaled_iat = DelayManager::ScaleHistogram(iat, 20, 60);
   EXPECT_EQ(scaled_iat, expected_result);
 }
+
 }  // namespace webrtc