diff --git a/video/encoder_bitrate_adjuster.cc b/video/encoder_bitrate_adjuster.cc index ae25527427..8743099ae3 100644 --- a/video/encoder_bitrate_adjuster.cc +++ b/video/encoder_bitrate_adjuster.cc @@ -51,7 +51,7 @@ EncoderBitrateAdjuster::EncoderBitrateAdjuster( Clock& clock) : utilize_bandwidth_headroom_(RateControlSettings(field_trials) .BitrateAdjusterCanUseNetworkHeadroom()), - use_newfangled_headroom_adjustment_(field_trials.IsEnabled( + use_newfangled_headroom_adjustment_(!field_trials.IsDisabled( "WebRTC-BitrateAdjusterUseNewfangledHeadroomAdjustment")), frames_since_layout_change_(0), min_bitrates_bps_{}, diff --git a/video/rate_utilization_tracker.cc b/video/rate_utilization_tracker.cc index 373493c1f0..9403ff13b4 100644 --- a/video/rate_utilization_tracker.cc +++ b/video/rate_utilization_tracker.cc @@ -91,7 +91,9 @@ absl::optional RateUtilizationTracker::GetRateUtilizationFactor( if (update.produced_data.IsZero()) { // Just a rate update past the last seen produced data. - data_allocated_for_last_data += allocated_since_previous_data_point; + data_allocated_for_last_data = + std::min(size_of_last_data, data_allocated_for_last_data + + allocated_since_previous_data_point); } else { // A newer data point with produced data, reset accumulator for rate // allocated past the last data point. diff --git a/video/rate_utilization_tracker_unittest.cc b/video/rate_utilization_tracker_unittest.cc index 33efbdd619..2e75d66a7b 100644 --- a/video/rate_utilization_tracker_unittest.cc +++ b/video/rate_utilization_tracker_unittest.cc @@ -248,5 +248,22 @@ TEST(RateUtilizationTrackerTest, EqualTimestampsTreatedAtSameDataPoint) { PrettyCloseTo(3.0 / 4.0)); } +TEST(RateUtilizationTrackerTest, FullRateAfterLastDataPoint) { + RateUtilizationTracker tracker(kDefaultMaxDataPoints, kDefaultTimeWindow); + constexpr TimeDelta kFrameInterval = TimeDelta::Seconds(1) / 33; + constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(100); + constexpr DataSize kIdealFrameSize = kTargetRate * kFrameInterval; + + tracker.OnDataRateChanged(kTargetRate, kStartTime); + tracker.OnDataProduced(kIdealFrameSize, kStartTime); + + // New rate update, but accumulated rate for last data point fully saturated + // by next to last rate update. + tracker.OnDataRateChanged(kTargetRate, kStartTime + kFrameInterval * 2); + + EXPECT_THAT(tracker.GetRateUtilizationFactor(kStartTime + kFrameInterval * 3), + PrettyCloseTo(1.0 / 3.0)); +} + } // namespace } // namespace webrtc