blob: c57f074326e71b8a369a7d80cb9b484fa28d0ec7 [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
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000042using ::testing::Return;
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000043using ::testing::_;
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_ =
65 DelayManager::HistogramMode::INTER_ARRIVAL_TIME;
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}
110void DelayManagerTest::TearDown() {
111 EXPECT_CALL(detector_, Die());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000112}
113
114TEST_F(DelayManagerTest, CreateAndDestroy) {
115 // Nothing to do here. The test fixture creates and destroys the DelayManager
116 // object.
117}
118
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000119TEST_F(DelayManagerTest, SetPacketAudioLength) {
120 const int kLengthMs = 30;
121 // Expect DelayManager to pass on the new length to the detector object.
Yves Gerey665174f2018-06-19 15:03:05 +0200122 EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs)).Times(1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000123 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
124 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
125}
126
127TEST_F(DelayManagerTest, PeakFound) {
128 // Expect DelayManager to pass on the question to the detector.
129 // Call twice, and let the detector return true the first time and false the
130 // second time.
131 EXPECT_CALL(detector_, peak_found())
132 .WillOnce(Return(true))
133 .WillOnce(Return(false));
134 EXPECT_TRUE(dm_->PeakFound());
135 EXPECT_FALSE(dm_->PeakFound());
136}
137
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000138TEST_F(DelayManagerTest, UpdateNormal) {
139 SetPacketAudioLength(kFrameSizeMs);
140 // First packet arrival.
141 InsertNextPacket();
142 // Advance time by one frame size.
143 IncreaseTime(kFrameSizeMs);
144 // Second packet arrival.
145 // Expect detector update method to be called once with inter-arrival time
146 // equal to 1 packet, and (base) target level equal to 1 as well.
147 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100148 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000149 InsertNextPacket();
150 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
151 EXPECT_EQ(1, dm_->base_target_level());
152 int lower, higher;
153 dm_->BufferLimits(&lower, &higher);
154 // Expect |lower| to be 75% of target level, and |higher| to be target level,
155 // but also at least 20 ms higher than |lower|, which is the limiting case
156 // here.
157 EXPECT_EQ((1 << 8) * 3 / 4, lower);
158 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
159}
160
161TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
162 SetPacketAudioLength(kFrameSizeMs);
163 // First packet arrival.
164 InsertNextPacket();
165 // Advance time by two frame size.
166 IncreaseTime(2 * kFrameSizeMs);
167 // Second packet arrival.
168 // Expect detector update method to be called once with inter-arrival time
169 // equal to 1 packet, and (base) target level equal to 1 as well.
170 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100171 EXPECT_CALL(detector_, Update(2, false, 2)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000172 InsertNextPacket();
173 EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8.
174 EXPECT_EQ(2, dm_->base_target_level());
175 int lower, higher;
176 dm_->BufferLimits(&lower, &higher);
177 // Expect |lower| to be 75% of target level, and |higher| to be target level,
178 // but also at least 20 ms higher than |lower|, which is the limiting case
179 // here.
180 EXPECT_EQ((2 << 8) * 3 / 4, lower);
181 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
182}
183
184TEST_F(DelayManagerTest, UpdatePeakFound) {
185 SetPacketAudioLength(kFrameSizeMs);
186 // First packet arrival.
187 InsertNextPacket();
188 // Advance time by one frame size.
189 IncreaseTime(kFrameSizeMs);
190 // Second packet arrival.
191 // Expect detector update method to be called once with inter-arrival time
192 // equal to 1 packet, and (base) target level equal to 1 as well.
193 // Return true to indicate that peaks are found. Let the peak height be 5.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100194 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(true));
Yves Gerey665174f2018-06-19 15:03:05 +0200195 EXPECT_CALL(detector_, MaxPeakHeight()).WillOnce(Return(5));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000196 InsertNextPacket();
197 EXPECT_EQ(5 << 8, dm_->TargetLevel());
198 EXPECT_EQ(1, dm_->base_target_level()); // Base target level is w/o peaks.
199 int lower, higher;
200 dm_->BufferLimits(&lower, &higher);
201 // Expect |lower| to be 75% of target level, and |higher| to be target level.
202 EXPECT_EQ((5 << 8) * 3 / 4, lower);
203 EXPECT_EQ(5 << 8, higher);
204}
205
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000206TEST_F(DelayManagerTest, TargetDelay) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000207 SetPacketAudioLength(kFrameSizeMs);
208 // First packet arrival.
209 InsertNextPacket();
210 // Advance time by one frame size.
211 IncreaseTime(kFrameSizeMs);
212 // Second packet arrival.
213 // Expect detector update method to be called once with inter-arrival time
214 // equal to 1 packet, and (base) target level equal to 1 as well.
215 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100216 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000217 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000218 const int kExpectedTarget = 1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000219 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
220 EXPECT_EQ(1, dm_->base_target_level());
221 int lower, higher;
222 dm_->BufferLimits(&lower, &higher);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000223 // Expect |lower| to be 75% of base target level, and |higher| to be
224 // lower + 20 ms headroom.
225 EXPECT_EQ((1 << 8) * 3 / 4, lower);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000226 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
227}
228
Niels Möller18f1adc2018-08-23 08:40:41 +0200229TEST_F(DelayManagerTest, MaxDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000230 const int kExpectedTarget = 5;
231 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
232 SetPacketAudioLength(kFrameSizeMs);
233 // First packet arrival.
234 InsertNextPacket();
235 // Second packet arrival.
236 // Expect detector update method to be called once with inter-arrival time
237 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100238 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000239 .WillRepeatedly(Return(true));
240 EXPECT_CALL(detector_, MaxPeakHeight())
241 .WillRepeatedly(Return(kExpectedTarget));
242 IncreaseTime(kTimeIncrement);
243 InsertNextPacket();
244
245 // No limit is set.
246 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
247
248 int kMaxDelayPackets = kExpectedTarget - 2;
249 int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
250 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
251 IncreaseTime(kTimeIncrement);
252 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000253 EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
254
255 // Target level at least should be one packet.
256 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
257}
258
Niels Möller18f1adc2018-08-23 08:40:41 +0200259TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000260 const int kExpectedTarget = 5;
261 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
262 SetPacketAudioLength(kFrameSizeMs);
263 // First packet arrival.
264 InsertNextPacket();
265 // Second packet arrival.
266 // Expect detector update method to be called once with inter-arrival time
267 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100268 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000269 .WillRepeatedly(Return(true));
270 EXPECT_CALL(detector_, MaxPeakHeight())
271 .WillRepeatedly(Return(kExpectedTarget));
272 IncreaseTime(kTimeIncrement);
273 InsertNextPacket();
274
275 // No limit is applied.
276 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
277
278 int kMinDelayPackets = kExpectedTarget + 2;
279 int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
280 dm_->SetMinimumDelay(kMinDelayMs);
281 IncreaseTime(kTimeIncrement);
282 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000283 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
284}
285
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100286TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
287 SetPacketAudioLength(kFrameSizeMs);
288
289 // Base minimum delay should be between [0, 10000] milliseconds.
290 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
291 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
292 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
293
294 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
295 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
296}
297
298TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
299 SetPacketAudioLength(kFrameSizeMs);
300 constexpr int kBaseMinimumDelayMs = 100;
301 constexpr int kMinimumDelayMs = 200;
302
303 // Base minimum delay sets lower bound on minimum. That is why when base
304 // minimum delay is lower than minimum delay we use minimum delay.
305 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
306
307 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
308 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
309 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
310}
311
312TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
313 SetPacketAudioLength(kFrameSizeMs);
314 constexpr int kBaseMinimumDelayMs = 70;
315 constexpr int kMinimumDelayMs = 30;
316
317 // Base minimum delay sets lower bound on minimum. That is why when base
318 // minimum delay is greater than minimum delay we use base minimum delay.
319 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
320
321 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
322 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
323 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
324}
325
326TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
327 SetPacketAudioLength(kFrameSizeMs);
328 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
329 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100330 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100331 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
332
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100333 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
334
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100335 // Base minimum delay is greater than minimum delay, that is why we clamp
336 // it to current the highest possible value which is maximum delay.
337 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
338 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100339 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
340 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100341
342 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
343 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
344
345 // Unset maximum value.
346 EXPECT_TRUE(dm_->SetMaximumDelay(0));
347
348 // With maximum value unset, the highest possible value now is 75% of
349 // currently possible maximum buffer size.
350 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
351}
352
353TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
354 SetPacketAudioLength(kFrameSizeMs);
355 constexpr int kMaximumDelayMs = 400;
356 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
357 constexpr int kMinimumDelayMs = 20;
358
359 // Base minimum delay is greater than minimum delay, that is why we clamp
360 // it to current the highest possible value which is kMaximumDelayMs.
361 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
362 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
363 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
364
365 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
366 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
367 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
368 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
369}
370
371TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
372 SetPacketAudioLength(kFrameSizeMs);
373 constexpr int kMaximumDelayMs = 400;
374 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
375 constexpr int kMinimumDelayMs = 20;
376
377 // Base minimum delay is greater than minimum delay, and lower than maximum
378 // delays that is why it is used.
379 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
380 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
381
382 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
383 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
384 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
385 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
386}
387
388TEST_F(DelayManagerTest, MinimumDelayMemorization) {
389 // Check that when we increase base minimum delay to value higher than
390 // minimum delay then minimum delay is still memorized. This allows to
391 // restore effective minimum delay to memorized minimum delay value when we
392 // decrease base minimum delay.
393 SetPacketAudioLength(kFrameSizeMs);
394
395 constexpr int kBaseMinimumDelayMsLow = 10;
396 constexpr int kMinimumDelayMs = 20;
397 constexpr int kBaseMinimumDelayMsHigh = 30;
398
399 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
400 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
401 // Minimum delay is used as it is higher than base minimum delay.
402 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
403
404 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
405 // Base minimum delay is used as it is now higher than minimum delay.
406 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
407 kBaseMinimumDelayMsHigh);
408
409 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
410 // Check that minimum delay is memorized and is used again.
411 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
412}
413
414TEST_F(DelayManagerTest, BaseMinimumDelay) {
Ruslan Burakovedbea462019-02-04 16:17:31 +0100415 const int kExpectedTarget = 5;
416 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
417 SetPacketAudioLength(kFrameSizeMs);
418 // First packet arrival.
419 InsertNextPacket();
420 // Second packet arrival.
421 // Expect detector update method to be called once with inter-arrival time
422 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
423 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
424 .WillRepeatedly(Return(true));
425 EXPECT_CALL(detector_, MaxPeakHeight())
426 .WillRepeatedly(Return(kExpectedTarget));
427 IncreaseTime(kTimeIncrement);
428 InsertNextPacket();
429
430 // No limit is applied.
431 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
432
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100433 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
434 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
435 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
436 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100437
438 IncreaseTime(kTimeIncrement);
439 InsertNextPacket();
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100440 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
441 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100442}
443
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100444TEST_F(DelayManagerTest, BaseMinimumDealyAffectTargetLevel) {
445 const int kExpectedTarget = 5;
446 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
447 SetPacketAudioLength(kFrameSizeMs);
448 // First packet arrival.
449 InsertNextPacket();
450 // Second packet arrival.
451 // Expect detector update method to be called once with inter-arrival time
452 // equal to |kExpectedTarget|. Return true to indicate peaks found.
453 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
454 .WillRepeatedly(Return(true));
455 EXPECT_CALL(detector_, MaxPeakHeight())
456 .WillRepeatedly(Return(kExpectedTarget));
457 IncreaseTime(kTimeIncrement);
458 InsertNextPacket();
Ruslan Burakovedbea462019-02-04 16:17:31 +0100459
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100460 // No limit is applied.
461 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
462
463 // Minimum delay is lower than base minimum delay, that is why base minimum
464 // delay is used to calculate target level.
465 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
466 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
467
468 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
469 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
470
471 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
472 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
473 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
474 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
475
476 IncreaseTime(kTimeIncrement);
477 InsertNextPacket();
478 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
479 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100480}
481
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100482TEST_F(DelayManagerTest, UpdateReorderedPacket) {
483 SetPacketAudioLength(kFrameSizeMs);
484 InsertNextPacket();
485
486 // Insert packet that was sent before the previous packet.
487 EXPECT_CALL(detector_, Update(_, true, _));
488 EXPECT_EQ(0, dm_->Update(seq_no_ - 1, ts_ - kFrameSizeMs, kFs));
489}
490
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100491TEST_F(DelayManagerTest, EnableRtxHandling) {
492 enable_rtx_handling_ = true;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100493 use_mock_histogram_ = true;
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100494 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100495 EXPECT_TRUE(mock_histogram_);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100496
497 // Insert first packet.
498 SetPacketAudioLength(kFrameSizeMs);
499 InsertNextPacket();
500
501 // Insert reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100502 EXPECT_CALL(*mock_histogram_, Add(3));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100503 EXPECT_EQ(0, dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs));
504
505 // Insert another reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100506 EXPECT_CALL(*mock_histogram_, Add(2));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100507 EXPECT_EQ(0, dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs));
508
509 // Insert the next packet in order and verify that the inter-arrival time is
510 // estimated correctly.
511 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100512 EXPECT_CALL(*mock_histogram_, Add(1));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100513 InsertNextPacket();
514}
515
henrik.lundinb8c55b12017-05-10 07:38:01 -0700516// Tests that skipped sequence numbers (simulating empty packets) are handled
517// correctly.
518TEST_F(DelayManagerTest, EmptyPacketsReported) {
519 SetPacketAudioLength(kFrameSizeMs);
520 // First packet arrival.
521 InsertNextPacket();
522
523 // Advance time by one frame size.
524 IncreaseTime(kFrameSizeMs);
525
526 // Advance the sequence number by 5, simulating that 5 empty packets were
527 // received, but never inserted.
528 seq_no_ += 10;
529 for (int j = 0; j < 10; ++j) {
530 dm_->RegisterEmptyPacket();
531 }
532
533 // Second packet arrival.
534 // Expect detector update method to be called once with inter-arrival time
535 // equal to 1 packet, and (base) target level equal to 1 as well.
536 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100537 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700538 InsertNextPacket();
539
540 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
541}
542
543// Same as above, but do not call RegisterEmptyPacket. Observe the target level
544// increase dramatically.
545TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
546 SetPacketAudioLength(kFrameSizeMs);
547 // First packet arrival.
548 InsertNextPacket();
549
550 // Advance time by one frame size.
551 IncreaseTime(kFrameSizeMs);
552
553 // Advance the sequence number by 5, simulating that 5 empty packets were
554 // received, but never inserted.
555 seq_no_ += 10;
556
557 // Second packet arrival.
558 // Expect detector update method to be called once with inter-arrival time
559 // equal to 1 packet, and (base) target level equal to 1 as well.
560 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100561 EXPECT_CALL(detector_, Update(10, false, 10)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700562 InsertNextPacket();
563
564 // Note 10 times higher target value.
565 EXPECT_EQ(10 * 1 << 8, dm_->TargetLevel()); // In Q8.
566}
567
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000568TEST_F(DelayManagerTest, Failures) {
569 // Wrong sample rate.
570 EXPECT_EQ(-1, dm_->Update(0, 0, -1));
571 // Wrong packet size.
572 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
573 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000574
575 // Minimum delay higher than a maximum delay is not accepted.
576 EXPECT_TRUE(dm_->SetMaximumDelay(10));
577 EXPECT_FALSE(dm_->SetMinimumDelay(20));
578
579 // Maximum delay less than minimum delay is not accepted.
580 EXPECT_TRUE(dm_->SetMaximumDelay(100));
581 EXPECT_TRUE(dm_->SetMinimumDelay(80));
582 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000583}
584
Minyue Li002fbb82018-10-04 11:31:03 +0200585TEST_F(DelayManagerTest, TargetDelayGreaterThanOne) {
586 test::ScopedFieldTrials field_trial(
587 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-0/");
588 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100589 EXPECT_EQ(0, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200590
591 SetPacketAudioLength(kFrameSizeMs);
592 // First packet arrival.
593 InsertNextPacket();
594 // Advance time by one frame size.
595 IncreaseTime(kFrameSizeMs);
596 // Second packet arrival.
597 // Expect detector update method to be called once with inter-arrival time
598 // equal to 1 packet.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100599 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
Minyue Li002fbb82018-10-04 11:31:03 +0200600 InsertNextPacket();
601 constexpr int kExpectedTarget = 1;
602 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
603}
604
605TEST_F(DelayManagerTest, ForcedTargetDelayPercentile) {
606 {
607 test::ScopedFieldTrials field_trial(
608 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-95/");
609 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100610 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200611 }
612 {
613 test::ScopedFieldTrials field_trial(
614 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/");
615 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100616 EXPECT_EQ(1073204953, dm_->histogram_quantile()); // 0.9995 in Q30.
Minyue Li002fbb82018-10-04 11:31:03 +0200617 }
618 {
619 test::ScopedFieldTrials field_trial(
620 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Disabled/");
621 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100622 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200623 }
624 {
625 test::ScopedFieldTrials field_trial(
626 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled--1/");
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100627 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200628 }
629 {
630 test::ScopedFieldTrials field_trial(
631 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-100.1/");
632 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100633 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200634 }
635}
636
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100637TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
638 {
639 test::ScopedFieldTrials field_trial(
640 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
641 RecreateDelayManager();
642 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
643 dm_->histogram_mode());
644 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
645 EXPECT_EQ(32702, dm_->histogram_forget_factor()); // 0.998 in Q15.
646 }
647 {
648 test::ScopedFieldTrials field_trial(
649 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
650 RecreateDelayManager();
651 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
652 dm_->histogram_mode());
653 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
654 EXPECT_EQ(32702, dm_->histogram_forget_factor()); // 0.998 in Q15.
655 }
656 {
657 // NetEqDelayHistogram should take precedence over
658 // NetEqForceTargetDelayPercentile.
659 test::ScopedFieldTrials field_trial(
660 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/"
661 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
662 RecreateDelayManager();
663 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
664 dm_->histogram_mode());
665 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
666 EXPECT_EQ(32702, dm_->histogram_forget_factor()); // 0.998 in Q15.
667 }
668 {
669 // Invalid parameters.
670 test::ScopedFieldTrials field_trial(
671 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96/");
672 RecreateDelayManager();
673 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
674 dm_->histogram_mode());
675 EXPECT_EQ(kDefaultHistogramQuantile,
676 dm_->histogram_quantile()); // 0.95 in Q30.
677 EXPECT_EQ(kForgetFactor, dm_->histogram_forget_factor()); // 0.9993 in Q15.
678 }
679 {
680 test::ScopedFieldTrials field_trial(
681 "WebRTC-Audio-NetEqDelayHistogram/Disabled/");
682 RecreateDelayManager();
683 EXPECT_EQ(DelayManager::HistogramMode::INTER_ARRIVAL_TIME,
684 dm_->histogram_mode());
685 EXPECT_EQ(kDefaultHistogramQuantile,
686 dm_->histogram_quantile()); // 0.95 in Q30.
687 EXPECT_EQ(kForgetFactor, dm_->histogram_forget_factor()); // 0.9993 in Q15.
688 }
689}
690
691TEST_F(DelayManagerTest, RelativeArrivalDelayMode) {
692 histogram_mode_ = DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
693 use_mock_histogram_ = true;
694 RecreateDelayManager();
695
696 SetPacketAudioLength(kFrameSizeMs);
697 InsertNextPacket();
698
699 IncreaseTime(kFrameSizeMs);
700 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
701 InsertNextPacket();
702
703 IncreaseTime(2 * kFrameSizeMs);
704 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
705 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
706
707 IncreaseTime(2 * kFrameSizeMs);
708 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
709 EXPECT_EQ(0, dm_->Update(seq_no_ + 1, ts_ + kTsIncrement, kFs));
710
711 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
712 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
713}
714
Jakob Ivarsson44507082019-03-05 16:59:03 +0100715TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
716 SetPacketAudioLength(kFrameSizeMs);
717 InsertNextPacket();
718
719 IncreaseTime(kFrameSizeMs);
720 EXPECT_CALL(stats_, RelativePacketArrivalDelay(0));
721 InsertNextPacket();
722
723 IncreaseTime(2 * kFrameSizeMs);
724 EXPECT_CALL(stats_, RelativePacketArrivalDelay(20));
725 InsertNextPacket();
726}
727
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000728} // namespace webrtc