OLD | NEW |
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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 } | 75 } |
76 | 76 |
77 // Class for testing that the capture data is properly received by the block | 77 // 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 | 78 // processor and that the processor data is properly passed to the |
79 // EchoCanceller3 output. | 79 // EchoCanceller3 output. |
80 class CaptureTransportVerificationProcessor : public BlockProcessor { | 80 class CaptureTransportVerificationProcessor : public BlockProcessor { |
81 public: | 81 public: |
82 explicit CaptureTransportVerificationProcessor(size_t num_bands) {} | 82 explicit CaptureTransportVerificationProcessor(size_t num_bands) {} |
83 ~CaptureTransportVerificationProcessor() override = default; | 83 ~CaptureTransportVerificationProcessor() override = default; |
84 | 84 |
85 void ProcessCapture(bool known_echo_path_change, | 85 void ProcessCapture(bool level_change, |
86 bool saturated_microphone_signal, | 86 bool saturated_microphone_signal, |
87 std::vector<std::vector<float>>* capture_block) override { | 87 std::vector<std::vector<float>>* capture_block) override { |
88 } | 88 } |
89 | 89 |
90 bool BufferRender(std::vector<std::vector<float>>* block) override { | 90 bool BufferRender(std::vector<std::vector<float>>* block) override { |
91 return false; | 91 return false; |
92 } | 92 } |
93 | 93 |
94 void ReportEchoLeakage(bool leakage_detected) override {} | 94 void UpdateEchoLeakageStatus(bool leakage_detected) override {} |
95 | 95 |
96 private: | 96 private: |
97 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(CaptureTransportVerificationProcessor); | 97 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(CaptureTransportVerificationProcessor); |
98 }; | 98 }; |
99 | 99 |
100 // Class for testing that the render data is properly received by the block | 100 // Class for testing that the render data is properly received by the block |
101 // processor. | 101 // processor. |
102 class RenderTransportVerificationProcessor : public BlockProcessor { | 102 class RenderTransportVerificationProcessor : public BlockProcessor { |
103 public: | 103 public: |
104 explicit RenderTransportVerificationProcessor(size_t num_bands) {} | 104 explicit RenderTransportVerificationProcessor(size_t num_bands) {} |
105 ~RenderTransportVerificationProcessor() override = default; | 105 ~RenderTransportVerificationProcessor() override = default; |
106 | 106 |
107 void ProcessCapture(bool known_echo_path_change, | 107 void ProcessCapture(bool level_change, |
108 bool saturated_microphone_signal, | 108 bool saturated_microphone_signal, |
109 std::vector<std::vector<float>>* capture_block) override { | 109 std::vector<std::vector<float>>* capture_block) override { |
110 std::vector<std::vector<float>> render_block = | 110 std::vector<std::vector<float>> render_block = |
111 received_render_blocks_.front(); | 111 received_render_blocks_.front(); |
112 received_render_blocks_.pop_front(); | 112 received_render_blocks_.pop_front(); |
113 capture_block->swap(render_block); | 113 capture_block->swap(render_block); |
114 } | 114 } |
115 | 115 |
116 bool BufferRender(std::vector<std::vector<float>>* block) override { | 116 bool BufferRender(std::vector<std::vector<float>>* block) override { |
117 received_render_blocks_.push_back(*block); | 117 received_render_blocks_.push_back(*block); |
118 return false; | 118 return false; |
119 } | 119 } |
120 | 120 |
121 void ReportEchoLeakage(bool leakage_detected) override {} | 121 void UpdateEchoLeakageStatus(bool leakage_detected) override {} |
122 | 122 |
123 private: | 123 private: |
124 std::deque<std::vector<std::vector<float>>> received_render_blocks_; | 124 std::deque<std::vector<std::vector<float>>> received_render_blocks_; |
125 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderTransportVerificationProcessor); | 125 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderTransportVerificationProcessor); |
126 }; | 126 }; |
127 | 127 |
128 class EchoCanceller3Tester { | 128 class EchoCanceller3Tester { |
129 public: | 129 public: |
130 explicit EchoCanceller3Tester(int sample_rate_hz) | 130 explicit EchoCanceller3Tester(int sample_rate_hz) |
131 : sample_rate_hz_(sample_rate_hz), | 131 : sample_rate_hz_(sample_rate_hz), |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize; | 211 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize; |
212 const size_t expected_num_block_to_process = | 212 const size_t expected_num_block_to_process = |
213 (kNumFramesToProcess * | 213 (kNumFramesToProcess * |
214 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) / | 214 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) / |
215 kBlockSize; | 215 kBlockSize; |
216 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> | 216 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> |
217 block_processor_mock( | 217 block_processor_mock( |
218 new StrictMock<webrtc::test::MockBlockProcessor>()); | 218 new StrictMock<webrtc::test::MockBlockProcessor>()); |
219 EXPECT_CALL(*block_processor_mock, BufferRender(_)) | 219 EXPECT_CALL(*block_processor_mock, BufferRender(_)) |
220 .Times(expected_num_block_to_process); | 220 .Times(expected_num_block_to_process); |
221 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(_)).Times(0); | 221 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0); |
222 | 222 |
223 switch (echo_path_change_test_variant) { | 223 switch (echo_path_change_test_variant) { |
224 case EchoPathChangeTestVariant::kNone: | 224 case EchoPathChangeTestVariant::kNone: |
225 EXPECT_CALL(*block_processor_mock, ProcessCapture(false, _, _)) | 225 EXPECT_CALL(*block_processor_mock, ProcessCapture(false, _, _)) |
226 .Times(expected_num_block_to_process); | 226 .Times(expected_num_block_to_process); |
227 break; | 227 break; |
228 case EchoPathChangeTestVariant::kOneSticky: | 228 case EchoPathChangeTestVariant::kOneSticky: |
229 EXPECT_CALL(*block_processor_mock, ProcessCapture(true, _, _)) | 229 EXPECT_CALL(*block_processor_mock, ProcessCapture(true, _, _)) |
230 .Times(expected_num_block_to_process); | 230 .Times(expected_num_block_to_process); |
231 break; | 231 break; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> | 293 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> |
294 block_processor_mock( | 294 block_processor_mock( |
295 new StrictMock<webrtc::test::MockBlockProcessor>()); | 295 new StrictMock<webrtc::test::MockBlockProcessor>()); |
296 EXPECT_CALL(*block_processor_mock, BufferRender(_)) | 296 EXPECT_CALL(*block_processor_mock, BufferRender(_)) |
297 .Times(expected_num_block_to_process); | 297 .Times(expected_num_block_to_process); |
298 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, _, _)) | 298 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, _, _)) |
299 .Times(expected_num_block_to_process); | 299 .Times(expected_num_block_to_process); |
300 | 300 |
301 switch (leakage_report_variant) { | 301 switch (leakage_report_variant) { |
302 case EchoLeakageTestVariant::kNone: | 302 case EchoLeakageTestVariant::kNone: |
303 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(_)).Times(0); | 303 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0); |
304 break; | 304 break; |
305 case EchoLeakageTestVariant::kFalseSticky: | 305 case EchoLeakageTestVariant::kFalseSticky: |
306 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(false)).Times(1); | 306 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(false)) |
| 307 .Times(1); |
307 break; | 308 break; |
308 case EchoLeakageTestVariant::kTrueSticky: | 309 case EchoLeakageTestVariant::kTrueSticky: |
309 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(true)).Times(1); | 310 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(true)) |
| 311 .Times(1); |
310 break; | 312 break; |
311 case EchoLeakageTestVariant::kTrueNonSticky: { | 313 case EchoLeakageTestVariant::kTrueNonSticky: { |
312 testing::InSequence s; | 314 testing::InSequence s; |
313 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(true)).Times(1); | 315 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(true)) |
314 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(false)) | 316 .Times(1); |
| 317 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(false)) |
315 .Times(kNumFramesToProcess - 1); | 318 .Times(kNumFramesToProcess - 1); |
316 } break; | 319 } break; |
317 } | 320 } |
318 | 321 |
319 EchoCanceller3 aec3(sample_rate_hz_, false, | 322 EchoCanceller3 aec3(sample_rate_hz_, false, |
320 std::move(block_processor_mock)); | 323 std::move(block_processor_mock)); |
321 | 324 |
322 for (size_t frame_index = 0; frame_index < kNumFramesToProcess; | 325 for (size_t frame_index = 0; frame_index < kNumFramesToProcess; |
323 ++frame_index) { | 326 ++frame_index) { |
324 switch (leakage_report_variant) { | 327 switch (leakage_report_variant) { |
325 case EchoLeakageTestVariant::kNone: | 328 case EchoLeakageTestVariant::kNone: |
326 break; | 329 break; |
327 case EchoLeakageTestVariant::kFalseSticky: | 330 case EchoLeakageTestVariant::kFalseSticky: |
328 if (frame_index == 0) { | 331 if (frame_index == 0) { |
329 aec3.ReportEchoLeakage(false); | 332 aec3.UpdateEchoLeakageStatus(false); |
330 } | 333 } |
331 break; | 334 break; |
332 case EchoLeakageTestVariant::kTrueSticky: | 335 case EchoLeakageTestVariant::kTrueSticky: |
333 if (frame_index == 0) { | 336 if (frame_index == 0) { |
334 aec3.ReportEchoLeakage(true); | 337 aec3.UpdateEchoLeakageStatus(true); |
335 } | 338 } |
336 break; | 339 break; |
337 case EchoLeakageTestVariant::kTrueNonSticky: | 340 case EchoLeakageTestVariant::kTrueNonSticky: |
338 if (frame_index == 0) { | 341 if (frame_index == 0) { |
339 aec3.ReportEchoLeakage(true); | 342 aec3.UpdateEchoLeakageStatus(true); |
340 } else { | 343 } else { |
341 aec3.ReportEchoLeakage(false); | 344 aec3.UpdateEchoLeakageStatus(false); |
342 } | 345 } |
343 break; | 346 break; |
344 } | 347 } |
345 | 348 |
346 aec3.AnalyzeCapture(&capture_buffer_); | 349 aec3.AnalyzeCapture(&capture_buffer_); |
347 OptionalBandSplit(); | 350 OptionalBandSplit(); |
348 | 351 |
349 PopulateInputFrame(frame_length_, num_bands_, frame_index, | 352 PopulateInputFrame(frame_length_, num_bands_, frame_index, |
350 &capture_buffer_.split_bands_f(0)[0], 0); | 353 &capture_buffer_.split_bands_f(0)[0], 0); |
351 PopulateInputFrame(frame_length_, num_bands_, frame_index, | 354 PopulateInputFrame(frame_length_, num_bands_, frame_index, |
(...skipping 23 matching lines...) Expand all Loading... |
375 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize; | 378 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize; |
376 const size_t expected_num_block_to_process = | 379 const size_t expected_num_block_to_process = |
377 (kNumFramesToProcess * | 380 (kNumFramesToProcess * |
378 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) / | 381 rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) / |
379 kBlockSize; | 382 kBlockSize; |
380 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> | 383 std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>> |
381 block_processor_mock( | 384 block_processor_mock( |
382 new StrictMock<webrtc::test::MockBlockProcessor>()); | 385 new StrictMock<webrtc::test::MockBlockProcessor>()); |
383 EXPECT_CALL(*block_processor_mock, BufferRender(_)) | 386 EXPECT_CALL(*block_processor_mock, BufferRender(_)) |
384 .Times(expected_num_block_to_process); | 387 .Times(expected_num_block_to_process); |
385 EXPECT_CALL(*block_processor_mock, ReportEchoLeakage(_)).Times(0); | 388 EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0); |
386 | 389 |
387 switch (saturation_variant) { | 390 switch (saturation_variant) { |
388 case SaturationTestVariant::kNone: | 391 case SaturationTestVariant::kNone: |
389 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, false, _)) | 392 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, false, _)) |
390 .Times(expected_num_block_to_process); | 393 .Times(expected_num_block_to_process); |
391 break; | 394 break; |
392 case SaturationTestVariant::kOneNegative: { | 395 case SaturationTestVariant::kOneNegative: { |
393 testing::InSequence s; | 396 testing::InSequence s; |
394 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, true, _)) | 397 EXPECT_CALL(*block_processor_mock, ProcessCapture(_, true, _)) |
395 .Times(num_full_blocks_per_frame); | 398 .Times(num_full_blocks_per_frame); |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 | 711 |
709 // Verifiers that the verification for null input to the capture processing api | 712 // Verifiers that the verification for null input to the capture processing api |
710 // call works. | 713 // call works. |
711 TEST(EchoCanceller3InputCheck, NullCaptureProcessingParameter) { | 714 TEST(EchoCanceller3InputCheck, NullCaptureProcessingParameter) { |
712 EXPECT_DEATH(EchoCanceller3(8000, false).ProcessCapture(nullptr, false), ""); | 715 EXPECT_DEATH(EchoCanceller3(8000, false).ProcessCapture(nullptr, false), ""); |
713 } | 716 } |
714 | 717 |
715 #endif | 718 #endif |
716 | 719 |
717 } // namespace webrtc | 720 } // namespace webrtc |
OLD | NEW |