blob: a8e2b3d18e51104738673065fe77ac046e69c9bb [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
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000042using ::testing::_;
Jonas Olssona4d87372019-07-05 19:08:33 +020043using ::testing::Return;
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}
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200110
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000111void DelayManagerTest::TearDown() {
112 EXPECT_CALL(detector_, Die());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000113}
114
115TEST_F(DelayManagerTest, CreateAndDestroy) {
116 // Nothing to do here. The test fixture creates and destroys the DelayManager
117 // object.
118}
119
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000120TEST_F(DelayManagerTest, SetPacketAudioLength) {
121 const int kLengthMs = 30;
122 // Expect DelayManager to pass on the new length to the detector object.
Yves Gerey665174f2018-06-19 15:03:05 +0200123 EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs)).Times(1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000124 EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
125 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value.
126}
127
128TEST_F(DelayManagerTest, PeakFound) {
129 // Expect DelayManager to pass on the question to the detector.
130 // Call twice, and let the detector return true the first time and false the
131 // second time.
132 EXPECT_CALL(detector_, peak_found())
133 .WillOnce(Return(true))
134 .WillOnce(Return(false));
135 EXPECT_TRUE(dm_->PeakFound());
136 EXPECT_FALSE(dm_->PeakFound());
137}
138
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000139TEST_F(DelayManagerTest, UpdateNormal) {
140 SetPacketAudioLength(kFrameSizeMs);
141 // First packet arrival.
142 InsertNextPacket();
143 // Advance time by one frame size.
144 IncreaseTime(kFrameSizeMs);
145 // Second packet arrival.
146 // Expect detector update method to be called once with inter-arrival time
147 // equal to 1 packet, and (base) target level equal to 1 as well.
148 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100149 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000150 InsertNextPacket();
151 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
152 EXPECT_EQ(1, dm_->base_target_level());
153 int lower, higher;
154 dm_->BufferLimits(&lower, &higher);
155 // Expect |lower| to be 75% of target level, and |higher| to be target level,
156 // but also at least 20 ms higher than |lower|, which is the limiting case
157 // here.
158 EXPECT_EQ((1 << 8) * 3 / 4, lower);
159 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
160}
161
162TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
163 SetPacketAudioLength(kFrameSizeMs);
164 // First packet arrival.
165 InsertNextPacket();
166 // Advance time by two frame size.
167 IncreaseTime(2 * kFrameSizeMs);
168 // Second packet arrival.
169 // Expect detector update method to be called once with inter-arrival time
170 // equal to 1 packet, and (base) target level equal to 1 as well.
171 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100172 EXPECT_CALL(detector_, Update(2, false, 2)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000173 InsertNextPacket();
174 EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8.
175 EXPECT_EQ(2, dm_->base_target_level());
176 int lower, higher;
177 dm_->BufferLimits(&lower, &higher);
178 // Expect |lower| to be 75% of target level, and |higher| to be target level,
179 // but also at least 20 ms higher than |lower|, which is the limiting case
180 // here.
181 EXPECT_EQ((2 << 8) * 3 / 4, lower);
182 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
183}
184
185TEST_F(DelayManagerTest, UpdatePeakFound) {
186 SetPacketAudioLength(kFrameSizeMs);
187 // First packet arrival.
188 InsertNextPacket();
189 // Advance time by one frame size.
190 IncreaseTime(kFrameSizeMs);
191 // Second packet arrival.
192 // Expect detector update method to be called once with inter-arrival time
193 // equal to 1 packet, and (base) target level equal to 1 as well.
194 // Return true to indicate that peaks are found. Let the peak height be 5.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100195 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(true));
Yves Gerey665174f2018-06-19 15:03:05 +0200196 EXPECT_CALL(detector_, MaxPeakHeight()).WillOnce(Return(5));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000197 InsertNextPacket();
198 EXPECT_EQ(5 << 8, dm_->TargetLevel());
199 EXPECT_EQ(1, dm_->base_target_level()); // Base target level is w/o peaks.
200 int lower, higher;
201 dm_->BufferLimits(&lower, &higher);
202 // Expect |lower| to be 75% of target level, and |higher| to be target level.
203 EXPECT_EQ((5 << 8) * 3 / 4, lower);
204 EXPECT_EQ(5 << 8, higher);
205}
206
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000207TEST_F(DelayManagerTest, TargetDelay) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000208 SetPacketAudioLength(kFrameSizeMs);
209 // First packet arrival.
210 InsertNextPacket();
211 // Advance time by one frame size.
212 IncreaseTime(kFrameSizeMs);
213 // Second packet arrival.
214 // Expect detector update method to be called once with inter-arrival time
215 // equal to 1 packet, and (base) target level equal to 1 as well.
216 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100217 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000218 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000219 const int kExpectedTarget = 1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000220 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
221 EXPECT_EQ(1, dm_->base_target_level());
222 int lower, higher;
223 dm_->BufferLimits(&lower, &higher);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000224 // Expect |lower| to be 75% of base target level, and |higher| to be
225 // lower + 20 ms headroom.
226 EXPECT_EQ((1 << 8) * 3 / 4, lower);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000227 EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
228}
229
Niels Möller18f1adc2018-08-23 08:40:41 +0200230TEST_F(DelayManagerTest, MaxDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000231 const int kExpectedTarget = 5;
232 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
233 SetPacketAudioLength(kFrameSizeMs);
234 // First packet arrival.
235 InsertNextPacket();
236 // Second packet arrival.
237 // Expect detector update method to be called once with inter-arrival time
238 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100239 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000240 .WillRepeatedly(Return(true));
241 EXPECT_CALL(detector_, MaxPeakHeight())
242 .WillRepeatedly(Return(kExpectedTarget));
243 IncreaseTime(kTimeIncrement);
244 InsertNextPacket();
245
246 // No limit is set.
247 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
248
249 int kMaxDelayPackets = kExpectedTarget - 2;
250 int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
251 EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
252 IncreaseTime(kTimeIncrement);
253 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000254 EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
255
256 // Target level at least should be one packet.
257 EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
258}
259
Niels Möller18f1adc2018-08-23 08:40:41 +0200260TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000261 const int kExpectedTarget = 5;
262 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
263 SetPacketAudioLength(kFrameSizeMs);
264 // First packet arrival.
265 InsertNextPacket();
266 // Second packet arrival.
267 // Expect detector update method to be called once with inter-arrival time
268 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100269 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000270 .WillRepeatedly(Return(true));
271 EXPECT_CALL(detector_, MaxPeakHeight())
272 .WillRepeatedly(Return(kExpectedTarget));
273 IncreaseTime(kTimeIncrement);
274 InsertNextPacket();
275
276 // No limit is applied.
277 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
278
279 int kMinDelayPackets = kExpectedTarget + 2;
280 int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
281 dm_->SetMinimumDelay(kMinDelayMs);
282 IncreaseTime(kTimeIncrement);
283 InsertNextPacket();
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000284 EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
285}
286
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100287TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
288 SetPacketAudioLength(kFrameSizeMs);
289
290 // Base minimum delay should be between [0, 10000] milliseconds.
291 EXPECT_FALSE(dm_->SetBaseMinimumDelay(-1));
292 EXPECT_FALSE(dm_->SetBaseMinimumDelay(10001));
293 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 0);
294
295 EXPECT_TRUE(dm_->SetBaseMinimumDelay(7999));
296 EXPECT_EQ(dm_->GetBaseMinimumDelay(), 7999);
297}
298
299TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
300 SetPacketAudioLength(kFrameSizeMs);
301 constexpr int kBaseMinimumDelayMs = 100;
302 constexpr int kMinimumDelayMs = 200;
303
304 // Base minimum delay sets lower bound on minimum. That is why when base
305 // minimum delay is lower than minimum delay we use minimum delay.
306 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
307
308 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
309 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
310 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
311}
312
313TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
314 SetPacketAudioLength(kFrameSizeMs);
315 constexpr int kBaseMinimumDelayMs = 70;
316 constexpr int kMinimumDelayMs = 30;
317
318 // Base minimum delay sets lower bound on minimum. That is why when base
319 // minimum delay is greater than minimum delay we use base minimum delay.
320 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
321
322 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
323 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
324 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
325}
326
327TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
328 SetPacketAudioLength(kFrameSizeMs);
329 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
330 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100331 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100332 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
333
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100334 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
335
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100336 // Base minimum delay is greater than minimum delay, that is why we clamp
337 // it to current the highest possible value which is maximum delay.
338 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
339 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100340 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
341 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100342
343 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
344 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
345
346 // Unset maximum value.
347 EXPECT_TRUE(dm_->SetMaximumDelay(0));
348
349 // With maximum value unset, the highest possible value now is 75% of
350 // currently possible maximum buffer size.
351 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
352}
353
354TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
355 SetPacketAudioLength(kFrameSizeMs);
356 constexpr int kMaximumDelayMs = 400;
357 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
358 constexpr int kMinimumDelayMs = 20;
359
360 // Base minimum delay is greater than minimum delay, that is why we clamp
361 // it to current the highest possible value which is kMaximumDelayMs.
362 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
363 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
364 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
365
366 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
367 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
368 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
369 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
370}
371
372TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
373 SetPacketAudioLength(kFrameSizeMs);
374 constexpr int kMaximumDelayMs = 400;
375 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
376 constexpr int kMinimumDelayMs = 20;
377
378 // Base minimum delay is greater than minimum delay, and lower than maximum
379 // delays that is why it is used.
380 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
381 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
382
383 EXPECT_TRUE(dm_->SetMaximumDelay(kMaximumDelayMs));
384 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
385 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
386 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
387}
388
389TEST_F(DelayManagerTest, MinimumDelayMemorization) {
390 // Check that when we increase base minimum delay to value higher than
391 // minimum delay then minimum delay is still memorized. This allows to
392 // restore effective minimum delay to memorized minimum delay value when we
393 // decrease base minimum delay.
394 SetPacketAudioLength(kFrameSizeMs);
395
396 constexpr int kBaseMinimumDelayMsLow = 10;
397 constexpr int kMinimumDelayMs = 20;
398 constexpr int kBaseMinimumDelayMsHigh = 30;
399
400 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
401 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
402 // Minimum delay is used as it is higher than base minimum delay.
403 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
404
405 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
406 // Base minimum delay is used as it is now higher than minimum delay.
407 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(),
408 kBaseMinimumDelayMsHigh);
409
410 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
411 // Check that minimum delay is memorized and is used again.
412 EXPECT_EQ(dm_->effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
413}
414
415TEST_F(DelayManagerTest, BaseMinimumDelay) {
Ruslan Burakovedbea462019-02-04 16:17:31 +0100416 const int kExpectedTarget = 5;
417 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
418 SetPacketAudioLength(kFrameSizeMs);
419 // First packet arrival.
420 InsertNextPacket();
421 // Second packet arrival.
422 // Expect detector update method to be called once with inter-arrival time
423 // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
424 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
425 .WillRepeatedly(Return(true));
426 EXPECT_CALL(detector_, MaxPeakHeight())
427 .WillRepeatedly(Return(kExpectedTarget));
428 IncreaseTime(kTimeIncrement);
429 InsertNextPacket();
430
431 // No limit is applied.
432 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
433
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100434 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
435 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
436 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
437 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakovedbea462019-02-04 16:17:31 +0100438
439 IncreaseTime(kTimeIncrement);
440 InsertNextPacket();
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100441 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
442 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100443}
444
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100445TEST_F(DelayManagerTest, BaseMinimumDealyAffectTargetLevel) {
446 const int kExpectedTarget = 5;
447 const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
448 SetPacketAudioLength(kFrameSizeMs);
449 // First packet arrival.
450 InsertNextPacket();
451 // Second packet arrival.
452 // Expect detector update method to be called once with inter-arrival time
453 // equal to |kExpectedTarget|. Return true to indicate peaks found.
454 EXPECT_CALL(detector_, Update(kExpectedTarget, false, _))
455 .WillRepeatedly(Return(true));
456 EXPECT_CALL(detector_, MaxPeakHeight())
457 .WillRepeatedly(Return(kExpectedTarget));
458 IncreaseTime(kTimeIncrement);
459 InsertNextPacket();
Ruslan Burakovedbea462019-02-04 16:17:31 +0100460
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100461 // No limit is applied.
462 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
463
464 // Minimum delay is lower than base minimum delay, that is why base minimum
465 // delay is used to calculate target level.
466 constexpr int kMinimumDelayPackets = kExpectedTarget + 1;
467 constexpr int kBaseMinimumDelayPackets = kExpectedTarget + 2;
468
469 constexpr int kMinimumDelayMs = kMinimumDelayPackets * kFrameSizeMs;
470 constexpr int kBaseMinimumDelayMs = kBaseMinimumDelayPackets * kFrameSizeMs;
471
472 EXPECT_TRUE(kMinimumDelayMs < kBaseMinimumDelayMs);
473 EXPECT_TRUE(dm_->SetMinimumDelay(kMinimumDelayMs));
474 EXPECT_TRUE(dm_->SetBaseMinimumDelay(kBaseMinimumDelayMs));
475 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
476
477 IncreaseTime(kTimeIncrement);
478 InsertNextPacket();
479 EXPECT_EQ(dm_->GetBaseMinimumDelay(), kBaseMinimumDelayMs);
480 EXPECT_EQ(kBaseMinimumDelayPackets << 8, dm_->TargetLevel());
Ruslan Burakovedbea462019-02-04 16:17:31 +0100481}
482
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100483TEST_F(DelayManagerTest, UpdateReorderedPacket) {
484 SetPacketAudioLength(kFrameSizeMs);
485 InsertNextPacket();
486
487 // Insert packet that was sent before the previous packet.
488 EXPECT_CALL(detector_, Update(_, true, _));
489 EXPECT_EQ(0, dm_->Update(seq_no_ - 1, ts_ - kFrameSizeMs, kFs));
490}
491
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100492TEST_F(DelayManagerTest, EnableRtxHandling) {
493 enable_rtx_handling_ = true;
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100494 use_mock_histogram_ = true;
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100495 RecreateDelayManager();
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100496 EXPECT_TRUE(mock_histogram_);
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100497
498 // Insert first packet.
499 SetPacketAudioLength(kFrameSizeMs);
500 InsertNextPacket();
501
502 // Insert reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100503 EXPECT_CALL(*mock_histogram_, Add(3));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100504 EXPECT_EQ(0, dm_->Update(seq_no_ - 3, ts_ - 3 * kFrameSizeMs, kFs));
505
506 // Insert another reordered packet.
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100507 EXPECT_CALL(*mock_histogram_, Add(2));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100508 EXPECT_EQ(0, dm_->Update(seq_no_ - 2, ts_ - 2 * kFrameSizeMs, kFs));
509
510 // Insert the next packet in order and verify that the inter-arrival time is
511 // estimated correctly.
512 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +0100513 EXPECT_CALL(*mock_histogram_, Add(1));
Jakob Ivarssone98954c2019-02-06 15:37:50 +0100514 InsertNextPacket();
515}
516
henrik.lundinb8c55b12017-05-10 07:38:01 -0700517// Tests that skipped sequence numbers (simulating empty packets) are handled
518// correctly.
519TEST_F(DelayManagerTest, EmptyPacketsReported) {
520 SetPacketAudioLength(kFrameSizeMs);
521 // First packet arrival.
522 InsertNextPacket();
523
524 // Advance time by one frame size.
525 IncreaseTime(kFrameSizeMs);
526
527 // Advance the sequence number by 5, simulating that 5 empty packets were
528 // received, but never inserted.
529 seq_no_ += 10;
530 for (int j = 0; j < 10; ++j) {
531 dm_->RegisterEmptyPacket();
532 }
533
534 // Second packet arrival.
535 // Expect detector update method to be called once with inter-arrival time
536 // equal to 1 packet, and (base) target level equal to 1 as well.
537 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100538 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700539 InsertNextPacket();
540
541 EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8.
542}
543
544// Same as above, but do not call RegisterEmptyPacket. Observe the target level
545// increase dramatically.
546TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
547 SetPacketAudioLength(kFrameSizeMs);
548 // First packet arrival.
549 InsertNextPacket();
550
551 // Advance time by one frame size.
552 IncreaseTime(kFrameSizeMs);
553
554 // Advance the sequence number by 5, simulating that 5 empty packets were
555 // received, but never inserted.
556 seq_no_ += 10;
557
558 // Second packet arrival.
559 // Expect detector update method to be called once with inter-arrival time
560 // equal to 1 packet, and (base) target level equal to 1 as well.
561 // Return false to indicate no peaks found.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100562 EXPECT_CALL(detector_, Update(10, false, 10)).WillOnce(Return(false));
henrik.lundinb8c55b12017-05-10 07:38:01 -0700563 InsertNextPacket();
564
565 // Note 10 times higher target value.
566 EXPECT_EQ(10 * 1 << 8, dm_->TargetLevel()); // In Q8.
567}
568
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000569TEST_F(DelayManagerTest, Failures) {
570 // Wrong sample rate.
571 EXPECT_EQ(-1, dm_->Update(0, 0, -1));
572 // Wrong packet size.
573 EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
574 EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000575
576 // Minimum delay higher than a maximum delay is not accepted.
577 EXPECT_TRUE(dm_->SetMaximumDelay(10));
578 EXPECT_FALSE(dm_->SetMinimumDelay(20));
579
580 // Maximum delay less than minimum delay is not accepted.
581 EXPECT_TRUE(dm_->SetMaximumDelay(100));
582 EXPECT_TRUE(dm_->SetMinimumDelay(80));
583 EXPECT_FALSE(dm_->SetMaximumDelay(60));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000584}
585
Minyue Li002fbb82018-10-04 11:31:03 +0200586TEST_F(DelayManagerTest, TargetDelayGreaterThanOne) {
587 test::ScopedFieldTrials field_trial(
588 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-0/");
589 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100590 EXPECT_EQ(0, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200591
592 SetPacketAudioLength(kFrameSizeMs);
593 // First packet arrival.
594 InsertNextPacket();
595 // Advance time by one frame size.
596 IncreaseTime(kFrameSizeMs);
597 // Second packet arrival.
598 // Expect detector update method to be called once with inter-arrival time
599 // equal to 1 packet.
Jakob Ivarsson39b934b2019-01-10 10:28:23 +0100600 EXPECT_CALL(detector_, Update(1, false, 1)).WillOnce(Return(false));
Minyue Li002fbb82018-10-04 11:31:03 +0200601 InsertNextPacket();
602 constexpr int kExpectedTarget = 1;
603 EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
604}
605
606TEST_F(DelayManagerTest, ForcedTargetDelayPercentile) {
607 {
608 test::ScopedFieldTrials field_trial(
609 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-95/");
610 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100611 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200612 }
613 {
614 test::ScopedFieldTrials field_trial(
615 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/");
616 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100617 EXPECT_EQ(1073204953, dm_->histogram_quantile()); // 0.9995 in Q30.
Minyue Li002fbb82018-10-04 11:31:03 +0200618 }
619 {
620 test::ScopedFieldTrials field_trial(
621 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Disabled/");
622 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100623 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200624 }
625 {
626 test::ScopedFieldTrials field_trial(
627 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled--1/");
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100628 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200629 }
630 {
631 test::ScopedFieldTrials field_trial(
632 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-100.1/");
633 RecreateDelayManager();
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100634 EXPECT_EQ(kDefaultHistogramQuantile, dm_->histogram_quantile());
Minyue Li002fbb82018-10-04 11:31:03 +0200635 }
636}
637
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100638TEST_F(DelayManagerTest, DelayHistogramFieldTrial) {
639 {
640 test::ScopedFieldTrials field_trial(
641 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
642 RecreateDelayManager();
643 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
644 dm_->histogram_mode());
645 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200646 EXPECT_EQ(
647 32702,
648 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
649 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100650 }
651 {
652 test::ScopedFieldTrials field_trial(
653 "WebRTC-Audio-NetEqDelayHistogram/Enabled-97.5-0.998/");
654 RecreateDelayManager();
655 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
656 dm_->histogram_mode());
657 EXPECT_EQ(1046898278, dm_->histogram_quantile()); // 0.975 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200658 EXPECT_EQ(
659 32702,
660 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
661 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100662 }
663 {
664 // NetEqDelayHistogram should take precedence over
665 // NetEqForceTargetDelayPercentile.
666 test::ScopedFieldTrials field_trial(
667 "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/"
668 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998/");
669 RecreateDelayManager();
670 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
671 dm_->histogram_mode());
672 EXPECT_EQ(1030792151, dm_->histogram_quantile()); // 0.96 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200673 EXPECT_EQ(
674 32702,
675 dm_->histogram()->base_forget_factor_for_testing()); // 0.998 in Q15.
676 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100677 }
678 {
679 // Invalid parameters.
680 test::ScopedFieldTrials field_trial(
681 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96/");
682 RecreateDelayManager();
683 EXPECT_EQ(DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY,
684 dm_->histogram_mode());
685 EXPECT_EQ(kDefaultHistogramQuantile,
Jonas Olssona4d87372019-07-05 19:08:33 +0200686 dm_->histogram_quantile()); // 0.95 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200687 EXPECT_EQ(
688 kForgetFactor,
689 dm_->histogram()->base_forget_factor_for_testing()); // 0.9993 in Q15.
690 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100691 }
692 {
693 test::ScopedFieldTrials field_trial(
694 "WebRTC-Audio-NetEqDelayHistogram/Disabled/");
695 RecreateDelayManager();
696 EXPECT_EQ(DelayManager::HistogramMode::INTER_ARRIVAL_TIME,
697 dm_->histogram_mode());
698 EXPECT_EQ(kDefaultHistogramQuantile,
Jonas Olssona4d87372019-07-05 19:08:33 +0200699 dm_->histogram_quantile()); // 0.95 in Q30.
Jakob Ivarssone9a2ee22019-05-22 16:54:09 +0200700 EXPECT_EQ(
701 kForgetFactor,
702 dm_->histogram()->base_forget_factor_for_testing()); // 0.9993 in Q15.
703 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
704 }
705
706 // Test parameter for new call start adaptation.
707 {
708 test::ScopedFieldTrials field_trial(
709 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1/");
710 RecreateDelayManager();
711 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.0);
712 }
713 {
714 test::ScopedFieldTrials field_trial(
715 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-1.5/");
716 RecreateDelayManager();
717 EXPECT_EQ(dm_->histogram()->start_forget_weight_for_testing().value(), 1.5);
718 }
719 {
720 test::ScopedFieldTrials field_trial(
721 "WebRTC-Audio-NetEqDelayHistogram/Enabled-96-0.998-0.5/");
722 RecreateDelayManager();
723 EXPECT_FALSE(dm_->histogram()->start_forget_weight_for_testing());
Jakob Ivarssondb42ed22019-02-27 10:08:09 +0100724 }
725}
726
727TEST_F(DelayManagerTest, RelativeArrivalDelayMode) {
728 histogram_mode_ = DelayManager::HistogramMode::RELATIVE_ARRIVAL_DELAY;
729 use_mock_histogram_ = true;
730 RecreateDelayManager();
731
732 SetPacketAudioLength(kFrameSizeMs);
733 InsertNextPacket();
734
735 IncreaseTime(kFrameSizeMs);
736 EXPECT_CALL(*mock_histogram_, Add(0)); // Not delayed.
737 InsertNextPacket();
738
739 IncreaseTime(2 * kFrameSizeMs);
740 EXPECT_CALL(*mock_histogram_, Add(1)); // 20ms delayed.
741 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
742
743 IncreaseTime(2 * kFrameSizeMs);
744 EXPECT_CALL(*mock_histogram_, Add(2)); // 40ms delayed.
745 EXPECT_EQ(0, dm_->Update(seq_no_ + 1, ts_ + kTsIncrement, kFs));
746
747 EXPECT_CALL(*mock_histogram_, Add(1)); // Reordered, 20ms delayed.
748 EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
749}
750
Jakob Ivarsson44507082019-03-05 16:59:03 +0100751TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
752 SetPacketAudioLength(kFrameSizeMs);
753 InsertNextPacket();
754
755 IncreaseTime(kFrameSizeMs);
756 EXPECT_CALL(stats_, RelativePacketArrivalDelay(0));
757 InsertNextPacket();
758
759 IncreaseTime(2 * kFrameSizeMs);
760 EXPECT_CALL(stats_, RelativePacketArrivalDelay(20));
761 InsertNextPacket();
762}
763
Ruslan Burakov1e193fa2019-05-15 14:31:22 +0200764TEST_F(DelayManagerTest, DecelerationTargetLevelOffsetFieldTrial) {
765 {
766 test::ScopedFieldTrials field_trial(
767 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-105/");
768 RecreateDelayManager();
769 EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 105 << 8);
770 }
771 {
772 // Negative number.
773 test::ScopedFieldTrials field_trial(
774 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled--105/");
775 RecreateDelayManager();
776 EXPECT_FALSE(dm_->deceleration_target_level_offset_ms().has_value());
777 }
778 {
779 // Disabled.
780 test::ScopedFieldTrials field_trial(
781 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Disabled/");
782 RecreateDelayManager();
783 EXPECT_FALSE(dm_->deceleration_target_level_offset_ms().has_value());
784 }
785 {
786 // Float number.
787 test::ScopedFieldTrials field_trial(
788 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-105.5/");
789 RecreateDelayManager();
790 EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 105 << 8);
791 }
792 {
793 // Several numbers.
794 test::ScopedFieldTrials field_trial(
795 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-20-40/");
796 RecreateDelayManager();
797 EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 20 << 8);
798 }
799}
800
801TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) {
802 // Border value where 1/4 target buffer level meets
803 // WebRTC-Audio-NetEqDecelerationTargetLevelOffset.
804 constexpr int kBoarderTargetLevel = 100 * 4;
805 {
806 // Test that for a low target level, default behaviour is intact.
807 test::ScopedFieldTrials field_trial(
808 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-100/");
809 const int target_level_ms = ((kBoarderTargetLevel - 1) << 8) / kFrameSizeMs;
810 RecreateDelayManager();
811 SetPacketAudioLength(kFrameSizeMs);
812
813 int lower, higher; // In Q8.
814 dm_->BufferLimits(target_level_ms, &lower, &higher);
815
816 // Default behaviour of taking 75% of target level.
817 EXPECT_EQ(target_level_ms * 3 / 4, lower);
818 EXPECT_EQ(target_level_ms, higher);
819 }
820
821 {
822 // Test that for the high target level, |lower| is below target level by
823 // fixed constant (100 ms in this Field Trial setup).
824 test::ScopedFieldTrials field_trial(
825 "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-100/");
826 const int target_level_ms = ((kBoarderTargetLevel + 1) << 8) / kFrameSizeMs;
827 RecreateDelayManager();
828 SetPacketAudioLength(kFrameSizeMs);
829
830 int lower, higher; // In Q8.
831 dm_->BufferLimits(target_level_ms, &lower, &higher);
832
833 EXPECT_EQ(target_level_ms - ((100 << 8) / kFrameSizeMs), lower);
834 EXPECT_EQ(target_level_ms, higher);
835 }
836
837 {
838 // Test that for the high target level, without Field Trial the behaviour
839 // will remain the same.
840 const int target_level_ms = ((kBoarderTargetLevel + 1) << 8) / kFrameSizeMs;
841 RecreateDelayManager();
842 SetPacketAudioLength(kFrameSizeMs);
843
844 int lower, higher; // In Q8.
845 dm_->BufferLimits(target_level_ms, &lower, &higher);
846
847 // Default behaviour of taking 75% of target level.
848 EXPECT_EQ(target_level_ms * 3 / 4, lower);
849 EXPECT_EQ(target_level_ms, higher);
850 }
851}
852
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000853} // namespace webrtc