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}
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 2efc337..95a40e0 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 @@
       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 852485b..4a25446 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 @@
     }
 
     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 @@
     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 85ce401..17d1aa1 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 @@
   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