Don't reset RTT Backoff timeout on route change.
Bug: webrtc:9718 Change-Id: I536733b33c40838cdfc473988581147bec6a358a Reviewed-on: https://webrtc-review.googlesource.com/c/109927 Commit-Queue: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Björn Terelius <terelius@webrtc.org> Reviewed-by: Christoffer Rodbro <crodbro@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25638}
This commit is contained in:
committed by
Commit Bot
parent
fdc635d2a8
commit
24643488d4
@ -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<DataRate> 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 {
|
||||
|
||||
@ -29,14 +29,22 @@ namespace webrtc {
|
||||
|
||||
class RtcEventLog;
|
||||
|
||||
struct RttBasedBackoffConfig {
|
||||
RttBasedBackoffConfig();
|
||||
RttBasedBackoffConfig(const RttBasedBackoffConfig&);
|
||||
RttBasedBackoffConfig& operator=(const RttBasedBackoffConfig&) = default;
|
||||
~RttBasedBackoffConfig();
|
||||
FieldTrialParameter<TimeDelta> rtt_limit;
|
||||
FieldTrialParameter<double> drop_fraction;
|
||||
FieldTrialParameter<TimeDelta> drop_interval;
|
||||
class RttBasedBackoff {
|
||||
public:
|
||||
RttBasedBackoff();
|
||||
~RttBasedBackoff();
|
||||
void OnRouteChange();
|
||||
void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt);
|
||||
TimeDelta RttLowerBound(Timestamp at_time) const;
|
||||
|
||||
FieldTrialParameter<TimeDelta> rtt_limit_;
|
||||
FieldTrialParameter<double> drop_fraction_;
|
||||
FieldTrialParameter<TimeDelta> 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<std::pair<Timestamp, DataRate> > 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_;
|
||||
|
||||
@ -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<SendSideBandwidthEstimation>(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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user