diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc index e56905f0c6..43ecf9dc4b 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc @@ -3569,10 +3569,18 @@ EncoderStreamFactory::CreateSimulcastOrConferenceModeScreenshareStreams( std::max(layers[i].max_bitrate_bps, layers[i].min_bitrate_bps); } else if (encoder_config.simulcast_layers[i].max_bitrate_bps > 0) { // Only max bitrate is configured, make sure min/target are below max. + // Keep target bitrate if it is set explicitly in encoding config. + // Otherwise set target bitrate to 3/4 of the max bitrate + // or the one calculated from GetSimulcastConfig() which is larger. layers[i].min_bitrate_bps = std::min(layers[i].min_bitrate_bps, layers[i].max_bitrate_bps); - layers[i].target_bitrate_bps = - std::min(layers[i].target_bitrate_bps, layers[i].max_bitrate_bps); + if (encoder_config.simulcast_layers[i].target_bitrate_bps <= 0) { + layers[i].target_bitrate_bps = std::max( + layers[i].target_bitrate_bps, layers[i].max_bitrate_bps * 3 / 4); + } + layers[i].target_bitrate_bps = std::max( + std::min(layers[i].target_bitrate_bps, layers[i].max_bitrate_bps), + layers[i].min_bitrate_bps); } if (i == layers.size() - 1) { is_highest_layer_max_bitrate_configured = diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc index 9353f19da6..ccac755134 100644 --- a/media/engine/webrtc_video_engine_unittest.cc +++ b/media/engine/webrtc_video_engine_unittest.cc @@ -10,6 +10,7 @@ #include "media/engine/webrtc_video_engine.h" +#include #include #include #include @@ -7545,10 +7546,13 @@ TEST_F(WebRtcVideoChannelTest, MinOrMaxSimulcastBitratePropagatedToEncoder) { EXPECT_EQ(kDefault[0].max_bitrate_bps, stream->GetVideoStreams()[0].max_bitrate_bps); // Layer 1: max configured bitrate should overwrite max default. + // And target bitrate should be 3/4 * max bitrate or default target + // which is larger. EXPECT_EQ(kDefault[1].min_bitrate_bps, stream->GetVideoStreams()[1].min_bitrate_bps); - EXPECT_EQ(kDefault[1].target_bitrate_bps, - stream->GetVideoStreams()[1].target_bitrate_bps); + const int kTargetBpsLayer1 = + std::max(kDefault[1].target_bitrate_bps, kMaxBpsLayer1 * 3 / 4); + EXPECT_EQ(kTargetBpsLayer1, stream->GetVideoStreams()[1].target_bitrate_bps); EXPECT_EQ(kMaxBpsLayer1, stream->GetVideoStreams()[1].max_bitrate_bps); // Layer 2: min and max bitrate not configured, default expected. EXPECT_EQ(kDefault[2].min_bitrate_bps,