From 8d33c0c1044a091b2f70f7a542d8148086fd32f4 Mon Sep 17 00:00:00 2001 From: Sebastian Jansson Date: Mon, 22 Oct 2018 10:22:03 +0200 Subject: [PATCH] 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 Reviewed-by: Christoffer Rodbro Cr-Commit-Position: refs/heads/master@{#25286} --- .../goog_cc/goog_cc_network_control.cc | 25 ++++++++++++++++--- .../goog_cc/goog_cc_network_control.h | 1 + .../goog_cc/probe_controller.cc | 10 ++++++++ .../goog_cc/probe_controller.h | 3 +++ .../include/send_side_congestion_controller.h | 1 + .../rtp/send_side_congestion_controller.cc | 7 ++++-- 6 files changed, 41 insertions(+), 6 deletions(-) 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 6e4774d167..2a79cca942 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 @@ GoogCcNetworkController::GoogCcNetworkController(RtcEventLog* event_log, 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 @@ NetworkControlUpdate GoogCcNetworkController::OnNetworkRouteChange( 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(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 323f313046..1ec073ff90 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 @@ class GoogCcNetworkController : public NetworkControllerInterface { RtcEventLog* const event_log_; const bool packet_feedback_only_; + const bool safe_reset_on_route_change_; const std::unique_ptr probe_controller_; const std::unique_ptr diff --git a/modules/congestion_controller/goog_cc/probe_controller.cc b/modules/congestion_controller/goog_cc/probe_controller.cc index 76cb64338c..7bbe8e7138 100644 --- a/modules/congestion_controller/goog_cc/probe_controller.cc +++ b/modules/congestion_controller/goog_cc/probe_controller.cc @@ -261,6 +261,16 @@ std::vector ProbeController::RequestProbe( return std::vector(); } +std::vector 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(); +} + 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 6b6d4ae8b4..4ddd77f75c 100644 --- a/modules/congestion_controller/goog_cc/probe_controller.h +++ b/modules/congestion_controller/goog_cc/probe_controller.h @@ -60,6 +60,9 @@ class ProbeController { RTC_WARN_UNUSED_RESULT std::vector RequestProbe( int64_t at_time_ms); + RTC_WARN_UNUSED_RESULT std::vector + 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 6c0eae2db0..55465cb75f 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 @@ class SendSideCongestionController 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 e2e9587cb1..c14750050b 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 @@ SendSideCongestionController::SendSideCongestionController( 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 @@ void SendSideCongestionController::OnNetworkRouteChanged( 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;