blob: 9678151dfa8e3b2309bb6a9c3b73194c93edbcd2 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11// Unit tests for DelayManager class.
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "modules/audio_coding/neteq/delay_manager.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000014
15#include <math.h>
16
Mirko Bonadei317a1f02019-09-17 17:06:18 +020017#include <memory>
18
Jakob Ivarsson7dff9f32020-11-11 15:26:10 +010019#include "absl/types/optional.h"
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010020#include "modules/audio_coding/neteq/histogram.h"
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010021#include "modules/audio_coding/neteq/mock/mock_histogram.h"
Jakob Ivarsson44507082019-03-05 16:59:03 +010022#include "modules/audio_coding/neteq/mock/mock_statistics_calculator.h"
Ruslan Burakov4a68fb92019-02-13 14:25:39 +010023#include "rtc_base/checks.h"
Minyue Li002fbb82018-10-04 11:31:03 +020024#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "test/gmock.h"
26#include "test/gtest.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000027
28namespace webrtc {
29
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010030namespace {
31constexpr int kMaxNumberOfPackets = 240;
32constexpr int kMinDelayMs = 0;
Jakob Ivarsson7dff9f32020-11-11 15:26:10 +010033constexpr int kMaxHistoryMs = 2000;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010034constexpr int kTimeStepMs = 10;
35constexpr int kFs = 8000;
36constexpr int kFrameSizeMs = 20;
37constexpr int kTsIncrement = kFrameSizeMs * kFs / 1000;
38constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
39constexpr int kDefaultHistogramQuantile = 1020054733;
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020040constexpr int kNumBuckets = 100;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010041constexpr int kForgetFactor = 32745;
42} // namespace
43
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000044class DelayManagerTest : public ::testing::Test {
45 protected:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000046 DelayManagerTest();
47 virtual void SetUp();
Minyue Li002fbb82018-10-04 11:31:03 +020048 void RecreateDelayManager();
Ivo Creusen53a31f72019-10-24 15:20:39 +020049 absl::optional<int> InsertNextPacket();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000050 void IncreaseTime(int inc_ms);
51
Minyue Li002fbb82018-10-04 11:31:03 +020052 std::unique_ptr<DelayManager> dm_;
henrik.lundinf3933702016-04-28 01:53:52 -070053 TickTimer tick_timer_;
Jakob Ivarsson44507082019-03-05 16:59:03 +010054 MockStatisticsCalculator stats_;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010055 MockHistogram* mock_histogram_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000056 uint32_t ts_;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010057 bool use_mock_histogram_ = false;
Jakob Ivarsson7dff9f32020-11-11 15:26:10 +010058 absl::optional<int> resample_interval_ms_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000059};
60
61DelayManagerTest::DelayManagerTest()
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010062 : dm_(nullptr),
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010063 ts_(0x12345678) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000064
65void DelayManagerTest::SetUp() {
Minyue Li002fbb82018-10-04 11:31:03 +020066 RecreateDelayManager();
67}
68
69void DelayManagerTest::RecreateDelayManager() {
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010070 if (use_mock_histogram_) {
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020071 mock_histogram_ = new MockHistogram(kNumBuckets, kForgetFactor);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010072 std::unique_ptr<Histogram> histogram(mock_histogram_);
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020073 dm_ = std::make_unique<DelayManager>(kMaxNumberOfPackets, kMinDelayMs,
74 kDefaultHistogramQuantile,
Jakob Ivarsson7dff9f32020-11-11 15:26:10 +010075 resample_interval_ms_, kMaxHistoryMs,
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020076 &tick_timer_, std::move(histogram));
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010077 } else {
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020078 dm_ = DelayManager::Create(kMaxNumberOfPackets, kMinDelayMs, &tick_timer_);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010079 }
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020080 dm_->SetPacketAudioLength(kFrameSizeMs);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000081}
82
Ivo Creusen53a31f72019-10-24 15:20:39 +020083absl::optional<int> DelayManagerTest::InsertNextPacket() {
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020084 auto relative_delay = dm_->Update(ts_, kFs);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000085 ts_ += kTsIncrement;
Ivo Creusen53a31f72019-10-24 15:20:39 +020086 return relative_delay;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000087}
88
89void DelayManagerTest::IncreaseTime(int inc_ms) {
90 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -070091 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000092 }
93}
Ruslan Burakov1e193fa2019-05-15 14:31:22 +020094
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000095TEST_F(DelayManagerTest, CreateAndDestroy) {
96 // Nothing to do here. The test fixture creates and destroys the DelayManager
97 // object.
98}
99
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000100TEST_F(DelayManagerTest, UpdateNormal) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000101 // First packet arrival.
102 InsertNextPacket();
103 // Advance time by one frame size.
104 IncreaseTime(kFrameSizeMs);
105 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000106 InsertNextPacket();
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200107 EXPECT_EQ(20, dm_->TargetDelayMs());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000108}
109
110TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000111 // First packet arrival.
112 InsertNextPacket();
113 // Advance time by two frame size.
114 IncreaseTime(2 * kFrameSizeMs);
115 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000116 InsertNextPacket();
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200117 EXPECT_EQ(40, dm_->TargetDelayMs());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000118}
119
Niels Möller18f1adc2018-08-23 08:40:41 +0200120TEST_F(DelayManagerTest, MaxDelay) {
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200121 const int kExpectedTarget = 5 * kFrameSizeMs;
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000122 // First packet arrival.
123 InsertNextPacket();
124 // Second packet arrival.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200125 IncreaseTime(kExpectedTarget);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000126 InsertNextPacket();
127
128 // No limit is set.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200129 EXPECT_EQ(kExpectedTarget, dm_->TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000130
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200131 const int kMaxDelayMs = 3 * kFrameSizeMs;
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000132 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200133 IncreaseTime(kFrameSizeMs);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000134 InsertNextPacket();
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200135 EXPECT_EQ(kMaxDelayMs, dm_->TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000136
137 // Target level at least should be one packet.
138 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
139}
140
Niels Möller18f1adc2018-08-23 08:40:41 +0200141TEST_F(DelayManagerTest, MinDelay) {
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200142 const int kExpectedTarget = 5 * kFrameSizeMs;
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000143 // First packet arrival.
144 InsertNextPacket();
145 // Second packet arrival.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200146 IncreaseTime(kExpectedTarget);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000147 InsertNextPacket();
148
149 // No limit is applied.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200150 EXPECT_EQ(kExpectedTarget, dm_->TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000151
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200152 int kMinDelayMs = 7 * kFrameSizeMs;
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000153 dm_->SetMinimumDelay(kMinDelayMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200154 IncreaseTime(kFrameSizeMs);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000155 InsertNextPacket();
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200156 EXPECT_EQ(kMinDelayMs, dm_->TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000157}
158
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100159TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100160 // Base minimum delay should be between [0, 10000] milliseconds.
161 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
162 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
163 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
164
165 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
166 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
167}
168
169TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100170 constexpr int kBaseMinimumDelayMs = 100;
171 constexpr int kMinimumDelayMs = 200;
172
173 // Base minimum delay sets lower bound on minimum. That is why when base
174 // minimum delay is lower than minimum delay we use minimum delay.
175 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
176
177 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
178 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
179 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
180}
181
182TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100183 constexpr int kBaseMinimumDelayMs = 70;
184 constexpr int kMinimumDelayMs = 30;
185
186 // Base minimum delay sets lower bound on minimum. That is why when base
187 // minimum delay is greater than minimum delay we use base minimum delay.
188 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
189
190 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
191 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
192 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
193}
194
195TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100196 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
197 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100198 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100199 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
200
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100201 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
202
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100203 // Base minimum delay is greater than minimum delay, that is why we clamp
204 // it to current the highest possible value which is maximum delay.
205 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
206 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100207 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
208 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100209
210 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
211 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
212
213 // Unset maximum value.
214 EXPECT_TRUE(dm_->SetMaximumDelay(0));
215
216 // With maximum value unset, the highest possible value now is 75% of
217 // currently possible maximum buffer size.
218 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
219}
220
221TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100222 constexpr int kMaximumDelayMs = 400;
223 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
224 constexpr int kMinimumDelayMs = 20;
225
226 // Base minimum delay is greater than minimum delay, that is why we clamp
227 // it to current the highest possible value which is kMaximumDelayMs.
228 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
229 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
230 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
231
232 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
233 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
234 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
235 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
236}
237
238TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100239 constexpr int kMaximumDelayMs = 400;
240 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
241 constexpr int kMinimumDelayMs = 20;
242
243 // Base minimum delay is greater than minimum delay, and lower than maximum
244 // delays that is why it is used.
245 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
246 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
247
248 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
249 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
250 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
251 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
252}
253
254TEST_F(DelayManagerTest, MinimumDelayMemorization) {
255 // Check that when we increase base minimum delay to value higher than
256 // minimum delay then minimum delay is still memorized. This allows to
257 // restore effective minimum delay to memorized minimum delay value when we
258 // decrease base minimum delay.
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100259 constexpr int kBaseMinimumDelayMsLow = 10;
260 constexpr int kMinimumDelayMs = 20;
261 constexpr int kBaseMinimumDelayMsHigh = 30;
262
263 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
264 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
265 // Minimum delay is used as it is higher than base minimum delay.
266 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
267
268 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
269 // Base minimum delay is used as it is now higher than minimum delay.
270 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
271 kBaseMinimumDelayMsHigh);
272
273 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
274 // Check that minimum delay is memorized and is used again.
275 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
276}
277
278TEST_F(DelayManagerTest, BaseMinimumDelay) {
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200279 const int kExpectedTarget = 5 * kFrameSizeMs;
Jakob Ivarssonb1ae5cc2020-10-06 15:37:28 +0000280 // First packet arrival.
281 InsertNextPacket();
282 // Second packet arrival.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200283 IncreaseTime(kExpectedTarget);
Jakob Ivarssonb1ae5cc2020-10-06 15:37:28 +0000284 InsertNextPacket();
285
286 // No limit is applied.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200287 EXPECT_EQ(kExpectedTarget, dm_->TargetDelayMs());
Jakob Ivarssonff9f6462020-10-07 12:46:42 +0000288
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200289 constexpr int kBaseMinimumDelayMs = 7 * kFrameSizeMs;
Jakob Ivarssonff9f6462020-10-07 12:46:42 +0000290 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
291 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
292
293 IncreaseTime(kFrameSizeMs);
294 InsertNextPacket();
295 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200296 EXPECT_EQ(kBaseMinimumDelayMs, dm_->TargetDelayMs());
Jakob Ivarssonff9f6462020-10-07 12:46:42 +0000297}
298
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200299TEST_F(DelayManagerTest, BaseMinimumDelayAffectsTargetDelay) {
Jakob Ivarssonff9f6462020-10-07 12:46:42 +0000300 const int kExpectedTarget = 5;
301 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
Jakob Ivarssonff9f6462020-10-07 12:46:42 +0000302 // First packet arrival.
303 InsertNextPacket();
304 // Second packet arrival.
305 IncreaseTime(kTimeIncrement);
306 InsertNextPacket();
307
308 // No limit is applied.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200309 EXPECT_EQ(kTimeIncrement, dm_->TargetDelayMs());
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100310
311 // Minimum delay is lower than base minimum delay, that is why base minimum
312 // delay is used to calculate target level.
313 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
314 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
315
316 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
317 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
318
319 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
320 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
321 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
322 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
323
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200324 IncreaseTime(kFrameSizeMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100325 InsertNextPacket();
326 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200327 EXPECT_EQ(kBaseMinimumDelayMs, dm_->TargetDelayMs());
henrik.lundinb8c55b12017-05-10 07:38:01 -0700328}
329
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000330TEST_F(DelayManagerTest, Failures) {
331 // Wrong sample rate.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200332 EXPECT_EQ(absl::nullopt, dm_->Update(0, -1));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000333 // Wrong packet size.
334 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
335 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000336
337 // Minimum delay higher than a maximum delay is not accepted.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200338 EXPECT_TRUE(dm_->SetMaximumDelay(20));
339 EXPECT_FALSE(dm_->SetMinimumDelay(40));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000340
341 // Maximum delay less than minimum delay is not accepted.
342 EXPECT_TRUE(dm_->SetMaximumDelay(100));
343 EXPECT_TRUE(dm_->SetMinimumDelay(80));
344 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000345}
346
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100347TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
348 {
349 test::ScopedFieldTrials field_trial(
350 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
351 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100352 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200353 EXPECT_EQ(
354 32702,
355 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
356 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100357 }
358 {
359 test::ScopedFieldTrials field_trial(
360 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
361 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100362 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200363 EXPECT_EQ(
364 32702,
365 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
366 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100367 }
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200368 // Test parameter for new call start adaptation.
369 {
370 test::ScopedFieldTrials field_trial(
371 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1/");
372 RecreateDelayManager();
373 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.0);
374 }
375 {
376 test::ScopedFieldTrials field_trial(
377 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1.5/");
378 RecreateDelayManager();
379 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.5);
380 }
381 {
382 test::ScopedFieldTrials field_trial(
383 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-0.5/");
384 RecreateDelayManager();
385 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100386 }
387}
388
Jakob Ivarssonbd5874a2020-01-07 17:07:40 +0100389TEST_F(DelayManagerTest, RelativeArrivalDelay) {
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100390 use_mock_histogram_ = true;
391 RecreateDelayManager();
392
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100393 InsertNextPacket();
394
395 IncreaseTime(kFrameSizeMs);
396 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
397 InsertNextPacket();
398
399 IncreaseTime(2 * kFrameSizeMs);
400 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200401 dm_->Update(ts_, kFs);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100402
403 IncreaseTime(2 * kFrameSizeMs);
404 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200405 dm_->Update(ts_ + kTsIncrement, kFs);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100406
407 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200408 dm_->Update(ts_, kFs);
409}
410
411TEST_F(DelayManagerTest, ReorderedPackets) {
412 use_mock_histogram_ = true;
413 RecreateDelayManager();
414
415 // Insert first packet.
416 InsertNextPacket();
417
418 // Insert reordered packet.
419 EXPECT_CALL(*mock_histogram_, Add(4));
420 dm_->Update(ts_ - 5 * kTsIncrement, kFs);
421
422 // Insert another reordered packet.
423 EXPECT_CALL(*mock_histogram_, Add(1));
424 dm_->Update(ts_ - 2 * kTsIncrement, kFs);
425
426 // Insert the next packet in order and verify that the relative delay is
427 // estimated based on the first inserted packet.
428 IncreaseTime(4 * kFrameSizeMs);
429 EXPECT_CALL(*mock_histogram_, Add(3));
430 InsertNextPacket();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100431}
432
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200433TEST_F(DelayManagerTest, MaxDelayHistory) {
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200434 use_mock_histogram_ = true;
435 RecreateDelayManager();
436
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200437 InsertNextPacket();
438
439 // Insert 20 ms iat delay in the delay history.
440 IncreaseTime(2 * kFrameSizeMs);
441 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
442 InsertNextPacket();
443
444 // Insert next packet with a timestamp difference larger than maximum history
445 // size. This removes the previously inserted iat delay from the history.
446 constexpr int kMaxHistoryMs = 2000;
447 IncreaseTime(kMaxHistoryMs + kFrameSizeMs);
448 ts_ += kFs * kMaxHistoryMs / 1000;
449 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200450 dm_->Update(ts_, kFs);
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200451}
452
Jakob Ivarsson44507082019-03-05 16:59:03 +0100453TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
Ivo Creusen53a31f72019-10-24 15:20:39 +0200454 EXPECT_EQ(absl::nullopt, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100455 IncreaseTime(kFrameSizeMs);
Ivo Creusen53a31f72019-10-24 15:20:39 +0200456 EXPECT_EQ(0, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100457 IncreaseTime(2 * kFrameSizeMs);
Ivo Creusen53a31f72019-10-24 15:20:39 +0200458
459 EXPECT_EQ(20, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100460}
461
Jakob Ivarsson7dff9f32020-11-11 15:26:10 +0100462TEST_F(DelayManagerTest, ResamplePacketDelays) {
463 use_mock_histogram_ = true;
464 resample_interval_ms_ = 500;
465 RecreateDelayManager();
466
467 // The histogram should be updated once with the maximum delay observed for
468 // the following sequence of packets.
469 EXPECT_CALL(*mock_histogram_, Add(5)).Times(1);
470
471 EXPECT_EQ(absl::nullopt, InsertNextPacket());
472
473 IncreaseTime(kFrameSizeMs);
474 EXPECT_EQ(0, InsertNextPacket());
475 IncreaseTime(3 * kFrameSizeMs);
476 EXPECT_EQ(2 * kFrameSizeMs, InsertNextPacket());
477 IncreaseTime(4 * kFrameSizeMs);
478 EXPECT_EQ(5 * kFrameSizeMs, InsertNextPacket());
479
480 for (int i = 4; i >= 0; --i) {
481 EXPECT_EQ(i * kFrameSizeMs, InsertNextPacket());
482 }
483 for (int i = 0; i < *resample_interval_ms_ / kFrameSizeMs; ++i) {
484 IncreaseTime(kFrameSizeMs);
485 EXPECT_EQ(0, InsertNextPacket());
486 }
487}
488
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000489} // namespace webrtc