From b9fc6508c00ac6d453e4d7c472abe174f07258ba Mon Sep 17 00:00:00 2001 From: Gustaf Ullberg Date: Mon, 21 May 2018 15:50:22 +0200 Subject: [PATCH] Add min and max allowed bitrate in Opus bitrate tests Instead of checking for an exact bitrate check that the bitrate is between the min and max values. Also relax a threshold in a bandwith adaptation test. Bug: webrtc:9280 Change-Id: I465d785a53759f73242198ee1ccd7da1a26c48b7 Reviewed-on: https://webrtc-review.googlesource.com/78041 Commit-Queue: Gustaf Ullberg Reviewed-by: Henrik Lundin Cr-Commit-Position: refs/heads/master@{#23330} --- .../acm2/audio_coding_module_unittest.cc | 70 ++++++------------- .../codecs/opus/opus_bandwidth_unittest.cc | 2 +- 2 files changed, 24 insertions(+), 48 deletions(-) diff --git a/modules/audio_coding/acm2/audio_coding_module_unittest.cc b/modules/audio_coding/acm2/audio_coding_module_unittest.cc index 1664b26e90..239e7eba03 100644 --- a/modules/audio_coding/acm2/audio_coding_module_unittest.cc +++ b/modules/audio_coding/acm2/audio_coding_module_unittest.cc @@ -1591,13 +1591,14 @@ class AcmSetBitRateTest : public ::testing::Test { return send_test_->RegisterExternalCodec(external_speech_encoder); } - void RunInner(int expected_total_bits) { + void RunInner(int min_expected_total_bits, int max_expected_total_bits) { int nr_bytes = 0; while (std::unique_ptr next_packet = send_test_->NextPacket()) { nr_bytes += rtc::checked_cast(next_packet->payload_length_bytes()); } - EXPECT_EQ(expected_total_bits, nr_bytes * 8); + EXPECT_LE(min_expected_total_bits, nr_bytes * 8); + EXPECT_GE(max_expected_total_bits, nr_bytes * 8); } void SetUpTest(const char* codec_name, @@ -1620,10 +1621,12 @@ class AcmSetBitRateOldApi : public AcmSetBitRateTest { protected: // Runs the test. SetUpSender() must have been called and a codec must be set // up before calling this method. - void Run(int target_bitrate_bps, int expected_total_bits) { + void Run(int target_bitrate_bps, + int min_expected_total_bits, + int max_expected_total_bits) { ASSERT_TRUE(send_test_->acm()); send_test_->acm()->SetBitRate(target_bitrate_bps); - RunInner(expected_total_bits); + RunInner(min_expected_total_bits, max_expected_total_bits); } }; @@ -1631,16 +1634,14 @@ class AcmSetBitRateNewApi : public AcmSetBitRateTest { protected: // Runs the test. SetUpSender() must have been called and a codec must be set // up before calling this method. - void Run(int expected_total_bits) { RunInner(expected_total_bits); } + void Run(int min_expected_total_bits, int max_expected_total_bits) { + RunInner(min_expected_total_bits, max_expected_total_bits); + } }; TEST_F(AcmSetBitRateOldApi, Opus_48khz_20ms_10kbps) { ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960)); -#if defined(WEBRTC_ANDROID) - Run(10000, 8640); -#else - Run(10000, 8696); -#endif // WEBRTC_ANDROID + Run(10000, 8000, 12000); } TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_10kbps) { @@ -1649,20 +1650,12 @@ TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_10kbps) { const auto encoder = AudioEncoderOpus::MakeAudioEncoder(*config, 107); ASSERT_TRUE(SetUpSender()); ASSERT_TRUE(RegisterExternalSendCodec(encoder.get(), 107)); -#if defined(WEBRTC_ANDROID) - RunInner(8640); -#else - RunInner(8696); -#endif // WEBRTC_ANDROID + RunInner(8000, 12000); } TEST_F(AcmSetBitRateOldApi, Opus_48khz_20ms_50kbps) { ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960)); -#if defined(WEBRTC_ANDROID) - Run(50000, 45792); -#else - Run(50000, 45600); -#endif // WEBRTC_ANDROID + Run(50000, 40000, 60000); } TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_50kbps) { @@ -1671,11 +1664,7 @@ TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_50kbps) { const auto encoder = AudioEncoderOpus::MakeAudioEncoder(*config, 107); ASSERT_TRUE(SetUpSender()); ASSERT_TRUE(RegisterExternalSendCodec(encoder.get(), 107)); -#if defined(WEBRTC_ANDROID) - RunInner(45792); -#else - RunInner(45600); -#endif // WEBRTC_ANDROID + RunInner(40000, 60000); } // The result on the Android platforms is inconsistent for this test case. @@ -1691,7 +1680,7 @@ TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_50kbps) { #endif TEST_F(AcmSetBitRateOldApi, MAYBE_Opus_48khz_20ms_100kbps) { ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960)); - Run(100000, 100832); + Run(100000, 80000, 120000); } TEST_F(AcmSetBitRateNewApi, MAYBE_OpusFromFormat_48khz_20ms_100kbps) { @@ -1700,18 +1689,18 @@ TEST_F(AcmSetBitRateNewApi, MAYBE_OpusFromFormat_48khz_20ms_100kbps) { const auto encoder = AudioEncoderOpus::MakeAudioEncoder(*config, 107); ASSERT_TRUE(SetUpSender()); ASSERT_TRUE(RegisterExternalSendCodec(encoder.get(), 107)); - RunInner(100832); + RunInner(80000, 120000); } // These next 2 tests ensure that the SetBitRate function has no effect on PCM TEST_F(AcmSetBitRateOldApi, Pcm16_8khz_10ms_8kbps) { ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 1, 107, 80, 80)); - Run(8000, 128000); + Run(8000, 128000, 128000); } TEST_F(AcmSetBitRateOldApi, Pcm16_8khz_10ms_32kbps) { ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 1, 107, 80, 80)); - Run(32000, 128000); + Run(32000, 128000, 128000); } // This test is for verifying the SetBitRate function. The bitrate is changed @@ -1758,8 +1747,11 @@ class AcmChangeBitRateOldApi : public AcmSetBitRateOldApi { next_packet->payload_length_bytes()); packet_counter++; } - EXPECT_EQ(expected_before_switch_bits, nr_bytes_before * 8); - EXPECT_EQ(expected_after_switch_bits, nr_bytes_after * 8); + // Check that bitrate is 80-120 percent of expected value. + EXPECT_GE(expected_before_switch_bits, nr_bytes_before * 8 * 8 / 10); + EXPECT_LE(expected_before_switch_bits, nr_bytes_before * 8 * 12 / 10); + EXPECT_GE(expected_after_switch_bits, nr_bytes_after * 8 * 8 / 10); + EXPECT_LE(expected_after_switch_bits, nr_bytes_after * 8 * 12 / 10); } uint32_t sampling_freq_hz_; @@ -1768,33 +1760,17 @@ class AcmChangeBitRateOldApi : public AcmSetBitRateOldApi { TEST_F(AcmChangeBitRateOldApi, Opus_48khz_20ms_10kbps_2) { ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960)); -#if defined(WEBRTC_ANDROID) - Run(10000, 29512, 4800); -#else Run(10000, 32200, 5208); -#endif // WEBRTC_ANDROID } TEST_F(AcmChangeBitRateOldApi, Opus_48khz_20ms_50kbps_2) { ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960)); -#if defined(WEBRTC_ANDROID) - Run(50000, 29512, 23304); -#else Run(50000, 32200, 23928); -#endif // WEBRTC_ANDROID } TEST_F(AcmChangeBitRateOldApi, Opus_48khz_20ms_100kbps_2) { ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960)); -#if defined(WEBRTC_ANDROID) - #if defined(WEBRTC_ARCH_ARM64) - Run(100000, 29512, 50440); - #else - Run(100000, 29512, 50496); - #endif // WEBRTC_ARCH_ARM64 -#else Run(100000, 32200, 50448); -#endif // WEBRTC_ANDROID } // These next 2 tests ensure that the SetBitRate function has no effect on PCM diff --git a/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc b/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc index 4394949f96..3c4cb02536 100644 --- a/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc +++ b/modules/audio_coding/codecs/opus/opus_bandwidth_unittest.cc @@ -105,7 +105,7 @@ TEST(BandwidthAdaptationTest, BandwidthAdaptationTest) { test::ScopedFieldTrials override_field_trials( "WebRTC-AdjustOpusBandwidth/Enabled/"); - constexpr float kMaxNarrowbandRatio = 0.003f; + constexpr float kMaxNarrowbandRatio = 0.0035f; constexpr float kMinWidebandRatio = 0.03f; // Create encoder.