Index: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc |
diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc |
index f07279fac7d877109ba3bef92a47c8522acb8347..9f2c3186bdf2085d0a69bbdcf643d84c5752669e 100644 |
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc |
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc |
@@ -14,6 +14,7 @@ |
#include "webrtc/common_types.h" |
#include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_audio_network_adaptor.h" |
#include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h" |
+#include "webrtc/test/field_trial.h" |
#include "webrtc/test/gmock.h" |
#include "webrtc/test/gtest.h" |
#include "webrtc/system_wrappers/include/clock.h" |
@@ -249,7 +250,7 @@ TEST(AudioEncoderOpusTest, SetReceiverFrameLengthRange) { |
EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); |
} |
-TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnSetUplinkBandwidth) { |
+TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { |
auto states = CreateCodec(2); |
states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
@@ -267,7 +268,7 @@ TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnSetUplinkBandwidth) { |
} |
TEST(AudioEncoderOpusTest, |
- InvokeAudioNetworkAdaptorOnSetUplinkPacketLossFraction) { |
+ InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { |
auto states = CreateCodec(2); |
states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
@@ -284,7 +285,8 @@ TEST(AudioEncoderOpusTest, |
CheckEncoderRuntimeConfig(states.encoder.get(), config); |
} |
-TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnSetTargetAudioBitrate) { |
+TEST(AudioEncoderOpusTest, |
+ InvokeAudioNetworkAdaptorOnReceivedTargetAudioBitrate) { |
auto states = CreateCodec(2); |
states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
@@ -301,7 +303,7 @@ TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnSetTargetAudioBitrate) { |
CheckEncoderRuntimeConfig(states.encoder.get(), config); |
} |
-TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnSetRtt) { |
+TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedRtt) { |
auto states = CreateCodec(2); |
states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
@@ -317,6 +319,22 @@ TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnSetRtt) { |
CheckEncoderRuntimeConfig(states.encoder.get(), config); |
} |
+TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) { |
+ auto states = CreateCodec(2); |
+ states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
+ |
+ auto config = CreateEncoderRuntimeConfig(); |
+ EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
+ .WillOnce(Return(config)); |
+ |
+ // Since using mock audio network adaptor, any overhead is fine. |
+ constexpr size_t kOverhead = 64; |
+ EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)); |
+ states.encoder->OnReceivedOverhead(kOverhead); |
+ |
+ CheckEncoderRuntimeConfig(states.encoder.get(), config); |
+} |
+ |
TEST(AudioEncoderOpusTest, |
PacketLossFractionSmoothedOnSetUplinkPacketLossFraction) { |
auto states = CreateCodec(2); |
@@ -343,4 +361,64 @@ TEST(AudioEncoderOpusTest, |
EXPECT_FLOAT_EQ(0.05f, states.encoder->packet_loss_rate()); |
} |
+TEST(AudioEncoderOpusTest, DoNotInvokeSetTargetBitrateIfOverheadUnknown) { |
+ test::ScopedFieldTrials override_field_trials( |
+ "WebRTC-SendSideBwe-WithOverhead/Enabled/"); |
+ |
+ auto states = CreateCodec(2); |
+ |
+ states.encoder->OnReceivedTargetAudioBitrate(kDefaultOpusSettings.rate * 2); |
+ |
+ // Since |OnReceivedOverhead| has not been called, the codec bitrate should |
+ // not change. |
+ EXPECT_EQ(kDefaultOpusSettings.rate, states.encoder->GetTargetBitrate()); |
+} |
+ |
+TEST(AudioEncoderOpusTest, OverheadRemovedFromTargetAudioBitrate) { |
+ test::ScopedFieldTrials override_field_trials( |
+ "WebRTC-SendSideBwe-WithOverhead/Enabled/"); |
+ |
+ auto states = CreateCodec(2); |
+ |
+ constexpr size_t kOverheadBytesPerPacket = 64; |
+ states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket); |
+ |
+ constexpr int kTargetBitrateBps = 40000; |
+ states.encoder->OnReceivedTargetAudioBitrate(kTargetBitrateBps); |
+ |
+ int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize); |
+ EXPECT_EQ(kTargetBitrateBps - |
+ 8 * static_cast<int>(kOverheadBytesPerPacket) * packet_rate, |
+ states.encoder->GetTargetBitrate()); |
+} |
+ |
+TEST(AudioEncoderOpusTest, BitrateBounded) { |
+ test::ScopedFieldTrials override_field_trials( |
+ "WebRTC-SendSideBwe-WithOverhead/Enabled/"); |
+ |
+ constexpr int kMinBitrateBps = 500; |
+ constexpr int kMaxBitrateBps = 512000; |
+ |
+ auto states = CreateCodec(2); |
+ |
+ constexpr size_t kOverheadBytesPerPacket = 64; |
+ states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket); |
+ |
+ int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize); |
+ |
+ // Set a target rate that is smaller than |kMinBitrateBps| when overhead is |
+ // subtracted. The eventual codec rate should be bounded by |kMinBitrateBps|. |
+ int target_bitrate = |
+ kOverheadBytesPerPacket * 8 * packet_rate + kMinBitrateBps - 1; |
+ states.encoder->OnReceivedTargetAudioBitrate(target_bitrate); |
+ EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); |
+ |
+ // Set a target rate that is greater than |kMaxBitrateBps| when overhead is |
+ // subtracted. The eventual codec rate should be bounded by |kMaxBitrateBps|. |
+ target_bitrate = |
+ kOverheadBytesPerPacket * 8 * packet_rate + kMaxBitrateBps + 1; |
+ states.encoder->OnReceivedTargetAudioBitrate(target_bitrate); |
+ EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); |
+} |
+ |
} // namespace webrtc |