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

Side by Side Diff: webrtc/modules/audio_processing/aec3/echo_canceller3_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
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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 10 matching lines...) Expand all
21 #include "webrtc/modules/audio_processing/aec3/block_processor.h" 21 #include "webrtc/modules/audio_processing/aec3/block_processor.h"
22 #include "webrtc/modules/audio_processing/aec3/frame_blocker.h" 22 #include "webrtc/modules/audio_processing/aec3/frame_blocker.h"
23 #include "webrtc/modules/audio_processing/aec3/mock/mock_block_processor.h" 23 #include "webrtc/modules/audio_processing/aec3/mock/mock_block_processor.h"
24 #include "webrtc/modules/audio_processing/audio_buffer.h" 24 #include "webrtc/modules/audio_processing/audio_buffer.h"
25 #include "webrtc/test/gmock.h" 25 #include "webrtc/test/gmock.h"
26 #include "webrtc/test/gtest.h" 26 #include "webrtc/test/gtest.h"
27 27
28 namespace webrtc { 28 namespace webrtc {
29 namespace { 29 namespace {
30 30
31 using testing::Return;
31 using testing::StrictMock; 32 using testing::StrictMock;
32 using testing::_; 33 using testing::_;
33 34
34 // Populates the frame with linearly increasing sample values for each band, 35 // Populates the frame with linearly increasing sample values for each band,
35 // with a band-specific offset, in order to allow simple bitexactness 36 // with a band-specific offset, in order to allow simple bitexactness
36 // verification for each band. 37 // verification for each band.
37 void PopulateInputFrame(size_t frame_length, 38 void PopulateInputFrame(size_t frame_length,
38 size_t num_bands, 39 size_t num_bands,
39 size_t frame_index, 40 size_t frame_index,
40 float* const* frame, 41 float* const* frame,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 } 76 }
76 77
77 // Class for testing that the capture data is properly received by the block 78 // Class for testing that the capture data is properly received by the block
78 // processor and that the processor data is properly passed to the 79 // processor and that the processor data is properly passed to the
79 // EchoCanceller3 output. 80 // EchoCanceller3 output.
80 class CaptureTransportVerificationProcessor : public BlockProcessor { 81 class CaptureTransportVerificationProcessor : public BlockProcessor {
81 public: 82 public:
82 explicit CaptureTransportVerificationProcessor(size_t num_bands) {} 83 explicit CaptureTransportVerificationProcessor(size_t num_bands) {}
83 ~CaptureTransportVerificationProcessor() override = default; 84 ~CaptureTransportVerificationProcessor() override = default;
84 85
85 void ProcessCapture(bool known_echo_path_change, 86 void ProcessCapture(bool level_change,
86 bool saturated_microphone_signal, 87 bool saturated_microphone_signal,
87 std::vector<std::vector<float>>* capture_block) override { 88 std::vector<std::vector<float>>* capture_block) override {
88 } 89 }
89 90
90 bool BufferRender(std::vector<std::vector<float>>* block) override { 91 bool BufferRender(std::vector<std::vector<float>>* block) override {
91 return false; 92 return true;
92 } 93 }
93 94
94 void ReportEchoLeakage(bool leakage_detected) override {} 95 void UpdateEchoLeakageStatus(bool leakage_detected) override {}
95 96
96 private: 97 private:
97 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(CaptureTransportVerificationProcessor); 98 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(CaptureTransportVerificationProcessor);
98 }; 99 };
99 100
100 // Class for testing that the render data is properly received by the block 101 // Class for testing that the render data is properly received by the block
101 // processor. 102 // processor.
102 class RenderTransportVerificationProcessor : public BlockProcessor { 103 class RenderTransportVerificationProcessor : public BlockProcessor {
103 public: 104 public:
104 explicit RenderTransportVerificationProcessor(size_t num_bands) {} 105 explicit RenderTransportVerificationProcessor(size_t num_bands) {}
105 ~RenderTransportVerificationProcessor() override = default; 106 ~RenderTransportVerificationProcessor() override = default;
106 107
107 void ProcessCapture(bool known_echo_path_change, 108 void ProcessCapture(bool level_change,
108 bool saturated_microphone_signal, 109 bool saturated_microphone_signal,
109 std::vector<std::vector<float>>* capture_block) override { 110 std::vector<std::vector<float>>* capture_block) override {
110 std::vector<std::vector<float>> render_block = 111 std::vector<std::vector<float>> render_block =
111 received_render_blocks_.front(); 112 received_render_blocks_.front();
112 received_render_blocks_.pop_front(); 113 received_render_blocks_.pop_front();
113 capture_block->swap(render_block); 114 capture_block->swap(render_block);
114 } 115 }
115 116
116 bool BufferRender(std::vector<std::vector<float>>* block) override { 117 bool BufferRender(std::vector<std::vector<float>>* block) override {
117 received_render_blocks_.push_back(*block); 118 received_render_blocks_.push_back(*block);
118 return false; 119 return true;
119 } 120 }
120 121
121 void ReportEchoLeakage(bool leakage_detected) override {} 122 void UpdateEchoLeakageStatus(bool leakage_detected) override {}
122 123
123 private: 124 private:
124 std::deque<std::vector<std::vector<float>>> received_render_blocks_; 125 std::deque<std::vector<std::vector<float>>> received_render_blocks_;
125 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderTransportVerificationProcessor); 126 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderTransportVerificationProcessor);
126 }; 127 };
127 128
128 class EchoCanceller3Tester { 129 class EchoCanceller3Tester {
129 public: 130 public:
130 explicit EchoCanceller3Tester(int sample_rate_hz) 131 explicit EchoCanceller3Tester(int sample_rate_hz)
131 : sample_rate_hz_(sample_rate_hz), 132 : sample_rate_hz_(sample_rate_hz),
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 const size_t num_full_blocks_per_frame = 211 const size_t num_full_blocks_per_frame =
211 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize; 212 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize;
212 const size_t expected_num_block_to_process = 213 const size_t expected_num_block_to_process =
213 (kNumFramesToProcess * 214 (kNumFramesToProcess *
214 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) / 215 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) /
215 kBlockSize; 216 kBlockSize;
216 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> 217 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>>
217 block_processor_mock( 218 block_processor_mock(
218 new StrictMock<webrtc::test::MockBlockProcessor>()); 219 new StrictMock<webrtc::test::MockBlockProcessor>());
219 EXPECT_CALL(*block_processor_mock, BufferRender(_)) 220 EXPECT_CALL(*block_processor_mock, BufferRender(_))
220 .Times(expected_num_block_to_process); 221 .Times(expected_num_block_to_process)
221 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(_)).Times(0); 222 .WillRepeatedly(Return(true));
223 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0);
222 224
223 switch (echo_path_change_test_variant) { 225 switch (echo_path_change_test_variant) {
224 case EchoPathChangeTestVariant::kNone: 226 case EchoPathChangeTestVariant::kNone:
225 EXPECT_CALL(*block_processor_mock, ProcessCapture(false, _, _)) 227 EXPECT_CALL(*block_processor_mock, ProcessCapture(false, _, _))
226 .Times(expected_num_block_to_process); 228 .Times(expected_num_block_to_process);
227 break; 229 break;
228 case EchoPathChangeTestVariant::kOneSticky: 230 case EchoPathChangeTestVariant::kOneSticky:
229 EXPECT_CALL(*block_processor_mock, ProcessCapture(true, _, _)) 231 EXPECT_CALL(*block_processor_mock, ProcessCapture(true, _, _))
230 .Times(expected_num_block_to_process); 232 .Times(expected_num_block_to_process);
231 break; 233 break;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 void RunEchoLeakageVerificationTest( 289 void RunEchoLeakageVerificationTest(
288 EchoLeakageTestVariant leakage_report_variant) { 290 EchoLeakageTestVariant leakage_report_variant) {
289 const size_t expected_num_block_to_process = 291 const size_t expected_num_block_to_process =
290 (kNumFramesToProcess * 292 (kNumFramesToProcess *
291 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) / 293 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) /
292 kBlockSize; 294 kBlockSize;
293 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> 295 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>>
294 block_processor_mock( 296 block_processor_mock(
295 new StrictMock<webrtc::test::MockBlockProcessor>()); 297 new StrictMock<webrtc::test::MockBlockProcessor>());
296 EXPECT_CALL(*block_processor_mock, BufferRender(_)) 298 EXPECT_CALL(*block_processor_mock, BufferRender(_))
297 .Times(expected_num_block_to_process); 299 .Times(expected_num_block_to_process)
300 .WillRepeatedly(Return(true));
298 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, _, _)) 301 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, _, _))
299 .Times(expected_num_block_to_process); 302 .Times(expected_num_block_to_process);
300 303
301 switch (leakage_report_variant) { 304 switch (leakage_report_variant) {
302 case EchoLeakageTestVariant::kNone: 305 case EchoLeakageTestVariant::kNone:
303 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(_)).Times(0); 306 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0);
304 break; 307 break;
305 case EchoLeakageTestVariant::kFalseSticky: 308 case EchoLeakageTestVariant::kFalseSticky:
306 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(false)).Times(1); 309 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(false))
310 .Times(1);
307 break; 311 break;
308 case EchoLeakageTestVariant::kTrueSticky: 312 case EchoLeakageTestVariant::kTrueSticky:
309 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(true)).Times(1); 313 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(true))
314 .Times(1);
310 break; 315 break;
311 case EchoLeakageTestVariant::kTrueNonSticky: { 316 case EchoLeakageTestVariant::kTrueNonSticky: {
312 testing::InSequence s; 317 testing::InSequence s;
313 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(true)).Times(1); 318 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(true))
314 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(false)) 319 .Times(1);
320 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(false))
315 .Times(kNumFramesToProcess - 1); 321 .Times(kNumFramesToProcess - 1);
316 } break; 322 } break;
317 } 323 }
318 324
319 EchoCanceller3 aec3(sample_rate_hz_, false, 325 EchoCanceller3 aec3(sample_rate_hz_, false,
320 std::move(block_processor_mock)); 326 std::move(block_processor_mock));
321 327
322 for (size_t frame_index = 0; frame_index < kNumFramesToProcess; 328 for (size_t frame_index = 0; frame_index < kNumFramesToProcess;
323 ++frame_index) { 329 ++frame_index) {
324 switch (leakage_report_variant) { 330 switch (leakage_report_variant) {
325 case EchoLeakageTestVariant::kNone: 331 case EchoLeakageTestVariant::kNone:
326 break; 332 break;
327 case EchoLeakageTestVariant::kFalseSticky: 333 case EchoLeakageTestVariant::kFalseSticky:
328 if (frame_index == 0) { 334 if (frame_index == 0) {
329 aec3.ReportEchoLeakage(false); 335 aec3.UpdateEchoLeakageStatus(false);
330 } 336 }
331 break; 337 break;
332 case EchoLeakageTestVariant::kTrueSticky: 338 case EchoLeakageTestVariant::kTrueSticky:
333 if (frame_index == 0) { 339 if (frame_index == 0) {
334 aec3.ReportEchoLeakage(true); 340 aec3.UpdateEchoLeakageStatus(true);
335 } 341 }
336 break; 342 break;
337 case EchoLeakageTestVariant::kTrueNonSticky: 343 case EchoLeakageTestVariant::kTrueNonSticky:
338 if (frame_index == 0) { 344 if (frame_index == 0) {
339 aec3.ReportEchoLeakage(true); 345 aec3.UpdateEchoLeakageStatus(true);
340 } else { 346 } else {
341 aec3.ReportEchoLeakage(false); 347 aec3.UpdateEchoLeakageStatus(false);
342 } 348 }
343 break; 349 break;
344 } 350 }
345 351
346 aec3.AnalyzeCapture(&capture_buffer_); 352 aec3.AnalyzeCapture(&capture_buffer_);
347 OptionalBandSplit(); 353 OptionalBandSplit();
348 354
349 PopulateInputFrame(frame_length_, num_bands_, frame_index, 355 PopulateInputFrame(frame_length_, num_bands_, frame_index,
350 &capture_buffer_.split_bands_f(0)[0], 0); 356 &capture_buffer_.split_bands_f(0)[0], 0);
351 PopulateInputFrame(frame_length_, num_bands_, frame_index, 357 PopulateInputFrame(frame_length_, num_bands_, frame_index,
(...skipping 22 matching lines...) Expand all
374 const size_t num_full_blocks_per_frame = 380 const size_t num_full_blocks_per_frame =
375 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize; 381 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize;
376 const size_t expected_num_block_to_process = 382 const size_t expected_num_block_to_process =
377 (kNumFramesToProcess * 383 (kNumFramesToProcess *
378 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) / 384 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) /
379 kBlockSize; 385 kBlockSize;
380 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> 386 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>>
381 block_processor_mock( 387 block_processor_mock(
382 new StrictMock<webrtc::test::MockBlockProcessor>()); 388 new StrictMock<webrtc::test::MockBlockProcessor>());
383 EXPECT_CALL(*block_processor_mock, BufferRender(_)) 389 EXPECT_CALL(*block_processor_mock, BufferRender(_))
384 .Times(expected_num_block_to_process); 390 .Times(expected_num_block_to_process)
385 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(_)).Times(0); 391 .WillRepeatedly(Return(true));
392 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0);
386 393
387 switch (saturation_variant) { 394 switch (saturation_variant) {
388 case SaturationTestVariant::kNone: 395 case SaturationTestVariant::kNone:
389 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, false, _)) 396 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, false, _))
390 .Times(expected_num_block_to_process); 397 .Times(expected_num_block_to_process);
391 break; 398 break;
392 case SaturationTestVariant::kOneNegative: { 399 case SaturationTestVariant::kOneNegative: {
393 testing::InSequence s; 400 testing::InSequence s;
394 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, true, _)) 401 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, true, _))
395 .Times(num_full_blocks_per_frame); 402 .Times(num_full_blocks_per_frame);
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 715
709 // Verifiers that the verification for null input to the capture processing api 716 // Verifiers that the verification for null input to the capture processing api
710 // call works. 717 // call works.
711 TEST(EchoCanceller3InputCheck, NullCaptureProcessingParameter) { 718 TEST(EchoCanceller3InputCheck, NullCaptureProcessingParameter) {
712 EXPECT_DEATH(EchoCanceller3(8000, false).ProcessCapture(nullptr, false), ""); 719 EXPECT_DEATH(EchoCanceller3(8000, false).ProcessCapture(nullptr, false), "");
713 } 720 }
714 721
715 #endif 722 #endif
716 723
717 } // namespace webrtc 724 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698