Avoid fraction_loss overflowing when packet loss is negative in send_side_bandwidth_estimation.cc.

Update an affected unit test by the change in goog_cc.

Bug: webrtc:14272
Change-Id: I83e97530c861b126bed876d57f6d4f91aa45de7e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/269002
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Diep Bui <diepbp@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37587}
This commit is contained in:
Diep Bui 2022-07-20 10:22:35 +00:00 committed by WebRTC LUCI CQ
parent dc5cf31cad
commit 9804aa5f6a
3 changed files with 29 additions and 3 deletions

View File

@ -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) {

View File

@ -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<int64_t>(lost_packets_since_last_loss_update_ + packets_lost,
0)
<< 8;
last_fraction_loss_ = std::min<int>(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);
}

View File

@ -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