blob: bd4c12965270e3e085c624f28c3ee3174a7334e5 [file]
/*
* Copyright 2025 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef MODULES_CONGESTION_CONTROLLER_SCREAM_SCREAM_V2_PARAMETERS_H_
#define MODULES_CONGESTION_CONTROLLER_SCREAM_SCREAM_V2_PARAMETERS_H_
#include "api/field_trials_view.h"
#include "api/units/data_size.h"
#include "api/units/time_delta.h"
#include "rtc_base/experiments/field_trial_parser.h"
namespace webrtc {
struct ScreamV2Parameters {
explicit ScreamV2Parameters(const FieldTrialsView& trials);
ScreamV2Parameters(const ScreamV2Parameters& params) = default;
// Minimum Reference Window
FieldTrialParameter<DataSize> min_ref_window;
// Exponentially Weighted Moving Average (EWMA) factor for l4s_alpha.
FieldTrialParameter<double> l4s_avg_g_up;
FieldTrialParameter<double> l4s_avg_g_down;
// Exponentially Weighted Moving Average (EWMA) factor for smoothed rtt.
FieldTrialParameter<double> smoothed_rtt_avg_g_up;
FieldTrialParameter<double> smoothed_rtt_avg_g_down;
// Maximum Segment Size (MSS)
// Size of the largest data segment that a sender is able to transmit. I.e
// largest possible IP packet.
FieldTrialParameter<DataSize> max_segment_size;
// Headroom for bytes in flight when increasing reference window.
FieldTrialParameter<double> bytes_in_flight_head_room;
// Reference window scale factor due to loss event.
FieldTrialParameter<double> beta_loss;
// Determines how many RTTs after a congestion event the reference window
// growth should be cautious.
FieldTrialParameter<int> post_congestion_delay_rtts;
// Determines how much (as a fraction of ref_window) that the ref_window can
// increase per RTT.
FieldTrialParameter<double> multiplicative_increase_factor;
// This mimics Prague's RTT fairness such that flows with RTT below
// virtual_rtt should get a roughly equal share over an L4S path.
FieldTrialParameter<TimeDelta> virtual_rtt;
// Increase and decrease of ref window is slower close to the last
// inflection point. Both increase and decrease is scaled by
// (backoff_scale_factor_close_to_ref_window_i* (ref_window_i -
// ref_window)) / ref_window_i) ^2
FieldTrialParameter<double> backoff_scale_factor_close_to_ref_window_i;
// If CE is detected and this number of RTTs has passed since last
// congestion, ref_window_i will be reset.
FieldTrialParameter<int>
number_of_rtts_between_reset_ref_window_i_on_congestion;
// Max/Min used for calculating how much larger the send window is allowed to
// be than the ref window.
FieldTrialParameter<double> ref_window_overhead_min;
FieldTrialParameter<double> ref_window_overhead_max;
// Exponentially Weighted Moving Average (EWMA) factor for updating queue
// delay.
FieldTrialParameter<double> queue_delay_avg_g;
// Exponentially Weighted Moving Average (EWMA) factor for updating average
// min queue delay and average latency difference.
FieldTrialParameter<double> delay_min_and_latency_diff_avg_g;
// Thresholds for average min queue delay. Used for limiting ref_window
// increase.
FieldTrialParameter<TimeDelta> queue_delay_min_threshold;
// Thresholds for average latency difference. Used for limiting ref_window
// increase.
FieldTrialParameter<TimeDelta> latency_diff_threshold;
// Determines the length of the base delay history when estimating one way
// delay (owd)
FieldTrialParameter<int> base_delay_window_length;
// Determines how often the base delay history is updated.
FieldTrialParameter<TimeDelta> base_delay_history_update_interval;
// Reference window is reduced if average queue delay is above
// `queue_delay_target/2`
// TODO: bugs.webrtc.org/447037083 - Consider implementing 4.2.1.4.1.
// Competing Flows Compensation.
FieldTrialParameter<TimeDelta> queue_delay_target;
// If the minimum queue delay is below this threshold, queues are deamed to be
// drained.
FieldTrialParameter<TimeDelta> queue_delay_drain_threshold;
// If the minimum queue delay has been above `queue_delay_drain_threshold` for
// longer than `queue_delay_drain_period`, an attempt it made to drain the
// queues, and if that fails, resets the estimates.
FieldTrialParameter<TimeDelta> queue_delay_drain_period;
// Number of RTTs where the target rate is reduced to attempt to drain.
FieldTrialParameter<int> queue_delay_drain_rtts;
// Padding is periodically used in order to increase target rate even if a
// stream does not produce a high enough rate. Time between periodic padding
// is at least this long.
FieldTrialParameter<TimeDelta> time_between_periodic_padding;
// Max duration padding is used when periodic padding start.
// Padding is stopped if congestion occur.
FieldTrialParameter<TimeDelta> periodic_padding_duration;
// Padding is allowed to be used after this duration since the last
// time reference window was reduced but at least `periodic_padding_interval`
// must have passed since last time padding was used.
FieldTrialParameter<TimeDelta> allow_padding_after_last_congestion_time;
// If initial BWE probing is allowed, allow periodic probing for this duration
// even of no streams have been configured.
FieldTrialParameter<TimeDelta> initial_probing_duration;
// Factor multiplied by the current target rate to decide the pacing rate.
FieldTrialParameter<double> pacing_factor;
// Exponentially Weighted Moving Average (EWMA) factor for calculating average
// time feedback is delayed by the receiver. I.e the time from a packet is
// received until feedback is sent. If zero, this delay is ignored.
FieldTrialParameter<double> feedback_hold_time_avg_g;
// If the time since last reaction to congestion is larger than this, the
// pacing window is increased. I.e. packets are allowed to be sent in larger
// bursts.
FieldTrialParameter<TimeDelta>
allow_large_pacing_bursts_after_congestion_time;
};
} // namespace webrtc
#endif // MODULES_CONGESTION_CONTROLLER_SCREAM_SCREAM_V2_PARAMETERS_H_