Add delay manager config options.

Add a new field trial with more flexible parsing and new options:
- Resample packet delays to only update histogram with maximum observed
 delay every X ms.
- Setting the maximum history size (in ms) used for calculating the
 relative arrival delay.

Legacy field trial used for configuration is maintained.

Bug: webrtc:10333
Change-Id: I35b004f5d8209c85b33cb49def3816db51650946
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/192789
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Commit-Queue: Jakob Ivarsson <jakobi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32591}
diff --git a/modules/audio_coding/neteq/delay_manager_unittest.cc b/modules/audio_coding/neteq/delay_manager_unittest.cc
index a6a38b6..9678151 100644
--- a/modules/audio_coding/neteq/delay_manager_unittest.cc
+++ b/modules/audio_coding/neteq/delay_manager_unittest.cc
@@ -16,6 +16,7 @@
 
 #include <memory>
 
+#include "absl/types/optional.h"
 #include "modules/audio_coding/neteq/histogram.h"
 #include "modules/audio_coding/neteq/mock/mock_histogram.h"
 #include "modules/audio_coding/neteq/mock/mock_statistics_calculator.h"
@@ -29,6 +30,7 @@
 namespace {
 constexpr int kMaxNumberOfPackets = 240;
 constexpr int kMinDelayMs = 0;
+constexpr int kMaxHistoryMs = 2000;
 constexpr int kTimeStepMs = 10;
 constexpr int kFs = 8000;
 constexpr int kFrameSizeMs = 20;
@@ -53,6 +55,7 @@
   MockHistogram* mock_histogram_;
   uint32_t ts_;
   bool use_mock_histogram_ = false;
+  absl::optional<int> resample_interval_ms_;
 };
 
 DelayManagerTest::DelayManagerTest()
@@ -69,6 +72,7 @@
     std::unique_ptr<Histogram> histogram(mock_histogram_);
     dm_ = std::make_unique<DelayManager>(kMaxNumberOfPackets, kMinDelayMs,
                                          kDefaultHistogramQuantile,
+                                         resample_interval_ms_, kMaxHistoryMs,
                                          &tick_timer_, std::move(histogram));
   } else {
     dm_ = DelayManager::Create(kMaxNumberOfPackets, kMinDelayMs, &tick_timer_);
@@ -455,4 +459,31 @@
   EXPECT_EQ(20, InsertNextPacket());
 }
 
+TEST_F(DelayManagerTest, ResamplePacketDelays) {
+  use_mock_histogram_ = true;
+  resample_interval_ms_ = 500;
+  RecreateDelayManager();
+
+  // The histogram should be updated once with the maximum delay observed for
+  // the following sequence of packets.
+  EXPECT_CALL(*mock_histogram_, Add(5)).Times(1);
+
+  EXPECT_EQ(absl::nullopt, InsertNextPacket());
+
+  IncreaseTime(kFrameSizeMs);
+  EXPECT_EQ(0, InsertNextPacket());
+  IncreaseTime(3 * kFrameSizeMs);
+  EXPECT_EQ(2 * kFrameSizeMs, InsertNextPacket());
+  IncreaseTime(4 * kFrameSizeMs);
+  EXPECT_EQ(5 * kFrameSizeMs, InsertNextPacket());
+
+  for (int i = 4; i >= 0; --i) {
+    EXPECT_EQ(i * kFrameSizeMs, InsertNextPacket());
+  }
+  for (int i = 0; i < *resample_interval_ms_ / kFrameSizeMs; ++i) {
+    IncreaseTime(kFrameSizeMs);
+    EXPECT_EQ(0, InsertNextPacket());
+  }
+}
+
 }  // namespace webrtc