blob: ee353065ea3d690d0ef89faf05bb55304ba88341 [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;
33constexpr int kFs = 8000;
34constexpr int kFrameSizeMs = 20;
35constexpr int kTsIncrement = kFrameSizeMs * kFs / 1000;
36constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020037
Jakob Ivarssondb42ed22019-02-27 10:08:09 +010038} // namespace
39
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000040class DelayManagerTest : public ::testing::Test {
41 protected:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000042 DelayManagerTest();
43 virtual void SetUp();
Ivo Creusen53a31f72019-10-24 15:20:39 +020044 absl::optional<int> InsertNextPacket();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000045 void IncreaseTime(int inc_ms);
46
Olga Sharonova46814942021-11-08 19:09:28 +000047 TickTimer tick_timer_;
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010048 DelayManager dm_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000049 uint32_t ts_;
50};
51
52DelayManagerTest::DelayManagerTest()
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020053 : dm_(DelayManager::Config(), &tick_timer_), ts_(0x12345678) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000054
55void DelayManagerTest::SetUp() {
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020056 dm_.SetPacketAudioLength(kFrameSizeMs);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000057}
58
Ivo Creusen53a31f72019-10-24 15:20:39 +020059absl::optional<int> DelayManagerTest::InsertNextPacket() {
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020060 auto relative_delay = dm_.Update(ts_, kFs);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000061 ts_ += kTsIncrement;
Ivo Creusen53a31f72019-10-24 15:20:39 +020062 return relative_delay;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000063}
64
65void DelayManagerTest::IncreaseTime(int inc_ms) {
66 for (int t = 0; t < inc_ms; t += kTimeStepMs) {
henrik.lundinf3933702016-04-28 01:53:52 -070067 tick_timer_.Increment();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000068 }
69}
Ruslan Burakov1e193fa2019-05-15 14:31:22 +020070
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000071TEST_F(DelayManagerTest, CreateAndDestroy) {
72 // Nothing to do here. The test fixture creates and destroys the DelayManager
73 // object.
74}
75
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000076TEST_F(DelayManagerTest, UpdateNormal) {
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010077 for (int i = 0; i < 50; ++i) {
78 InsertNextPacket();
79 IncreaseTime(kFrameSizeMs);
80 }
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020081 EXPECT_EQ(20, dm_.TargetDelayMs());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000082}
83
Olga Sharonova46814942021-11-08 19:09:28 +000084TEST_F(DelayManagerTest, MaxDelay) {
Olga Sharonova46814942021-11-08 19:09:28 +000085 InsertNextPacket();
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010086 const int kMaxDelayMs = 60;
87 EXPECT_GT(dm_.TargetDelayMs(), kMaxDelayMs);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020088 EXPECT_TRUE(dm_.SetMaximumDelay(kMaxDelayMs));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000089 InsertNextPacket();
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020090 EXPECT_EQ(kMaxDelayMs, dm_.TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000091
92 // Target level at least should be one packet.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +020093 EXPECT_FALSE(dm_.SetMaximumDelay(kFrameSizeMs - 1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000094}
95
Niels Möller18f1adc2018-08-23 08:40:41 +020096TEST_F(DelayManagerTest, MinDelay) {
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +000097 InsertNextPacket();
Jakob Ivarsson80fb9782020-10-09 13:41:06 +020098 int kMinDelayMs = 7 * kFrameSizeMs;
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +010099 EXPECT_LT(dm_.TargetDelayMs(), kMinDelayMs);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200100 dm_.SetMinimumDelay(kMinDelayMs);
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200101 IncreaseTime(kFrameSizeMs);
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000102 InsertNextPacket();
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200103 EXPECT_EQ(kMinDelayMs, dm_.TargetDelayMs());
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000104}
105
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100106TEST_F(DelayManagerTest, BaseMinimumDelayCheckValidRange) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100107 // Base minimum delay should be between [0, 10000] milliseconds.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200108 EXPECT_FALSE(dm_.SetBaseMinimumDelay(-1));
109 EXPECT_FALSE(dm_.SetBaseMinimumDelay(10001));
110 EXPECT_EQ(dm_.GetBaseMinimumDelay(), 0);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100111
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200112 EXPECT_TRUE(dm_.SetBaseMinimumDelay(7999));
113 EXPECT_EQ(dm_.GetBaseMinimumDelay(), 7999);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100114}
115
116TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMinimumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100117 constexpr int kBaseMinimumDelayMs = 100;
118 constexpr int kMinimumDelayMs = 200;
119
120 // Base minimum delay sets lower bound on minimum. That is why when base
121 // minimum delay is lower than minimum delay we use minimum delay.
122 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
123
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200124 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
125 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
126 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100127}
128
129TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMinimumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100130 constexpr int kBaseMinimumDelayMs = 70;
131 constexpr int kMinimumDelayMs = 30;
132
133 // Base minimum delay sets lower bound on minimum. That is why when base
134 // minimum delay is greater than minimum delay we use base minimum delay.
135 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
136
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200137 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
138 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
139 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100140}
141
142TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanBufferSize) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100143 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
144 constexpr int kMinimumDelayMs = 12;
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100145 constexpr int kMaximumDelayMs = 20;
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100146 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
147
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200148 EXPECT_TRUE(dm_.SetMaximumDelay(kMaximumDelayMs));
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100149
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100150 // Base minimum delay is greater than minimum delay, that is why we clamp
151 // it to current the highest possible value which is maximum delay.
152 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
153 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
Ruslan Burakovb35bacc2019-02-20 13:41:59 +0100154 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
155 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100156
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200157 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
158 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100159
160 // Unset maximum value.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200161 EXPECT_TRUE(dm_.SetMaximumDelay(0));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100162
163 // With maximum value unset, the highest possible value now is 75% of
164 // currently possible maximum buffer size.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200165 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMaxBufferSizeMsQ75);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100166}
167
168TEST_F(DelayManagerTest, BaseMinimumDelayGreaterThanMaximumDelay) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100169 constexpr int kMaximumDelayMs = 400;
170 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
171 constexpr int kMinimumDelayMs = 20;
172
173 // Base minimum delay is greater than minimum delay, that is why we clamp
174 // it to current the highest possible value which is kMaximumDelayMs.
175 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
176 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
177 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
178
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200179 EXPECT_TRUE(dm_.SetMaximumDelay(kMaximumDelayMs));
180 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
181 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
182 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100183}
184
185TEST_F(DelayManagerTest, BaseMinimumDelayLowerThanMaxSize) {
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100186 constexpr int kMaximumDelayMs = 400;
187 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
188 constexpr int kMinimumDelayMs = 20;
189
190 // Base minimum delay is greater than minimum delay, and lower than maximum
191 // delays that is why it is used.
192 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
193 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
194
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200195 EXPECT_TRUE(dm_.SetMaximumDelay(kMaximumDelayMs));
196 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
197 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
198 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100199}
200
201TEST_F(DelayManagerTest, MinimumDelayMemorization) {
202 // Check that when we increase base minimum delay to value higher than
203 // minimum delay then minimum delay is still memorized. This allows to
204 // restore effective minimum delay to memorized minimum delay value when we
205 // decrease base minimum delay.
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100206 constexpr int kBaseMinimumDelayMsLow = 10;
207 constexpr int kMinimumDelayMs = 20;
208 constexpr int kBaseMinimumDelayMsHigh = 30;
209
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200210 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
211 EXPECT_TRUE(dm_.SetMinimumDelay(kMinimumDelayMs));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100212 // Minimum delay is used as it is higher than base minimum delay.
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
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200215 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100216 // Base minimum delay is used as it is now higher than minimum delay.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200217 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kBaseMinimumDelayMsHigh);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100218
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200219 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100220 // Check that minimum delay is memorized and is used again.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200221 EXPECT_EQ(dm_.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100222}
223
224TEST_F(DelayManagerTest, BaseMinimumDelay) {
Jakob Ivarssonb1ae5cc2020-10-06 15:37:28 +0000225 // First packet arrival.
226 InsertNextPacket();
Jakob Ivarssonff9f6462020-10-07 12:46:42 +0000227
Jakob Ivarsson80fb9782020-10-09 13:41:06 +0200228 constexpr int kBaseMinimumDelayMs = 7 * kFrameSizeMs;
Jakob Ivarssonfa68ac02021-11-09 12:58:45 +0100229 EXPECT_LT(dm_.TargetDelayMs(), kBaseMinimumDelayMs);
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200230 EXPECT_TRUE(dm_.SetBaseMinimumDelay(kBaseMinimumDelayMs));
231 EXPECT_EQ(dm_.GetBaseMinimumDelay(), kBaseMinimumDelayMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100232
Jakob Ivarsson507f4342019-09-03 13:04:41 +0200233 IncreaseTime(kFrameSizeMs);
Ruslan Burakov4a68fb92019-02-13 14:25:39 +0100234 InsertNextPacket();
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200235 EXPECT_EQ(dm_.GetBaseMinimumDelay(), kBaseMinimumDelayMs);
236 EXPECT_EQ(kBaseMinimumDelayMs, dm_.TargetDelayMs());
henrik.lundinb8c55b12017-05-10 07:38:01 -0700237}
238
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000239TEST_F(DelayManagerTest, Failures) {
240 // Wrong sample rate.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200241 EXPECT_EQ(absl::nullopt, dm_.Update(0, -1));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000242 // Wrong packet size.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200243 EXPECT_EQ(-1, dm_.SetPacketAudioLength(0));
244 EXPECT_EQ(-1, dm_.SetPacketAudioLength(-1));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000245
246 // Minimum delay higher than a maximum delay is not accepted.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200247 EXPECT_TRUE(dm_.SetMaximumDelay(20));
248 EXPECT_FALSE(dm_.SetMinimumDelay(40));
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000249
250 // Maximum delay less than minimum delay is not accepted.
Jakob Ivarsson74158ff2021-09-07 14:24:56 +0200251 EXPECT_TRUE(dm_.SetMaximumDelay(100));
252 EXPECT_TRUE(dm_.SetMinimumDelay(80));
253 EXPECT_FALSE(dm_.SetMaximumDelay(60));
Jakob Ivarsson74154e62019-08-22 15:00:16 +0200254}
255
Jakob Ivarsson44507082019-03-05 16:59:03 +0100256TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) {
Ivo Creusen53a31f72019-10-24 15:20:39 +0200257 EXPECT_EQ(absl::nullopt, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100258 IncreaseTime(kFrameSizeMs);
Ivo Creusen53a31f72019-10-24 15:20:39 +0200259 EXPECT_EQ(0, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100260 IncreaseTime(2 * kFrameSizeMs);
Ivo Creusen53a31f72019-10-24 15:20:39 +0200261
262 EXPECT_EQ(20, InsertNextPacket());
Jakob Ivarsson44507082019-03-05 16:59:03 +0100263}
264
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000265} // namespace webrtc