blob: da5f53188caf0fe8a8d2dabb25832c4d207dc3bf [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 Ivarsson7dff9f32020-11-11 15:26:10 +010019#include "absl/types/optional.h"
Jakob Ivarsson1eb3d7e2019-02-21 15:42:31 +010020#include "modules/audio_coding/neteq/histogram.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 {
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020031constexpr int kMaxNumberOfPackets = 200;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010032constexpr int kTimeStepMs = 10;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010033constexpr int kFrameSizeMs = 20;
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010034constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020035
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010036} // namespace
37
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000038class DelayManagerTest : public ::testing::Test {
39 protected:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000040 DelayManagerTest();
41 virtual void SetUp();
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020042 void Update(int delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000043 void IncreaseTime(int inc_ms);
44
Olga Sharonova46814942021-11-08 19:09:28 +000045 TickTimer tick_timer_;
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010046 DelayManager dm_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000047};
48
49DelayManagerTest::DelayManagerTest()
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020050 : dm_(DelayManager::Config(), &tick_timer_) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000051
52void DelayManagerTest::SetUp() {
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020053 dm_.SetPacketAudioLength(kFrameSizeMs);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000054}
55
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020056void DelayManagerTest::Update(int delay) {
57 dm_.Update(delay, false);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000058}
59
60void DelayManagerTest::IncreaseTime(int inc_ms) {
61 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -070062 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000063 }
64}
Ruslan Burakov1e193fa2019-05-15 14:31:22 +020065
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000066TEST_F(DelayManagerTest, CreateAndDestroy) {
67 // Nothing to do here. The test fixture creates and destroys the DelayManager
68 // object.
69}
70
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000071TEST_F(DelayManagerTest, UpdateNormal) {
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010072 for (int i = 0; i < 50; ++i) {
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020073 Update(0);
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010074 IncreaseTime(kFrameSizeMs);
75 }
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020076 EXPECT_EQ(20, dm_.TargetDelayMs());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000077}
78
Olga Sharonova46814942021-11-08 19:09:28 +000079TEST_F(DelayManagerTest, MaxDelay) {
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020080 Update(0);
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010081 const int kMaxDelayMs = 60;
82 EXPECT_GT(dm_.TargetDelayMs(), kMaxDelayMs);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020083 EXPECT_TRUE(dm_.SetMaximumDelay(kMaxDelayMs));
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020084 Update(0);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020085 EXPECT_EQ(kMaxDelayMs, dm_.TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000086}
87
Niels Möller18f1adc2018-08-23 08:40:41 +020088TEST_F(DelayManagerTest, MinDelay) {
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020089 Update(0);
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020090 int kMinDelayMs = 7 * kFrameSizeMs;
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010091 EXPECT_LT(dm_.TargetDelayMs(), kMinDelayMs);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020092 dm_.SetMinimumDelay(kMinDelayMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +020093 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +020094 Update(0);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020095 EXPECT_EQ(kMinDelayMs, dm_.TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000096}
97
Ruslan Burakov4a68fb92019-02-13 14:25:39 +010098TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +010099 // Base minimum delay should be between [0, 10000] milliseconds.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200100 EXPECT_FALSE(dm_.SetBaseMinimumDelay(-1));
101 EXPECT_FALSE(dm_.SetBaseMinimumDelay(10001));
102 EXPECT_EQ(dm_.GetBaseMinimumDelay(), 0);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100103
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200104 EXPECT_TRUE(dm_.SetBaseMinimumDelay(7999));
105 EXPECT_EQ(dm_.GetBaseMinimumDelay(), 7999);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100106}
107
108TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100109 constexpr int kBaseMinimumDelayMs = 100;
110 constexpr int kMinimumDelayMs = 200;
111
112 // Base minimum delay sets lower bound on minimum. That is why when base
113 // minimum delay is lower than minimum delay we use minimum delay.
114 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
115
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200116 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
117 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
118 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100119}
120
121TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100122 constexpr int kBaseMinimumDelayMs = 70;
123 constexpr int kMinimumDelayMs = 30;
124
125 // Base minimum delay sets lower bound on minimum. That is why when base
126 // minimum delay is greater than minimum delay we use base minimum delay.
127 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
128
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200129 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
130 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
131 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100132}
133
134TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100135 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
136 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100137 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100138 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
139
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200140 EXPECT_TRUE(dm_.SetMaximumDelay(kMaximumDelayMs));
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100141
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100142 // Base minimum delay is greater than minimum delay, that is why we clamp
143 // it to current the highest possible value which is maximum delay.
144 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
145 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100146 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
147 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100148
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200149 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
150 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100151
152 // Unset maximum value.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200153 EXPECT_TRUE(dm_.SetMaximumDelay(0));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100154
155 // With maximum value unset, the highest possible value now is 75% of
156 // currently possible maximum buffer size.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200157 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100158}
159
160TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100161 constexpr int kMaximumDelayMs = 400;
162 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
163 constexpr int kMinimumDelayMs = 20;
164
165 // Base minimum delay is greater than minimum delay, that is why we clamp
166 // it to current the highest possible value which is kMaximumDelayMs.
167 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
168 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
169 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
170
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200171 EXPECT_TRUE(dm_.SetMaximumDelay(kMaximumDelayMs));
172 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
173 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
174 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100175}
176
177TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100178 constexpr int kMaximumDelayMs = 400;
179 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
180 constexpr int kMinimumDelayMs = 20;
181
182 // Base minimum delay is greater than minimum delay, and lower than maximum
183 // delays that is why it is used.
184 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
185 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
186
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200187 EXPECT_TRUE(dm_.SetMaximumDelay(kMaximumDelayMs));
188 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
189 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
190 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100191}
192
193TEST_F(DelayManagerTest, MinimumDelayMemorization) {
194 // Check that when we increase base minimum delay to value higher than
195 // minimum delay then minimum delay is still memorized. This allows to
196 // restore effective minimum delay to memorized minimum delay value when we
197 // decrease base minimum delay.
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100198 constexpr int kBaseMinimumDelayMsLow = 10;
199 constexpr int kMinimumDelayMs = 20;
200 constexpr int kBaseMinimumDelayMsHigh = 30;
201
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200202 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
203 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100204 // Minimum delay is used as it is higher than base minimum delay.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200205 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100206
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200207 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100208 // Base minimum delay is used as it is now higher than minimum delay.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200209 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMsHigh);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100210
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200211 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100212 // Check that minimum delay is memorized and is used again.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200213 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100214}
215
216TEST_F(DelayManagerTest, BaseMinimumDelay) {
Jakob Ivarssonb1ae5cc2020-10-06 15:37:28 +0000217 // First packet arrival.
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +0200218 Update(0);
Jakob Ivarssonff9f6462020-10-07 12:46:42 +0000219
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200220 constexpr int kBaseMinimumDelayMs = 7 * kFrameSizeMs;
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +0100221 EXPECT_LT(dm_.TargetDelayMs(), kBaseMinimumDelayMs);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200222 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
223 EXPECT_EQ(dm_.GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100224
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200225 IncreaseTime(kFrameSizeMs);
Jakob Ivarsson01ab7d52022-05-25 21:06:14 +0200226 Update(0);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200227 EXPECT_EQ(dm_.GetBaseMinimumDelay(), kBaseMinimumDelayMs);
228 EXPECT_EQ(kBaseMinimumDelayMs, dm_.TargetDelayMs());
henrik.lundinb8c55b12017-05-10 07:38:01 -0700229}
230
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000231TEST_F(DelayManagerTest, Failures) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000232 // Wrong packet size.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200233 EXPECT_EQ(-1, dm_.SetPacketAudioLength(0));
234 EXPECT_EQ(-1, dm_.SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000235
236 // Minimum delay higher than a maximum delay is not accepted.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200237 EXPECT_TRUE(dm_.SetMaximumDelay(20));
238 EXPECT_FALSE(dm_.SetMinimumDelay(40));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000239
240 // Maximum delay less than minimum delay is not accepted.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200241 EXPECT_TRUE(dm_.SetMaximumDelay(100));
242 EXPECT_TRUE(dm_.SetMinimumDelay(80));
243 EXPECT_FALSE(dm_.SetMaximumDelay(60));
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200244}
245
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000246} // namespace webrtc