1 /*
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
13 #include "modules/audio_coding/neteq/delay_manager.h"
14
15 #include <math.h>
16
17 #include <memory>
18
19 #include "modules/audio_coding/neteq/histogram.h"
20 #include "modules/audio_coding/neteq/mock/mock_histogram.h"
21 #include "modules/audio_coding/neteq/mock/mock_statistics_calculator.h"
22 #include "rtc_base/checks.h"
23 #include "test/field_trial.h"
24 #include "test/gmock.h"
25 #include "test/gtest.h"
26
27 namespace webrtc {
28
29 namespace {
30 constexpr int kMaxNumberOfPackets = 240;
31 constexpr int kMinDelayMs = 0;
32 constexpr int kTimeStepMs = 10;
33 constexpr int kFs = 8000;
34 constexpr int kFrameSizeMs = 20;
35 constexpr int kTsIncrement = kFrameSizeMs * kFs / 1000;
36 constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
37 constexpr int kDefaultHistogramQuantile = 1020054733;
38 constexpr int kMaxIat = 64;
39 constexpr int kForgetFactor = 32745;
40 } // namespace
41
42 using ::testing::_;
43 using ::testing::Return;
44
45 class DelayManagerTest : public ::testing::Test {
46 protected:
47 DelayManagerTest();
48 virtual void SetUp();
49 void RecreateDelayManager();
50 void SetPacketAudioLength(int lengt_ms);
51 absl::optional<int> InsertNextPacket();
52 void IncreaseTime(int inc_ms);
53
54 std::unique_ptr<DelayManager> dm_;
55 TickTimer tick_timer_;
56 MockStatisticsCalculator stats_;
57 MockHistogram* mock_histogram_;
58 uint16_t seq_no_;
59 uint32_t ts_;
60 bool enable_rtx_handling_ = false;
61 bool use_mock_histogram_ = false;
62 };
63
DelayManagerTest()64 DelayManagerTest::DelayManagerTest()
65 : dm_(nullptr),
66 seq_no_(0x1234),
67 ts_(0x12345678) {}
68
SetUp()69 void DelayManagerTest::SetUp() {
70 RecreateDelayManager();
71 }
72
RecreateDelayManager()73 void DelayManagerTest::RecreateDelayManager() {
74 if (use_mock_histogram_) {
75 mock_histogram_ = new MockHistogram(kMaxIat, kForgetFactor);
76 std::unique_ptr<Histogram> histogram(mock_histogram_);
77 dm_ = std::make_unique<DelayManager>(
78 kMaxNumberOfPackets, kMinDelayMs, kDefaultHistogramQuantile,
79 enable_rtx_handling_, &tick_timer_, std::move(histogram));
80 } else {
81 dm_ = DelayManager::Create(kMaxNumberOfPackets, kMinDelayMs,
82 enable_rtx_handling_, &tick_timer_);
83 }
84 }
85
SetPacketAudioLength(int lengt_ms)86 void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
87 dm_->SetPacketAudioLength(lengt_ms);
88 }
89
InsertNextPacket()90 absl::optional<int> DelayManagerTest::InsertNextPacket() {
91 auto relative_delay = dm_->Update(seq_no_, ts_, kFs);
92 seq_no_ += 1;
93 ts_ += kTsIncrement;
94 return relative_delay;
95 }
96
IncreaseTime(int inc_ms)97 void DelayManagerTest::IncreaseTime(int inc_ms) {
98 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
99 tick_timer_.Increment();
100 }
101 }
102
TEST_F(DelayManagerTest,CreateAndDestroy)103 TEST_F(DelayManagerTest, CreateAndDestroy) {
104 // Nothing to do here. The test fixture creates and destroys the DelayManager
105 // object.
106 }
107
TEST_F(DelayManagerTest,SetPacketAudioLength)108 TEST_F(DelayManagerTest, SetPacketAudioLength) {
109 const int kLengthMs = 30;
110 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
111 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
112 }
113
TEST_F(DelayManagerTest,UpdateNormal)114 TEST_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.
121 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
TEST_F(DelayManagerTest,UpdateLongInterArrivalTime)133 TEST_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.
140 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
TEST_F(DelayManagerTest,MaxDelay)152 TEST_F(DelayManagerTest, MaxDelay) {
153 const int kExpectedTarget = 5;
154 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
155 SetPacketAudioLength(kFrameSizeMs);
156 // First packet arrival.
157 InsertNextPacket();
158 // Second packet arrival.
159 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();
170 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
TEST_F(DelayManagerTest,MinDelay)176 TEST_F(DelayManagerTest, MinDelay) {
177 const int kExpectedTarget = 5;
178 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
179 SetPacketAudioLength(kFrameSizeMs);
180 // First packet arrival.
181 InsertNextPacket();
182 // Second packet arrival.
183 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);
192 IncreaseTime(kFrameSizeMs);
193 InsertNextPacket();
194 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
195 }
196
TEST_F(DelayManagerTest,BaseMinimumDelayCheckValidRange)197 TEST_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
TEST_F(DelayManagerTest,BaseMinimumDelayLowerThanMinimumDelay)209 TEST_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
TEST_F(DelayManagerTest,BaseMinimumDelayGreaterThanMinimumDelay)223 TEST_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
TEST_F(DelayManagerTest,BaseMinimumDelayGreaterThanBufferSize)237 TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
238 SetPacketAudioLength(kFrameSizeMs);
239 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
240 constexpr int kMinimumDelayMs = 12;
241 constexpr int kMaximumDelayMs = 20;
242 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
243
244 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
245
246 // 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);
250 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
251 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
252
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
TEST_F(DelayManagerTest,BaseMinimumDelayGreaterThanMaximumDelay)264 TEST_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
TEST_F(DelayManagerTest,BaseMinimumDelayLowerThanMaxSize)282 TEST_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
TEST_F(DelayManagerTest,MinimumDelayMemorization)299 TEST_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
TEST_F(DelayManagerTest,BaseMinimumDelay)325 TEST_F(DelayManagerTest, BaseMinimumDelay) {
326 const int kExpectedTarget = 5;
327 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
328 SetPacketAudioLength(kFrameSizeMs);
329 // First packet arrival.
330 InsertNextPacket();
331 // Second packet arrival.
332 IncreaseTime(kTimeIncrement);
333 InsertNextPacket();
334
335 // No limit is applied.
336 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
337
338 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
339 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
340 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
341 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
342
343 IncreaseTime(kFrameSizeMs);
344 InsertNextPacket();
345 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
346 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
347 }
348
TEST_F(DelayManagerTest,BaseMinimumDealyAffectTargetLevel)349 TEST_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.
356 IncreaseTime(kTimeIncrement);
357 InsertNextPacket();
358
359 // 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
375 IncreaseTime(kFrameSizeMs);
376 InsertNextPacket();
377 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
378 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
379 }
380
TEST_F(DelayManagerTest,EnableRtxHandling)381 TEST_F(DelayManagerTest, EnableRtxHandling) {
382 enable_rtx_handling_ = true;
383 use_mock_histogram_ = true;
384 RecreateDelayManager();
385 EXPECT_TRUE(mock_histogram_);
386
387 // Insert first packet.
388 SetPacketAudioLength(kFrameSizeMs);
389 InsertNextPacket();
390
391 // Insert reordered packet.
392 EXPECT_CALL(*mock_histogram_, Add(2));
393 dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs);
394
395 // Insert another reordered packet.
396 EXPECT_CALL(*mock_histogram_, Add(1));
397 dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs);
398
399 // Insert the next packet in order and verify that the inter-arrival time is
400 // estimated correctly.
401 IncreaseTime(kFrameSizeMs);
402 EXPECT_CALL(*mock_histogram_, Add(0));
403 InsertNextPacket();
404 }
405
406 // Tests that skipped sequence numbers (simulating empty packets) are handled
407 // correctly.
408 // TODO(jakobi): Make delay manager independent of sequence numbers.
TEST_F(DelayManagerTest,EmptyPacketsReported)409 TEST_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.
425 InsertNextPacket();
426
427 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
428 }
429
430 // Same as above, but do not call RegisterEmptyPacket. Target level stays the
431 // same.
TEST_F(DelayManagerTest,EmptyPacketsNotReported)432 TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
433 SetPacketAudioLength(kFrameSizeMs);
434 // First packet arrival.
435 InsertNextPacket();
436
437 // Advance time by one frame size.
438 IncreaseTime(kFrameSizeMs);
439
440 // Advance the sequence number by 10, simulating that 10 empty packets were
441 // received, but never inserted.
442 seq_no_ += 10;
443
444 // Second packet arrival.
445 InsertNextPacket();
446
447 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
448 }
449
TEST_F(DelayManagerTest,Failures)450 TEST_F(DelayManagerTest, Failures) {
451 // Wrong sample rate.
452 EXPECT_EQ(absl::nullopt, dm_->Update(0, 0, -1));
453 // Wrong packet size.
454 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
455 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
456
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));
465 }
466
TEST_F(DelayManagerTest,DelayHistogramFieldTrial)467 TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
468 {
469 test::ScopedFieldTrials field_trial(
470 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
471 RecreateDelayManager();
472 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
473 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());
477 }
478 {
479 test::ScopedFieldTrials field_trial(
480 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
481 RecreateDelayManager();
482 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
483 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());
487 }
488 // 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());
506 }
507 }
508
TEST_F(DelayManagerTest,RelativeArrivalDelay)509 TEST_F(DelayManagerTest, RelativeArrivalDelay) {
510 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.
522 dm_->Update(seq_no_, ts_, kFs);
523
524 IncreaseTime(2 * kFrameSizeMs);
525 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
526 dm_->Update(seq_no_ + 1, ts_ + kTsIncrement, kFs);
527
528 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
529 dm_->Update(seq_no_, ts_, kFs);
530 }
531
TEST_F(DelayManagerTest,MaxDelayHistory)532 TEST_F(DelayManagerTest, MaxDelayHistory) {
533 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.
550 dm_->Update(seq_no_, ts_, kFs);
551 }
552
TEST_F(DelayManagerTest,RelativeArrivalDelayStatistic)553 TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
554 SetPacketAudioLength(kFrameSizeMs);
555 EXPECT_EQ(absl::nullopt, InsertNextPacket());
556 IncreaseTime(kFrameSizeMs);
557 EXPECT_EQ(0, InsertNextPacket());
558 IncreaseTime(2 * kFrameSizeMs);
559
560 EXPECT_EQ(20, InsertNextPacket());
561 }
562
TEST_F(DelayManagerTest,DecelerationTargetLevelOffset)563 TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) {
564 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;
571 {
572 // Test that for a low target level, default behaviour is intact.
573 const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs - 1;
574
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
585 // fixed |kOffset|.
586 const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs + 1;
587
588 int lower, higher; // In Q8.
589 dm_->BufferLimits(target_level_ms, &lower, &higher);
590
591 EXPECT_EQ(target_level_ms - kDecelerationTargetLevelOffsetMs / kFrameSizeMs,
592 lower);
593 EXPECT_EQ(target_level_ms, higher);
594 }
595 }
596
597 } // namespace webrtc
598