diff options
Diffstat (limited to 'modules/audio_processing/aec3/multi_channel_content_detector_unittest.cc')
-rw-r--r-- | modules/audio_processing/aec3/multi_channel_content_detector_unittest.cc | 146 |
1 files changed, 119 insertions, 27 deletions
diff --git a/modules/audio_processing/aec3/multi_channel_content_detector_unittest.cc b/modules/audio_processing/aec3/multi_channel_content_detector_unittest.cc index ae2a9336ef..cb495e859f 100644 --- a/modules/audio_processing/aec3/multi_channel_content_detector_unittest.cc +++ b/modules/audio_processing/aec3/multi_channel_content_detector_unittest.cc @@ -15,23 +15,29 @@ namespace webrtc { TEST(MultiChannelContentDetector, HandlingOfMono) { - MultiChannelContentDetector mc(/*detect_stereo_content=*/true, - /*num_render_input_channels=*/1, - /*detection_threshold=*/0.0f); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/true, + /*num_render_input_channels=*/1, + /*detection_threshold=*/0.0f, + /*stereo_detection_timeout_threshold_seconds=*/0); EXPECT_FALSE(mc.IsMultiChannelContentDetected()); } TEST(MultiChannelContentDetector, HandlingOfMonoAndDetectionOff) { - MultiChannelContentDetector mc(/*detect_stereo_content=*/false, - /*num_render_input_channels=*/1, - /*detection_threshold=*/0.0f); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/false, + /*num_render_input_channels=*/1, + /*detection_threshold=*/0.0f, + /*stereo_detection_timeout_threshold_seconds=*/0); EXPECT_FALSE(mc.IsMultiChannelContentDetected()); } TEST(MultiChannelContentDetector, HandlingOfDetectionOff) { - MultiChannelContentDetector mc(/*detect_stereo_content=*/false, - /*num_render_input_channels=*/2, - /*detection_threshold=*/0.0f); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/false, + /*num_render_input_channels=*/2, + /*detection_threshold=*/0.0f, + /*stereo_detection_timeout_threshold_seconds=*/0); EXPECT_TRUE(mc.IsMultiChannelContentDetected()); std::vector<std::vector<std::vector<float>>> frame( @@ -46,16 +52,20 @@ TEST(MultiChannelContentDetector, HandlingOfDetectionOff) { } TEST(MultiChannelContentDetector, InitialDetectionOfStereo) { - MultiChannelContentDetector mc(/*detect_stereo_content=*/true, - /*num_render_input_channels=*/2, - /*detection_threshold=*/0.0f); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/true, + /*num_render_input_channels=*/2, + /*detection_threshold=*/0.0f, + /*stereo_detection_timeout_threshold_seconds=*/0); EXPECT_FALSE(mc.IsMultiChannelContentDetected()); } TEST(MultiChannelContentDetector, DetectionWhenFakeStereo) { - MultiChannelContentDetector mc(/*detect_stereo_content=*/true, - /*num_render_input_channels=*/2, - /*detection_threshold=*/0.0f); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/true, + /*num_render_input_channels=*/2, + /*detection_threshold=*/0.0f, + /*stereo_detection_timeout_threshold_seconds=*/0); std::vector<std::vector<std::vector<float>>> frame( 1, std::vector<std::vector<float>>(2, std::vector<float>(160, 0.0f))); std::fill(frame[0][0].begin(), frame[0][0].end(), 100.0f); @@ -67,9 +77,11 @@ TEST(MultiChannelContentDetector, DetectionWhenFakeStereo) { } TEST(MultiChannelContentDetector, DetectionWhenStereo) { - MultiChannelContentDetector mc(/*detect_stereo_content=*/true, - /*num_render_input_channels=*/2, - /*detection_threshold=*/0.0f); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/true, + /*num_render_input_channels=*/2, + /*detection_threshold=*/0.0f, + /*stereo_detection_timeout_threshold_seconds=*/0); std::vector<std::vector<std::vector<float>>> frame( 1, std::vector<std::vector<float>>(2, std::vector<float>(160, 0.0f))); std::fill(frame[0][0].begin(), frame[0][0].end(), 100.0f); @@ -81,9 +93,11 @@ TEST(MultiChannelContentDetector, DetectionWhenStereo) { } TEST(MultiChannelContentDetector, DetectionWhenStereoAfterAWhile) { - MultiChannelContentDetector mc(/*detect_stereo_content=*/true, - /*num_render_input_channels=*/2, - /*detection_threshold=*/0.0f); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/true, + /*num_render_input_channels=*/2, + /*detection_threshold=*/0.0f, + /*stereo_detection_timeout_threshold_seconds=*/0); std::vector<std::vector<std::vector<float>>> frame( 1, std::vector<std::vector<float>>(2, std::vector<float>(160, 0.0f))); @@ -105,9 +119,11 @@ TEST(MultiChannelContentDetector, DetectionWhenStereoAfterAWhile) { TEST(MultiChannelContentDetector, DetectionWithStereoBelowThreshold) { constexpr float kThreshold = 1.0f; - MultiChannelContentDetector mc(/*detect_stereo_content=*/true, - /*num_render_input_channels=*/2, - /*detection_threshold=*/kThreshold); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/true, + /*num_render_input_channels=*/2, + /*detection_threshold=*/kThreshold, + /*stereo_detection_timeout_threshold_seconds=*/0); std::vector<std::vector<std::vector<float>>> frame( 1, std::vector<std::vector<float>>(2, std::vector<float>(160, 0.0f))); std::fill(frame[0][0].begin(), frame[0][0].end(), 100.0f); @@ -121,9 +137,11 @@ TEST(MultiChannelContentDetector, DetectionWithStereoBelowThreshold) { TEST(MultiChannelContentDetector, DetectionWithStereoAboveThreshold) { constexpr float kThreshold = 1.0f; - MultiChannelContentDetector mc(/*detect_stereo_content=*/true, - /*num_render_input_channels=*/2, - /*detection_threshold=*/kThreshold); + MultiChannelContentDetector mc( + /*detect_stereo_content=*/true, + /*num_render_input_channels=*/2, + /*detection_threshold=*/kThreshold, + /*stereo_detection_timeout_threshold_seconds=*/0); std::vector<std::vector<std::vector<float>>> frame( 1, std::vector<std::vector<float>>(2, std::vector<float>(160, 0.0f))); std::fill(frame[0][0].begin(), frame[0][0].end(), 100.0f); @@ -135,4 +153,78 @@ TEST(MultiChannelContentDetector, DetectionWithStereoAboveThreshold) { EXPECT_FALSE(mc.UpdateDetection(frame)); } +class MultiChannelContentDetectorTimeoutBehavior + : public ::testing::Test, + public ::testing::WithParamInterface<std::tuple<bool, int>> {}; + +INSTANTIATE_TEST_SUITE_P(MultiChannelContentDetector, + MultiChannelContentDetectorTimeoutBehavior, + ::testing::Combine(::testing::Values(false, true), + ::testing::Values(0, 1, 10))); + +TEST_P(MultiChannelContentDetectorTimeoutBehavior, + TimeOutBehaviorForNonTrueStereo) { + constexpr int kNumFramesPerSecond = 100; + const bool detect_stereo_content = std::get<0>(GetParam()); + const int stereo_stereo_detection_timeout_threshold_seconds = + std::get<1>(GetParam()); + const int stereo_detection_timeout_threshold_frames = + stereo_stereo_detection_timeout_threshold_seconds * kNumFramesPerSecond; + + MultiChannelContentDetector mc( + detect_stereo_content, + /*num_render_input_channels=*/2, + /*detection_threshold=*/0.0f, + stereo_stereo_detection_timeout_threshold_seconds); + std::vector<std::vector<std::vector<float>>> true_stereo_frame = { + {std::vector<float>(160, 100.0f), std::vector<float>(160, 101.0f)}}; + + std::vector<std::vector<std::vector<float>>> fake_stereo_frame = { + {std::vector<float>(160, 100.0f), std::vector<float>(160, 100.0f)}}; + + // Pass fake stereo frames and verify the content detection. + for (int k = 0; k < 10; ++k) { + EXPECT_FALSE(mc.UpdateDetection(fake_stereo_frame)); + if (detect_stereo_content) { + EXPECT_FALSE(mc.IsMultiChannelContentDetected()); + } else { + EXPECT_TRUE(mc.IsMultiChannelContentDetected()); + } + } + + // Pass a true stereo frame and verify that it is properly detected. + if (detect_stereo_content) { + EXPECT_TRUE(mc.UpdateDetection(true_stereo_frame)); + } else { + EXPECT_FALSE(mc.UpdateDetection(true_stereo_frame)); + } + EXPECT_TRUE(mc.IsMultiChannelContentDetected()); + + // Pass fake stereo frames until any timeouts are about to occur. + for (int k = 0; k < stereo_detection_timeout_threshold_frames - 1; ++k) { + EXPECT_FALSE(mc.UpdateDetection(fake_stereo_frame)); + EXPECT_TRUE(mc.IsMultiChannelContentDetected()); + } + + // Pass a fake stereo frame and verify that any timeouts properly occur. + if (detect_stereo_content && stereo_detection_timeout_threshold_frames > 0) { + EXPECT_TRUE(mc.UpdateDetection(fake_stereo_frame)); + EXPECT_FALSE(mc.IsMultiChannelContentDetected()); + } else { + EXPECT_FALSE(mc.UpdateDetection(fake_stereo_frame)); + EXPECT_TRUE(mc.IsMultiChannelContentDetected()); + } + + // Pass fake stereo frames and verify the behavior after any timeout. + for (int k = 0; k < 10; ++k) { + EXPECT_FALSE(mc.UpdateDetection(fake_stereo_frame)); + if (detect_stereo_content && + stereo_detection_timeout_threshold_frames > 0) { + EXPECT_FALSE(mc.IsMultiChannelContentDetected()); + } else { + EXPECT_TRUE(mc.IsMultiChannelContentDetected()); + } + } +} + } // namespace webrtc |