diff --git a/webrtc/modules/congestion_controller/delay_based_bwe.cc b/webrtc/modules/congestion_controller/delay_based_bwe.cc index 685b6c290a..4b9dcca79c 100644 --- a/webrtc/modules/congestion_controller/delay_based_bwe.cc +++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc @@ -201,6 +201,18 @@ DelayBasedBwe::Result DelayBasedBwe::MaybeUpdateEstimate( rate_control_.TimeToReduceFurther(now_ms, *acked_bitrate_bps)) { result.updated = UpdateEstimate(now_ms, acked_bitrate_bps, overusing, &result.target_bitrate_bps); + } else if (!acked_bitrate_bps && rate_control_.ValidEstimate() && + rate_control_.TimeToReduceFurther( + now_ms, rate_control_.LatestEstimate() / 2 - 1)) { + // Overusing before we have a measured acknowledged bitrate. We check + // TimeToReduceFurther (with a fake acknowledged bitrate) to avoid + // reducing too often. + // TODO(tschumim): Improve this and/or the acknowledged bitrate estimator + // so that we (almost) always have a bitrate estimate. + rate_control_.SetEstimate(rate_control_.LatestEstimate() / 2, now_ms); + result.updated = true; + result.probe = false; + result.target_bitrate_bps = rate_control_.LatestEstimate(); } } else { if (probe_bitrate_bps) { diff --git a/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc b/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc index 996af46743..4b01c7eb85 100644 --- a/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc +++ b/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc @@ -194,4 +194,41 @@ TEST_F(DelayBasedBweTest, TestLongTimeoutAndWrap) { TestWrappingHelper(10 * 64); } +TEST_F(DelayBasedBweTest, TestInitialOveruse) { + const uint32_t kStartBitrate = 300e3; + const uint32_t kInitialCapacityBps = 200e3; + const uint32_t kDummySsrc = 0; + // High FPS to ensure that we send a lot of packets in a short time. + const int kFps = 90; + + stream_generator_->AddStream(new test::RtpStream(kFps, kStartBitrate)); + stream_generator_->set_capacity_bps(kInitialCapacityBps); + + // Needed to initialize the AimdRateControl. + bitrate_estimator_->SetStartBitrate(kStartBitrate); + + // Produce 30 frames (in 1/3 second) and give them to the estimator. + uint32_t bitrate_bps = kStartBitrate; + bool seen_overuse = false; + for (int i = 0; i < 30; ++i) { + bool overuse = GenerateAndProcessFrame(kDummySsrc, bitrate_bps); + // The purpose of this test is to ensure that we back down even if we don't + // have any acknowledged bitrate estimate yet. Hence, if the test works + // as expected, we should not have a measured bitrate yet. + EXPECT_FALSE(acknowledged_bitrate_estimator_->bitrate_bps().has_value()); + if (overuse) { + EXPECT_TRUE(bitrate_observer_.updated()); + EXPECT_NEAR(bitrate_observer_.latest_bitrate(), kStartBitrate / 2, 15000); + bitrate_bps = bitrate_observer_.latest_bitrate(); + seen_overuse = true; + break; + } else if (bitrate_observer_.updated()) { + bitrate_bps = bitrate_observer_.latest_bitrate(); + bitrate_observer_.Reset(); + } + } + EXPECT_TRUE(seen_overuse); + EXPECT_NEAR(bitrate_observer_.latest_bitrate(), kStartBitrate / 2, 15000); +} + } // namespace webrtc