blob: c691fd5bc93b278429943508e93df8145f2931c9 [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
Mirko Bonadei317a1f02019-09-17 17:06:18 +020017#include <memory>
18
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010019#include "modules/audio_coding/neteq/histogram.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/audio_coding/neteq/mock/mock_delay_peak_detector.h"
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010021#include "modules/audio_coding/neteq/mock/mock_histogram.h"
Jakob Ivarsson44507082019-03-05 16:59:03 +010022#include "modules/audio_coding/neteq/mock/mock_statistics_calculator.h"
Ruslan Burakov4a68fb92019-02-13 14:25:39 +010023#include "rtc_base/checks.h"
Minyue Li002fbb82018-10-04 11:31:03 +020024#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "test/gmock.h"
26#include "test/gtest.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000027
28namespace webrtc {
29
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010030namespace {
31constexpr int kMaxNumberOfPackets = 240;
32constexpr int kMinDelayMs = 0;
33constexpr int kTimeStepMs = 10;
34constexpr int kFs = 8000;
35constexpr int kFrameSizeMs = 20;
36constexpr int kTsIncrement = kFrameSizeMs * kFs / 1000;
37constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
38constexpr int kDefaultHistogramQuantile = 1020054733;
39constexpr int kMaxIat = 64;
40constexpr int kForgetFactor = 32745;
41} // namespace
42
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000043using ::testing::_;
Jonas Olssona4d87372019-07-05 19:08:33 +020044using ::testing::Return;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000045
46class DelayManagerTest : public ::testing::Test {
47 protected:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000048 DelayManagerTest();
49 virtual void SetUp();
50 virtual void TearDown();
Minyue Li002fbb82018-10-04 11:31:03 +020051 void RecreateDelayManager();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000052 void SetPacketAudioLength(int lengt_ms);
53 void InsertNextPacket();
54 void IncreaseTime(int inc_ms);
55
Minyue Li002fbb82018-10-04 11:31:03 +020056 std::unique_ptr<DelayManager> dm_;
henrik.lundinf3933702016-04-28 01:53:52 -070057 TickTimer tick_timer_;
Jakob Ivarsson44507082019-03-05 16:59:03 +010058 MockStatisticsCalculator stats_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000059 MockDelayPeakDetector detector_;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010060 MockHistogram* mock_histogram_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000061 uint16_t seq_no_;
62 uint32_t ts_;
Jakob Ivarssone98954c2019-02-06 15:37:50 +010063 bool enable_rtx_handling_ = false;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010064 bool use_mock_histogram_ = false;
65 DelayManager::HistogramMode histogram_mode_ =
Jakob Ivarsson507f4342019-09-03 13:04:41 +020066 DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000067};
68
69DelayManagerTest::DelayManagerTest()
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010070 : dm_(nullptr),
71 detector_(&tick_timer_, false),
72 seq_no_(0x1234),
73 ts_(0x12345678) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000074
75void DelayManagerTest::SetUp() {
Minyue Li002fbb82018-10-04 11:31:03 +020076 RecreateDelayManager();
77}
78
79void DelayManagerTest::RecreateDelayManager() {
Yves Gerey665174f2018-06-19 15:03:05 +020080 EXPECT_CALL(detector_, Reset()).Times(1);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010081 if (use_mock_histogram_) {
82 mock_histogram_ = new MockHistogram(kMaxIat, kForgetFactor);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010083 std::unique_ptr<Histogram> histogram(mock_histogram_);
Mirko Bonadei317a1f02019-09-17 17:06:18 +020084 dm_ = std::make_unique<DelayManager>(
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010085 kMaxNumberOfPackets, kMinDelayMs, kDefaultHistogramQuantile,
86 histogram_mode_, enable_rtx_handling_, &detector_, &tick_timer_,
Jakob Ivarsson44507082019-03-05 16:59:03 +010087 &stats_, std::move(histogram));
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010088 } else {
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010089 dm_ = DelayManager::Create(kMaxNumberOfPackets, kMinDelayMs,
Jakob Ivarsson44507082019-03-05 16:59:03 +010090 enable_rtx_handling_, &detector_, &tick_timer_,
91 &stats_);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010092 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000093}
94
95void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
96 EXPECT_CALL(detector_, SetPacketAudioLength(lengt_ms));
97 dm_->SetPacketAudioLength(lengt_ms);
98}
99
100void DelayManagerTest::InsertNextPacket() {
101 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
102 seq_no_ += 1;
103 ts_ += kTsIncrement;
104}
105
106void DelayManagerTest::IncreaseTime(int inc_ms) {
107 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -0700108 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000109 }
110}
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200111
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000112void DelayManagerTest::TearDown() {
113 EXPECT_CALL(detector_, Die());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000114}
115
116TEST_F(DelayManagerTest, CreateAndDestroy) {
117 // Nothing to do here. The test fixture creates and destroys the DelayManager
118 // object.
119}
120
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000121TEST_F(DelayManagerTest, SetPacketAudioLength) {
122 const int kLengthMs = 30;
123 // Expect DelayManager to pass on the new length to the detector object.
Yves Gerey665174f2018-06-19 15:03:05 +0200124 EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs)).Times(1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000125 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
126 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
127}
128
129TEST_F(DelayManagerTest, PeakFound) {
130 // Expect DelayManager to pass on the question to the detector.
131 // Call twice, and let the detector return true the first time and false the
132 // second time.
133 EXPECT_CALL(detector_, peak_found())
134 .WillOnce(Return(true))
135 .WillOnce(Return(false));
136 EXPECT_TRUE(dm_->PeakFound());
137 EXPECT_FALSE(dm_->PeakFound());
138}
139
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000140TEST_F(DelayManagerTest, UpdateNormal) {
141 SetPacketAudioLength(kFrameSizeMs);
142 // First packet arrival.
143 InsertNextPacket();
144 // Advance time by one frame size.
145 IncreaseTime(kFrameSizeMs);
146 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000147 InsertNextPacket();
148 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
149 EXPECT_EQ(1, dm_->base_target_level());
150 int lower, higher;
151 dm_->BufferLimits(&lower, &higher);
152 // Expect |lower| to be 75% of target level, and |higher| to be target level,
153 // but also at least 20 ms higher than |lower|, which is the limiting case
154 // here.
155 EXPECT_EQ((1 << 8) * 3 / 4, lower);
156 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
157}
158
159TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
160 SetPacketAudioLength(kFrameSizeMs);
161 // First packet arrival.
162 InsertNextPacket();
163 // Advance time by two frame size.
164 IncreaseTime(2 * kFrameSizeMs);
165 // Second packet arrival.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000166 InsertNextPacket();
167 EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8.
168 EXPECT_EQ(2, dm_->base_target_level());
169 int lower, higher;
170 dm_->BufferLimits(&lower, &higher);
171 // Expect |lower| to be 75% of target level, and |higher| to be target level,
172 // but also at least 20 ms higher than |lower|, which is the limiting case
173 // here.
174 EXPECT_EQ((2 << 8) * 3 / 4, lower);
175 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
176}
177
Niels Möller18f1adc2018-08-23 08:40:41 +0200178TEST_F(DelayManagerTest, MaxDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000179 const int kExpectedTarget = 5;
180 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
181 SetPacketAudioLength(kFrameSizeMs);
182 // First packet arrival.
183 InsertNextPacket();
184 // Second packet arrival.
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000185 IncreaseTime(kTimeIncrement);
186 InsertNextPacket();
187
188 // No limit is set.
189 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
190
191 int kMaxDelayPackets = kExpectedTarget - 2;
192 int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
193 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
194 IncreaseTime(kTimeIncrement);
195 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000196 EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
197
198 // Target level at least should be one packet.
199 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
200}
201
Niels Möller18f1adc2018-08-23 08:40:41 +0200202TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000203 const int kExpectedTarget = 5;
204 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
205 SetPacketAudioLength(kFrameSizeMs);
206 // First packet arrival.
207 InsertNextPacket();
208 // Second packet arrival.
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000209 IncreaseTime(kTimeIncrement);
210 InsertNextPacket();
211
212 // No limit is applied.
213 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
214
215 int kMinDelayPackets = kExpectedTarget + 2;
216 int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
217 dm_->SetMinimumDelay(kMinDelayMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200218 IncreaseTime(kFrameSizeMs);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000219 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000220 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
221}
222
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100223TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
224 SetPacketAudioLength(kFrameSizeMs);
225
226 // Base minimum delay should be between [0, 10000] milliseconds.
227 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
228 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
229 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
230
231 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
232 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
233}
234
235TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
236 SetPacketAudioLength(kFrameSizeMs);
237 constexpr int kBaseMinimumDelayMs = 100;
238 constexpr int kMinimumDelayMs = 200;
239
240 // Base minimum delay sets lower bound on minimum. That is why when base
241 // minimum delay is lower than minimum delay we use minimum delay.
242 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
243
244 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
245 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
246 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
247}
248
249TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
250 SetPacketAudioLength(kFrameSizeMs);
251 constexpr int kBaseMinimumDelayMs = 70;
252 constexpr int kMinimumDelayMs = 30;
253
254 // Base minimum delay sets lower bound on minimum. That is why when base
255 // minimum delay is greater than minimum delay we use base minimum delay.
256 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
257
258 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
259 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
260 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
261}
262
263TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
264 SetPacketAudioLength(kFrameSizeMs);
265 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
266 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100267 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100268 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
269
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100270 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
271
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100272 // Base minimum delay is greater than minimum delay, that is why we clamp
273 // it to current the highest possible value which is maximum delay.
274 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
275 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100276 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
277 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100278
279 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
280 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
281
282 // Unset maximum value.
283 EXPECT_TRUE(dm_->SetMaximumDelay(0));
284
285 // With maximum value unset, the highest possible value now is 75% of
286 // currently possible maximum buffer size.
287 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
288}
289
290TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
291 SetPacketAudioLength(kFrameSizeMs);
292 constexpr int kMaximumDelayMs = 400;
293 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
294 constexpr int kMinimumDelayMs = 20;
295
296 // Base minimum delay is greater than minimum delay, that is why we clamp
297 // it to current the highest possible value which is kMaximumDelayMs.
298 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
299 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
300 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
301
302 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
303 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
304 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
305 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
306}
307
308TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
309 SetPacketAudioLength(kFrameSizeMs);
310 constexpr int kMaximumDelayMs = 400;
311 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
312 constexpr int kMinimumDelayMs = 20;
313
314 // Base minimum delay is greater than minimum delay, and lower than maximum
315 // delays that is why it is used.
316 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
317 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
318
319 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
320 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
321 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
322 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
323}
324
325TEST_F(DelayManagerTest, MinimumDelayMemorization) {
326 // Check that when we increase base minimum delay to value higher than
327 // minimum delay then minimum delay is still memorized. This allows to
328 // restore effective minimum delay to memorized minimum delay value when we
329 // decrease base minimum delay.
330 SetPacketAudioLength(kFrameSizeMs);
331
332 constexpr int kBaseMinimumDelayMsLow = 10;
333 constexpr int kMinimumDelayMs = 20;
334 constexpr int kBaseMinimumDelayMsHigh = 30;
335
336 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
337 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
338 // Minimum delay is used as it is higher than base minimum delay.
339 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
340
341 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
342 // Base minimum delay is used as it is now higher than minimum delay.
343 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
344 kBaseMinimumDelayMsHigh);
345
346 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
347 // Check that minimum delay is memorized and is used again.
348 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
349}
350
351TEST_F(DelayManagerTest, BaseMinimumDelay) {
Ruslan Burakovedbea462019-02-04 16:17:31 +0100352 const int kExpectedTarget = 5;
353 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
354 SetPacketAudioLength(kFrameSizeMs);
355 // First packet arrival.
356 InsertNextPacket();
357 // Second packet arrival.
Ruslan Burakovedbea462019-02-04 16:17:31 +0100358 IncreaseTime(kTimeIncrement);
359 InsertNextPacket();
360
361 // No limit is applied.
362 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
363
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100364 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
365 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
366 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
367 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100368
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200369 IncreaseTime(kFrameSizeMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100370 InsertNextPacket();
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100371 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
372 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100373}
374
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100375TEST_F(DelayManagerTest, BaseMinimumDealyAffectTargetLevel) {
376 const int kExpectedTarget = 5;
377 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
378 SetPacketAudioLength(kFrameSizeMs);
379 // First packet arrival.
380 InsertNextPacket();
381 // Second packet arrival.
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100382 IncreaseTime(kTimeIncrement);
383 InsertNextPacket();
Ruslan Burakovedbea462019-02-04 16:17:31 +0100384
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100385 // No limit is applied.
386 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
387
388 // Minimum delay is lower than base minimum delay, that is why base minimum
389 // delay is used to calculate target level.
390 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
391 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
392
393 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
394 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
395
396 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
397 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
398 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
399 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
400
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200401 IncreaseTime(kFrameSizeMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100402 InsertNextPacket();
403 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
404 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100405}
406
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100407TEST_F(DelayManagerTest, EnableRtxHandling) {
408 enable_rtx_handling_ = true;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100409 use_mock_histogram_ = true;
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100410 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100411 EXPECT_TRUE(mock_histogram_);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100412
413 // Insert first packet.
414 SetPacketAudioLength(kFrameSizeMs);
415 InsertNextPacket();
416
417 // Insert reordered packet.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200418 EXPECT_CALL(*mock_histogram_, Add(2));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100419 EXPECT_EQ(0, dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs));
420
421 // Insert another reordered packet.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200422 EXPECT_CALL(*mock_histogram_, Add(1));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100423 EXPECT_EQ(0, dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs));
424
425 // Insert the next packet in order and verify that the inter-arrival time is
426 // estimated correctly.
427 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200428 EXPECT_CALL(*mock_histogram_, Add(0));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100429 InsertNextPacket();
430}
431
henrik.lundinb8c55b12017-05-10 07:38:01 -0700432// Tests that skipped sequence numbers (simulating empty packets) are handled
433// correctly.
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200434// TODO(jakobi): Make delay manager independent of sequence numbers.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700435TEST_F(DelayManagerTest, EmptyPacketsReported) {
436 SetPacketAudioLength(kFrameSizeMs);
437 // First packet arrival.
438 InsertNextPacket();
439
440 // Advance time by one frame size.
441 IncreaseTime(kFrameSizeMs);
442
443 // Advance the sequence number by 5, simulating that 5 empty packets were
444 // received, but never inserted.
445 seq_no_ += 10;
446 for (int j = 0; j < 10; ++j) {
447 dm_->RegisterEmptyPacket();
448 }
449
450 // Second packet arrival.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700451 InsertNextPacket();
452
453 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
454}
455
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200456// Same as above, but do not call RegisterEmptyPacket. Target level stays the
457// same.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700458TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
459 SetPacketAudioLength(kFrameSizeMs);
460 // First packet arrival.
461 InsertNextPacket();
462
463 // Advance time by one frame size.
464 IncreaseTime(kFrameSizeMs);
465
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200466 // Advance the sequence number by 10, simulating that 10 empty packets were
henrik.lundinb8c55b12017-05-10 07:38:01 -0700467 // received, but never inserted.
468 seq_no_ += 10;
469
470 // Second packet arrival.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700471 InsertNextPacket();
472
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200473 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
henrik.lundinb8c55b12017-05-10 07:38:01 -0700474}
475
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000476TEST_F(DelayManagerTest, Failures) {
477 // Wrong sample rate.
478 EXPECT_EQ(-1, dm_->Update(0, 0, -1));
479 // Wrong packet size.
480 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
481 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000482
483 // Minimum delay higher than a maximum delay is not accepted.
484 EXPECT_TRUE(dm_->SetMaximumDelay(10));
485 EXPECT_FALSE(dm_->SetMinimumDelay(20));
486
487 // Maximum delay less than minimum delay is not accepted.
488 EXPECT_TRUE(dm_->SetMaximumDelay(100));
489 EXPECT_TRUE(dm_->SetMinimumDelay(80));
490 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000491}
492
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100493TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
494 {
495 test::ScopedFieldTrials field_trial(
496 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
497 RecreateDelayManager();
498 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
499 dm_->histogram_mode());
500 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200501 EXPECT_EQ(
502 32702,
503 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
504 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100505 }
506 {
507 test::ScopedFieldTrials field_trial(
508 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
509 RecreateDelayManager();
510 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
511 dm_->histogram_mode());
512 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200513 EXPECT_EQ(
514 32702,
515 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
516 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100517 }
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200518 // Test parameter for new call start adaptation.
519 {
520 test::ScopedFieldTrials field_trial(
521 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1/");
522 RecreateDelayManager();
523 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.0);
524 }
525 {
526 test::ScopedFieldTrials field_trial(
527 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1.5/");
528 RecreateDelayManager();
529 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.5);
530 }
531 {
532 test::ScopedFieldTrials field_trial(
533 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-0.5/");
534 RecreateDelayManager();
535 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100536 }
537}
538
539TEST_F(DelayManagerTest, RelativeArrivalDelayMode) {
540 histogram_mode_ = DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
541 use_mock_histogram_ = true;
542 RecreateDelayManager();
543
544 SetPacketAudioLength(kFrameSizeMs);
545 InsertNextPacket();
546
547 IncreaseTime(kFrameSizeMs);
548 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
549 InsertNextPacket();
550
551 IncreaseTime(2 * kFrameSizeMs);
552 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
553 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
554
555 IncreaseTime(2 * kFrameSizeMs);
556 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
557 EXPECT_EQ(0, dm_->Update(seq_no_ + 1, ts_ + kTsIncrement, kFs));
558
559 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
560 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
561}
562
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200563TEST_F(DelayManagerTest, MaxDelayHistory) {
564 histogram_mode_ = DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
565 use_mock_histogram_ = true;
566 RecreateDelayManager();
567
568 SetPacketAudioLength(kFrameSizeMs);
569 InsertNextPacket();
570
571 // Insert 20 ms iat delay in the delay history.
572 IncreaseTime(2 * kFrameSizeMs);
573 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
574 InsertNextPacket();
575
576 // Insert next packet with a timestamp difference larger than maximum history
577 // size. This removes the previously inserted iat delay from the history.
578 constexpr int kMaxHistoryMs = 2000;
579 IncreaseTime(kMaxHistoryMs + kFrameSizeMs);
580 ts_ += kFs * kMaxHistoryMs / 1000;
581 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
582 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
583}
584
Jakob Ivarsson44507082019-03-05 16:59:03 +0100585TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
586 SetPacketAudioLength(kFrameSizeMs);
587 InsertNextPacket();
588
589 IncreaseTime(kFrameSizeMs);
590 EXPECT_CALL(stats_, RelativePacketArrivalDelay(0));
591 InsertNextPacket();
592
593 IncreaseTime(2 * kFrameSizeMs);
594 EXPECT_CALL(stats_, RelativePacketArrivalDelay(20));
595 InsertNextPacket();
596}
597
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200598TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) {
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200599 SetPacketAudioLength(kFrameSizeMs);
600
601 // Deceleration target level offset follows the value hardcoded in
602 // delay_manager.cc.
603 constexpr int kDecelerationTargetLevelOffsetMs = 85 << 8; // In Q8.
604 // Border value where |x * 3/4 = target_level - x|.
605 constexpr int kBoarderTargetLevel = kDecelerationTargetLevelOffsetMs * 4;
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200606 {
607 // Test that for a low target level, default behaviour is intact.
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200608 const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs - 1;
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200609
610 int lower, higher; // In Q8.
611 dm_->BufferLimits(target_level_ms, &lower, &higher);
612
613 // Default behaviour of taking 75% of target level.
614 EXPECT_EQ(target_level_ms * 3 / 4, lower);
615 EXPECT_EQ(target_level_ms, higher);
616 }
617
618 {
619 // Test that for the high target level, |lower| is below target level by
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200620 // fixed |kOffset|.
621 const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs + 1;
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200622
623 int lower, higher; // In Q8.
624 dm_->BufferLimits(target_level_ms, &lower, &higher);
625
Ruslan Burakovaa5a75d2019-09-12 15:44:18 +0200626 EXPECT_EQ(target_level_ms - kDecelerationTargetLevelOffsetMs / kFrameSizeMs,
627 lower);
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200628 EXPECT_EQ(target_level_ms, higher);
629 }
630}
631
Jakob Ivarsson81df62b2019-07-17 14:09:04 +0200632TEST_F(DelayManagerTest, ExtraDelay) {
633 {
634 // Default behavior. Insert two packets so that a new target level is
635 // calculated.
636 SetPacketAudioLength(kFrameSizeMs);
637 InsertNextPacket();
638 IncreaseTime(kFrameSizeMs);
639 InsertNextPacket();
640 EXPECT_EQ(dm_->TargetLevel(), 1 << 8);
641 }
642 {
643 // Add 80 ms extra delay and calculate a new target level.
644 test::ScopedFieldTrials field_trial(
645 "WebRTC-Audio-NetEqExtraDelay/Enabled-80/");
646 RecreateDelayManager();
647 SetPacketAudioLength(kFrameSizeMs);
648 InsertNextPacket();
649 IncreaseTime(kFrameSizeMs);
650 InsertNextPacket();
651 EXPECT_EQ(dm_->TargetLevel(), 5 << 8);
652 }
653}
654
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000655} // namespace webrtc