OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 | 23 |
24 namespace webrtc { | 24 namespace webrtc { |
25 namespace { | 25 namespace { |
26 | 26 |
27 std::string ProduceDebugText(int sample_rate_hz) { | 27 std::string ProduceDebugText(int sample_rate_hz) { |
28 std::ostringstream ss; | 28 std::ostringstream ss; |
29 ss << "Sample rate: " << sample_rate_hz; | 29 ss << "Sample rate: " << sample_rate_hz; |
30 return ss.str(); | 30 return ss.str(); |
31 } | 31 } |
32 | 32 |
33 std::string ProduceDebugText(int sample_rate_hz, size_t delay) { | |
34 std::ostringstream ss; | |
35 ss << "Sample rate: " << sample_rate_hz; | |
36 ss << ", Delay: " << delay; | |
37 return ss.str(); | |
38 } | |
39 | |
40 constexpr size_t kMaxApiCallJitter = 30; | |
41 | |
42 } // namespace | 33 } // namespace |
43 | 34 |
44 // Verifies that the basic swap in the insert call works. | |
45 TEST(RenderDelayBuffer, InsertSwap) { | |
46 for (auto rate : {8000, 16000, 32000, 48000}) { | |
47 SCOPED_TRACE(ProduceDebugText(rate)); | |
48 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | |
49 250, NumBandsForRate(rate), kMaxApiCallJitter)); | |
50 for (size_t k = 0; k < 10; ++k) { | |
51 std::vector<std::vector<float>> block_to_insert( | |
52 NumBandsForRate(rate), std::vector<float>(kBlockSize, k + 1)); | |
53 std::vector<std::vector<float>> reference_block = block_to_insert; | |
54 | |
55 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); | |
56 EXPECT_NE(reference_block, block_to_insert); | |
57 } | |
58 } | |
59 } | |
60 | |
61 // Verifies that the buffer passes the blocks in a bitexact manner when the | |
62 // delay is zero. | |
63 TEST(RenderDelayBuffer, BasicBitexactness) { | |
64 for (auto rate : {8000, 16000, 32000, 48000}) { | |
65 SCOPED_TRACE(ProduceDebugText(rate)); | |
66 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | |
67 20, NumBandsForRate(rate), kMaxApiCallJitter)); | |
68 for (size_t k = 0; k < 200; ++k) { | |
69 std::vector<std::vector<float>> block_to_insert( | |
70 NumBandsForRate(rate), std::vector<float>(kBlockSize, k)); | |
71 std::vector<std::vector<float>> reference_block = block_to_insert; | |
72 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); | |
73 ASSERT_TRUE(delay_buffer->IsBlockAvailable()); | |
74 const std::vector<std::vector<float>>& output_block = | |
75 delay_buffer->GetNext(); | |
76 EXPECT_EQ(reference_block, output_block); | |
77 } | |
78 } | |
79 } | |
80 | |
81 // Verifies that the buffer passes the blocks in a bitexact manner when the | |
82 // delay is non-zero. | |
83 TEST(RenderDelayBuffer, BitexactnessWithNonZeroDelay) { | |
84 constexpr size_t kMaxDelay = 200; | |
85 for (auto rate : {8000, 16000, 32000, 48000}) { | |
86 for (size_t delay = 0; delay < kMaxDelay; ++delay) { | |
87 SCOPED_TRACE(ProduceDebugText(rate, delay)); | |
88 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | |
89 20 + kMaxDelay, NumBandsForRate(rate), kMaxApiCallJitter)); | |
90 delay_buffer->SetDelay(delay); | |
91 for (size_t k = 0; k < 200 + delay; ++k) { | |
92 std::vector<std::vector<float>> block_to_insert( | |
93 NumBandsForRate(rate), std::vector<float>(kBlockSize, k)); | |
94 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); | |
95 ASSERT_TRUE(delay_buffer->IsBlockAvailable()); | |
96 const std::vector<std::vector<float>>& output_block = | |
97 delay_buffer->GetNext(); | |
98 if (k >= delay) { | |
99 std::vector<std::vector<float>> reference_block( | |
100 NumBandsForRate(rate), std::vector<float>(kBlockSize, k - delay)); | |
101 EXPECT_EQ(reference_block, output_block); | |
102 } | |
103 } | |
104 } | |
105 } | |
106 } | |
107 | |
108 // Verifies that the buffer passes the blocks in a bitexact manner when the | |
109 // delay is zero and there is jitter in the Insert and GetNext calls. | |
110 TEST(RenderDelayBuffer, BasicBitexactnessWithJitter) { | |
111 for (auto rate : {8000, 16000, 32000, 48000}) { | |
112 SCOPED_TRACE(ProduceDebugText(rate)); | |
113 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | |
114 20, NumBandsForRate(rate), kMaxApiCallJitter)); | |
115 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | |
116 std::vector<std::vector<float>> block_to_insert( | |
117 NumBandsForRate(rate), std::vector<float>(kBlockSize, k)); | |
118 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); | |
119 } | |
120 | |
121 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | |
122 std::vector<std::vector<float>> reference_block( | |
123 NumBandsForRate(rate), std::vector<float>(kBlockSize, k)); | |
124 ASSERT_TRUE(delay_buffer->IsBlockAvailable()); | |
125 const std::vector<std::vector<float>>& output_block = | |
126 delay_buffer->GetNext(); | |
127 EXPECT_EQ(reference_block, output_block); | |
128 } | |
129 EXPECT_FALSE(delay_buffer->IsBlockAvailable()); | |
130 } | |
131 } | |
132 | |
133 // Verifies that the buffer passes the blocks in a bitexact manner when the | |
134 // delay is non-zero and there is jitter in the Insert and GetNext calls. | |
135 TEST(RenderDelayBuffer, BitexactnessWithNonZeroDelayAndJitter) { | |
136 constexpr size_t kMaxDelay = 200; | |
137 for (auto rate : {8000, 16000, 32000, 48000}) { | |
138 for (size_t delay = 0; delay < kMaxDelay; ++delay) { | |
139 SCOPED_TRACE(ProduceDebugText(rate, delay)); | |
140 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | |
141 20 + kMaxDelay, NumBandsForRate(rate), kMaxApiCallJitter)); | |
142 delay_buffer->SetDelay(delay); | |
143 for (size_t j = 0; j < 10; ++j) { | |
144 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | |
145 const size_t block_value = k + j * kMaxApiCallJitter; | |
146 std::vector<std::vector<float>> block_to_insert( | |
147 NumBandsForRate(rate), | |
148 std::vector<float>(kBlockSize, block_value)); | |
149 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); | |
150 } | |
151 | |
152 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | |
153 ASSERT_TRUE(delay_buffer->IsBlockAvailable()); | |
154 const std::vector<std::vector<float>>& output_block = | |
155 delay_buffer->GetNext(); | |
156 const size_t block_value = k + j * kMaxApiCallJitter; | |
157 if (block_value >= delay) { | |
158 std::vector<std::vector<float>> reference_block( | |
159 NumBandsForRate(rate), | |
160 std::vector<float>(kBlockSize, block_value - delay)); | |
161 EXPECT_EQ(reference_block, output_block); | |
162 } | |
163 } | |
164 } | |
165 } | |
166 } | |
167 } | |
168 | |
169 // Verifies that no blocks present in the buffer are lost when the buffer is | |
170 // overflowed. | |
171 TEST(RenderDelayBuffer, BufferOverflowBitexactness) { | |
172 for (auto rate : {8000, 16000, 32000, 48000}) { | |
173 SCOPED_TRACE(ProduceDebugText(rate)); | |
174 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | |
175 20, NumBandsForRate(rate), kMaxApiCallJitter)); | |
176 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | |
177 std::vector<std::vector<float>> block_to_insert( | |
178 NumBandsForRate(rate), std::vector<float>(kBlockSize, k)); | |
179 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); | |
180 } | |
181 | |
182 std::vector<std::vector<float>> block_to_insert( | |
183 NumBandsForRate(rate), | |
184 std::vector<float>(kBlockSize, kMaxApiCallJitter + 1)); | |
185 auto block_to_insert_copy = block_to_insert; | |
186 EXPECT_FALSE(delay_buffer->Insert(&block_to_insert)); | |
187 EXPECT_EQ(block_to_insert_copy, block_to_insert); | |
188 | |
189 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | |
190 std::vector<std::vector<float>> reference_block( | |
191 NumBandsForRate(rate), std::vector<float>(kBlockSize, k)); | |
192 ASSERT_TRUE(delay_buffer->IsBlockAvailable()); | |
193 const std::vector<std::vector<float>>& output_block = | |
194 delay_buffer->GetNext(); | |
195 EXPECT_EQ(reference_block, output_block); | |
196 } | |
197 EXPECT_FALSE(delay_buffer->IsBlockAvailable()); | |
198 } | |
199 } | |
200 | |
201 // Verifies that the buffer overflow is correctly reported. | 35 // Verifies that the buffer overflow is correctly reported. |
202 TEST(RenderDelayBuffer, BufferOverflow) { | 36 TEST(RenderDelayBuffer, BufferOverflow) { |
203 for (auto rate : {8000, 16000, 32000, 48000}) { | 37 for (auto rate : {8000, 16000, 32000, 48000}) { |
204 SCOPED_TRACE(ProduceDebugText(rate)); | 38 SCOPED_TRACE(ProduceDebugText(rate)); |
205 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | 39 std::unique_ptr<RenderDelayBuffer> delay_buffer( |
206 20, NumBandsForRate(rate), kMaxApiCallJitter)); | 40 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
207 std::vector<std::vector<float>> block_to_insert( | 41 std::vector<std::vector<float>> block_to_insert( |
208 NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); | 42 NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
209 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | 43 for (size_t k = 0; k < kMaxApiCallsJitterBlocks; ++k) { |
210 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); | 44 EXPECT_TRUE(delay_buffer->Insert(&block_to_insert)); |
211 } | 45 } |
212 EXPECT_FALSE(delay_buffer->Insert(&block_to_insert)); | 46 EXPECT_FALSE(delay_buffer->Insert(&block_to_insert)); |
213 } | 47 } |
214 } | 48 } |
215 | 49 |
216 // Verifies that the check for available block works. | 50 // Verifies that the check for available block works. |
217 TEST(RenderDelayBuffer, AvailableBlock) { | 51 TEST(RenderDelayBuffer, AvailableBlock) { |
218 constexpr size_t kNumBands = 1; | 52 constexpr size_t kNumBands = 1; |
219 std::unique_ptr<RenderDelayBuffer> delay_buffer( | 53 std::unique_ptr<RenderDelayBuffer> delay_buffer( |
220 RenderDelayBuffer::Create(20, kNumBands, kMaxApiCallJitter)); | 54 RenderDelayBuffer::Create(kNumBands)); |
221 EXPECT_FALSE(delay_buffer->IsBlockAvailable()); | |
222 std::vector<std::vector<float>> input_block( | 55 std::vector<std::vector<float>> input_block( |
223 kNumBands, std::vector<float>(kBlockSize, 1.f)); | 56 kNumBands, std::vector<float>(kBlockSize, 1.f)); |
224 EXPECT_TRUE(delay_buffer->Insert(&input_block)); | 57 EXPECT_TRUE(delay_buffer->Insert(&input_block)); |
225 ASSERT_TRUE(delay_buffer->IsBlockAvailable()); | 58 delay_buffer->UpdateBuffers(); |
226 delay_buffer->GetNext(); | |
227 EXPECT_FALSE(delay_buffer->IsBlockAvailable()); | |
228 } | |
229 | |
230 // Verifies that the maximum delay is computed correctly. | |
231 TEST(RenderDelayBuffer, MaxDelay) { | |
232 for (size_t max_delay = 1; max_delay < 20; ++max_delay) { | |
233 std::unique_ptr<RenderDelayBuffer> delay_buffer( | |
234 RenderDelayBuffer::Create(max_delay, 1, kMaxApiCallJitter)); | |
235 EXPECT_EQ(max_delay, delay_buffer->MaxDelay()); | |
236 } | |
237 } | 59 } |
238 | 60 |
239 // Verifies the SetDelay method. | 61 // Verifies the SetDelay method. |
240 TEST(RenderDelayBuffer, SetDelay) { | 62 TEST(RenderDelayBuffer, SetDelay) { |
241 std::unique_ptr<RenderDelayBuffer> delay_buffer( | 63 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create(1)); |
242 RenderDelayBuffer::Create(20, 1, kMaxApiCallJitter)); | |
243 EXPECT_EQ(0u, delay_buffer->Delay()); | 64 EXPECT_EQ(0u, delay_buffer->Delay()); |
244 for (size_t delay = 0; delay < 20; ++delay) { | 65 for (size_t delay = 0; delay < 20; ++delay) { |
245 delay_buffer->SetDelay(delay); | 66 delay_buffer->SetDelay(delay); |
246 EXPECT_EQ(delay, delay_buffer->Delay()); | 67 EXPECT_EQ(delay, delay_buffer->Delay()); |
247 } | 68 } |
248 } | 69 } |
249 | 70 |
250 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 71 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
251 | 72 |
252 // Verifies the check for null insert. | 73 // Verifies the check for null insert. |
253 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH | 74 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH |
254 // tests on test bots has been fixed. | 75 // tests on test bots has been fixed. |
255 TEST(RenderDelayBuffer, DISABLED_NullPointerInInsert) { | 76 TEST(RenderDelayBuffer, DISABLED_NullPointerInInsert) { |
256 std::unique_ptr<RenderDelayBuffer> delay_buffer( | 77 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create(3)); |
257 RenderDelayBuffer::Create(20, 1, kMaxApiCallJitter)); | |
258 EXPECT_DEATH(delay_buffer->Insert(nullptr), ""); | 78 EXPECT_DEATH(delay_buffer->Insert(nullptr), ""); |
259 } | 79 } |
260 | 80 |
261 // Verifies the check for feasible delay. | 81 // Verifies the check for feasible delay. |
262 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH | 82 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH |
263 // tests on test bots has been fixed. | 83 // tests on test bots has been fixed. |
264 TEST(RenderDelayBuffer, DISABLED_WrongDelay) { | 84 TEST(RenderDelayBuffer, DISABLED_WrongDelay) { |
265 std::unique_ptr<RenderDelayBuffer> delay_buffer( | 85 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create(3)); |
266 RenderDelayBuffer::Create(20, 1, kMaxApiCallJitter)); | |
267 EXPECT_DEATH(delay_buffer->SetDelay(21), ""); | 86 EXPECT_DEATH(delay_buffer->SetDelay(21), ""); |
268 } | 87 } |
269 | 88 |
270 // Verifies the check for the number of bands in the inserted blocks. | 89 // Verifies the check for the number of bands in the inserted blocks. |
271 TEST(RenderDelayBuffer, WrongNumberOfBands) { | 90 TEST(RenderDelayBuffer, WrongNumberOfBands) { |
272 for (auto rate : {16000, 32000, 48000}) { | 91 for (auto rate : {16000, 32000, 48000}) { |
273 SCOPED_TRACE(ProduceDebugText(rate)); | 92 SCOPED_TRACE(ProduceDebugText(rate)); |
274 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | 93 std::unique_ptr<RenderDelayBuffer> delay_buffer( |
275 20, NumBandsForRate(rate), kMaxApiCallJitter)); | 94 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
276 std::vector<std::vector<float>> block_to_insert( | 95 std::vector<std::vector<float>> block_to_insert( |
277 NumBandsForRate(rate < 48000 ? rate + 16000 : 16000), | 96 NumBandsForRate(rate < 48000 ? rate + 16000 : 16000), |
278 std::vector<float>(kBlockSize, 0.f)); | 97 std::vector<float>(kBlockSize, 0.f)); |
279 EXPECT_DEATH(delay_buffer->Insert(&block_to_insert), ""); | 98 EXPECT_DEATH(delay_buffer->Insert(&block_to_insert), ""); |
280 } | 99 } |
281 } | 100 } |
282 | 101 |
283 // Verifies the check of the length of the inserted blocks. | 102 // Verifies the check of the length of the inserted blocks. |
284 TEST(RenderDelayBuffer, WrongBlockLength) { | 103 TEST(RenderDelayBuffer, WrongBlockLength) { |
285 for (auto rate : {8000, 16000, 32000, 48000}) { | 104 for (auto rate : {8000, 16000, 32000, 48000}) { |
286 SCOPED_TRACE(ProduceDebugText(rate)); | 105 SCOPED_TRACE(ProduceDebugText(rate)); |
287 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | 106 std::unique_ptr<RenderDelayBuffer> delay_buffer( |
288 20, NumBandsForRate(rate), kMaxApiCallJitter)); | 107 RenderDelayBuffer::Create(3)); |
289 std::vector<std::vector<float>> block_to_insert( | 108 std::vector<std::vector<float>> block_to_insert( |
290 NumBandsForRate(rate), std::vector<float>(kBlockSize - 1, 0.f)); | 109 NumBandsForRate(rate), std::vector<float>(kBlockSize - 1, 0.f)); |
291 EXPECT_DEATH(delay_buffer->Insert(&block_to_insert), ""); | 110 EXPECT_DEATH(delay_buffer->Insert(&block_to_insert), ""); |
292 } | 111 } |
293 } | 112 } |
294 | 113 |
295 // Verifies the behavior when getting a block from an empty buffer. | |
296 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH | |
297 // tests on test bots has been fixed. | |
298 TEST(RenderDelayBuffer, DISABLED_GetNextWithNoAvailableBlockVariant1) { | |
299 std::unique_ptr<RenderDelayBuffer> delay_buffer( | |
300 RenderDelayBuffer::Create(20, 1, kMaxApiCallJitter)); | |
301 EXPECT_DEATH(delay_buffer->GetNext(), ""); | |
302 } | |
303 | |
304 // Verifies the behavior when getting a block from an empty buffer. | |
305 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH | |
306 // tests on test bots has been fixed. | |
307 TEST(RenderDelayBuffer, DISABLED_GetNextWithNoAvailableBlockVariant2) { | |
308 std::unique_ptr<RenderDelayBuffer> delay_buffer( | |
309 RenderDelayBuffer::Create(20, 1, kMaxApiCallJitter)); | |
310 std::vector<std::vector<float>> input_block( | |
311 1, std::vector<float>(kBlockSize, 1.f)); | |
312 EXPECT_TRUE(delay_buffer->Insert(&input_block)); | |
313 delay_buffer->GetNext(); | |
314 EXPECT_DEATH(delay_buffer->GetNext(), ""); | |
315 } | |
316 | |
317 #endif | 114 #endif |
318 | 115 |
319 } // namespace webrtc | 116 } // namespace webrtc |
OLD | NEW |