blob: 7b573240d3c4d3741e401d9301b13a41d9995aa0 [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
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010028namespace {
29constexpr int kMaxNumberOfPackets = 240;
30constexpr int kMinDelayMs = 0;
31constexpr int kTimeStepMs = 10;
32constexpr int kFs = 8000;
33constexpr int kFrameSizeMs = 20;
34constexpr int kTsIncrement = kFrameSizeMs * kFs / 1000;
35constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
36constexpr int kDefaultHistogramQuantile = 1020054733;
37constexpr int kMaxIat = 64;
38constexpr int kForgetFactor = 32745;
39} // namespace
40
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000041using ::testing::Return;
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000042using ::testing::_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000043
44class DelayManagerTest : public ::testing::Test {
45 protected:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000046 DelayManagerTest();
47 virtual void SetUp();
48 virtual void TearDown();
Minyue Li002fbb82018-10-04 11:31:03 +020049 void RecreateDelayManager();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000050 void SetPacketAudioLength(int lengt_ms);
51 void InsertNextPacket();
52 void IncreaseTime(int inc_ms);
53
Minyue Li002fbb82018-10-04 11:31:03 +020054 std::unique_ptr<DelayManager> dm_;
henrik.lundinf3933702016-04-28 01:53:52 -070055 TickTimer tick_timer_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000056 MockDelayPeakDetector detector_;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010057 MockHistogram* mock_histogram_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000058 uint16_t seq_no_;
59 uint32_t ts_;
Jakob Ivarssone98954c2019-02-06 15:37:50 +010060 bool enable_rtx_handling_ = false;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010061 bool use_mock_histogram_ = false;
62 DelayManager::HistogramMode histogram_mode_ =
63 DelayManager::HistogramMode::INTER_ARRIVAL_TIME;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000064};
65
66DelayManagerTest::DelayManagerTest()
Jakob Ivarsson39b934b2019-01-10 10:28:23 +010067 : dm_(nullptr),
68 detector_(&tick_timer_, false),
69 seq_no_(0x1234),
70 ts_(0x12345678) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000071
72void DelayManagerTest::SetUp() {
Minyue Li002fbb82018-10-04 11:31:03 +020073 RecreateDelayManager();
74}
75
76void DelayManagerTest::RecreateDelayManager() {
Yves Gerey665174f2018-06-19 15:03:05 +020077 EXPECT_CALL(detector_, Reset()).Times(1);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010078 if (use_mock_histogram_) {
79 mock_histogram_ = new MockHistogram(kMaxIat, kForgetFactor);
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010080 std::unique_ptr<Histogram> histogram(mock_histogram_);
81 dm_ = absl::make_unique<DelayManager>(
82 kMaxNumberOfPackets, kMinDelayMs, kDefaultHistogramQuantile,
83 histogram_mode_, enable_rtx_handling_, &detector_, &tick_timer_,
84 std::move(histogram));
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010085 } else {
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010086 dm_ = DelayManager::Create(kMaxNumberOfPackets, kMinDelayMs,
87 enable_rtx_handling_, &detector_, &tick_timer_);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010088 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000089}
90
91void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
92 EXPECT_CALL(detector_, SetPacketAudioLength(lengt_ms));
93 dm_->SetPacketAudioLength(lengt_ms);
94}
95
96void DelayManagerTest::InsertNextPacket() {
97 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
98 seq_no_ += 1;
99 ts_ += kTsIncrement;
100}
101
102void DelayManagerTest::IncreaseTime(int inc_ms) {
103 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -0700104 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000105 }
106}
107void DelayManagerTest::TearDown() {
108 EXPECT_CALL(detector_, Die());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000109}
110
111TEST_F(DelayManagerTest, CreateAndDestroy) {
112 // Nothing to do here. The test fixture creates and destroys the DelayManager
113 // object.
114}
115
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000116TEST_F(DelayManagerTest, SetPacketAudioLength) {
117 const int kLengthMs = 30;
118 // Expect DelayManager to pass on the new length to the detector object.
Yves Gerey665174f2018-06-19 15:03:05 +0200119 EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs)).Times(1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000120 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
121 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
122}
123
124TEST_F(DelayManagerTest, PeakFound) {
125 // Expect DelayManager to pass on the question to the detector.
126 // Call twice, and let the detector return true the first time and false the
127 // second time.
128 EXPECT_CALL(detector_, peak_found())
129 .WillOnce(Return(true))
130 .WillOnce(Return(false));
131 EXPECT_TRUE(dm_->PeakFound());
132 EXPECT_FALSE(dm_->PeakFound());
133}
134
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000135TEST_F(DelayManagerTest, UpdateNormal) {
136 SetPacketAudioLength(kFrameSizeMs);
137 // First packet arrival.
138 InsertNextPacket();
139 // Advance time by one frame size.
140 IncreaseTime(kFrameSizeMs);
141 // Second packet arrival.
142 // Expect detector update method to be called once with inter-arrival time
143 // equal to 1 packet, and (base) target level equal to 1 as well.
144 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100145 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000146 InsertNextPacket();
147 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
148 EXPECT_EQ(1, dm_->base_target_level());
149 int lower, higher;
150 dm_->BufferLimits(&lower, &higher);
151 // Expect |lower| to be 75% of target level, and |higher| to be target level,
152 // but also at least 20 ms higher than |lower|, which is the limiting case
153 // here.
154 EXPECT_EQ((1 << 8) * 3 / 4, lower);
155 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
156}
157
158TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
159 SetPacketAudioLength(kFrameSizeMs);
160 // First packet arrival.
161 InsertNextPacket();
162 // Advance time by two frame size.
163 IncreaseTime(2 * kFrameSizeMs);
164 // Second packet arrival.
165 // Expect detector update method to be called once with inter-arrival time
166 // equal to 1 packet, and (base) target level equal to 1 as well.
167 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100168 EXPECT_CALL(detector_, Update(2, false, 2)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000169 InsertNextPacket();
170 EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8.
171 EXPECT_EQ(2, dm_->base_target_level());
172 int lower, higher;
173 dm_->BufferLimits(&lower, &higher);
174 // Expect |lower| to be 75% of target level, and |higher| to be target level,
175 // but also at least 20 ms higher than |lower|, which is the limiting case
176 // here.
177 EXPECT_EQ((2 << 8) * 3 / 4, lower);
178 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
179}
180
181TEST_F(DelayManagerTest, UpdatePeakFound) {
182 SetPacketAudioLength(kFrameSizeMs);
183 // First packet arrival.
184 InsertNextPacket();
185 // Advance time by one frame size.
186 IncreaseTime(kFrameSizeMs);
187 // Second packet arrival.
188 // Expect detector update method to be called once with inter-arrival time
189 // equal to 1 packet, and (base) target level equal to 1 as well.
190 // Return true to indicate that peaks are found. Let the peak height be 5.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100191 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(true));
Yves Gerey665174f2018-06-19 15:03:05 +0200192 EXPECT_CALL(detector_, MaxPeakHeight()).WillOnce(Return(5));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000193 InsertNextPacket();
194 EXPECT_EQ(5 << 8, dm_->TargetLevel());
195 EXPECT_EQ(1, dm_->base_target_level()); // Base target level is w/o peaks.
196 int lower, higher;
197 dm_->BufferLimits(&lower, &higher);
198 // Expect |lower| to be 75% of target level, and |higher| to be target level.
199 EXPECT_EQ((5 << 8) * 3 / 4, lower);
200 EXPECT_EQ(5 << 8, higher);
201}
202
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000203TEST_F(DelayManagerTest, TargetDelay) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000204 SetPacketAudioLength(kFrameSizeMs);
205 // First packet arrival.
206 InsertNextPacket();
207 // Advance time by one frame size.
208 IncreaseTime(kFrameSizeMs);
209 // Second packet arrival.
210 // Expect detector update method to be called once with inter-arrival time
211 // equal to 1 packet, and (base) target level equal to 1 as well.
212 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100213 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000214 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000215 const int kExpectedTarget = 1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000216 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
217 EXPECT_EQ(1, dm_->base_target_level());
218 int lower, higher;
219 dm_->BufferLimits(&lower, &higher);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000220 // Expect |lower| to be 75% of base target level, and |higher| to be
221 // lower + 20 ms headroom.
222 EXPECT_EQ((1 << 8) * 3 / 4, lower);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000223 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
224}
225
Niels Möller18f1adc2018-08-23 08:40:41 +0200226TEST_F(DelayManagerTest, MaxDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000227 const int kExpectedTarget = 5;
228 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
229 SetPacketAudioLength(kFrameSizeMs);
230 // First packet arrival.
231 InsertNextPacket();
232 // Second packet arrival.
233 // Expect detector update method to be called once with inter-arrival time
234 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100235 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000236 .WillRepeatedly(Return(true));
237 EXPECT_CALL(detector_, MaxPeakHeight())
238 .WillRepeatedly(Return(kExpectedTarget));
239 IncreaseTime(kTimeIncrement);
240 InsertNextPacket();
241
242 // No limit is set.
243 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
244
245 int kMaxDelayPackets = kExpectedTarget - 2;
246 int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
247 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
248 IncreaseTime(kTimeIncrement);
249 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000250 EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
251
252 // Target level at least should be one packet.
253 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
254}
255
Niels Möller18f1adc2018-08-23 08:40:41 +0200256TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000257 const int kExpectedTarget = 5;
258 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
259 SetPacketAudioLength(kFrameSizeMs);
260 // First packet arrival.
261 InsertNextPacket();
262 // Second packet arrival.
263 // Expect detector update method to be called once with inter-arrival time
264 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100265 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000266 .WillRepeatedly(Return(true));
267 EXPECT_CALL(detector_, MaxPeakHeight())
268 .WillRepeatedly(Return(kExpectedTarget));
269 IncreaseTime(kTimeIncrement);
270 InsertNextPacket();
271
272 // No limit is applied.
273 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
274
275 int kMinDelayPackets = kExpectedTarget + 2;
276 int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
277 dm_->SetMinimumDelay(kMinDelayMs);
278 IncreaseTime(kTimeIncrement);
279 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000280 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
281}
282
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100283TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
284 SetPacketAudioLength(kFrameSizeMs);
285
286 // Base minimum delay should be between [0, 10000] milliseconds.
287 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
288 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
289 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
290
291 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
292 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
293}
294
295TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
296 SetPacketAudioLength(kFrameSizeMs);
297 constexpr int kBaseMinimumDelayMs = 100;
298 constexpr int kMinimumDelayMs = 200;
299
300 // Base minimum delay sets lower bound on minimum. That is why when base
301 // minimum delay is lower than minimum delay we use minimum delay.
302 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
303
304 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
305 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
306 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
307}
308
309TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
310 SetPacketAudioLength(kFrameSizeMs);
311 constexpr int kBaseMinimumDelayMs = 70;
312 constexpr int kMinimumDelayMs = 30;
313
314 // Base minimum delay sets lower bound on minimum. That is why when base
315 // minimum delay is greater than minimum delay we use base minimum delay.
316 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
317
318 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
319 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
320 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
321}
322
323TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
324 SetPacketAudioLength(kFrameSizeMs);
325 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
326 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100327 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100328 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
329
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100330 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
331
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100332 // Base minimum delay is greater than minimum delay, that is why we clamp
333 // it to current the highest possible value which is maximum delay.
334 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
335 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100336 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
337 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100338
339 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
340 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
341
342 // Unset maximum value.
343 EXPECT_TRUE(dm_->SetMaximumDelay(0));
344
345 // With maximum value unset, the highest possible value now is 75% of
346 // currently possible maximum buffer size.
347 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
348}
349
350TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
351 SetPacketAudioLength(kFrameSizeMs);
352 constexpr int kMaximumDelayMs = 400;
353 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
354 constexpr int kMinimumDelayMs = 20;
355
356 // Base minimum delay is greater than minimum delay, that is why we clamp
357 // it to current the highest possible value which is kMaximumDelayMs.
358 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
359 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
360 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
361
362 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
363 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
364 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
365 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
366}
367
368TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
369 SetPacketAudioLength(kFrameSizeMs);
370 constexpr int kMaximumDelayMs = 400;
371 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
372 constexpr int kMinimumDelayMs = 20;
373
374 // Base minimum delay is greater than minimum delay, and lower than maximum
375 // delays that is why it is used.
376 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
377 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
378
379 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
380 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
381 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
382 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
383}
384
385TEST_F(DelayManagerTest, MinimumDelayMemorization) {
386 // Check that when we increase base minimum delay to value higher than
387 // minimum delay then minimum delay is still memorized. This allows to
388 // restore effective minimum delay to memorized minimum delay value when we
389 // decrease base minimum delay.
390 SetPacketAudioLength(kFrameSizeMs);
391
392 constexpr int kBaseMinimumDelayMsLow = 10;
393 constexpr int kMinimumDelayMs = 20;
394 constexpr int kBaseMinimumDelayMsHigh = 30;
395
396 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
397 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
398 // Minimum delay is used as it is higher than base minimum delay.
399 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
400
401 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
402 // Base minimum delay is used as it is now higher than minimum delay.
403 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
404 kBaseMinimumDelayMsHigh);
405
406 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
407 // Check that minimum delay is memorized and is used again.
408 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
409}
410
411TEST_F(DelayManagerTest, BaseMinimumDelay) {
Ruslan Burakovedbea462019-02-04 16:17:31 +0100412 const int kExpectedTarget = 5;
413 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
414 SetPacketAudioLength(kFrameSizeMs);
415 // First packet arrival.
416 InsertNextPacket();
417 // Second packet arrival.
418 // Expect detector update method to be called once with inter-arrival time
419 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
420 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
421 .WillRepeatedly(Return(true));
422 EXPECT_CALL(detector_, MaxPeakHeight())
423 .WillRepeatedly(Return(kExpectedTarget));
424 IncreaseTime(kTimeIncrement);
425 InsertNextPacket();
426
427 // No limit is applied.
428 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
429
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100430 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
431 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
432 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
433 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100434
435 IncreaseTime(kTimeIncrement);
436 InsertNextPacket();
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100437 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
438 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100439}
440
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100441TEST_F(DelayManagerTest, BaseMinimumDealyAffectTargetLevel) {
442 const int kExpectedTarget = 5;
443 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
444 SetPacketAudioLength(kFrameSizeMs);
445 // First packet arrival.
446 InsertNextPacket();
447 // Second packet arrival.
448 // Expect detector update method to be called once with inter-arrival time
449 // equal to |kExpectedTarget|. Return true to indicate peaks found.
450 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
451 .WillRepeatedly(Return(true));
452 EXPECT_CALL(detector_, MaxPeakHeight())
453 .WillRepeatedly(Return(kExpectedTarget));
454 IncreaseTime(kTimeIncrement);
455 InsertNextPacket();
Ruslan Burakovedbea462019-02-04 16:17:31 +0100456
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100457 // No limit is applied.
458 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
459
460 // Minimum delay is lower than base minimum delay, that is why base minimum
461 // delay is used to calculate target level.
462 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
463 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
464
465 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
466 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
467
468 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
469 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
470 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
471 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
472
473 IncreaseTime(kTimeIncrement);
474 InsertNextPacket();
475 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
476 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100477}
478
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100479TEST_F(DelayManagerTest, UpdateReorderedPacket) {
480 SetPacketAudioLength(kFrameSizeMs);
481 InsertNextPacket();
482
483 // Insert packet that was sent before the previous packet.
484 EXPECT_CALL(detector_, Update(_, true, _));
485 EXPECT_EQ(0, dm_->Update(seq_no_ - 1, ts_ - kFrameSizeMs, kFs));
486}
487
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100488TEST_F(DelayManagerTest, EnableRtxHandling) {
489 enable_rtx_handling_ = true;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100490 use_mock_histogram_ = true;
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100491 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100492 EXPECT_TRUE(mock_histogram_);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100493
494 // Insert first packet.
495 SetPacketAudioLength(kFrameSizeMs);
496 InsertNextPacket();
497
498 // Insert reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100499 EXPECT_CALL(*mock_histogram_, Add(3));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100500 EXPECT_EQ(0, dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs));
501
502 // Insert another reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100503 EXPECT_CALL(*mock_histogram_, Add(2));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100504 EXPECT_EQ(0, dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs));
505
506 // Insert the next packet in order and verify that the inter-arrival time is
507 // estimated correctly.
508 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100509 EXPECT_CALL(*mock_histogram_, Add(1));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100510 InsertNextPacket();
511}
512
henrik.lundinb8c55b12017-05-10 07:38:01 -0700513// Tests that skipped sequence numbers (simulating empty packets) are handled
514// correctly.
515TEST_F(DelayManagerTest, EmptyPacketsReported) {
516 SetPacketAudioLength(kFrameSizeMs);
517 // First packet arrival.
518 InsertNextPacket();
519
520 // Advance time by one frame size.
521 IncreaseTime(kFrameSizeMs);
522
523 // Advance the sequence number by 5, simulating that 5 empty packets were
524 // received, but never inserted.
525 seq_no_ += 10;
526 for (int j = 0; j < 10; ++j) {
527 dm_->RegisterEmptyPacket();
528 }
529
530 // Second packet arrival.
531 // Expect detector update method to be called once with inter-arrival time
532 // equal to 1 packet, and (base) target level equal to 1 as well.
533 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100534 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700535 InsertNextPacket();
536
537 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
538}
539
540// Same as above, but do not call RegisterEmptyPacket. Observe the target level
541// increase dramatically.
542TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
543 SetPacketAudioLength(kFrameSizeMs);
544 // First packet arrival.
545 InsertNextPacket();
546
547 // Advance time by one frame size.
548 IncreaseTime(kFrameSizeMs);
549
550 // Advance the sequence number by 5, simulating that 5 empty packets were
551 // received, but never inserted.
552 seq_no_ += 10;
553
554 // Second packet arrival.
555 // Expect detector update method to be called once with inter-arrival time
556 // equal to 1 packet, and (base) target level equal to 1 as well.
557 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100558 EXPECT_CALL(detector_, Update(10, false, 10)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700559 InsertNextPacket();
560
561 // Note 10 times higher target value.
562 EXPECT_EQ(10 * 1 << 8, dm_->TargetLevel()); // In Q8.
563}
564
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000565TEST_F(DelayManagerTest, Failures) {
566 // Wrong sample rate.
567 EXPECT_EQ(-1, dm_->Update(0, 0, -1));
568 // Wrong packet size.
569 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
570 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000571
572 // Minimum delay higher than a maximum delay is not accepted.
573 EXPECT_TRUE(dm_->SetMaximumDelay(10));
574 EXPECT_FALSE(dm_->SetMinimumDelay(20));
575
576 // Maximum delay less than minimum delay is not accepted.
577 EXPECT_TRUE(dm_->SetMaximumDelay(100));
578 EXPECT_TRUE(dm_->SetMinimumDelay(80));
579 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000580}
581
Minyue Li002fbb82018-10-04 11:31:03 +0200582TEST_F(DelayManagerTest, TargetDelayGreaterThanOne) {
583 test::ScopedFieldTrials field_trial(
584 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-0/");
585 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100586 EXPECT_EQ(0, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200587
588 SetPacketAudioLength(kFrameSizeMs);
589 // First packet arrival.
590 InsertNextPacket();
591 // Advance time by one frame size.
592 IncreaseTime(kFrameSizeMs);
593 // Second packet arrival.
594 // Expect detector update method to be called once with inter-arrival time
595 // equal to 1 packet.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100596 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
Minyue Li002fbb82018-10-04 11:31:03 +0200597 InsertNextPacket();
598 constexpr int kExpectedTarget = 1;
599 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
600}
601
602TEST_F(DelayManagerTest, ForcedTargetDelayPercentile) {
603 {
604 test::ScopedFieldTrials field_trial(
605 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-95/");
606 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100607 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200608 }
609 {
610 test::ScopedFieldTrials field_trial(
611 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/");
612 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100613 EXPECT_EQ(1073204953, dm_->histogram_quantile()); // 0.9995 in Q30.
Minyue Li002fbb82018-10-04 11:31:03 +0200614 }
615 {
616 test::ScopedFieldTrials field_trial(
617 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Disabled/");
618 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100619 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200620 }
621 {
622 test::ScopedFieldTrials field_trial(
623 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled--1/");
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100624 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200625 }
626 {
627 test::ScopedFieldTrials field_trial(
628 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-100.1/");
629 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100630 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200631 }
632}
633
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100634TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
635 {
636 test::ScopedFieldTrials field_trial(
637 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
638 RecreateDelayManager();
639 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
640 dm_->histogram_mode());
641 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
642 EXPECT_EQ(32702, dm_->histogram_forget_factor()); // 0.998 in Q15.
643 }
644 {
645 test::ScopedFieldTrials field_trial(
646 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
647 RecreateDelayManager();
648 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
649 dm_->histogram_mode());
650 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
651 EXPECT_EQ(32702, dm_->histogram_forget_factor()); // 0.998 in Q15.
652 }
653 {
654 // NetEqDelayHistogram should take precedence over
655 // NetEqForceTargetDelayPercentile.
656 test::ScopedFieldTrials field_trial(
657 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/"
658 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
659 RecreateDelayManager();
660 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
661 dm_->histogram_mode());
662 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
663 EXPECT_EQ(32702, dm_->histogram_forget_factor()); // 0.998 in Q15.
664 }
665 {
666 // Invalid parameters.
667 test::ScopedFieldTrials field_trial(
668 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96/");
669 RecreateDelayManager();
670 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
671 dm_->histogram_mode());
672 EXPECT_EQ(kDefaultHistogramQuantile,
673 dm_->histogram_quantile()); // 0.95 in Q30.
674 EXPECT_EQ(kForgetFactor, dm_->histogram_forget_factor()); // 0.9993 in Q15.
675 }
676 {
677 test::ScopedFieldTrials field_trial(
678 "WebRTC-Audio-NetEqDelayHistogram/Disabled/");
679 RecreateDelayManager();
680 EXPECT_EQ(DelayManager::HistogramMode::INTER_ARRIVAL_TIME,
681 dm_->histogram_mode());
682 EXPECT_EQ(kDefaultHistogramQuantile,
683 dm_->histogram_quantile()); // 0.95 in Q30.
684 EXPECT_EQ(kForgetFactor, dm_->histogram_forget_factor()); // 0.9993 in Q15.
685 }
686}
687
688TEST_F(DelayManagerTest, RelativeArrivalDelayMode) {
689 histogram_mode_ = DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
690 use_mock_histogram_ = true;
691 RecreateDelayManager();
692
693 SetPacketAudioLength(kFrameSizeMs);
694 InsertNextPacket();
695
696 IncreaseTime(kFrameSizeMs);
697 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
698 InsertNextPacket();
699
700 IncreaseTime(2 * kFrameSizeMs);
701 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
702 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
703
704 IncreaseTime(2 * kFrameSizeMs);
705 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
706 EXPECT_EQ(0, dm_->Update(seq_no_ + 1, ts_ + kTsIncrement, kFs));
707
708 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
709 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
710}
711
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000712} // namespace webrtc