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:
parent
c98849cf92
commit
8d33c0c104
@ -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;
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user