blob: b3797e2e800ea2cb89616206ce5722a3c2a275eb [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"
Ruslan Burakov4a68fb92019-02-13 14:25:39 +010021#include "rtc_base/checks.h"
Minyue Li002fbb82018-10-04 11:31:03 +020022#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "test/gmock.h"
24#include "test/gtest.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000025
26namespace webrtc {
27
28using ::testing::Return;
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000029using ::testing::_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000030
31class DelayManagerTest : public ::testing::Test {
32 protected:
33 static const int kMaxNumberOfPackets = 240;
Jakob Ivarsson10403ae2018-11-27 15:45:20 +010034 static const int kMinDelayMs = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000035 static const int kTimeStepMs = 10;
36 static const int kFs = 8000;
37 static const int kFrameSizeMs = 20;
38 static const int kTsIncrement = kFrameSizeMs * kFs / 1000;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +010039 static const int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000040
41 DelayManagerTest();
42 virtual void SetUp();
43 virtual void TearDown();
Minyue Li002fbb82018-10-04 11:31:03 +020044 void RecreateDelayManager();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000045 void SetPacketAudioLength(int lengt_ms);
46 void InsertNextPacket();
47 void IncreaseTime(int inc_ms);
48
Minyue Li002fbb82018-10-04 11:31:03 +020049 std::unique_ptr<DelayManager> dm_;
henrik.lundinf3933702016-04-28 01:53:52 -070050 TickTimer tick_timer_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000051 MockDelayPeakDetector detector_;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010052 bool use_mock_histogram_ = false;
53 MockHistogram* mock_histogram_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000054 uint16_t seq_no_;
55 uint32_t ts_;
Jakob Ivarssone98954c2019-02-06 15:37:50 +010056 bool enable_rtx_handling_ = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000057};
58
59DelayManagerTest::DelayManagerTest()
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010060 : dm_(nullptr),
61 detector_(&tick_timer_, false),
62 seq_no_(0x1234),
63 ts_(0x12345678) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000064
65void DelayManagerTest::SetUp() {
Minyue Li002fbb82018-10-04 11:31:03 +020066 RecreateDelayManager();
67}
68
69void DelayManagerTest::RecreateDelayManager() {
Yves Gerey665174f2018-06-19 15:03:05 +020070 EXPECT_CALL(detector_, Reset()).Times(1);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010071 std::unique_ptr<Histogram> histogram;
72 static const int kMaxIat = 64;
73 static const int kForgetFactor = 32745;
74 if (use_mock_histogram_) {
75 mock_histogram_ = new MockHistogram(kMaxIat, kForgetFactor);
76 histogram.reset(mock_histogram_);
77 } else {
78 histogram = absl::make_unique<Histogram>(kMaxIat, kForgetFactor);
79 }
Jakob Ivarssone98954c2019-02-06 15:37:50 +010080 dm_.reset(new DelayManager(kMaxNumberOfPackets, kMinDelayMs,
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010081 enable_rtx_handling_, &detector_, &tick_timer_,
82 std::move(histogram)));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000083}
84
85void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
86 EXPECT_CALL(detector_, SetPacketAudioLength(lengt_ms));
87 dm_->SetPacketAudioLength(lengt_ms);
88}
89
90void DelayManagerTest::InsertNextPacket() {
91 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
92 seq_no_ += 1;
93 ts_ += kTsIncrement;
94}
95
96void DelayManagerTest::IncreaseTime(int inc_ms) {
97 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -070098 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000099 }
100}
101void DelayManagerTest::TearDown() {
102 EXPECT_CALL(detector_, Die());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000103}
104
105TEST_F(DelayManagerTest, CreateAndDestroy) {
106 // Nothing to do here. The test fixture creates and destroys the DelayManager
107 // object.
108}
109
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000110TEST_F(DelayManagerTest, SetPacketAudioLength) {
111 const int kLengthMs = 30;
112 // Expect DelayManager to pass on the new length to the detector object.
Yves Gerey665174f2018-06-19 15:03:05 +0200113 EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs)).Times(1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000114 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
115 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
116}
117
118TEST_F(DelayManagerTest, PeakFound) {
119 // Expect DelayManager to pass on the question to the detector.
120 // Call twice, and let the detector return true the first time and false the
121 // second time.
122 EXPECT_CALL(detector_, peak_found())
123 .WillOnce(Return(true))
124 .WillOnce(Return(false));
125 EXPECT_TRUE(dm_->PeakFound());
126 EXPECT_FALSE(dm_->PeakFound());
127}
128
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000129TEST_F(DelayManagerTest, UpdateNormal) {
130 SetPacketAudioLength(kFrameSizeMs);
131 // First packet arrival.
132 InsertNextPacket();
133 // Advance time by one frame size.
134 IncreaseTime(kFrameSizeMs);
135 // Second packet arrival.
136 // Expect detector update method to be called once with inter-arrival time
137 // equal to 1 packet, and (base) target level equal to 1 as well.
138 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100139 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000140 InsertNextPacket();
141 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
142 EXPECT_EQ(1, 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((1 << 8) * 3 / 4, lower);
149 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
150}
151
152TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
153 SetPacketAudioLength(kFrameSizeMs);
154 // First packet arrival.
155 InsertNextPacket();
156 // Advance time by two frame size.
157 IncreaseTime(2 * kFrameSizeMs);
158 // Second packet arrival.
159 // Expect detector update method to be called once with inter-arrival time
160 // equal to 1 packet, and (base) target level equal to 1 as well.
161 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100162 EXPECT_CALL(detector_, Update(2, false, 2)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000163 InsertNextPacket();
164 EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8.
165 EXPECT_EQ(2, dm_->base_target_level());
166 int lower, higher;
167 dm_->BufferLimits(&lower, &higher);
168 // Expect |lower| to be 75% of target level, and |higher| to be target level,
169 // but also at least 20 ms higher than |lower|, which is the limiting case
170 // here.
171 EXPECT_EQ((2 << 8) * 3 / 4, lower);
172 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
173}
174
175TEST_F(DelayManagerTest, UpdatePeakFound) {
176 SetPacketAudioLength(kFrameSizeMs);
177 // First packet arrival.
178 InsertNextPacket();
179 // Advance time by one frame size.
180 IncreaseTime(kFrameSizeMs);
181 // Second packet arrival.
182 // Expect detector update method to be called once with inter-arrival time
183 // equal to 1 packet, and (base) target level equal to 1 as well.
184 // Return true to indicate that peaks are found. Let the peak height be 5.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100185 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(true));
Yves Gerey665174f2018-06-19 15:03:05 +0200186 EXPECT_CALL(detector_, MaxPeakHeight()).WillOnce(Return(5));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000187 InsertNextPacket();
188 EXPECT_EQ(5 << 8, dm_->TargetLevel());
189 EXPECT_EQ(1, dm_->base_target_level()); // Base target level is w/o peaks.
190 int lower, higher;
191 dm_->BufferLimits(&lower, &higher);
192 // Expect |lower| to be 75% of target level, and |higher| to be target level.
193 EXPECT_EQ((5 << 8) * 3 / 4, lower);
194 EXPECT_EQ(5 << 8, higher);
195}
196
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000197TEST_F(DelayManagerTest, TargetDelay) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000198 SetPacketAudioLength(kFrameSizeMs);
199 // First packet arrival.
200 InsertNextPacket();
201 // Advance time by one frame size.
202 IncreaseTime(kFrameSizeMs);
203 // Second packet arrival.
204 // Expect detector update method to be called once with inter-arrival time
205 // equal to 1 packet, and (base) target level equal to 1 as well.
206 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100207 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000208 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000209 const int kExpectedTarget = 1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000210 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
211 EXPECT_EQ(1, dm_->base_target_level());
212 int lower, higher;
213 dm_->BufferLimits(&lower, &higher);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000214 // Expect |lower| to be 75% of base target level, and |higher| to be
215 // lower + 20 ms headroom.
216 EXPECT_EQ((1 << 8) * 3 / 4, lower);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000217 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
218}
219
Niels Möller18f1adc2018-08-23 08:40:41 +0200220TEST_F(DelayManagerTest, MaxDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000221 const int kExpectedTarget = 5;
222 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
223 SetPacketAudioLength(kFrameSizeMs);
224 // First packet arrival.
225 InsertNextPacket();
226 // Second packet arrival.
227 // Expect detector update method to be called once with inter-arrival time
228 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100229 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000230 .WillRepeatedly(Return(true));
231 EXPECT_CALL(detector_, MaxPeakHeight())
232 .WillRepeatedly(Return(kExpectedTarget));
233 IncreaseTime(kTimeIncrement);
234 InsertNextPacket();
235
236 // No limit is set.
237 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
238
239 int kMaxDelayPackets = kExpectedTarget - 2;
240 int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
241 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
242 IncreaseTime(kTimeIncrement);
243 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000244 EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
245
246 // Target level at least should be one packet.
247 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
248}
249
Niels Möller18f1adc2018-08-23 08:40:41 +0200250TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000251 const int kExpectedTarget = 5;
252 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
253 SetPacketAudioLength(kFrameSizeMs);
254 // First packet arrival.
255 InsertNextPacket();
256 // Second packet arrival.
257 // Expect detector update method to be called once with inter-arrival time
258 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100259 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000260 .WillRepeatedly(Return(true));
261 EXPECT_CALL(detector_, MaxPeakHeight())
262 .WillRepeatedly(Return(kExpectedTarget));
263 IncreaseTime(kTimeIncrement);
264 InsertNextPacket();
265
266 // No limit is applied.
267 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
268
269 int kMinDelayPackets = kExpectedTarget + 2;
270 int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
271 dm_->SetMinimumDelay(kMinDelayMs);
272 IncreaseTime(kTimeIncrement);
273 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000274 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
275}
276
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100277TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
278 SetPacketAudioLength(kFrameSizeMs);
279
280 // Base minimum delay should be between [0, 10000] milliseconds.
281 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
282 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
283 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
284
285 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
286 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
287}
288
289TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
290 SetPacketAudioLength(kFrameSizeMs);
291 constexpr int kBaseMinimumDelayMs = 100;
292 constexpr int kMinimumDelayMs = 200;
293
294 // Base minimum delay sets lower bound on minimum. That is why when base
295 // minimum delay is lower than minimum delay we use minimum delay.
296 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
297
298 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
299 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
300 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
301}
302
303TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
304 SetPacketAudioLength(kFrameSizeMs);
305 constexpr int kBaseMinimumDelayMs = 70;
306 constexpr int kMinimumDelayMs = 30;
307
308 // Base minimum delay sets lower bound on minimum. That is why when base
309 // minimum delay is greater than minimum delay we use base minimum delay.
310 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
311
312 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
313 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
314 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
315}
316
317TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
318 SetPacketAudioLength(kFrameSizeMs);
319 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
320 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100321 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100322 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
323
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100324 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
325
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100326 // Base minimum delay is greater than minimum delay, that is why we clamp
327 // it to current the highest possible value which is maximum delay.
328 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
329 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100330 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
331 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100332
333 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
334 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
335
336 // Unset maximum value.
337 EXPECT_TRUE(dm_->SetMaximumDelay(0));
338
339 // With maximum value unset, the highest possible value now is 75% of
340 // currently possible maximum buffer size.
341 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
342}
343
344TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
345 SetPacketAudioLength(kFrameSizeMs);
346 constexpr int kMaximumDelayMs = 400;
347 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
348 constexpr int kMinimumDelayMs = 20;
349
350 // Base minimum delay is greater than minimum delay, that is why we clamp
351 // it to current the highest possible value which is kMaximumDelayMs.
352 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
353 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
354 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
355
356 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
357 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
358 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
359 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
360}
361
362TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
363 SetPacketAudioLength(kFrameSizeMs);
364 constexpr int kMaximumDelayMs = 400;
365 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
366 constexpr int kMinimumDelayMs = 20;
367
368 // Base minimum delay is greater than minimum delay, and lower than maximum
369 // delays that is why it is used.
370 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
371 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
372
373 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
374 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
375 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
376 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
377}
378
379TEST_F(DelayManagerTest, MinimumDelayMemorization) {
380 // Check that when we increase base minimum delay to value higher than
381 // minimum delay then minimum delay is still memorized. This allows to
382 // restore effective minimum delay to memorized minimum delay value when we
383 // decrease base minimum delay.
384 SetPacketAudioLength(kFrameSizeMs);
385
386 constexpr int kBaseMinimumDelayMsLow = 10;
387 constexpr int kMinimumDelayMs = 20;
388 constexpr int kBaseMinimumDelayMsHigh = 30;
389
390 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
391 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
392 // Minimum delay is used as it is higher than base minimum delay.
393 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
394
395 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
396 // Base minimum delay is used as it is now higher than minimum delay.
397 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
398 kBaseMinimumDelayMsHigh);
399
400 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
401 // Check that minimum delay is memorized and is used again.
402 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
403}
404
405TEST_F(DelayManagerTest, BaseMinimumDelay) {
Ruslan Burakovedbea462019-02-04 16:17:31 +0100406 const int kExpectedTarget = 5;
407 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
408 SetPacketAudioLength(kFrameSizeMs);
409 // First packet arrival.
410 InsertNextPacket();
411 // Second packet arrival.
412 // Expect detector update method to be called once with inter-arrival time
413 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
414 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
415 .WillRepeatedly(Return(true));
416 EXPECT_CALL(detector_, MaxPeakHeight())
417 .WillRepeatedly(Return(kExpectedTarget));
418 IncreaseTime(kTimeIncrement);
419 InsertNextPacket();
420
421 // No limit is applied.
422 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
423
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100424 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
425 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
426 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
427 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100428
429 IncreaseTime(kTimeIncrement);
430 InsertNextPacket();
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100431 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
432 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100433}
434
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100435TEST_F(DelayManagerTest, BaseMinimumDealyAffectTargetLevel) {
436 const int kExpectedTarget = 5;
437 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
438 SetPacketAudioLength(kFrameSizeMs);
439 // First packet arrival.
440 InsertNextPacket();
441 // Second packet arrival.
442 // Expect detector update method to be called once with inter-arrival time
443 // equal to |kExpectedTarget|. Return true to indicate peaks found.
444 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
445 .WillRepeatedly(Return(true));
446 EXPECT_CALL(detector_, MaxPeakHeight())
447 .WillRepeatedly(Return(kExpectedTarget));
448 IncreaseTime(kTimeIncrement);
449 InsertNextPacket();
Ruslan Burakovedbea462019-02-04 16:17:31 +0100450
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100451 // No limit is applied.
452 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
453
454 // Minimum delay is lower than base minimum delay, that is why base minimum
455 // delay is used to calculate target level.
456 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
457 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
458
459 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
460 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
461
462 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
463 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
464 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
465 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
466
467 IncreaseTime(kTimeIncrement);
468 InsertNextPacket();
469 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
470 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100471}
472
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100473TEST_F(DelayManagerTest, UpdateReorderedPacket) {
474 SetPacketAudioLength(kFrameSizeMs);
475 InsertNextPacket();
476
477 // Insert packet that was sent before the previous packet.
478 EXPECT_CALL(detector_, Update(_, true, _));
479 EXPECT_EQ(0, dm_->Update(seq_no_ - 1, ts_ - kFrameSizeMs, kFs));
480}
481
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100482TEST_F(DelayManagerTest, EnableRtxHandling) {
483 enable_rtx_handling_ = true;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100484 use_mock_histogram_ = true;
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100485 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100486 EXPECT_TRUE(mock_histogram_);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100487
488 // Insert first packet.
489 SetPacketAudioLength(kFrameSizeMs);
490 InsertNextPacket();
491
492 // Insert reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100493 EXPECT_CALL(*mock_histogram_, Add(3));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100494 EXPECT_EQ(0, dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs));
495
496 // Insert another reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100497 EXPECT_CALL(*mock_histogram_, Add(2));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100498 EXPECT_EQ(0, dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs));
499
500 // Insert the next packet in order and verify that the inter-arrival time is
501 // estimated correctly.
502 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100503 EXPECT_CALL(*mock_histogram_, Add(1));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100504 InsertNextPacket();
505}
506
henrik.lundinb8c55b12017-05-10 07:38:01 -0700507// Tests that skipped sequence numbers (simulating empty packets) are handled
508// correctly.
509TEST_F(DelayManagerTest, EmptyPacketsReported) {
510 SetPacketAudioLength(kFrameSizeMs);
511 // First packet arrival.
512 InsertNextPacket();
513
514 // Advance time by one frame size.
515 IncreaseTime(kFrameSizeMs);
516
517 // Advance the sequence number by 5, simulating that 5 empty packets were
518 // received, but never inserted.
519 seq_no_ += 10;
520 for (int j = 0; j < 10; ++j) {
521 dm_->RegisterEmptyPacket();
522 }
523
524 // Second packet arrival.
525 // Expect detector update method to be called once with inter-arrival time
526 // equal to 1 packet, and (base) target level equal to 1 as well.
527 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100528 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700529 InsertNextPacket();
530
531 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
532}
533
534// Same as above, but do not call RegisterEmptyPacket. Observe the target level
535// increase dramatically.
536TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
537 SetPacketAudioLength(kFrameSizeMs);
538 // First packet arrival.
539 InsertNextPacket();
540
541 // Advance time by one frame size.
542 IncreaseTime(kFrameSizeMs);
543
544 // Advance the sequence number by 5, simulating that 5 empty packets were
545 // received, but never inserted.
546 seq_no_ += 10;
547
548 // Second packet arrival.
549 // Expect detector update method to be called once with inter-arrival time
550 // equal to 1 packet, and (base) target level equal to 1 as well.
551 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100552 EXPECT_CALL(detector_, Update(10, false, 10)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700553 InsertNextPacket();
554
555 // Note 10 times higher target value.
556 EXPECT_EQ(10 * 1 << 8, dm_->TargetLevel()); // In Q8.
557}
558
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000559TEST_F(DelayManagerTest, Failures) {
560 // Wrong sample rate.
561 EXPECT_EQ(-1, dm_->Update(0, 0, -1));
562 // Wrong packet size.
563 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
564 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000565
566 // Minimum delay higher than a maximum delay is not accepted.
567 EXPECT_TRUE(dm_->SetMaximumDelay(10));
568 EXPECT_FALSE(dm_->SetMinimumDelay(20));
569
570 // Maximum delay less than minimum delay is not accepted.
571 EXPECT_TRUE(dm_->SetMaximumDelay(100));
572 EXPECT_TRUE(dm_->SetMinimumDelay(80));
573 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000574}
575
Minyue Li002fbb82018-10-04 11:31:03 +0200576TEST_F(DelayManagerTest, TargetDelayGreaterThanOne) {
577 test::ScopedFieldTrials field_trial(
578 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-0/");
579 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100580 EXPECT_EQ(absl::make_optional<int>(0),
Minyue Li002fbb82018-10-04 11:31:03 +0200581 dm_->forced_limit_probability_for_test());
582
583 SetPacketAudioLength(kFrameSizeMs);
584 // First packet arrival.
585 InsertNextPacket();
586 // Advance time by one frame size.
587 IncreaseTime(kFrameSizeMs);
588 // Second packet arrival.
589 // Expect detector update method to be called once with inter-arrival time
590 // equal to 1 packet.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100591 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
Minyue Li002fbb82018-10-04 11:31:03 +0200592 InsertNextPacket();
593 constexpr int kExpectedTarget = 1;
594 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
595}
596
597TEST_F(DelayManagerTest, ForcedTargetDelayPercentile) {
598 {
599 test::ScopedFieldTrials field_trial(
600 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-95/");
601 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100602 EXPECT_EQ(absl::make_optional<int>(1020054733),
Minyue Li002fbb82018-10-04 11:31:03 +0200603 dm_->forced_limit_probability_for_test()); // 1/20 in Q30
604 }
605 {
606 test::ScopedFieldTrials field_trial(
607 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/");
608 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100609 EXPECT_EQ(absl::make_optional<int>(1073204953),
Minyue Li002fbb82018-10-04 11:31:03 +0200610 dm_->forced_limit_probability_for_test()); // 1/2000 in Q30
611 }
612 {
613 test::ScopedFieldTrials field_trial(
614 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Disabled/");
615 RecreateDelayManager();
616 EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
617 }
618 {
619 test::ScopedFieldTrials field_trial(
620 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled--1/");
621 EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
622 }
623 {
624 test::ScopedFieldTrials field_trial(
625 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-100.1/");
626 RecreateDelayManager();
627 EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
628 }
629}
630
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000631} // namespace webrtc