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