diff --git a/modules/bitrate_controller/send_side_bandwidth_estimation.cc b/modules/bitrate_controller/send_side_bandwidth_estimation.cc index ce7c5101db..7dfee62a31 100644 --- a/modules/bitrate_controller/send_side_bandwidth_estimation.cc +++ b/modules/bitrate_controller/send_side_bandwidth_estimation.cc @@ -104,21 +104,43 @@ bool ReadBweLossExperimentParameters(float* low_loss_threshold, } } // namespace -RttBasedBackoffConfig::RttBasedBackoffConfig() - : rtt_limit("limit", TimeDelta::PlusInfinity()), - drop_fraction("fraction", 0.5), - drop_interval("interval", TimeDelta::ms(300)) { - std::string trial_string = - field_trial::FindFullName("WebRTC-Bwe-MaxRttLimit"); - ParseFieldTrial({&rtt_limit, &drop_fraction, &drop_interval}, trial_string); +RttBasedBackoff::RttBasedBackoff() + : rtt_limit_("limit", TimeDelta::PlusInfinity()), + drop_fraction_("fraction", 0.5), + drop_interval_("interval", TimeDelta::ms(300)), + persist_on_route_change_("persist"), + // By initializing this to plus infinity, we make sure that we never + // trigger rtt backoff unless packet feedback is enabled. + last_propagation_rtt_update_(Timestamp::PlusInfinity()), + last_propagation_rtt_(TimeDelta::Zero()) { + ParseFieldTrial({&rtt_limit_, &drop_fraction_, &drop_interval_, + &persist_on_route_change_}, + field_trial::FindFullName("WebRTC-Bwe-MaxRttLimit")); } -RttBasedBackoffConfig::RttBasedBackoffConfig(const RttBasedBackoffConfig&) = - default; -RttBasedBackoffConfig::~RttBasedBackoffConfig() = default; + +void RttBasedBackoff::OnRouteChange() { + if (!persist_on_route_change_) { + last_propagation_rtt_update_ = Timestamp::PlusInfinity(); + last_propagation_rtt_ = TimeDelta::Zero(); + } +} + +void RttBasedBackoff::UpdatePropagationRtt(Timestamp at_time, + TimeDelta propagation_rtt) { + last_propagation_rtt_update_ = at_time; + last_propagation_rtt_ = propagation_rtt; +} + +TimeDelta RttBasedBackoff::RttLowerBound(Timestamp at_time) const { + // TODO(srte): Use time since last unacknowledged packet for this. + TimeDelta time_since_rtt = at_time - last_propagation_rtt_update_; + return time_since_rtt + last_propagation_rtt_; +} + +RttBasedBackoff::~RttBasedBackoff() = default; SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) - : rtt_backoff_config_(RttBasedBackoffConfig()), - lost_packets_since_last_loss_update_(0), + : lost_packets_since_last_loss_update_(0), expected_packets_since_last_loss_update_(0), current_bitrate_(DataRate::Zero()), min_bitrate_configured_( @@ -132,10 +154,6 @@ SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) last_fraction_loss_(0), last_logged_fraction_loss_(0), last_round_trip_time_(TimeDelta::Zero()), - // By initializing this to plus infinity, we make sure that we never - // trigger rtt backoff unless packet feedback is enabled. - last_propagation_rtt_update_(Timestamp::PlusInfinity()), - last_propagation_rtt_(TimeDelta::Zero()), bwe_incoming_(DataRate::Zero()), delay_based_bitrate_(DataRate::Zero()), time_last_decrease_(Timestamp::MinusInfinity()), @@ -168,6 +186,34 @@ SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {} +void SendSideBandwidthEstimation::OnRouteChange() { + lost_packets_since_last_loss_update_ = 0; + expected_packets_since_last_loss_update_ = 0; + current_bitrate_ = DataRate::Zero(); + min_bitrate_configured_ = + DataRate::bps(congestion_controller::GetMinBitrateBps()); + max_bitrate_configured_ = kDefaultMaxBitrate; + last_low_bitrate_log_ = Timestamp::MinusInfinity(); + has_decreased_since_last_fraction_loss_ = false; + last_loss_feedback_ = Timestamp::MinusInfinity(); + last_loss_packet_report_ = Timestamp::MinusInfinity(); + last_timeout_ = Timestamp::MinusInfinity(); + last_fraction_loss_ = 0; + last_logged_fraction_loss_ = 0; + last_round_trip_time_ = TimeDelta::Zero(); + bwe_incoming_ = DataRate::Zero(); + delay_based_bitrate_ = DataRate::Zero(); + time_last_decrease_ = Timestamp::MinusInfinity(); + first_report_time_ = Timestamp::MinusInfinity(); + initially_lost_packets_ = 0; + bitrate_at_2_seconds_ = DataRate::Zero(); + uma_update_state_ = kNoUpdate; + uma_rtt_state_ = kNoUpdate; + last_rtc_event_log_ = Timestamp::MinusInfinity(); + + rtt_backoff_.OnRouteChange(); +} + void SendSideBandwidthEstimation::SetBitrates( absl::optional send_bitrate, DataRate min_bitrate, @@ -312,11 +358,10 @@ void SendSideBandwidthEstimation::UpdateRtt(TimeDelta rtt, Timestamp at_time) { void SendSideBandwidthEstimation::UpdateEstimate(Timestamp at_time) { DataRate new_bitrate = current_bitrate_; - TimeDelta time_since_rtt = at_time - last_propagation_rtt_update_; - if (time_since_rtt + last_propagation_rtt_ > rtt_backoff_config_.rtt_limit) { - if (at_time - time_last_decrease_ >= rtt_backoff_config_.drop_interval) { + if (rtt_backoff_.RttLowerBound(at_time) > rtt_backoff_.rtt_limit_) { + if (at_time - time_last_decrease_ >= rtt_backoff_.drop_interval_) { time_last_decrease_ = at_time; - new_bitrate = current_bitrate_ * rtt_backoff_config_.drop_fraction; + new_bitrate = current_bitrate_ * rtt_backoff_.drop_fraction_; } CapBitrateToThresholds(at_time, new_bitrate); return; @@ -412,8 +457,7 @@ void SendSideBandwidthEstimation::UpdateEstimate(Timestamp at_time) { void SendSideBandwidthEstimation::UpdatePropagationRtt( Timestamp at_time, TimeDelta propagation_rtt) { - last_propagation_rtt_update_ = at_time; - last_propagation_rtt_ = propagation_rtt; + rtt_backoff_.UpdatePropagationRtt(at_time, propagation_rtt); } bool SendSideBandwidthEstimation::IsInStartPhase(Timestamp at_time) const { diff --git a/modules/bitrate_controller/send_side_bandwidth_estimation.h b/modules/bitrate_controller/send_side_bandwidth_estimation.h index 9ee43bbcdc..83efe92378 100644 --- a/modules/bitrate_controller/send_side_bandwidth_estimation.h +++ b/modules/bitrate_controller/send_side_bandwidth_estimation.h @@ -29,14 +29,22 @@ namespace webrtc { class RtcEventLog; -struct RttBasedBackoffConfig { - RttBasedBackoffConfig(); - RttBasedBackoffConfig(const RttBasedBackoffConfig&); - RttBasedBackoffConfig& operator=(const RttBasedBackoffConfig&) = default; - ~RttBasedBackoffConfig(); - FieldTrialParameter rtt_limit; - FieldTrialParameter drop_fraction; - FieldTrialParameter drop_interval; +class RttBasedBackoff { + public: + RttBasedBackoff(); + ~RttBasedBackoff(); + void OnRouteChange(); + void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt); + TimeDelta RttLowerBound(Timestamp at_time) const; + + FieldTrialParameter rtt_limit_; + FieldTrialParameter drop_fraction_; + FieldTrialParameter drop_interval_; + FieldTrialFlag persist_on_route_change_; + + public: + Timestamp last_propagation_rtt_update_; + TimeDelta last_propagation_rtt_; }; class SendSideBandwidthEstimation { @@ -45,12 +53,13 @@ class SendSideBandwidthEstimation { explicit SendSideBandwidthEstimation(RtcEventLog* event_log); ~SendSideBandwidthEstimation(); + void OnRouteChange(); void CurrentEstimate(int* bitrate, uint8_t* loss, int64_t* rtt) const; // Call periodically to update estimate. void UpdateEstimate(Timestamp at_time); void OnSentPacket(SentPacket sent_packet); - void UpdatePropagationRtt(Timestamp at_time, TimeDelta feedback_rtt); + void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt); // Call when we receive a RTCP message with TMMBR or REMB. void UpdateReceiverEstimate(Timestamp at_time, DataRate bandwidth); @@ -96,7 +105,7 @@ class SendSideBandwidthEstimation { // set |current_bitrate_| to the capped value and updates the event log. void CapBitrateToThresholds(Timestamp at_time, DataRate bitrate); - RttBasedBackoffConfig rtt_backoff_config_; + RttBasedBackoff rtt_backoff_; std::deque > min_bitrate_history_; @@ -117,9 +126,6 @@ class SendSideBandwidthEstimation { uint8_t last_logged_fraction_loss_; TimeDelta last_round_trip_time_; - Timestamp last_propagation_rtt_update_; - TimeDelta last_propagation_rtt_; - DataRate bwe_incoming_; DataRate delay_based_bitrate_; Timestamp time_last_decrease_; 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 00880180a6..3b06ed64d0 100644 --- a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc +++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc @@ -213,8 +213,7 @@ NetworkControlUpdate GoogCcNetworkController::OnNetworkRouteChange( 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_->OnRouteChange(); bandwidth_estimation_->SetBitrates( msg.constraints.starting_rate, DataRate::bps(min_bitrate_bps), msg.constraints.max_data_rate.value_or(DataRate::Infinity()), @@ -428,6 +427,7 @@ NetworkControlUpdate GoogCcNetworkController::OnTransportPacketsFeedback( const size_t kMaxFeedbackRttWindow = 32; if (feedback_max_rtts_.size() > kMaxFeedbackRttWindow) feedback_max_rtts_.pop_front(); + // TODO(srte): Use time since last unacknowledged packet. bandwidth_estimation_->UpdatePropagationRtt(report.feedback_time, min_propagation_rtt); }