blob: beb61b0b023b4bd0d6fe383773752ad814143a94 [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
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010017#include "absl/memory/memory.h"
18#include "modules/audio_coding/neteq/histogram.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "modules/audio_coding/neteq/mock/mock_delay_peak_detector.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();
49 virtual void TearDown();
Minyue Li002fbb82018-10-04 11:31:03 +020050 void RecreateDelayManager();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000051 void SetPacketAudioLength(int lengt_ms);
52 void InsertNextPacket();
53 void IncreaseTime(int inc_ms);
54
Minyue Li002fbb82018-10-04 11:31:03 +020055 std::unique_ptr<DelayManager> dm_;
henrik.lundinf3933702016-04-28 01:53:52 -070056 TickTimer tick_timer_;
Jakob Ivarsson44507082019-03-05 16:59:03 +010057 MockStatisticsCalculator stats_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000058 MockDelayPeakDetector detector_;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010059 MockHistogram* mock_histogram_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000060 uint16_t seq_no_;
61 uint32_t ts_;
Jakob Ivarssone98954c2019-02-06 15:37:50 +010062 bool enable_rtx_handling_ = false;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010063 bool use_mock_histogram_ = false;
64 DelayManager::HistogramMode histogram_mode_ =
Jakob Ivarsson507f4342019-09-03 13:04:41 +020065 DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000066};
67
68DelayManagerTest::DelayManagerTest()
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010069 : dm_(nullptr),
70 detector_(&tick_timer_, false),
71 seq_no_(0x1234),
72 ts_(0x12345678) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000073
74void DelayManagerTest::SetUp() {
Minyue Li002fbb82018-10-04 11:31:03 +020075 RecreateDelayManager();
76}
77
78void DelayManagerTest::RecreateDelayManager() {
Yves Gerey665174f2018-06-19 15:03:05 +020079 EXPECT_CALL(detector_, Reset()).Times(1);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010080 if (use_mock_histogram_) {
81 mock_histogram_ = new MockHistogram(kMaxIat, kForgetFactor);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010082 std::unique_ptr<Histogram> histogram(mock_histogram_);
83 dm_ = absl::make_unique<DelayManager>(
84 kMaxNumberOfPackets, kMinDelayMs, kDefaultHistogramQuantile,
85 histogram_mode_, enable_rtx_handling_, &detector_, &tick_timer_,
Jakob Ivarsson44507082019-03-05 16:59:03 +010086 &stats_, std::move(histogram));
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010087 } else {
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010088 dm_ = DelayManager::Create(kMaxNumberOfPackets, kMinDelayMs,
Jakob Ivarsson44507082019-03-05 16:59:03 +010089 enable_rtx_handling_, &detector_, &tick_timer_,
90 &stats_);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010091 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000092}
93
94void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
95 EXPECT_CALL(detector_, SetPacketAudioLength(lengt_ms));
96 dm_->SetPacketAudioLength(lengt_ms);
97}
98
99void DelayManagerTest::InsertNextPacket() {
100 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
101 seq_no_ += 1;
102 ts_ += kTsIncrement;
103}
104
105void DelayManagerTest::IncreaseTime(int inc_ms) {
106 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -0700107 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000108 }
109}
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200110
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000111void DelayManagerTest::TearDown() {
112 EXPECT_CALL(detector_, Die());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000113}
114
115TEST_F(DelayManagerTest, CreateAndDestroy) {
116 // Nothing to do here. The test fixture creates and destroys the DelayManager
117 // object.
118}
119
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000120TEST_F(DelayManagerTest, SetPacketAudioLength) {
121 const int kLengthMs = 30;
122 // Expect DelayManager to pass on the new length to the detector object.
Yves Gerey665174f2018-06-19 15:03:05 +0200123 EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs)).Times(1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000124 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
125 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
126}
127
128TEST_F(DelayManagerTest, PeakFound) {
129 // Expect DelayManager to pass on the question to the detector.
130 // Call twice, and let the detector return true the first time and false the
131 // second time.
132 EXPECT_CALL(detector_, peak_found())
133 .WillOnce(Return(true))
134 .WillOnce(Return(false));
135 EXPECT_TRUE(dm_->PeakFound());
136 EXPECT_FALSE(dm_->PeakFound());
137}
138
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000139TEST_F(DelayManagerTest, UpdateNormal) {
140 SetPacketAudioLength(kFrameSizeMs);
141 // First packet arrival.
142 InsertNextPacket();
143 // Advance time by one frame size.
144 IncreaseTime(kFrameSizeMs);
145 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000146 InsertNextPacket();
147 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
148 EXPECT_EQ(1, dm_->base_target_level());
149 int lower, higher;
150 dm_->BufferLimits(&lower, &higher);
151 // Expect |lower| to be 75% of target level, and |higher| to be target level,
152 // but also at least 20 ms higher than |lower|, which is the limiting case
153 // here.
154 EXPECT_EQ((1 << 8) * 3 / 4, lower);
155 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
156}
157
158TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
159 SetPacketAudioLength(kFrameSizeMs);
160 // First packet arrival.
161 InsertNextPacket();
162 // Advance time by two frame size.
163 IncreaseTime(2 * kFrameSizeMs);
164 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000165 InsertNextPacket();
166 EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8.
167 EXPECT_EQ(2, dm_->base_target_level());
168 int lower, higher;
169 dm_->BufferLimits(&lower, &higher);
170 // Expect |lower| to be 75% of target level, and |higher| to be target level,
171 // but also at least 20 ms higher than |lower|, which is the limiting case
172 // here.
173 EXPECT_EQ((2 << 8) * 3 / 4, lower);
174 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
175}
176
Niels Möller18f1adc2018-08-23 08:40:41 +0200177TEST_F(DelayManagerTest, MaxDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000178 const int kExpectedTarget = 5;
179 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
180 SetPacketAudioLength(kFrameSizeMs);
181 // First packet arrival.
182 InsertNextPacket();
183 // Second packet arrival.
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000184 IncreaseTime(kTimeIncrement);
185 InsertNextPacket();
186
187 // No limit is set.
188 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
189
190 int kMaxDelayPackets = kExpectedTarget - 2;
191 int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
192 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
193 IncreaseTime(kTimeIncrement);
194 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000195 EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
196
197 // Target level at least should be one packet.
198 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
199}
200
Niels Möller18f1adc2018-08-23 08:40:41 +0200201TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000202 const int kExpectedTarget = 5;
203 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
204 SetPacketAudioLength(kFrameSizeMs);
205 // First packet arrival.
206 InsertNextPacket();
207 // Second packet arrival.
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000208 IncreaseTime(kTimeIncrement);
209 InsertNextPacket();
210
211 // No limit is applied.
212 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
213
214 int kMinDelayPackets = kExpectedTarget + 2;
215 int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
216 dm_->SetMinimumDelay(kMinDelayMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200217 IncreaseTime(kFrameSizeMs);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000218 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000219 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
220}
221
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100222TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
223 SetPacketAudioLength(kFrameSizeMs);
224
225 // Base minimum delay should be between [0, 10000] milliseconds.
226 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
227 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
228 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
229
230 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
231 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
232}
233
234TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
235 SetPacketAudioLength(kFrameSizeMs);
236 constexpr int kBaseMinimumDelayMs = 100;
237 constexpr int kMinimumDelayMs = 200;
238
239 // Base minimum delay sets lower bound on minimum. That is why when base
240 // minimum delay is lower than minimum delay we use minimum delay.
241 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
242
243 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
244 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
245 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
246}
247
248TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
249 SetPacketAudioLength(kFrameSizeMs);
250 constexpr int kBaseMinimumDelayMs = 70;
251 constexpr int kMinimumDelayMs = 30;
252
253 // Base minimum delay sets lower bound on minimum. That is why when base
254 // minimum delay is greater than minimum delay we use base minimum delay.
255 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
256
257 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
258 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
259 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
260}
261
262TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
263 SetPacketAudioLength(kFrameSizeMs);
264 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
265 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100266 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100267 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
268
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100269 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
270
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100271 // Base minimum delay is greater than minimum delay, that is why we clamp
272 // it to current the highest possible value which is maximum delay.
273 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
274 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100275 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
276 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100277
278 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
279 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
280
281 // Unset maximum value.
282 EXPECT_TRUE(dm_->SetMaximumDelay(0));
283
284 // With maximum value unset, the highest possible value now is 75% of
285 // currently possible maximum buffer size.
286 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
287}
288
289TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
290 SetPacketAudioLength(kFrameSizeMs);
291 constexpr int kMaximumDelayMs = 400;
292 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
293 constexpr int kMinimumDelayMs = 20;
294
295 // Base minimum delay is greater than minimum delay, that is why we clamp
296 // it to current the highest possible value which is kMaximumDelayMs.
297 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
298 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
299 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
300
301 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
302 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
303 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
304 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
305}
306
307TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
308 SetPacketAudioLength(kFrameSizeMs);
309 constexpr int kMaximumDelayMs = 400;
310 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
311 constexpr int kMinimumDelayMs = 20;
312
313 // Base minimum delay is greater than minimum delay, and lower than maximum
314 // delays that is why it is used.
315 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
316 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
317
318 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
319 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
320 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
321 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
322}
323
324TEST_F(DelayManagerTest, MinimumDelayMemorization) {
325 // Check that when we increase base minimum delay to value higher than
326 // minimum delay then minimum delay is still memorized. This allows to
327 // restore effective minimum delay to memorized minimum delay value when we
328 // decrease base minimum delay.
329 SetPacketAudioLength(kFrameSizeMs);
330
331 constexpr int kBaseMinimumDelayMsLow = 10;
332 constexpr int kMinimumDelayMs = 20;
333 constexpr int kBaseMinimumDelayMsHigh = 30;
334
335 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
336 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
337 // Minimum delay is used as it is higher than base minimum delay.
338 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
339
340 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
341 // Base minimum delay is used as it is now higher than minimum delay.
342 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
343 kBaseMinimumDelayMsHigh);
344
345 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
346 // Check that minimum delay is memorized and is used again.
347 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
348}
349
350TEST_F(DelayManagerTest, BaseMinimumDelay) {
Ruslan Burakovedbea462019-02-04 16:17:31 +0100351 const int kExpectedTarget = 5;
352 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
353 SetPacketAudioLength(kFrameSizeMs);
354 // First packet arrival.
355 InsertNextPacket();
356 // Second packet arrival.
Ruslan Burakovedbea462019-02-04 16:17:31 +0100357 IncreaseTime(kTimeIncrement);
358 InsertNextPacket();
359
360 // No limit is applied.
361 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
362
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100363 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
364 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
365 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
366 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100367
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200368 IncreaseTime(kFrameSizeMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100369 InsertNextPacket();
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100370 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
371 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100372}
373
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100374TEST_F(DelayManagerTest, BaseMinimumDealyAffectTargetLevel) {
375 const int kExpectedTarget = 5;
376 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
377 SetPacketAudioLength(kFrameSizeMs);
378 // First packet arrival.
379 InsertNextPacket();
380 // Second packet arrival.
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100381 IncreaseTime(kTimeIncrement);
382 InsertNextPacket();
Ruslan Burakovedbea462019-02-04 16:17:31 +0100383
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100384 // No limit is applied.
385 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
386
387 // Minimum delay is lower than base minimum delay, that is why base minimum
388 // delay is used to calculate target level.
389 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
390 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
391
392 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
393 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
394
395 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
396 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
397 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
398 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
399
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200400 IncreaseTime(kFrameSizeMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100401 InsertNextPacket();
402 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
403 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100404}
405
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100406TEST_F(DelayManagerTest, EnableRtxHandling) {
407 enable_rtx_handling_ = true;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100408 use_mock_histogram_ = true;
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100409 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100410 EXPECT_TRUE(mock_histogram_);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100411
412 // Insert first packet.
413 SetPacketAudioLength(kFrameSizeMs);
414 InsertNextPacket();
415
416 // Insert reordered packet.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200417 EXPECT_CALL(*mock_histogram_, Add(2));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100418 EXPECT_EQ(0, dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs));
419
420 // Insert another reordered packet.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200421 EXPECT_CALL(*mock_histogram_, Add(1));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100422 EXPECT_EQ(0, dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs));
423
424 // Insert the next packet in order and verify that the inter-arrival time is
425 // estimated correctly.
426 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200427 EXPECT_CALL(*mock_histogram_, Add(0));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100428 InsertNextPacket();
429}
430
henrik.lundinb8c55b12017-05-10 07:38:01 -0700431// Tests that skipped sequence numbers (simulating empty packets) are handled
432// correctly.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200433// TODO(jakobi): Make delay manager independent of sequence numbers.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700434TEST_F(DelayManagerTest, EmptyPacketsReported) {
435 SetPacketAudioLength(kFrameSizeMs);
436 // First packet arrival.
437 InsertNextPacket();
438
439 // Advance time by one frame size.
440 IncreaseTime(kFrameSizeMs);
441
442 // Advance the sequence number by 5, simulating that 5 empty packets were
443 // received, but never inserted.
444 seq_no_ += 10;
445 for (int j = 0; j < 10; ++j) {
446 dm_->RegisterEmptyPacket();
447 }
448
449 // Second packet arrival.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700450 InsertNextPacket();
451
452 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
453}
454
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200455// Same as above, but do not call RegisterEmptyPacket. Target level stays the
456// same.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700457TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
458 SetPacketAudioLength(kFrameSizeMs);
459 // First packet arrival.
460 InsertNextPacket();
461
462 // Advance time by one frame size.
463 IncreaseTime(kFrameSizeMs);
464
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200465 // Advance the sequence number by 10, simulating that 10 empty packets were
henrik.lundinb8c55b12017-05-10 07:38:01 -0700466 // received, but never inserted.
467 seq_no_ += 10;
468
469 // Second packet arrival.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700470 InsertNextPacket();
471
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200472 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700473}
474
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000475TEST_F(DelayManagerTest, Failures) {
476 // Wrong sample rate.
477 EXPECT_EQ(-1, dm_->Update(0, 0, -1));
478 // Wrong packet size.
479 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
480 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000481
482 // Minimum delay higher than a maximum delay is not accepted.
483 EXPECT_TRUE(dm_->SetMaximumDelay(10));
484 EXPECT_FALSE(dm_->SetMinimumDelay(20));
485
486 // Maximum delay less than minimum delay is not accepted.
487 EXPECT_TRUE(dm_->SetMaximumDelay(100));
488 EXPECT_TRUE(dm_->SetMinimumDelay(80));
489 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000490}
491
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100492TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
493 {
494 test::ScopedFieldTrials field_trial(
495 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
496 RecreateDelayManager();
497 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
498 dm_->histogram_mode());
499 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200500 EXPECT_EQ(
501 32702,
502 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
503 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100504 }
505 {
506 test::ScopedFieldTrials field_trial(
507 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
508 RecreateDelayManager();
509 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
510 dm_->histogram_mode());
511 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200512 EXPECT_EQ(
513 32702,
514 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
515 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100516 }
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200517 // Test parameter for new call start adaptation.
518 {
519 test::ScopedFieldTrials field_trial(
520 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1/");
521 RecreateDelayManager();
522 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.0);
523 }
524 {
525 test::ScopedFieldTrials field_trial(
526 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1.5/");
527 RecreateDelayManager();
528 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.5);
529 }
530 {
531 test::ScopedFieldTrials field_trial(
532 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-0.5/");
533 RecreateDelayManager();
534 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100535 }
536}
537
538TEST_F(DelayManagerTest, RelativeArrivalDelayMode) {
539 histogram_mode_ = DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
540 use_mock_histogram_ = true;
541 RecreateDelayManager();
542
543 SetPacketAudioLength(kFrameSizeMs);
544 InsertNextPacket();
545
546 IncreaseTime(kFrameSizeMs);
547 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
548 InsertNextPacket();
549
550 IncreaseTime(2 * kFrameSizeMs);
551 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
552 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
553
554 IncreaseTime(2 * kFrameSizeMs);
555 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
556 EXPECT_EQ(0, dm_->Update(seq_no_ + 1, ts_ + kTsIncrement, kFs));
557
558 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
559 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
560}
561
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200562TEST_F(DelayManagerTest, MaxDelayHistory) {
563 histogram_mode_ = DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
564 use_mock_histogram_ = true;
565 RecreateDelayManager();
566
567 SetPacketAudioLength(kFrameSizeMs);
568 InsertNextPacket();
569
570 // Insert 20 ms iat delay in the delay history.
571 IncreaseTime(2 * kFrameSizeMs);
572 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
573 InsertNextPacket();
574
575 // Insert next packet with a timestamp difference larger than maximum history
576 // size. This removes the previously inserted iat delay from the history.
577 constexpr int kMaxHistoryMs = 2000;
578 IncreaseTime(kMaxHistoryMs + kFrameSizeMs);
579 ts_ += kFs * kMaxHistoryMs / 1000;
580 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
581 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
582}
583
Jakob Ivarsson44507082019-03-05 16:59:03 +0100584TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
585 SetPacketAudioLength(kFrameSizeMs);
586 InsertNextPacket();
587
588 IncreaseTime(kFrameSizeMs);
589 EXPECT_CALL(stats_, RelativePacketArrivalDelay(0));
590 InsertNextPacket();
591
592 IncreaseTime(2 * kFrameSizeMs);
593 EXPECT_CALL(stats_, RelativePacketArrivalDelay(20));
594 InsertNextPacket();
595}
596
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200597TEST_F(DelayManagerTest, DecelerationTargetLevelOffsetFieldTrial) {
598 {
599 test::ScopedFieldTrials field_trial(
600 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-105/");
601 RecreateDelayManager();
602 EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 105 << 8);
603 }
604 {
605 // Negative number.
606 test::ScopedFieldTrials field_trial(
607 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled--105/");
608 RecreateDelayManager();
609 EXPECT_FALSE(dm_->deceleration_target_level_offset_ms().has_value());
610 }
611 {
612 // Disabled.
613 test::ScopedFieldTrials field_trial(
614 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Disabled/");
615 RecreateDelayManager();
616 EXPECT_FALSE(dm_->deceleration_target_level_offset_ms().has_value());
617 }
618 {
619 // Float number.
620 test::ScopedFieldTrials field_trial(
621 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-105.5/");
622 RecreateDelayManager();
623 EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 105 << 8);
624 }
625 {
626 // Several numbers.
627 test::ScopedFieldTrials field_trial(
628 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-20-40/");
629 RecreateDelayManager();
630 EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 20 << 8);
631 }
632}
633
634TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) {
635 // Border value where 1/4 target buffer level meets
636 // WebRTC-Audio-NetEqDecelerationTargetLevelOffset.
637 constexpr int kBoarderTargetLevel = 100 * 4;
638 {
639 // Test that for a low target level, default behaviour is intact.
640 test::ScopedFieldTrials field_trial(
641 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-100/");
642 const int target_level_ms = ((kBoarderTargetLevel - 1) << 8) / kFrameSizeMs;
643 RecreateDelayManager();
644 SetPacketAudioLength(kFrameSizeMs);
645
646 int lower, higher; // In Q8.
647 dm_->BufferLimits(target_level_ms, &lower, &higher);
648
649 // Default behaviour of taking 75% of target level.
650 EXPECT_EQ(target_level_ms * 3 / 4, lower);
651 EXPECT_EQ(target_level_ms, higher);
652 }
653
654 {
655 // Test that for the high target level, |lower| is below target level by
656 // fixed constant (100 ms in this Field Trial setup).
657 test::ScopedFieldTrials field_trial(
658 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-100/");
659 const int target_level_ms = ((kBoarderTargetLevel + 1) << 8) / kFrameSizeMs;
660 RecreateDelayManager();
661 SetPacketAudioLength(kFrameSizeMs);
662
663 int lower, higher; // In Q8.
664 dm_->BufferLimits(target_level_ms, &lower, &higher);
665
666 EXPECT_EQ(target_level_ms - ((100 << 8) / kFrameSizeMs), lower);
667 EXPECT_EQ(target_level_ms, higher);
668 }
669
670 {
671 // Test that for the high target level, without Field Trial the behaviour
672 // will remain the same.
673 const int target_level_ms = ((kBoarderTargetLevel + 1) << 8) / kFrameSizeMs;
674 RecreateDelayManager();
675 SetPacketAudioLength(kFrameSizeMs);
676
677 int lower, higher; // In Q8.
678 dm_->BufferLimits(target_level_ms, &lower, &higher);
679
680 // Default behaviour of taking 75% of target level.
681 EXPECT_EQ(target_level_ms * 3 / 4, lower);
682 EXPECT_EQ(target_level_ms, higher);
683 }
684}
685
Jakob Ivarsson81df62b2019-07-17 14:09:04 +0200686TEST_F(DelayManagerTest, ExtraDelay) {
687 {
688 // Default behavior. Insert two packets so that a new target level is
689 // calculated.
690 SetPacketAudioLength(kFrameSizeMs);
691 InsertNextPacket();
692 IncreaseTime(kFrameSizeMs);
693 InsertNextPacket();
694 EXPECT_EQ(dm_->TargetLevel(), 1 << 8);
695 }
696 {
697 // Add 80 ms extra delay and calculate a new target level.
698 test::ScopedFieldTrials field_trial(
699 "WebRTC-Audio-NetEqExtraDelay/Enabled-80/");
700 RecreateDelayManager();
701 SetPacketAudioLength(kFrameSizeMs);
702 InsertNextPacket();
703 IncreaseTime(kFrameSizeMs);
704 InsertNextPacket();
705 EXPECT_EQ(dm_->TargetLevel(), 5 << 8);
706 }
707}
708
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000709} // namespace webrtc