Add "WebRTC-BurstyPacer/burst:20ms" field trial.
This experiment will tell if we still see the performance gains that we saw with the "bursty slacked pacer" even if we don't apply slack (since the "slack without burst" showed little impact at Stable). The hope is that without slack all quality regressions will go away but that bursting will still provide the desired performance benefits. Bug: chromium:1354491 Change-Id: I95f05d040713addaaa1856c8e374a01c27311612 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/272366 Commit-Queue: Henrik Boström <hbos@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/main@{#37845}
This commit is contained in:
parent
0cd0dd3b07
commit
d34605b0a4
@ -25,6 +25,8 @@ namespace webrtc {
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr const char* kBurstyPacerFieldTrial = "WebRTC-BurstyPacer";
|
||||
|
||||
constexpr const char* kSlackedTaskQueuePacedSenderFieldTrial =
|
||||
"WebRTC-SlackedTaskQueuePacedSender";
|
||||
|
||||
@ -32,6 +34,12 @@ constexpr const char* kSlackedTaskQueuePacedSenderFieldTrial =
|
||||
|
||||
const int TaskQueuePacedSender::kNoPacketHoldback = -1;
|
||||
|
||||
TaskQueuePacedSender::BurstyPacerFlags::BurstyPacerFlags(
|
||||
const FieldTrialsView& field_trials)
|
||||
: burst("burst") {
|
||||
ParseFieldTrial({&burst}, field_trials.Lookup(kBurstyPacerFieldTrial));
|
||||
}
|
||||
|
||||
TaskQueuePacedSender::SlackedPacerFlags::SlackedPacerFlags(
|
||||
const FieldTrialsView& field_trials)
|
||||
: allow_low_precision("Enabled"),
|
||||
@ -50,6 +58,7 @@ TaskQueuePacedSender::TaskQueuePacedSender(
|
||||
TimeDelta max_hold_back_window,
|
||||
int max_hold_back_window_in_packets)
|
||||
: clock_(clock),
|
||||
bursty_pacer_flags_(field_trials),
|
||||
slacked_pacer_flags_(field_trials),
|
||||
max_hold_back_window_(slacked_pacer_flags_.allow_low_precision
|
||||
? PacingController::kMinSleepTime
|
||||
@ -67,10 +76,18 @@ TaskQueuePacedSender::TaskQueuePacedSender(
|
||||
"TaskQueuePacedSender",
|
||||
TaskQueueFactory::Priority::NORMAL)) {
|
||||
RTC_DCHECK_GE(max_hold_back_window_, PacingController::kMinSleepTime);
|
||||
// There are multiple field trials that can affect burst. If multiple bursts
|
||||
// are specified we pick the largest of the values.
|
||||
absl::optional<TimeDelta> burst = bursty_pacer_flags_.burst.GetOptional();
|
||||
if (slacked_pacer_flags_.allow_low_precision &&
|
||||
slacked_pacer_flags_.send_burst_interval) {
|
||||
pacing_controller_.SetSendBurstInterval(
|
||||
slacked_pacer_flags_.send_burst_interval.Value());
|
||||
TimeDelta slacked_burst = slacked_pacer_flags_.send_burst_interval.Value();
|
||||
if (!burst.has_value() || burst.value() < slacked_burst) {
|
||||
burst = slacked_burst;
|
||||
}
|
||||
}
|
||||
if (burst.has_value()) {
|
||||
pacing_controller_.SetSendBurstInterval(burst.value());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -131,6 +131,15 @@ class TaskQueuePacedSender : public RtpPacketPacer, public RtpPacketSender {
|
||||
Stats GetStats() const;
|
||||
|
||||
Clock* const clock_;
|
||||
struct BurstyPacerFlags {
|
||||
// Parses `kBurstyPacerFieldTrial`. Example:
|
||||
// --force-fieldtrials=WebRTC-BurstyPacer/burst:20ms/
|
||||
explicit BurstyPacerFlags(const FieldTrialsView& field_trials);
|
||||
// If set, the pacer is allowed to build up a packet "debt" that correspond
|
||||
// to approximately the send rate during the specified interval.
|
||||
FieldTrialOptional<TimeDelta> burst;
|
||||
};
|
||||
const BurstyPacerFlags bursty_pacer_flags_;
|
||||
struct SlackedPacerFlags {
|
||||
// Parses `kSlackedTaskQueuePacedSenderFieldTrial`. Example:
|
||||
// --force-fieldtrials=WebRTC-SlackedTaskQueuePacedSender/Enabled,max_queue_time:75ms/
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user