• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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