Delete WebRTC-SlackedTaskQueuePacer experiment

R=hbos@webrtc.org, sprang@webrtc.org

Bug: webrtc:14913
Change-Id: I1ea9d5bda798ea01fa9ec2a9b8d96cb50ccb9ec2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/293920
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39356}
diff --git a/modules/pacing/task_queue_paced_sender.cc b/modules/pacing/task_queue_paced_sender.cc
index 4ba2495..bfe9792 100644
--- a/modules/pacing/task_queue_paced_sender.cc
+++ b/modules/pacing/task_queue_paced_sender.cc
@@ -13,13 +13,11 @@
 #include <algorithm>
 #include <utility>
 
-#include "absl/memory/memory.h"
 #include "api/task_queue/pending_task_safety_flag.h"
 #include "api/transport/network_types.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 #include "rtc_base/experiments/field_trial_units.h"
-#include "rtc_base/system/unused.h"
 #include "rtc_base/trace_event.h"
 
 namespace webrtc {
@@ -28,9 +26,6 @@
 
 constexpr const char* kBurstyPacerFieldTrial = "WebRTC-BurstyPacer";
 
-constexpr const char* kSlackedTaskQueuePacedSenderFieldTrial =
-    "WebRTC-SlackedTaskQueuePacedSender";
-
 }  // namespace
 
 const int TaskQueuePacedSender::kNoPacketHoldback = -1;
@@ -41,16 +36,6 @@
   ParseFieldTrial({&burst}, field_trials.Lookup(kBurstyPacerFieldTrial));
 }
 
-TaskQueuePacedSender::SlackedPacerFlags::SlackedPacerFlags(
-    const FieldTrialsView& field_trials)
-    : allow_low_precision("Enabled"),
-      max_low_precision_expected_queue_time("max_queue_time"),
-      send_burst_interval("send_burst_interval") {
-  ParseFieldTrial({&allow_low_precision, &max_low_precision_expected_queue_time,
-                   &send_burst_interval},
-                  field_trials.Lookup(kSlackedTaskQueuePacedSenderFieldTrial));
-}
-
 TaskQueuePacedSender::TaskQueuePacedSender(
     Clock* clock,
     PacingController::PacketSender* packet_sender,
@@ -61,13 +46,8 @@
     absl::optional<TimeDelta> burst_interval)
     : clock_(clock),
       bursty_pacer_flags_(field_trials),
-      slacked_pacer_flags_(field_trials),
-      max_hold_back_window_(slacked_pacer_flags_.allow_low_precision
-                                ? PacingController::kMinSleepTime
-                                : max_hold_back_window),
-      max_hold_back_window_in_packets_(slacked_pacer_flags_.allow_low_precision
-                                           ? 0
-                                           : max_hold_back_window_in_packets),
+      max_hold_back_window_(max_hold_back_window),
+      max_hold_back_window_in_packets_(max_hold_back_window_in_packets),
       pacing_controller_(clock, packet_sender, field_trials),
       next_process_time_(Timestamp::MinusInfinity()),
       is_started_(false),
@@ -79,13 +59,6 @@
   // 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) {
-    TimeDelta slacked_burst = slacked_pacer_flags_.send_burst_interval.Value();
-    if (!burst.has_value() || burst.value() < slacked_burst) {
-      burst = slacked_burst;
-    }
-  }
   // If not overriden by an experiment, the burst is specified by the
   // `burst_interval` argument.
   if (!burst.has_value()) {
@@ -320,32 +293,7 @@
   if (next_process_time_.IsMinusInfinity() ||
       next_process_time_ > next_send_time) {
     // Prefer low precision if allowed and not probing.
-    TaskQueueBase::DelayPrecision precision =
-        slacked_pacer_flags_.allow_low_precision &&
-                !pacing_controller_.IsProbing()
-            ? TaskQueueBase::DelayPrecision::kLow
-            : TaskQueueBase::DelayPrecision::kHigh;
-    // Check for cases where we need high precision.
-    if (precision == TaskQueueBase::DelayPrecision::kLow) {
-      auto& packets_per_type =
-          pacing_controller_.SizeInPacketsPerRtpPacketMediaType();
-      bool audio_or_retransmission_packets_in_queue =
-          packets_per_type[static_cast<size_t>(RtpPacketMediaType::kAudio)] >
-              0 ||
-          packets_per_type[static_cast<size_t>(
-              RtpPacketMediaType::kRetransmission)] > 0;
-      bool queue_time_too_large =
-          slacked_pacer_flags_.max_low_precision_expected_queue_time &&
-          pacing_controller_.ExpectedQueueTime() >=
-              slacked_pacer_flags_.max_low_precision_expected_queue_time
-                  .Value();
-      if (audio_or_retransmission_packets_in_queue || queue_time_too_large) {
-        precision = TaskQueueBase::DelayPrecision::kHigh;
-      }
-    }
-
-    task_queue_.TaskQueueForDelayedTasks()->PostDelayedTaskWithPrecision(
-        precision,
+    task_queue_.TaskQueueForDelayedTasks()->PostDelayedHighPrecisionTask(
         task_queue_.MaybeSafeTask(
             safety_.flag(),
             [this, next_send_time]() { MaybeProcessPackets(next_send_time); }),
diff --git a/modules/pacing/task_queue_paced_sender.h b/modules/pacing/task_queue_paced_sender.h
index ea335fd..4d51695 100644
--- a/modules/pacing/task_queue_paced_sender.h
+++ b/modules/pacing/task_queue_paced_sender.h
@@ -150,26 +150,7 @@
     FieldTrialOptional<TimeDelta> burst;
   };
   const BurstyPacerFlags bursty_pacer_flags_;
-  struct SlackedPacerFlags {
-    // Parses `kSlackedTaskQueuePacedSenderFieldTrial`. Example:
-    // --force-fieldtrials=WebRTC-SlackedTaskQueuePacedSender/Enabled,max_queue_time:75ms/
-    explicit SlackedPacerFlags(const FieldTrialsView& field_trials);
-    // When "Enabled", delayed tasks invoking MaybeProcessPackets() are
-    // scheduled using low precision instead of high precision, resulting in
-    // less idle wake ups and packets being sent in bursts if the `task_queue_`
-    // implementation supports slack. When probing, high precision is used
-    // regardless to ensure good bandwidth estimation.
-    FieldTrialFlag allow_low_precision;
-    // Controlled via the "max_queue_time" experiment argument. If set, uses
-    // high precision scheduling of MaybeProcessPackets() whenever the expected
-    // queue time is greater than or equal to this value.
-    FieldTrialOptional<TimeDelta> max_low_precision_expected_queue_time;
-    // Controlled via "send_burst_interval" experiment argument. 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> send_burst_interval;
-  };
-  const SlackedPacerFlags slacked_pacer_flags_;
+
   // The holdback window prevents too frequent delayed MaybeProcessPackets()
   // calls. These are only applicable if `allow_low_precision` is false.
   const TimeDelta max_hold_back_window_;
diff --git a/modules/pacing/task_queue_paced_sender_unittest.cc b/modules/pacing/task_queue_paced_sender_unittest.cc
index 69c7b9b..23a72ce 100644
--- a/modules/pacing/task_queue_paced_sender_unittest.cc
+++ b/modules/pacing/task_queue_paced_sender_unittest.cc
@@ -811,103 +811,5 @@
   EXPECT_TRUE(pacer.ExpectedQueueTime().IsZero());
 }
 
-// TODO(webrtc:14502): Rewrite these tests if the functionality is needed if
-// pacing is done on the worker thread.
-TEST(TaskQueuePacedSenderTest, HighPrecisionPacingWhenSlackIsDisabled) {
-  ScopedKeyValueConfig trials("WebRTC-SlackedTaskQueuePacedSender/Disabled/");
-
-  GlobalSimulatedTimeController time_controller(Timestamp::Millis(1234));
-  TaskQueueWithFakePrecisionFactory task_queue_factory(
-      time_controller.GetTaskQueueFactory());
-
-  MockPacketRouter packet_router;
-  TaskQueuePacedSender pacer(
-      time_controller.GetClock(), &packet_router, trials, &task_queue_factory,
-      PacingController::kMinSleepTime, TaskQueuePacedSender::kNoPacketHoldback);
-
-  // Send enough packets (covering one second) that pacing is triggered, i.e.
-  // delayed tasks being scheduled.
-  static constexpr size_t kPacketsToSend = 42;
-  static constexpr DataRate kPacingRate =
-      DataRate::BitsPerSec(kDefaultPacketSize * 8 * kPacketsToSend);
-  pacer.SetPacingRates(kPacingRate, DataRate::Zero());
-  pacer.EnsureStarted();
-  pacer.EnqueuePackets(
-      GeneratePackets(RtpPacketMediaType::kVideo, kPacketsToSend));
-  // Expect all of them to be sent.
-  size_t packets_sent = 0;
-  EXPECT_CALL(packet_router, SendPacket)
-      .WillRepeatedly(
-          [&](std::unique_ptr<RtpPacketToSend> packet,
-              const PacedPacketInfo& cluster_info) { ++packets_sent; });
-  time_controller.AdvanceTime(TimeDelta::Seconds(1));
-  EXPECT_EQ(packets_sent, kPacketsToSend);
-
-  // Expect pacing to make use of high precision.
-  EXPECT_EQ(task_queue_factory.delayed_low_precision_count(), 0);
-  EXPECT_GT(task_queue_factory.delayed_high_precision_count(), 0);
-
-  // Create probe cluster which is also high precision.
-  pacer.CreateProbeClusters(
-      {{.at_time = time_controller.GetClock()->CurrentTime(),
-        .target_data_rate = kPacingRate,
-        .target_duration = TimeDelta::Millis(15),
-        .target_probe_count = 4,
-        .id = 123}});
-  pacer.EnqueuePackets(GeneratePackets(RtpPacketMediaType::kVideo, 1));
-  time_controller.AdvanceTime(TimeDelta::Seconds(1));
-  EXPECT_EQ(task_queue_factory.delayed_low_precision_count(), 0);
-  EXPECT_GT(task_queue_factory.delayed_high_precision_count(), 0);
-}
-
-// TODO(webrtc:14502): Rewrite these tests if the functionality is needed if
-// pacing is done on the worker thread.
-TEST(TaskQueuePacedSenderTest, LowPrecisionPacingWhenSlackIsEnabled) {
-  ScopedKeyValueConfig trials("WebRTC-SlackedTaskQueuePacedSender/Enabled/");
-
-  GlobalSimulatedTimeController time_controller(Timestamp::Millis(1234));
-  TaskQueueWithFakePrecisionFactory task_queue_factory(
-      time_controller.GetTaskQueueFactory());
-
-  MockPacketRouter packet_router;
-  TaskQueuePacedSender pacer(
-      time_controller.GetClock(), &packet_router, trials, &task_queue_factory,
-      PacingController::kMinSleepTime, TaskQueuePacedSender::kNoPacketHoldback);
-
-  // Send enough packets (covering one second) that pacing is triggered, i.e.
-  // delayed tasks being scheduled.
-  static constexpr size_t kPacketsToSend = 42;
-  static constexpr DataRate kPacingRate =
-      DataRate::BitsPerSec(kDefaultPacketSize * 8 * kPacketsToSend);
-  pacer.SetPacingRates(kPacingRate, DataRate::Zero());
-  pacer.EnsureStarted();
-  pacer.EnqueuePackets(
-      GeneratePackets(RtpPacketMediaType::kVideo, kPacketsToSend));
-  // Expect all of them to be sent.
-  size_t packets_sent = 0;
-  EXPECT_CALL(packet_router, SendPacket)
-      .WillRepeatedly(
-          [&](std::unique_ptr<RtpPacketToSend> packet,
-              const PacedPacketInfo& cluster_info) { ++packets_sent; });
-  time_controller.AdvanceTime(TimeDelta::Seconds(1));
-  EXPECT_EQ(packets_sent, kPacketsToSend);
-
-  // Expect pacing to make use of low precision.
-  EXPECT_GT(task_queue_factory.delayed_low_precision_count(), 0);
-  EXPECT_EQ(task_queue_factory.delayed_high_precision_count(), 0);
-
-  // Create probe cluster, which uses high precision despite regular pacing
-  // being low precision.
-  pacer.CreateProbeClusters(
-      {{.at_time = time_controller.GetClock()->CurrentTime(),
-        .target_data_rate = kPacingRate,
-        .target_duration = TimeDelta::Millis(15),
-        .target_probe_count = 4,
-        .id = 123}});
-  pacer.EnqueuePackets(GeneratePackets(RtpPacketMediaType::kVideo, 1));
-  time_controller.AdvanceTime(TimeDelta::Seconds(1));
-  EXPECT_GT(task_queue_factory.delayed_high_precision_count(), 0);
-}
-
 }  // namespace test
 }  // namespace webrtc