blob: d60dbeb7552e87f5760b8afc50ed2ccd0272f96f [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 Ivarsson1eb3d7e2019-02-21 15:42:31 +010019#include "modules/audio_coding/neteq/histogram.h"
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010020#include "modules/audio_coding/neteq/mock/mock_histogram.h"
Jakob Ivarsson44507082019-03-05 16:59:03 +010021#include "modules/audio_coding/neteq/mock/mock_statistics_calculator.h"
Ruslan Burakov4a68fb92019-02-13 14:25:39 +010022#include "rtc_base/checks.h"
Minyue Li002fbb82018-10-04 11:31:03 +020023#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "test/gmock.h"
25#include "test/gtest.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000026
27namespace webrtc {
28
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010029namespace {
30constexpr int kMaxNumberOfPackets = 240;
31constexpr int kMinDelayMs = 0;
32constexpr int kTimeStepMs = 10;
33constexpr int kFs = 8000;
34constexpr int kFrameSizeMs = 20;
35constexpr int kTsIncrement = kFrameSizeMs * kFs / 1000;
36constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
37constexpr int kDefaultHistogramQuantile = 1020054733;
38constexpr int kMaxIat = 64;
39constexpr int kForgetFactor = 32745;
40} // namespace
41
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000042using ::testing::_;
Jonas Olssona4d87372019-07-05 19:08:33 +020043using ::testing::Return;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000044
45class DelayManagerTest : public ::testing::Test {
46 protected:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000047 DelayManagerTest();
48 virtual void SetUp();
Minyue Li002fbb82018-10-04 11:31:03 +020049 void RecreateDelayManager();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000050 void SetPacketAudioLength(int lengt_ms);
Ivo Creusen53a31f72019-10-24 15:20:39 +020051 absl::optional<int> InsertNextPacket();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000052 void IncreaseTime(int inc_ms);
53
Minyue Li002fbb82018-10-04 11:31:03 +020054 std::unique_ptr<DelayManager> dm_;
henrik.lundinf3933702016-04-28 01:53:52 -070055 TickTimer tick_timer_;
Jakob Ivarsson44507082019-03-05 16:59:03 +010056 MockStatisticsCalculator stats_;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010057 MockHistogram* mock_histogram_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000058 uint16_t seq_no_;
59 uint32_t ts_;
Jakob Ivarssone98954c2019-02-06 15:37:50 +010060 bool enable_rtx_handling_ = false;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010061 bool use_mock_histogram_ = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000062};
63
64DelayManagerTest::DelayManagerTest()
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010065 : dm_(nullptr),
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010066 seq_no_(0x1234),
67 ts_(0x12345678) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000068
69void DelayManagerTest::SetUp() {
Minyue Li002fbb82018-10-04 11:31:03 +020070 RecreateDelayManager();
71}
72
73void DelayManagerTest::RecreateDelayManager() {
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010074 if (use_mock_histogram_) {
75 mock_histogram_ = new MockHistogram(kMaxIat, kForgetFactor);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010076 std::unique_ptr<Histogram> histogram(mock_histogram_);
Mirko Bonadei317a1f02019-09-17 17:06:18 +020077 dm_ = std::make_unique<DelayManager>(
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010078 kMaxNumberOfPackets, kMinDelayMs, kDefaultHistogramQuantile,
Jakob Ivarssonbd5874a2020-01-07 17:07:40 +010079 enable_rtx_handling_, &tick_timer_, std::move(histogram));
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010080 } else {
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010081 dm_ = DelayManager::Create(kMaxNumberOfPackets, kMinDelayMs,
Jakob Ivarssonbd5874a2020-01-07 17:07:40 +010082 enable_rtx_handling_, &tick_timer_);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010083 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000084}
85
86void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000087 dm_->SetPacketAudioLength(lengt_ms);
88}
89
Ivo Creusen53a31f72019-10-24 15:20:39 +020090absl::optional<int> DelayManagerTest::InsertNextPacket() {
91 auto relative_delay = dm_->Update(seq_no_, ts_, kFs);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000092 seq_no_ += 1;
93 ts_ += kTsIncrement;
Ivo Creusen53a31f72019-10-24 15:20:39 +020094 return relative_delay;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000095}
96
97void DelayManagerTest::IncreaseTime(int inc_ms) {
98 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -070099 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000100 }
101}
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200102
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000103TEST_F(DelayManagerTest, CreateAndDestroy) {
104 // Nothing to do here. The test fixture creates and destroys the DelayManager
105 // object.
106}
107
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000108TEST_F(DelayManagerTest, SetPacketAudioLength) {
109 const int kLengthMs = 30;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000110 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
111 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
112}
113
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000114TEST_F(DelayManagerTest, UpdateNormal) {
115 SetPacketAudioLength(kFrameSizeMs);
116 // First packet arrival.
117 InsertNextPacket();
118 // Advance time by one frame size.
119 IncreaseTime(kFrameSizeMs);
120 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000121 InsertNextPacket();
122 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
123 EXPECT_EQ(1, dm_->base_target_level());
124 int lower, higher;
125 dm_->BufferLimits(&lower, &higher);
126 // Expect |lower| to be 75% of target level, and |higher| to be target level,
127 // but also at least 20 ms higher than |lower|, which is the limiting case
128 // here.
129 EXPECT_EQ((1 << 8) * 3 / 4, lower);
130 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
131}
132
133TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
134 SetPacketAudioLength(kFrameSizeMs);
135 // First packet arrival.
136 InsertNextPacket();
137 // Advance time by two frame size.
138 IncreaseTime(2 * kFrameSizeMs);
139 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000140 InsertNextPacket();
141 EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8.
142 EXPECT_EQ(2, dm_->base_target_level());
143 int lower, higher;
144 dm_->BufferLimits(&lower, &higher);
145 // Expect |lower| to be 75% of target level, and |higher| to be target level,
146 // but also at least 20 ms higher than |lower|, which is the limiting case
147 // here.
148 EXPECT_EQ((2 << 8) * 3 / 4, lower);
149 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
150}
151
Niels Möller18f1adc2018-08-23 08:40:41 +0200152TEST_F(DelayManagerTest, MaxDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000153 const int kExpectedTarget = 5;
154 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
155 SetPacketAudioLength(kFrameSizeMs);
156 // First packet arrival.
157 InsertNextPacket();
158 // Second packet arrival.
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000159 IncreaseTime(kTimeIncrement);
160 InsertNextPacket();
161
162 // No limit is set.
163 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
164
165 int kMaxDelayPackets = kExpectedTarget - 2;
166 int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
167 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
168 IncreaseTime(kTimeIncrement);
169 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000170 EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
171
172 // Target level at least should be one packet.
173 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
174}
175
Niels Möller18f1adc2018-08-23 08:40:41 +0200176TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000177 const int kExpectedTarget = 5;
178 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
179 SetPacketAudioLength(kFrameSizeMs);
180 // First packet arrival.
181 InsertNextPacket();
182 // Second packet arrival.
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000183 IncreaseTime(kTimeIncrement);
184 InsertNextPacket();
185
186 // No limit is applied.
187 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
188
189 int kMinDelayPackets = kExpectedTarget + 2;
190 int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
191 dm_->SetMinimumDelay(kMinDelayMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200192 IncreaseTime(kFrameSizeMs);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000193 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000194 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
195}
196
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100197TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
198 SetPacketAudioLength(kFrameSizeMs);
199
200 // Base minimum delay should be between [0, 10000] milliseconds.
201 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
202 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
203 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
204
205 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
206 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
207}
208
209TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
210 SetPacketAudioLength(kFrameSizeMs);
211 constexpr int kBaseMinimumDelayMs = 100;
212 constexpr int kMinimumDelayMs = 200;
213
214 // Base minimum delay sets lower bound on minimum. That is why when base
215 // minimum delay is lower than minimum delay we use minimum delay.
216 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
217
218 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
219 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
220 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
221}
222
223TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
224 SetPacketAudioLength(kFrameSizeMs);
225 constexpr int kBaseMinimumDelayMs = 70;
226 constexpr int kMinimumDelayMs = 30;
227
228 // Base minimum delay sets lower bound on minimum. That is why when base
229 // minimum delay is greater than minimum delay we use base minimum delay.
230 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
231
232 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
233 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
234 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
235}
236
237TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
238 SetPacketAudioLength(kFrameSizeMs);
239 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
240 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100241 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100242 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
243
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100244 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
245
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100246 // Base minimum delay is greater than minimum delay, that is why we clamp
247 // it to current the highest possible value which is maximum delay.
248 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
249 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100250 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
251 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100252
253 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
254 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
255
256 // Unset maximum value.
257 EXPECT_TRUE(dm_->SetMaximumDelay(0));
258
259 // With maximum value unset, the highest possible value now is 75% of
260 // currently possible maximum buffer size.
261 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
262}
263
264TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
265 SetPacketAudioLength(kFrameSizeMs);
266 constexpr int kMaximumDelayMs = 400;
267 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
268 constexpr int kMinimumDelayMs = 20;
269
270 // Base minimum delay is greater than minimum delay, that is why we clamp
271 // it to current the highest possible value which is kMaximumDelayMs.
272 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
273 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
274 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
275
276 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
277 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
278 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
279 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
280}
281
282TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
283 SetPacketAudioLength(kFrameSizeMs);
284 constexpr int kMaximumDelayMs = 400;
285 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
286 constexpr int kMinimumDelayMs = 20;
287
288 // Base minimum delay is greater than minimum delay, and lower than maximum
289 // delays that is why it is used.
290 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
291 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
292
293 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
294 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
295 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
296 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
297}
298
299TEST_F(DelayManagerTest, MinimumDelayMemorization) {
300 // Check that when we increase base minimum delay to value higher than
301 // minimum delay then minimum delay is still memorized. This allows to
302 // restore effective minimum delay to memorized minimum delay value when we
303 // decrease base minimum delay.
304 SetPacketAudioLength(kFrameSizeMs);
305
306 constexpr int kBaseMinimumDelayMsLow = 10;
307 constexpr int kMinimumDelayMs = 20;
308 constexpr int kBaseMinimumDelayMsHigh = 30;
309
310 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
311 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
312 // Minimum delay is used as it is higher than base minimum delay.
313 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
314
315 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
316 // Base minimum delay is used as it is now higher than minimum delay.
317 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
318 kBaseMinimumDelayMsHigh);
319
320 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
321 // Check that minimum delay is memorized and is used again.
322 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
323}
324
325TEST_F(DelayManagerTest, BaseMinimumDelay) {
Ruslan Burakovedbea462019-02-04 16:17:31 +0100326 const int kExpectedTarget = 5;
327 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
328 SetPacketAudioLength(kFrameSizeMs);
329 // First packet arrival.
330 InsertNextPacket();
331 // Second packet arrival.
Ruslan Burakovedbea462019-02-04 16:17:31 +0100332 IncreaseTime(kTimeIncrement);
333 InsertNextPacket();
334
335 // No limit is applied.
336 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
337
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100338 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
339 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
340 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
341 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100342
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200343 IncreaseTime(kFrameSizeMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100344 InsertNextPacket();
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100345 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
346 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100347}
348
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100349TEST_F(DelayManagerTest, BaseMinimumDealyAffectTargetLevel) {
350 const int kExpectedTarget = 5;
351 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
352 SetPacketAudioLength(kFrameSizeMs);
353 // First packet arrival.
354 InsertNextPacket();
355 // Second packet arrival.
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100356 IncreaseTime(kTimeIncrement);
357 InsertNextPacket();
Ruslan Burakovedbea462019-02-04 16:17:31 +0100358
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100359 // No limit is applied.
360 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
361
362 // Minimum delay is lower than base minimum delay, that is why base minimum
363 // delay is used to calculate target level.
364 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
365 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
366
367 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
368 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
369
370 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
371 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
372 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
373 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
374
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200375 IncreaseTime(kFrameSizeMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100376 InsertNextPacket();
377 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
378 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100379}
380
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100381TEST_F(DelayManagerTest, EnableRtxHandling) {
382 enable_rtx_handling_ = true;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100383 use_mock_histogram_ = true;
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100384 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100385 EXPECT_TRUE(mock_histogram_);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100386
387 // Insert first packet.
388 SetPacketAudioLength(kFrameSizeMs);
389 InsertNextPacket();
390
391 // Insert reordered packet.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200392 EXPECT_CALL(*mock_histogram_, Add(2));
Ivo Creusen53a31f72019-10-24 15:20:39 +0200393 dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100394
395 // Insert another reordered packet.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200396 EXPECT_CALL(*mock_histogram_, Add(1));
Ivo Creusen53a31f72019-10-24 15:20:39 +0200397 dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100398
399 // Insert the next packet in order and verify that the inter-arrival time is
400 // estimated correctly.
401 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200402 EXPECT_CALL(*mock_histogram_, Add(0));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100403 InsertNextPacket();
404}
405
henrik.lundinb8c55b12017-05-10 07:38:01 -0700406// Tests that skipped sequence numbers (simulating empty packets) are handled
407// correctly.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200408// TODO(jakobi): Make delay manager independent of sequence numbers.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700409TEST_F(DelayManagerTest, EmptyPacketsReported) {
410 SetPacketAudioLength(kFrameSizeMs);
411 // First packet arrival.
412 InsertNextPacket();
413
414 // Advance time by one frame size.
415 IncreaseTime(kFrameSizeMs);
416
417 // Advance the sequence number by 5, simulating that 5 empty packets were
418 // received, but never inserted.
419 seq_no_ += 10;
420 for (int j = 0; j < 10; ++j) {
421 dm_->RegisterEmptyPacket();
422 }
423
424 // Second packet arrival.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700425 InsertNextPacket();
426
427 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
428}
429
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200430// Same as above, but do not call RegisterEmptyPacket. Target level stays the
431// same.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700432TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
433 SetPacketAudioLength(kFrameSizeMs);
434 // First packet arrival.
435 InsertNextPacket();
436
437 // Advance time by one frame size.
438 IncreaseTime(kFrameSizeMs);
439
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200440 // Advance the sequence number by 10, simulating that 10 empty packets were
henrik.lundinb8c55b12017-05-10 07:38:01 -0700441 // received, but never inserted.
442 seq_no_ += 10;
443
444 // Second packet arrival.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700445 InsertNextPacket();
446
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200447 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700448}
449
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000450TEST_F(DelayManagerTest, Failures) {
451 // Wrong sample rate.
Ivo Creusen53a31f72019-10-24 15:20:39 +0200452 EXPECT_EQ(absl::nullopt, dm_->Update(0, 0, -1));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000453 // Wrong packet size.
454 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
455 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000456
457 // Minimum delay higher than a maximum delay is not accepted.
458 EXPECT_TRUE(dm_->SetMaximumDelay(10));
459 EXPECT_FALSE(dm_->SetMinimumDelay(20));
460
461 // Maximum delay less than minimum delay is not accepted.
462 EXPECT_TRUE(dm_->SetMaximumDelay(100));
463 EXPECT_TRUE(dm_->SetMinimumDelay(80));
464 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000465}
466
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100467TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
468 {
469 test::ScopedFieldTrials field_trial(
470 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
471 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100472 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200473 EXPECT_EQ(
474 32702,
475 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
476 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100477 }
478 {
479 test::ScopedFieldTrials field_trial(
480 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
481 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100482 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200483 EXPECT_EQ(
484 32702,
485 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
486 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100487 }
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200488 // Test parameter for new call start adaptation.
489 {
490 test::ScopedFieldTrials field_trial(
491 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1/");
492 RecreateDelayManager();
493 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.0);
494 }
495 {
496 test::ScopedFieldTrials field_trial(
497 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1.5/");
498 RecreateDelayManager();
499 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.5);
500 }
501 {
502 test::ScopedFieldTrials field_trial(
503 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-0.5/");
504 RecreateDelayManager();
505 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100506 }
507}
508
Jakob Ivarssonbd5874a2020-01-07 17:07:40 +0100509TEST_F(DelayManagerTest, RelativeArrivalDelay) {
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100510 use_mock_histogram_ = true;
511 RecreateDelayManager();
512
513 SetPacketAudioLength(kFrameSizeMs);
514 InsertNextPacket();
515
516 IncreaseTime(kFrameSizeMs);
517 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
518 InsertNextPacket();
519
520 IncreaseTime(2 * kFrameSizeMs);
521 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
Ivo Creusen53a31f72019-10-24 15:20:39 +0200522 dm_->Update(seq_no_, ts_, kFs);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100523
524 IncreaseTime(2 * kFrameSizeMs);
525 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
Ivo Creusen53a31f72019-10-24 15:20:39 +0200526 dm_->Update(seq_no_ + 1, ts_ + kTsIncrement, kFs);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100527
528 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
Ivo Creusen53a31f72019-10-24 15:20:39 +0200529 dm_->Update(seq_no_, ts_, kFs);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100530}
531
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200532TEST_F(DelayManagerTest, MaxDelayHistory) {
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200533 use_mock_histogram_ = true;
534 RecreateDelayManager();
535
536 SetPacketAudioLength(kFrameSizeMs);
537 InsertNextPacket();
538
539 // Insert 20 ms iat delay in the delay history.
540 IncreaseTime(2 * kFrameSizeMs);
541 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
542 InsertNextPacket();
543
544 // Insert next packet with a timestamp difference larger than maximum history
545 // size. This removes the previously inserted iat delay from the history.
546 constexpr int kMaxHistoryMs = 2000;
547 IncreaseTime(kMaxHistoryMs + kFrameSizeMs);
548 ts_ += kFs * kMaxHistoryMs / 1000;
549 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
Ivo Creusen53a31f72019-10-24 15:20:39 +0200550 dm_->Update(seq_no_, ts_, kFs);
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200551}
552
Jakob Ivarsson44507082019-03-05 16:59:03 +0100553TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
554 SetPacketAudioLength(kFrameSizeMs);
Ivo Creusen53a31f72019-10-24 15:20:39 +0200555 EXPECT_EQ(absl::nullopt, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100556 IncreaseTime(kFrameSizeMs);
Ivo Creusen53a31f72019-10-24 15:20:39 +0200557 EXPECT_EQ(0, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100558 IncreaseTime(2 * kFrameSizeMs);
Ivo Creusen53a31f72019-10-24 15:20:39 +0200559
560 EXPECT_EQ(20, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100561}
562
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200563TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) {
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200564 SetPacketAudioLength(kFrameSizeMs);
565
566 // Deceleration target level offset follows the value hardcoded in
567 // delay_manager.cc.
568 constexpr int kDecelerationTargetLevelOffsetMs = 85 << 8; // In Q8.
569 // Border value where |x * 3/4 = target_level - x|.
570 constexpr int kBoarderTargetLevel = kDecelerationTargetLevelOffsetMs * 4;
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200571 {
572 // Test that for a low target level, default behaviour is intact.
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200573 const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs - 1;
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200574
575 int lower, higher; // In Q8.
576 dm_->BufferLimits(target_level_ms, &lower, &higher);
577
578 // Default behaviour of taking 75% of target level.
579 EXPECT_EQ(target_level_ms * 3 / 4, lower);
580 EXPECT_EQ(target_level_ms, higher);
581 }
582
583 {
584 // Test that for the high target level, |lower| is below target level by
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200585 // fixed |kOffset|.
586 const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs + 1;
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200587
588 int lower, higher; // In Q8.
589 dm_->BufferLimits(target_level_ms, &lower, &higher);
590
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200591 EXPECT_EQ(target_level_ms - kDecelerationTargetLevelOffsetMs / kFrameSizeMs,
592 lower);
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200593 EXPECT_EQ(target_level_ms, higher);
594 }
595}
596
Jakob Ivarsson81df62b2019-07-17 14:09:04 +0200597TEST_F(DelayManagerTest, ExtraDelay) {
598 {
599 // Default behavior. Insert two packets so that a new target level is
600 // calculated.
601 SetPacketAudioLength(kFrameSizeMs);
602 InsertNextPacket();
603 IncreaseTime(kFrameSizeMs);
604 InsertNextPacket();
605 EXPECT_EQ(dm_->TargetLevel(), 1 << 8);
606 }
607 {
608 // Add 80 ms extra delay and calculate a new target level.
609 test::ScopedFieldTrials field_trial(
610 "WebRTC-Audio-NetEqExtraDelay/Enabled-80/");
611 RecreateDelayManager();
612 SetPacketAudioLength(kFrameSizeMs);
613 InsertNextPacket();
614 IncreaseTime(kFrameSizeMs);
615 InsertNextPacket();
616 EXPECT_EQ(dm_->TargetLevel(), 5 << 8);
617 }
618}
619
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000620} // namespace webrtc