Revert "Make relative arrival delay mode default in NetEq delay manager."

This reverts commit 77c71d1488b1c821b2b3481f23a3264f1b1d37a5.

Reason for revert: breaking downstream projects

Original change's description:
> Make relative arrival delay mode default in NetEq delay manager.
> 
> Bug: webrtc:10333
> Change-Id: I9b1e0bec0b1813cf31259492f83eb2ca86a44d3f
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/150782
> Reviewed-by: Sebastian Jansson <srte@webrtc.org>
> Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
> Reviewed-by: Minyue Li <minyue@webrtc.org>
> Commit-Queue: Jakob Ivarsson <jakobi@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#29075}

TBR=henrik.lundin@webrtc.org,srte@webrtc.org,minyue@webrtc.org,jakobi@webrtc.org

Change-Id: I67c5b9c7a6e854d3aac379aa4d98bfeb5425d312
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: webrtc:10333
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151642
Reviewed-by: Alessio Bazzica <alessiob@webrtc.org>
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29078}
diff --git a/modules/audio_coding/neteq/delay_manager_unittest.cc b/modules/audio_coding/neteq/delay_manager_unittest.cc
index beb61b0..ab316e2 100644
--- a/modules/audio_coding/neteq/delay_manager_unittest.cc
+++ b/modules/audio_coding/neteq/delay_manager_unittest.cc
@@ -62,7 +62,7 @@
   bool enable_rtx_handling_ = false;
   bool use_mock_histogram_ = false;
   DelayManager::HistogramMode histogram_mode_ =
-      DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
+      DelayManager::HistogramMode::INTER_ARRIVAL_TIME;
 };
 
 DelayManagerTest::DelayManagerTest()
@@ -143,6 +143,10 @@
   // 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, and (base) target level equal to 1 as well.
+  // Return false to indicate no peaks found.
+  EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
   InsertNextPacket();
   EXPECT_EQ(1 << 8, dm_->TargetLevel());  // In Q8.
   EXPECT_EQ(1, dm_->base_target_level());
@@ -162,6 +166,10 @@
   // Advance time by two frame size.
   IncreaseTime(2 * kFrameSizeMs);
   // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to 1 packet, and (base) target level equal to 1 as well.
+  // Return false to indicate no peaks found.
+  EXPECT_CALL(detector_, Update(2, false, 2)).WillOnce(Return(false));
   InsertNextPacket();
   EXPECT_EQ(2 << 8, dm_->TargetLevel());  // In Q8.
   EXPECT_EQ(2, dm_->base_target_level());
@@ -174,6 +182,51 @@
   EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
 }
 
+TEST_F(DelayManagerTest, UpdatePeakFound) {
+  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, and (base) target level equal to 1 as well.
+  // Return true to indicate that peaks are found. Let the peak height be 5.
+  EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(true));
+  EXPECT_CALL(detector_, MaxPeakHeight()).WillOnce(Return(5));
+  InsertNextPacket();
+  EXPECT_EQ(5 << 8, dm_->TargetLevel());
+  EXPECT_EQ(1, dm_->base_target_level());  // Base target level is w/o peaks.
+  int lower, higher;
+  dm_->BufferLimits(&lower, &higher);
+  // Expect |lower| to be 75% of target level, and |higher| to be target level.
+  EXPECT_EQ((5 << 8) * 3 / 4, lower);
+  EXPECT_EQ(5 << 8, higher);
+}
+
+TEST_F(DelayManagerTest, TargetDelay) {
+  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, and (base) target level equal to 1 as well.
+  // Return false to indicate no peaks found.
+  EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
+  InsertNextPacket();
+  const int kExpectedTarget = 1;
+  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());  // In Q8.
+  EXPECT_EQ(1, dm_->base_target_level());
+  int lower, higher;
+  dm_->BufferLimits(&lower, &higher);
+  // Expect |lower| to be 75% of base target level, and |higher| to be
+  // lower + 20 ms headroom.
+  EXPECT_EQ((1 << 8) * 3 / 4, lower);
+  EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
+}
+
 TEST_F(DelayManagerTest, MaxDelay) {
   const int kExpectedTarget = 5;
   const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
@@ -181,6 +234,12 @@
   // First packet arrival.
   InsertNextPacket();
   // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
+  EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(detector_, MaxPeakHeight())
+      .WillRepeatedly(Return(kExpectedTarget));
   IncreaseTime(kTimeIncrement);
   InsertNextPacket();
 
@@ -205,6 +264,12 @@
   // First packet arrival.
   InsertNextPacket();
   // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
+  EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(detector_, MaxPeakHeight())
+      .WillRepeatedly(Return(kExpectedTarget));
   IncreaseTime(kTimeIncrement);
   InsertNextPacket();
 
@@ -214,7 +279,7 @@
   int kMinDelayPackets = kExpectedTarget + 2;
   int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
   dm_->SetMinimumDelay(kMinDelayMs);
-  IncreaseTime(kFrameSizeMs);
+  IncreaseTime(kTimeIncrement);
   InsertNextPacket();
   EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
 }
@@ -354,6 +419,12 @@
   // First packet arrival.
   InsertNextPacket();
   // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
+  EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(detector_, MaxPeakHeight())
+      .WillRepeatedly(Return(kExpectedTarget));
   IncreaseTime(kTimeIncrement);
   InsertNextPacket();
 
@@ -365,7 +436,7 @@
   EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
   EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
 
-  IncreaseTime(kFrameSizeMs);
+  IncreaseTime(kTimeIncrement);
   InsertNextPacket();
   EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
   EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
@@ -378,6 +449,12 @@
   // First packet arrival.
   InsertNextPacket();
   // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to |kExpectedTarget|. Return true to indicate peaks found.
+  EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(detector_, MaxPeakHeight())
+      .WillRepeatedly(Return(kExpectedTarget));
   IncreaseTime(kTimeIncrement);
   InsertNextPacket();
 
@@ -397,12 +474,21 @@
   EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
   EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
 
-  IncreaseTime(kFrameSizeMs);
+  IncreaseTime(kTimeIncrement);
   InsertNextPacket();
   EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
   EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
 }
 
+TEST_F(DelayManagerTest, UpdateReorderedPacket) {
+  SetPacketAudioLength(kFrameSizeMs);
+  InsertNextPacket();
+
+  // Insert packet that was sent before the previous packet.
+  EXPECT_CALL(detector_, Update(_, true, _));
+  EXPECT_EQ(0, dm_->Update(seq_no_ - 1, ts_ - kFrameSizeMs, kFs));
+}
+
 TEST_F(DelayManagerTest, EnableRtxHandling) {
   enable_rtx_handling_ = true;
   use_mock_histogram_ = true;
@@ -414,23 +500,22 @@
   InsertNextPacket();
 
   // Insert reordered packet.
-  EXPECT_CALL(*mock_histogram_, Add(2));
+  EXPECT_CALL(*mock_histogram_, Add(3));
   EXPECT_EQ(0, dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs));
 
   // Insert another reordered packet.
-  EXPECT_CALL(*mock_histogram_, Add(1));
+  EXPECT_CALL(*mock_histogram_, Add(2));
   EXPECT_EQ(0, dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs));
 
   // Insert the next packet in order and verify that the inter-arrival time is
   // estimated correctly.
   IncreaseTime(kFrameSizeMs);
-  EXPECT_CALL(*mock_histogram_, Add(0));
+  EXPECT_CALL(*mock_histogram_, Add(1));
   InsertNextPacket();
 }
 
 // Tests that skipped sequence numbers (simulating empty packets) are handled
 // correctly.
-// TODO(jakobi): Make delay manager independent of sequence numbers.
 TEST_F(DelayManagerTest, EmptyPacketsReported) {
   SetPacketAudioLength(kFrameSizeMs);
   // First packet arrival.
@@ -447,13 +532,17 @@
   }
 
   // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to 1 packet, and (base) target level equal to 1 as well.
+  // Return false to indicate no peaks found.
+  EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
   InsertNextPacket();
 
   EXPECT_EQ(1 << 8, dm_->TargetLevel());  // In Q8.
 }
 
-// Same as above, but do not call RegisterEmptyPacket. Target level stays the
-// same.
+// Same as above, but do not call RegisterEmptyPacket. Observe the target level
+// increase dramatically.
 TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
   SetPacketAudioLength(kFrameSizeMs);
   // First packet arrival.
@@ -462,14 +551,19 @@
   // Advance time by one frame size.
   IncreaseTime(kFrameSizeMs);
 
-  // Advance the sequence number by 10, simulating that 10 empty packets were
+  // Advance the sequence number by 5, simulating that 5 empty packets were
   // received, but never inserted.
   seq_no_ += 10;
 
   // Second packet arrival.
+  // Expect detector update method to be called once with inter-arrival time
+  // equal to 1 packet, and (base) target level equal to 1 as well.
+  // Return false to indicate no peaks found.
+  EXPECT_CALL(detector_, Update(10, false, 10)).WillOnce(Return(false));
   InsertNextPacket();
 
-  EXPECT_EQ(1 << 8, dm_->TargetLevel());  // In Q8.
+  // Note 10 times higher target value.
+  EXPECT_EQ(10 * 1 << 8, dm_->TargetLevel());  // In Q8.
 }
 
 TEST_F(DelayManagerTest, Failures) {
@@ -489,6 +583,58 @@
   EXPECT_FALSE(dm_->SetMaximumDelay(60));
 }
 
+TEST_F(DelayManagerTest, TargetDelayGreaterThanOne) {
+  test::ScopedFieldTrials field_trial(
+      "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-0/");
+  RecreateDelayManager();
+  EXPECT_EQ(0, dm_->histogram_quantile());
+
+  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, false, 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(kDefaultHistogramQuantile, dm_->histogram_quantile());
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/");
+    RecreateDelayManager();
+    EXPECT_EQ(1073204953, dm_->histogram_quantile());  // 0.9995 in Q30.
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Disabled/");
+    RecreateDelayManager();
+    EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled--1/");
+    EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-100.1/");
+    RecreateDelayManager();
+    EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
+  }
+}
+
 TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
   {
     test::ScopedFieldTrials field_trial(
@@ -514,6 +660,49 @@
         dm_->histogram()->base_forget_factor_for_testing());  // 0.998 in Q15.
     EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
   }
+  {
+    // NetEqDelayHistogram should take precedence over
+    // NetEqForceTargetDelayPercentile.
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/"
+        "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
+    RecreateDelayManager();
+    EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
+              dm_->histogram_mode());
+    EXPECT_EQ(1030792151, dm_->histogram_quantile());  // 0.96 in Q30.
+    EXPECT_EQ(
+        32702,
+        dm_->histogram()->base_forget_factor_for_testing());  // 0.998 in Q15.
+    EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
+  }
+  {
+    // Invalid parameters.
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqDelayHistogram/Enabled-96/");
+    RecreateDelayManager();
+    EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
+              dm_->histogram_mode());
+    EXPECT_EQ(kDefaultHistogramQuantile,
+              dm_->histogram_quantile());  // 0.95 in Q30.
+    EXPECT_EQ(
+        kForgetFactor,
+        dm_->histogram()->base_forget_factor_for_testing());  // 0.9993 in Q15.
+    EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
+  }
+  {
+    test::ScopedFieldTrials field_trial(
+        "WebRTC-Audio-NetEqDelayHistogram/Disabled/");
+    RecreateDelayManager();
+    EXPECT_EQ(DelayManager::HistogramMode::INTER_ARRIVAL_TIME,
+              dm_->histogram_mode());
+    EXPECT_EQ(kDefaultHistogramQuantile,
+              dm_->histogram_quantile());  // 0.95 in Q30.
+    EXPECT_EQ(
+        kForgetFactor,
+        dm_->histogram()->base_forget_factor_for_testing());  // 0.9993 in Q15.
+    EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
+  }
+
   // Test parameter for new call start adaptation.
   {
     test::ScopedFieldTrials field_trial(