Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: webrtc/modules/audio_processing/aec3/render_delay_controller_unittest.cc

Issue 2611223003: Adding second layer of the echo canceller 3 functionality. (Closed)
Patch Set: Disabled DEATH tests that were causing memory leakage reports on test bots Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2017 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 "webrtc/modules/audio_processing/aec3/render_delay_controller.h"
12
13 #include <algorithm>
14 #include <memory>
15 #include <sstream>
16 #include <string>
17 #include <vector>
18
19 #include "webrtc/base/random.h"
20 #include "webrtc/modules/audio_processing/aec3/aec3_constants.h"
21 #include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
22 #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
23 #include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
24 #include "webrtc/test/gtest.h"
25
26 namespace webrtc {
27 namespace {
28
29 std::string ProduceDebugText(int sample_rate_hz) {
30 std::ostringstream ss;
31 ss << "Sample rate: " << sample_rate_hz;
32 return ss.str();
33 }
34
35 std::string ProduceDebugText(int sample_rate_hz, size_t delay) {
36 std::ostringstream ss(ProduceDebugText(sample_rate_hz));
37 ss << ", Delay: " << delay;
38 return ss.str();
39 }
40
41 std::string ProduceDebugText(int sample_rate_hz,
42 size_t delay,
43 size_t max_jitter) {
44 std::ostringstream ss(ProduceDebugText(sample_rate_hz, delay));
45 ss << ", Max Api call jitter: " << max_jitter;
46 return ss.str();
47 }
48
49 constexpr size_t kMaxApiCallJitter = 30;
50
51 } // namespace
52
53 // Verifies the output of GetDelay when there are no AnalyzeRender calls.
54 TEST(RenderDelayController, NoRenderSignal) {
55 std::vector<float> block(kBlockSize, 0.f);
56 for (auto rate : {8000, 16000, 32000, 48000}) {
57 SCOPED_TRACE(ProduceDebugText(rate));
58 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create(
59 250, NumBandsForRate(rate), kMaxApiCallJitter));
60 std::unique_ptr<RenderDelayController> delay_controller(
61 RenderDelayController::Create(rate, *delay_buffer));
62 for (size_t k = 0; k < 100; ++k) {
63 EXPECT_EQ(0u, delay_controller->GetDelay(block));
64 }
65 }
66 }
67
68 // Verifies the behavior when there are too many AnalyzeRender calls.
69 TEST(RenderDelayController, RenderOverflow) {
70 std::vector<float> block(kBlockSize, 0.f);
71 for (auto rate : {8000, 16000, 32000, 48000}) {
72 SCOPED_TRACE(ProduceDebugText(rate));
73 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create(
74 250, NumBandsForRate(rate), kMaxApiCallJitter));
75 std::unique_ptr<RenderDelayController> delay_controller(
76 RenderDelayController::Create(rate, *delay_buffer));
77 for (size_t k = 0; k < kMaxApiCallJitter; ++k) {
78 EXPECT_TRUE(delay_controller->AnalyzeRender(block));
79 }
80 EXPECT_FALSE(delay_controller->AnalyzeRender(block));
81 delay_controller->GetDelay(block);
82 EXPECT_TRUE(delay_controller->AnalyzeRender(block));
83 }
84 }
85
86 // Verifies the basic API call sequence.
87 TEST(RenderDelayController, BasicApiCalls) {
88 std::vector<float> render_block(kBlockSize, 0.f);
89 std::vector<float> capture_block(kBlockSize, 0.f);
90 size_t delay_blocks = 0;
91 for (auto rate : {8000, 16000, 32000, 48000}) {
92 std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
93 RenderDelayBuffer::Create(50, NumBandsForRate(rate),
94 kMaxApiCallJitter));
95 std::unique_ptr<RenderDelayController> delay_controller(
96 RenderDelayController::Create(rate, *render_delay_buffer));
97 for (size_t k = 0; k < 10; ++k) {
98 EXPECT_TRUE(delay_controller->AnalyzeRender(render_block));
99 delay_blocks = delay_controller->GetDelay(capture_block);
100 }
101 EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
102 EXPECT_EQ(0u, delay_blocks);
103 }
104 }
105
106 // Verifies that the RenderDelayController is able to align the signals for
107 // simple timeshifts between the signals.
108 // TODO(peah): Activate the unittest once the required code has been landed.
109 TEST(RenderDelayController, DISABLED_Alignment) {
110 Random random_generator(42U);
111 std::vector<float> render_block(kBlockSize, 0.f);
112 std::vector<float> capture_block(kBlockSize, 0.f);
113 size_t delay_blocks = 0;
114 for (auto rate : {8000, 16000, 32000, 48000}) {
115 for (size_t delay_samples : {0, 50, 150, 200, 800, 4000}) {
116 SCOPED_TRACE(ProduceDebugText(rate, delay_samples));
117 std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
118 RenderDelayBuffer::Create(250, NumBandsForRate(rate),
119 kMaxApiCallJitter));
120 std::unique_ptr<RenderDelayController> delay_controller(
121 RenderDelayController::Create(rate, *render_delay_buffer));
122 DelayBuffer<float> signal_delay_buffer(delay_samples);
123 for (size_t k = 0; k < (300 + delay_samples / kBlockSize); ++k) {
124 RandomizeSampleVector(&random_generator, render_block);
125 signal_delay_buffer.Delay(render_block, capture_block);
126 EXPECT_TRUE(delay_controller->AnalyzeRender(render_block));
127 delay_blocks = delay_controller->GetDelay(capture_block);
128 }
129
130 constexpr int kDelayHeadroomBlocks = 1;
131 size_t expected_delay_blocks =
132 std::max(0, static_cast<int>(delay_samples / kBlockSize) -
133 kDelayHeadroomBlocks);
134 if (expected_delay_blocks < 2) {
135 expected_delay_blocks = 0;
136 }
137
138 EXPECT_EQ(expected_delay_blocks, delay_blocks);
139
140 const rtc::Optional<size_t> headroom_samples =
141 delay_controller->AlignmentHeadroomSamples();
142 ASSERT_TRUE(headroom_samples);
143 EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize, *headroom_samples,
144 4);
145 }
146 }
147 }
148
149 // Verifies that the RenderDelayController is able to align the signals for
150 // simple timeshifts between the signals when there is jitter in the API calls.
151 // TODO(peah): Activate the unittest once the required code has been landed.
152 TEST(RenderDelayController, DISABLED_AlignmentWithJitter) {
153 Random random_generator(42U);
154 std::vector<float> render_block(kBlockSize, 0.f);
155 std::vector<float> capture_block(kBlockSize, 0.f);
156 for (auto rate : {8000, 16000, 32000, 48000}) {
157 for (size_t delay_samples : {0, 50, 800}) {
158 for (size_t max_jitter : {1, 9, 20}) {
159 size_t delay_blocks = 0;
160 SCOPED_TRACE(ProduceDebugText(rate, delay_samples, max_jitter));
161 std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
162 RenderDelayBuffer::Create(250, NumBandsForRate(rate), max_jitter));
163 std::unique_ptr<RenderDelayController> delay_controller(
164 RenderDelayController::Create(rate, *render_delay_buffer));
165 DelayBuffer<float> signal_delay_buffer(delay_samples);
166 for (size_t j = 0;
167 j < (300 + delay_samples / kBlockSize) / max_jitter + 1; ++j) {
168 std::vector<std::vector<float>> capture_block_buffer;
169 for (size_t k = 0; k < max_jitter; ++k) {
170 RandomizeSampleVector(&random_generator, render_block);
171 signal_delay_buffer.Delay(render_block, capture_block);
172 capture_block_buffer.push_back(capture_block);
173 EXPECT_TRUE(delay_controller->AnalyzeRender(render_block));
174 }
175 for (size_t k = 0; k < max_jitter; ++k) {
176 delay_blocks = delay_controller->GetDelay(capture_block_buffer[k]);
177 }
178 }
179
180 constexpr int kDelayHeadroomBlocks = 1;
181 size_t expected_delay_blocks =
182 std::max(0, static_cast<int>(delay_samples / kBlockSize) -
183 kDelayHeadroomBlocks);
184 if (expected_delay_blocks < 2) {
185 expected_delay_blocks = 0;
186 }
187
188 EXPECT_EQ(expected_delay_blocks, delay_blocks);
189
190 const rtc::Optional<size_t> headroom_samples =
191 delay_controller->AlignmentHeadroomSamples();
192 ASSERT_TRUE(headroom_samples);
193 EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize,
194 *headroom_samples, 4);
195 }
196 }
197 }
198 }
199
200 // Verifies the initial value for the AlignmentHeadroomSamples.
201 TEST(RenderDelayController, InitialHeadroom) {
202 std::vector<float> render_block(kBlockSize, 0.f);
203 std::vector<float> capture_block(kBlockSize, 0.f);
204 for (auto rate : {8000, 16000, 32000, 48000}) {
205 SCOPED_TRACE(ProduceDebugText(rate));
206 std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
207 RenderDelayBuffer::Create(250, NumBandsForRate(rate),
208 kMaxApiCallJitter));
209 std::unique_ptr<RenderDelayController> delay_controller(
210 RenderDelayController::Create(rate, *render_delay_buffer));
211 EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
212 }
213 }
214
215 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
216
217 // Verifies the check for the capture signal block size.
218 TEST(RenderDelayController, WrongCaptureSize) {
219 std::vector<float> block(kBlockSize - 1, 0.f);
220 for (auto rate : {8000, 16000, 32000, 48000}) {
221 SCOPED_TRACE(ProduceDebugText(rate));
222 std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
223 RenderDelayBuffer::Create(250, NumBandsForRate(rate),
224 kMaxApiCallJitter));
225 EXPECT_DEATH(std::unique_ptr<RenderDelayController>(
226 RenderDelayController::Create(rate, *render_delay_buffer))
227 ->GetDelay(block),
228 "");
229 }
230 }
231
232 // Verifies the check for the render signal block size.
233 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
234 // tests on test bots has been fixed.
235 TEST(RenderDelayController, DISABLED_WrongRenderSize) {
236 std::vector<float> block(kBlockSize - 1, 0.f);
237 for (auto rate : {8000, 16000, 32000, 48000}) {
238 SCOPED_TRACE(ProduceDebugText(rate));
239 std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
240 RenderDelayBuffer::Create(250, NumBandsForRate(rate),
241 kMaxApiCallJitter));
242 EXPECT_DEATH(std::unique_ptr<RenderDelayController>(
243 RenderDelayController::Create(rate, *render_delay_buffer))
244 ->AnalyzeRender(block),
245 "");
246 }
247 }
248
249 // Verifies the check for correct sample rate.
250 TEST(RenderDelayController, WrongSampleRate) {
251 for (auto rate : {-1, 0, 8001, 16001}) {
252 SCOPED_TRACE(ProduceDebugText(rate));
253 std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
254 RenderDelayBuffer::Create(10, NumBandsForRate(rate),
255 kMaxApiCallJitter));
256 EXPECT_DEATH(std::unique_ptr<RenderDelayController>(
257 RenderDelayController::Create(rate, *render_delay_buffer)),
258 "");
259 }
260 }
261
262 #endif
263
264 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698