Chromium Code Reviews| 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 e8bfaf6830cca7dff72f7ef749b9b46ad8173634..89a9a40348797c47a435d512fd00a9ee30b8e553 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 |
| @@ -11,6 +11,7 @@ |
| #include <memory> |
| #include "webrtc/base/checks.h" |
| +#include "webrtc/common_audio/mocks/mock_smoothing_filter.h" |
| #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" |
| @@ -42,8 +43,10 @@ AudioEncoderOpus::Config CreateConfig(const CodecInst& codec_inst) { |
| struct AudioEncoderOpusStates { |
| std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; |
| + MockSmoothingFilter* mock_bitrate_smoother; |
| std::unique_ptr<AudioEncoderOpus> encoder; |
| std::unique_ptr<SimulatedClock> simulated_clock; |
| + AudioEncoderOpus::Config config; |
| }; |
| AudioEncoderOpusStates CreateCodec(size_t num_channels) { |
| @@ -68,11 +71,15 @@ AudioEncoderOpusStates CreateCodec(size_t num_channels) { |
| CodecInst codec_inst = kDefaultOpusSettings; |
| codec_inst.channels = num_channels; |
| - auto config = CreateConfig(codec_inst); |
| + states.config = CreateConfig(codec_inst); |
| + std::unique_ptr<MockSmoothingFilter> bitrate_smoother( |
| + new MockSmoothingFilter()); |
| + states.mock_bitrate_smoother = bitrate_smoother.get(); |
| states.simulated_clock.reset(new SimulatedClock(kInitialTimeUs)); |
| - config.clock = states.simulated_clock.get(); |
| + states.config.clock = states.simulated_clock.get(); |
| - states.encoder.reset(new AudioEncoderOpus(config, std::move(creator))); |
| + states.encoder.reset(new AudioEncoderOpus(states.config, std::move(creator), |
| + std::move(bitrate_smoother))); |
| return states; |
| } |
| @@ -159,20 +166,25 @@ TEST(AudioEncoderOpusTest, |
| const int kMinBitrateBps = 500; |
| const int kMaxBitrateBps = 512000; |
| // Set a too low bitrate. |
| - states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps - 1); |
| + states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps - 1, |
| + rtc::Optional<int64_t>()); |
| EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); |
| // Set a too high bitrate. |
| - states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps + 1); |
| + states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps + 1, |
| + rtc::Optional<int64_t>()); |
| EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); |
| // Set the minimum rate. |
| - states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps); |
| + states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps, |
| + rtc::Optional<int64_t>()); |
| EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); |
| // Set the maximum rate. |
| - states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps); |
| + states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps, |
| + rtc::Optional<int64_t>()); |
| EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); |
| // Set rates from 1000 up to 32000 bps. |
| for (int rate = 1000; rate <= 32000; rate += 1000) { |
| - states.encoder->OnReceivedTargetAudioBitrate(rate); |
| + states.encoder->OnReceivedTargetAudioBitrate(rate, |
| + rtc::Optional<int64_t>()); |
| EXPECT_EQ(rate, states.encoder->GetTargetBitrate()); |
| } |
| } |
| @@ -250,23 +262,6 @@ TEST(AudioEncoderOpusTest, SetReceiverFrameLengthRange) { |
| EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); |
| } |
| -TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { |
| - 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 bandwidth value is fine. |
| - constexpr int kUplinkBandwidth = 50000; |
| - EXPECT_CALL(**states.mock_audio_network_adaptor, |
| - SetUplinkBandwidth(kUplinkBandwidth)); |
| - states.encoder->OnReceivedUplinkBandwidth(kUplinkBandwidth); |
| - |
| - CheckEncoderRuntimeConfig(states.encoder.get(), config); |
| -} |
| - |
| TEST(AudioEncoderOpusTest, |
| InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { |
| auto states = CreateCodec(2); |
| @@ -296,9 +291,14 @@ TEST(AudioEncoderOpusTest, |
| // Since using mock audio network adaptor, any target audio bitrate is fine. |
| constexpr int kTargetAudioBitrate = 30000; |
| + constexpr int64_t kProbingIntervalMs = 3000; |
| EXPECT_CALL(**states.mock_audio_network_adaptor, |
| SetTargetAudioBitrate(kTargetAudioBitrate)); |
| - states.encoder->OnReceivedTargetAudioBitrate(kTargetAudioBitrate); |
| + EXPECT_CALL(*states.mock_bitrate_smoother, |
| + SetTimeConstantMs(kProbingIntervalMs * 4)); |
| + EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate)); |
| + states.encoder->OnReceivedTargetAudioBitrate( |
| + kTargetAudioBitrate, rtc::Optional<int64_t>(kProbingIntervalMs)); |
| CheckEncoderRuntimeConfig(states.encoder.get(), config); |
| } |
| @@ -367,7 +367,8 @@ TEST(AudioEncoderOpusTest, DoNotInvokeSetTargetBitrateIfOverheadUnknown) { |
| auto states = CreateCodec(2); |
| - states.encoder->OnReceivedTargetAudioBitrate(kDefaultOpusSettings.rate * 2); |
| + states.encoder->OnReceivedTargetAudioBitrate(kDefaultOpusSettings.rate * 2, |
| + rtc::Optional<int64_t>()); |
| // Since |OnReceivedOverhead| has not been called, the codec bitrate should |
| // not change. |
| @@ -384,7 +385,8 @@ TEST(AudioEncoderOpusTest, OverheadRemovedFromTargetAudioBitrate) { |
| states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket); |
| constexpr int kTargetBitrateBps = 40000; |
| - states.encoder->OnReceivedTargetAudioBitrate(kTargetBitrateBps); |
| + states.encoder->OnReceivedTargetAudioBitrate(kTargetBitrateBps, |
| + rtc::Optional<int64_t>()); |
| int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize); |
| EXPECT_EQ(kTargetBitrateBps - |
| @@ -410,14 +412,16 @@ TEST(AudioEncoderOpusTest, BitrateBounded) { |
| // subtracted. The eventual codec rate should be bounded by |kMinBitrateBps|. |
| int target_bitrate = |
| kOverheadBytesPerPacket * 8 * packet_rate + kMinBitrateBps - 1; |
| - states.encoder->OnReceivedTargetAudioBitrate(target_bitrate); |
| + states.encoder->OnReceivedTargetAudioBitrate(target_bitrate, |
| + rtc::Optional<int64_t>()); |
| 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); |
| + states.encoder->OnReceivedTargetAudioBitrate(target_bitrate, |
| + rtc::Optional<int64_t>()); |
| EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); |
| } |
| @@ -443,4 +447,33 @@ TEST(AudioEncoderOpusTest, ConfigComplexityAdaptation) { |
| config.bitrate_bps = rtc::Optional<int>(14001); |
| EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); |
| } |
| + |
| +TEST(AudioEncoderOpusTest, UpdateUplinkBandwithInAudioNetworkAdaptor) { |
|
minyue-webrtc
2016/12/22 14:51:27
Bandwidth
michaelt
2016/12/22 15:10:10
Done.
|
| + auto states = CreateCodec(2); |
| + states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
| + int16_t audio[480 * 2]; |
| + rtc::Buffer encoded; |
| + EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
| + .WillOnce(Return(rtc::Optional<float>(50000))); |
| + EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); |
| + states.encoder->Encode(0, rtc::ArrayView<const int16_t>(audio, 480 * 2), |
| + &encoded); |
| + |
| + // Repeat update uplink bandwidth tests. |
| + for (int i = 0; i < 5; i++) { |
| + // Don't update till its time to update again. |
|
minyue-webrtc
2016/12/22 14:51:27
its -> it is
michaelt
2016/12/22 15:10:10
Done.
|
| + states.simulated_clock->AdvanceTimeMilliseconds( |
| + states.config.update_uplink_bandwidth_interval_ms - 1); |
| + states.encoder->Encode(0, rtc::ArrayView<const int16_t>(audio, 480 * 2), |
| + &encoded); |
| + |
| + // Update when its time to update. |
|
minyue-webrtc
2016/12/22 14:51:27
its -> it is
michaelt
2016/12/22 15:10:10
Done.
|
| + EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
| + .WillOnce(Return(rtc::Optional<float>(40000))); |
| + EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); |
| + states.simulated_clock->AdvanceTimeMilliseconds(1); |
| + states.encoder->Encode(0, rtc::ArrayView<const int16_t>(audio, 480 * 2), |
| + &encoded); |
| + } |
| +} |
| } // namespace webrtc |