diff options
author | Erik Språng <sprang@webrtc.org> | 2020-03-24 12:00:00 +0100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-24 12:29:05 +0000 |
commit | 01611ed3ac4102dc209e50bd618dd7933e11f314 (patch) | |
tree | c40a9fdf3531d4526fc612143afaba3fa9c8eaef /media | |
parent | 5b6a4d8908f87b22132ddee4ed2bd114b524ff03 (diff) | |
download | webrtc-01611ed3ac4102dc209e50bd618dd7933e11f314.tar.gz |
Fix potential divide by zero in SimulcastEncoderAdapter
Bug: webrtc:11453
Change-Id: I4119955d7a3cdc4099b8f0ab013e5e33ec38715f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/171511
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30866}
Diffstat (limited to 'media')
-rw-r--r-- | media/engine/simulcast_encoder_adapter.cc | 3 | ||||
-rw-r--r-- | media/engine/simulcast_encoder_adapter_unittest.cc | 25 |
2 files changed, 27 insertions, 1 deletions
diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index a5454eb582..863ccc756e 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -513,7 +513,8 @@ void SimulcastEncoderAdapter::SetRates( } // Assign link allocation proportionally to spatial layer allocation. - if (parameters.bandwidth_allocation != DataRate::Zero()) { + if (!parameters.bandwidth_allocation.IsZero() && + parameters.bitrate.get_sum_bps() > 0) { stream_parameters.bandwidth_allocation = DataRate::BitsPerSec((parameters.bandwidth_allocation.bps() * stream_parameters.bitrate.get_sum_bps()) / diff --git a/media/engine/simulcast_encoder_adapter_unittest.cc b/media/engine/simulcast_encoder_adapter_unittest.cc index 14c1cd4010..b467c49166 100644 --- a/media/engine/simulcast_encoder_adapter_unittest.cc +++ b/media/engine/simulcast_encoder_adapter_unittest.cc @@ -1364,6 +1364,31 @@ TEST_F(TestSimulcastEncoderAdapterFake, SetRateDistributesBandwithAllocation) { } } +TEST_F(TestSimulcastEncoderAdapterFake, CanSetZeroBitrateWithHeadroom) { + SimulcastTestFixtureImpl::DefaultSettings( + &codec_, static_cast<const int*>(kTestTemporalLayerProfile), + kVideoCodecVP8); + codec_.numberOfSimulcastStreams = 3; + + rate_allocator_.reset(new SimulcastRateAllocator(codec_)); + EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings)); + adapter_->RegisterEncodeCompleteCallback(this); + + // Set allocated bitrate to 0, but keep (network) bandwidth allocation. + VideoEncoder::RateControlParameters rate_params; + rate_params.framerate_fps = 30; + rate_params.bandwidth_allocation = DataRate::KilobitsPerSec(600); + + adapter_->SetRates(rate_params); + + std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders(); + + ASSERT_EQ(3u, encoders.size()); + for (size_t i = 0; i < 3; ++i) { + EXPECT_EQ(0u, encoders[i]->last_set_rates().bitrate.get_sum_bps()); + } +} + TEST_F(TestSimulcastEncoderAdapterFake, SupportsSimulcast) { SimulcastTestFixtureImpl::DefaultSettings( &codec_, static_cast<const int*>(kTestTemporalLayerProfile), |