delay_constraints_unittest.cc (8188B)
1 /* 2 * Copyright (c) 2024 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 #include "modules/audio_coding/neteq/delay_constraints.h" 12 13 #include "rtc_base/checks.h" 14 #include "test/gtest.h" 15 16 namespace webrtc { 17 namespace { 18 19 constexpr int kMaxNumberOfPackets = 200; 20 constexpr int kFrameSizeMs = 20; 21 constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs; 22 23 TEST(DelayConstraintsTest, NoConstraints) { 24 DelayConstraints constraints(kMaxNumberOfPackets, 0); 25 EXPECT_EQ(constraints.Clamp(100), 100); 26 EXPECT_EQ(constraints.Clamp(0), 0); 27 } 28 29 TEST(DelayConstraintsTest, MaxDelay) { 30 DelayConstraints constraints(kMaxNumberOfPackets, 0); 31 constexpr int kMaxDelayMs = 60; 32 EXPECT_TRUE(constraints.SetMaximumDelay(kMaxDelayMs)); 33 EXPECT_EQ(constraints.Clamp(100), kMaxDelayMs); 34 } 35 36 TEST(DelayConstraintsTest, MinDelay) { 37 DelayConstraints constraints(kMaxNumberOfPackets, 0); 38 constexpr int kMinDelayMs = 7 * kFrameSizeMs; 39 constraints.SetMinimumDelay(kMinDelayMs); 40 EXPECT_EQ(constraints.Clamp(20), kMinDelayMs); 41 } 42 43 TEST(DelayConstraintsTest, BaseMinimumDelayCheckValidRange) { 44 DelayConstraints constraints(kMaxNumberOfPackets, 0); 45 // Base minimum delay should be between [0, 10000] milliseconds. 46 EXPECT_FALSE(constraints.SetBaseMinimumDelay(-1)); 47 EXPECT_FALSE(constraints.SetBaseMinimumDelay(10001)); 48 EXPECT_EQ(constraints.GetBaseMinimumDelay(), 0); 49 50 EXPECT_TRUE(constraints.SetBaseMinimumDelay(7999)); 51 EXPECT_EQ(constraints.GetBaseMinimumDelay(), 7999); 52 } 53 54 TEST(DelayConstraintsTest, BaseMinimumDelayLowerThanMinimumDelay) { 55 DelayConstraints constraints(kMaxNumberOfPackets, 0); 56 constexpr int kBaseMinimumDelayMs = 100; 57 constexpr int kMinimumDelayMs = 200; 58 59 // Base minimum delay sets lower bound on minimum. That is why when base 60 // minimum delay is lower than minimum delay we use minimum delay. 61 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs); 62 63 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs)); 64 EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs)); 65 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMinimumDelayMs); 66 } 67 68 TEST(DelayConstraintsTest, BaseMinimumDelayGreaterThanMinimumDelay) { 69 DelayConstraints constraints(kMaxNumberOfPackets, 0); 70 constexpr int kBaseMinimumDelayMs = 70; 71 constexpr int kMinimumDelayMs = 30; 72 73 // Base minimum delay sets lower bound on minimum. That is why when base 74 // minimum delay is greater than minimum delay we use base minimum delay. 75 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs); 76 77 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs)); 78 EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs)); 79 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), 80 kBaseMinimumDelayMs); 81 } 82 83 TEST(DelayConstraintsTest, BaseMinimumDelayGreaterThanBufferSize) { 84 DelayConstraints constraints(kMaxNumberOfPackets, 0); 85 constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1; 86 constexpr int kMinimumDelayMs = 12; 87 constexpr int kMaximumDelayMs = 20; 88 constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4; 89 EXPECT_TRUE(constraints.SetPacketAudioLength(kFrameSizeMs)); 90 91 EXPECT_TRUE(constraints.SetMaximumDelay(kMaximumDelayMs)); 92 93 // Base minimum delay is greater than minimum delay, that is why we clamp 94 // it to current the highest possible value which is maximum delay. 95 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs); 96 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs); 97 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs); 98 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75); 99 100 EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs)); 101 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs)); 102 103 // Unset maximum value. 104 EXPECT_TRUE(constraints.SetMaximumDelay(0)); 105 106 // With maximum value unset, the highest possible value now is 75% of 107 // currently possible maximum buffer size. 108 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), 109 kMaxBufferSizeMsQ75); 110 } 111 112 TEST(DelayConstraintsTest, BaseMinimumDelayGreaterThanMaximumDelay) { 113 DelayConstraints constraints(kMaxNumberOfPackets, 0); 114 constexpr int kMaximumDelayMs = 400; 115 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1; 116 constexpr int kMinimumDelayMs = 20; 117 118 // Base minimum delay is greater than minimum delay, that is why we clamp 119 // it to current the highest possible value which is kMaximumDelayMs. 120 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs); 121 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs); 122 RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs); 123 124 EXPECT_TRUE(constraints.SetMaximumDelay(kMaximumDelayMs)); 125 EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs)); 126 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs)); 127 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMaximumDelayMs); 128 } 129 130 TEST(DelayConstraintsTest, BaseMinimumDelayLowerThanMaxSize) { 131 DelayConstraints constraints(kMaxNumberOfPackets, 0); 132 constexpr int kMaximumDelayMs = 400; 133 constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1; 134 constexpr int kMinimumDelayMs = 20; 135 136 // Base minimum delay is greater than minimum delay, and lower than maximum 137 // delays that is why it is used. 138 RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs); 139 RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs); 140 141 EXPECT_TRUE(constraints.SetMaximumDelay(kMaximumDelayMs)); 142 EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs)); 143 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs)); 144 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), 145 kBaseMinimumDelayMs); 146 } 147 148 TEST(DelayConstraintsTest, MinimumDelayMemorization) { 149 DelayConstraints constraints(kMaxNumberOfPackets, 0); 150 // Check that when we increase base minimum delay to value higher than 151 // minimum delay then minimum delay is still memorized. This allows to 152 // restore effective minimum delay to memorized minimum delay value when we 153 // decrease base minimum delay. 154 constexpr int kBaseMinimumDelayMsLow = 10; 155 constexpr int kMinimumDelayMs = 20; 156 constexpr int kBaseMinimumDelayMsHigh = 30; 157 158 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMsLow)); 159 EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs)); 160 // Minimum delay is used as it is higher than base minimum delay. 161 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMinimumDelayMs); 162 163 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMsHigh)); 164 // Base minimum delay is used as it is now higher than minimum delay. 165 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), 166 kBaseMinimumDelayMsHigh); 167 168 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMsLow)); 169 // Check that minimum delay is memorized and is used again. 170 EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMinimumDelayMs); 171 } 172 173 TEST(DelayConstraintsTest, BaseMinimumDelay) { 174 DelayConstraints constraints(kMaxNumberOfPackets, 0); 175 constexpr int kBaseMinimumDelayMs = 7 * kFrameSizeMs; 176 EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs)); 177 EXPECT_EQ(constraints.GetBaseMinimumDelay(), kBaseMinimumDelayMs); 178 EXPECT_EQ(constraints.Clamp(20), kBaseMinimumDelayMs); 179 } 180 181 TEST(DelayConstraintsTest, Failures) { 182 DelayConstraints constraints(kMaxNumberOfPackets, 0); 183 // Wrong packet size. 184 EXPECT_FALSE(constraints.SetPacketAudioLength(0)); 185 EXPECT_FALSE(constraints.SetPacketAudioLength(-1)); 186 187 // Minimum delay higher than a maximum delay is not accepted. 188 EXPECT_TRUE(constraints.SetMaximumDelay(20)); 189 EXPECT_FALSE(constraints.SetMinimumDelay(40)); 190 191 // Maximum delay less than minimum delay is not accepted. 192 EXPECT_TRUE(constraints.SetMaximumDelay(100)); 193 EXPECT_TRUE(constraints.SetMinimumDelay(80)); 194 EXPECT_FALSE(constraints.SetMaximumDelay(60)); 195 } 196 197 } // namespace 198 } // namespace webrtc