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;