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}
This commit is contained in:
Sebastian Jansson 2018-10-22 10:22:03 +02:00 committed by Commit Bot
parent c98849cf92
commit 8d33c0c104
6 changed files with 41 additions and 6 deletions

View File

@ -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<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;

View File

@ -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<ProbeController> probe_controller_;
const std::unique_ptr<CongestionWindowPushbackController>

View File

@ -261,6 +261,16 @@ std::vector<ProbeClusterConfig> ProbeController::RequestProbe(
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;

View File

@ -60,6 +60,9 @@ class ProbeController {
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);

View File

@ -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.

View File

@ -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;