diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc index 2efc337abc..95a40e0ca8 100644 --- a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc +++ b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc @@ -677,7 +677,7 @@ TEST(GoogCcScenario, LossBasedRecoversFasterAfterCrossInducedLoss) { AverageBitrateAfterCrossInducedLoss("googcc_unit/cross_loss_based"); EXPECT_GE(average_bitrate_with_loss_based, - average_bitrate_without_loss_based * 1.1); + average_bitrate_without_loss_based * 1.05); } TEST(GoogCcScenario, LossBasedEstimatorCapsRateAtModerateLoss) { diff --git a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc index 852485b189..4a25446272 100644 --- a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc +++ b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc @@ -391,8 +391,10 @@ void SendSideBandwidthEstimation::UpdatePacketsLost(int64_t packets_lost, } has_decreased_since_last_fraction_loss_ = false; - int64_t lost_q8 = (lost_packets_since_last_loss_update_ + packets_lost) - << 8; + int64_t lost_q8 = + std::max(lost_packets_since_last_loss_update_ + packets_lost, + 0) + << 8; last_fraction_loss_ = std::min(lost_q8 / expected, 255); // Reset accumulators. @@ -401,6 +403,7 @@ void SendSideBandwidthEstimation::UpdatePacketsLost(int64_t packets_lost, last_loss_packet_report_ = at_time; UpdateEstimate(at_time); } + UpdateUmaStatsPacketsLost(at_time, packets_lost); } diff --git a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc index 85ce401098..17d1aa1ada 100644 --- a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc +++ b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc @@ -180,4 +180,27 @@ TEST(RttBasedBackoff, CanBeDisabled) { EXPECT_TRUE(rtt_backoff.rtt_limit_.IsPlusInfinity()); } +TEST(SendSideBweTest, FractionLossIsNotOverflowed) { + MockRtcEventLog event_log; + test::ExplicitKeyValueConfig key_value_config(""); + SendSideBandwidthEstimation bwe(&key_value_config, &event_log); + static const int kMinBitrateBps = 100000; + static const int kInitialBitrateBps = 1000000; + int64_t now_ms = 1000; + bwe.SetMinMaxBitrate(DataRate::BitsPerSec(kMinBitrateBps), + DataRate::BitsPerSec(1500000)); + bwe.SetSendBitrate(DataRate::BitsPerSec(kInitialBitrateBps), + Timestamp::Millis(now_ms)); + + now_ms += 10000; + + EXPECT_EQ(kInitialBitrateBps, bwe.target_rate().bps()); + EXPECT_EQ(0, bwe.fraction_loss()); + + // Signal negative loss. + bwe.UpdatePacketsLost(/*packets_lost=*/-1, /*number_of_packets=*/100, + Timestamp::Millis(now_ms)); + EXPECT_EQ(0, bwe.fraction_loss()); +} + } // namespace webrtc