Adds field trial to do safer reset on route change.

Bug: webrtc:9718
Change-Id: I71143a9616981a24bca7bd5c663a9dae9fc9692e
Reviewed-on: https://webrtc-review.googlesource.com/c/106903
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Christoffer Rodbro <crodbro@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25286}
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
index 6e4774d..2a79cca 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
@@ -136,6 +136,8 @@
                                                  bool feedback_only)
     : event_log_(event_log),
       packet_feedback_only_(feedback_only),
+      safe_reset_on_route_change_(
+          field_trial::IsEnabled("WebRTC-Bwe-SafeResetOnRouteChange")),
       probe_controller_(new ProbeController()),
       congestion_window_pushback_controller_(
           MaybeInitalizeCongestionWindowPushbackController()),
@@ -184,16 +186,31 @@
 
   ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
 
+  if (safe_reset_on_route_change_) {
+    int32_t estimated_bitrate_bps;
+    uint8_t fraction_loss;
+    int64_t rtt_ms;
+    bandwidth_estimation_->CurrentEstimate(&estimated_bitrate_bps,
+                                           &fraction_loss, &rtt_ms);
+    if (!msg.constraints.starting_rate ||
+        estimated_bitrate_bps <= start_bitrate_bps) {
+      start_bitrate_bps = estimated_bitrate_bps;
+      if (msg.constraints.starting_rate) {
+        msg.constraints.starting_rate = DataRate::bps(start_bitrate_bps);
+      }
+    }
+  }
+
+  acknowledged_bitrate_estimator_.reset(new AcknowledgedBitrateEstimator());
+  delay_based_bwe_.reset(new DelayBasedBwe(event_log_));
+  delay_based_bwe_->SetStartBitrate(start_bitrate_bps);
+  delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
   bandwidth_estimation_ =
       absl::make_unique<SendSideBandwidthEstimation>(event_log_);
   bandwidth_estimation_->SetBitrates(
       msg.constraints.starting_rate, DataRate::bps(min_bitrate_bps),
       msg.constraints.max_data_rate.value_or(DataRate::Infinity()),
       msg.at_time);
-  delay_based_bwe_.reset(new DelayBasedBwe(event_log_));
-  acknowledged_bitrate_estimator_.reset(new AcknowledgedBitrateEstimator());
-  delay_based_bwe_->SetStartBitrate(start_bitrate_bps);
-  delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
 
   probe_controller_->Reset(msg.at_time.ms());
   NetworkControlUpdate update;
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control.h b/modules/congestion_controller/goog_cc/goog_cc_network_control.h
index 323f313..1ec073f 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control.h
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.h
@@ -64,6 +64,7 @@
 
   RtcEventLog* const event_log_;
   const bool packet_feedback_only_;
+  const bool safe_reset_on_route_change_;
 
   const std::unique_ptr<ProbeController> probe_controller_;
   const std::unique_ptr<CongestionWindowPushbackController>
diff --git a/modules/congestion_controller/goog_cc/probe_controller.cc b/modules/congestion_controller/goog_cc/probe_controller.cc
index 76cb643..7bbe8e7 100644
--- a/modules/congestion_controller/goog_cc/probe_controller.cc
+++ b/modules/congestion_controller/goog_cc/probe_controller.cc
@@ -261,6 +261,16 @@
   return std::vector<ProbeClusterConfig>();
 }
 
+std::vector<ProbeClusterConfig> ProbeController::InitiateCapacityProbing(
+    int64_t bitrate_bps,
+    int64_t at_time_ms) {
+  if (state_ != State::kWaitingForProbingResult) {
+    RTC_DCHECK(network_available_);
+    return InitiateProbing(at_time_ms, {2 * bitrate_bps}, true);
+  }
+  return std::vector<ProbeClusterConfig>();
+}
+
 void ProbeController::Reset(int64_t at_time_ms) {
   network_available_ = true;
   state_ = State::kInit;
diff --git a/modules/congestion_controller/goog_cc/probe_controller.h b/modules/congestion_controller/goog_cc/probe_controller.h
index 6b6d4ae..4ddd77f 100644
--- a/modules/congestion_controller/goog_cc/probe_controller.h
+++ b/modules/congestion_controller/goog_cc/probe_controller.h
@@ -60,6 +60,9 @@
   RTC_WARN_UNUSED_RESULT std::vector<ProbeClusterConfig> RequestProbe(
       int64_t at_time_ms);
 
+  RTC_WARN_UNUSED_RESULT std::vector<ProbeClusterConfig>
+  InitiateCapacityProbing(int64_t bitrate_bps, int64_t at_time_ms);
+
   // Resets the ProbeController to a state equivalent to as if it was just
   // created EXCEPT for |enable_periodic_alr_probing_|.
   void Reset(int64_t at_time_ms);
diff --git a/modules/congestion_controller/rtp/include/send_side_congestion_controller.h b/modules/congestion_controller/rtp/include/send_side_congestion_controller.h
index 6c0eae2..55465cb 100644
--- a/modules/congestion_controller/rtp/include/send_side_congestion_controller.h
+++ b/modules/congestion_controller/rtp/include/send_side_congestion_controller.h
@@ -191,6 +191,7 @@
   NetworkControllerConfig initial_config_ RTC_GUARDED_BY(task_queue_);
   StreamsConfig streams_config_ RTC_GUARDED_BY(task_queue_);
 
+  const bool reset_feedback_on_route_change_;
   const bool send_side_bwe_with_overhead_;
   // Transport overhead is written by OnNetworkRouteChanged and read by
   // AddPacket.
diff --git a/modules/congestion_controller/rtp/send_side_congestion_controller.cc b/modules/congestion_controller/rtp/send_side_congestion_controller.cc
index e2e9587..c147500 100644
--- a/modules/congestion_controller/rtp/send_side_congestion_controller.cc
+++ b/modules/congestion_controller/rtp/send_side_congestion_controller.cc
@@ -122,6 +122,8 @@
       process_interval_(controller_factory_fallback_->GetProcessInterval()),
       last_report_block_time_(Timestamp::ms(clock_->TimeInMilliseconds())),
       observer_(nullptr),
+      reset_feedback_on_route_change_(
+          !field_trial::IsEnabled("WebRTC-Bwe-NoFeedbackReset")),
       send_side_bwe_with_overhead_(
           webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
       transport_overhead_bytes_per_packet_(0),
@@ -255,8 +257,9 @@
     int start_bitrate_bps,
     int min_bitrate_bps,
     int max_bitrate_bps) {
-  transport_feedback_adapter_.SetNetworkIds(network_route.local_network_id,
-                                            network_route.remote_network_id);
+  if (reset_feedback_on_route_change_)
+    transport_feedback_adapter_.SetNetworkIds(network_route.local_network_id,
+                                              network_route.remote_network_id);
   transport_overhead_bytes_per_packet_ = network_route.packet_overhead;
 
   NetworkRouteChange msg;