Remove direct use of FieldTrials from AlrDetector

Instead use WebRtcKeyValueConfig and FieldTrialBasedConfig.
The purpose is to allow a user of GoogCC to use different settings on different instances.

BUG=webrtc:10335

Change-Id: I2f837688c9fdd341eecb44484cc784b1c80da1a9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/132791
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27617}
diff --git a/modules/congestion_controller/goog_cc/BUILD.gn b/modules/congestion_controller/goog_cc/BUILD.gn
index d9749bc..e21e1a1 100644
--- a/modules/congestion_controller/goog_cc/BUILD.gn
+++ b/modules/congestion_controller/goog_cc/BUILD.gn
@@ -89,6 +89,7 @@
     "alr_detector.h",
   ]
   deps = [
+    "../../../api/transport:field_trial_based_config",
     "../../../api/transport:webrtc_key_value_config",
     "../../../logging:rtc_event_log_api",
     "../../../logging:rtc_event_pacing",
diff --git a/modules/congestion_controller/goog_cc/alr_detector.cc b/modules/congestion_controller/goog_cc/alr_detector.cc
index 3009de4..2bcea3e 100644
--- a/modules/congestion_controller/goog_cc/alr_detector.cc
+++ b/modules/congestion_controller/goog_cc/alr_detector.cc
@@ -23,20 +23,25 @@
 #include "rtc_base/time_utils.h"
 
 namespace webrtc {
-AlrDetector::AlrDetector() : AlrDetector(nullptr) {}
 
-AlrDetector::AlrDetector(RtcEventLog* event_log)
+AlrDetector::AlrDetector(const WebRtcKeyValueConfig* key_value_config)
+    : AlrDetector(key_value_config, nullptr) {}
+
+AlrDetector::AlrDetector(const WebRtcKeyValueConfig* key_value_config,
+                         RtcEventLog* event_log)
     : bandwidth_usage_percent_(kDefaultAlrBandwidthUsagePercent),
       alr_start_budget_level_percent_(kDefaultAlrStartBudgetLevelPercent),
       alr_stop_budget_level_percent_(kDefaultAlrStopBudgetLevelPercent),
       alr_budget_(0, true),
       event_log_(event_log) {
-  RTC_CHECK(AlrExperimentSettings::MaxOneFieldTrialEnabled());
+  RTC_CHECK(AlrExperimentSettings::MaxOneFieldTrialEnabled(*key_value_config));
   absl::optional<AlrExperimentSettings> experiment_settings =
       AlrExperimentSettings::CreateFromFieldTrial(
+          *key_value_config,
           AlrExperimentSettings::kScreenshareProbingBweExperimentName);
   if (!experiment_settings) {
     experiment_settings = AlrExperimentSettings::CreateFromFieldTrial(
+        *key_value_config,
         AlrExperimentSettings::kStrictPacingAndProbingExperimentName);
   }
   if (experiment_settings) {
diff --git a/modules/congestion_controller/goog_cc/alr_detector.h b/modules/congestion_controller/goog_cc/alr_detector.h
index c30ba1d..b58c926 100644
--- a/modules/congestion_controller/goog_cc/alr_detector.h
+++ b/modules/congestion_controller/goog_cc/alr_detector.h
@@ -15,6 +15,7 @@
 #include <stdint.h>
 
 #include "absl/types/optional.h"
+#include "api/transport/webrtc_key_value_config.h"
 #include "modules/pacing/interval_budget.h"
 
 namespace webrtc {
@@ -30,8 +31,9 @@
 // Note: This class is not thread-safe.
 class AlrDetector {
  public:
-  AlrDetector();
-  explicit AlrDetector(RtcEventLog* event_log);
+  explicit AlrDetector(const WebRtcKeyValueConfig* key_value_config);
+  AlrDetector(const WebRtcKeyValueConfig* key_value_config,
+              RtcEventLog* event_log);
   ~AlrDetector();
 
   void OnBytesSent(size_t bytes_sent, int64_t send_time_ms);
diff --git a/modules/congestion_controller/goog_cc/alr_detector_unittest.cc b/modules/congestion_controller/goog_cc/alr_detector_unittest.cc
index 2c8232c..c1f96a1 100644
--- a/modules/congestion_controller/goog_cc/alr_detector_unittest.cc
+++ b/modules/congestion_controller/goog_cc/alr_detector_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "modules/congestion_controller/goog_cc/alr_detector.h"
 
+#include "api/transport/field_trial_based_config.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/experiments/alr_experiment.h"
 #include "test/field_trial.h"
@@ -71,11 +72,13 @@
 
 class AlrDetectorTest : public ::testing::Test {
  public:
+  AlrDetectorTest() : alr_detector_(&field_trials_) {}
   void SetUp() override {
     alr_detector_.SetEstimatedBitrate(kEstimatedBitrateBps);
   }
 
  protected:
+  FieldTrialBasedConfig field_trials_;
   AlrDetector alr_detector_;
   int64_t timestamp_ms_ = 1000;
 };
@@ -153,7 +156,7 @@
       "WebRTC-ProbingScreenshareBwe/Control/");
   absl::optional<AlrExperimentSettings> parsed_params =
       AlrExperimentSettings::CreateFromFieldTrial(
-          "WebRTC-ProbingScreenshareBwe");
+          FieldTrialBasedConfig(), "WebRTC-ProbingScreenshareBwe");
   EXPECT_FALSE(static_cast<bool>(parsed_params));
 }
 
@@ -162,7 +165,7 @@
       "WebRTC-ProbingScreenshareBwe/1.1,2875,85,20,-20,1/");
   absl::optional<AlrExperimentSettings> parsed_params =
       AlrExperimentSettings::CreateFromFieldTrial(
-          "WebRTC-ProbingScreenshareBwe");
+          FieldTrialBasedConfig(), "WebRTC-ProbingScreenshareBwe");
   ASSERT_TRUE(static_cast<bool>(parsed_params));
   EXPECT_EQ(1.1f, parsed_params->pacing_factor);
   EXPECT_EQ(2875, parsed_params->max_paced_queue_time);
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
index 06d94fe..489f6a0 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
@@ -105,7 +105,7 @@
               : nullptr),
       bandwidth_estimation_(
           absl::make_unique<SendSideBandwidthEstimation>(event_log_)),
-      alr_detector_(absl::make_unique<AlrDetector>()),
+      alr_detector_(absl::make_unique<AlrDetector>(key_value_config_)),
       probe_bitrate_estimator_(new ProbeBitrateEstimator(event_log)),
       delay_based_bwe_(new DelayBasedBwe(key_value_config_,
                                          event_log_,
diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc
index e6331f2..71302f1 100644
--- a/modules/pacing/paced_sender.cc
+++ b/modules/pacing/paced_sender.cc
@@ -46,7 +46,6 @@
 }
 
 }  // namespace
-
 const int64_t PacedSender::kMaxQueueLengthMs = 2000;
 const float PacedSender::kDefaultPaceMultiplier = 2.5f;
 
@@ -54,31 +53,23 @@
                          PacketSender* packet_sender,
                          RtcEventLog* event_log,
                          const WebRtcKeyValueConfig* field_trials)
-    : PacedSender(clock,
-                  packet_sender,
-                  event_log,
-                  field_trials
-                      ? *field_trials
-                      : static_cast<const webrtc::WebRtcKeyValueConfig&>(
-                            FieldTrialBasedConfig())) {}
-
-PacedSender::PacedSender(Clock* clock,
-                         PacketSender* packet_sender,
-                         RtcEventLog* event_log,
-                         const WebRtcKeyValueConfig& field_trials)
     : clock_(clock),
       packet_sender_(packet_sender),
+      fallback_field_trials_(
+          !field_trials ? absl::make_unique<FieldTrialBasedConfig>() : nullptr),
+      field_trials_(field_trials ? field_trials : fallback_field_trials_.get()),
       alr_detector_(),
-      drain_large_queues_(!IsDisabled(field_trials, "WebRTC-Pacer-DrainQueue")),
+      drain_large_queues_(
+          !IsDisabled(*field_trials_, "WebRTC-Pacer-DrainQueue")),
       send_padding_if_silent_(
-          IsEnabled(field_trials, "WebRTC-Pacer-PadInSilence")),
-      pace_audio_(!IsDisabled(field_trials, "WebRTC-Pacer-BlockAudio")),
+          IsEnabled(*field_trials_, "WebRTC-Pacer-PadInSilence")),
+      pace_audio_(!IsDisabled(*field_trials_, "WebRTC-Pacer-BlockAudio")),
       min_packet_limit_ms_("", kDefaultMinPacketLimitMs),
       last_timestamp_ms_(clock_->TimeInMilliseconds()),
       paused_(false),
       media_budget_(0),
       padding_budget_(0),
-      prober_(field_trials),
+      prober_(*field_trials_),
       probing_send_failure_(false),
       estimated_bitrate_bps_(0),
       min_send_bitrate_kbps_(0u),
@@ -97,7 +88,7 @@
                            "pushback experiment must be enabled.";
   }
   ParseFieldTrial({&min_packet_limit_ms_},
-                  field_trials.Lookup("WebRTC-Pacer-MinPacketLimitMs"));
+                  field_trials_->Lookup("WebRTC-Pacer-MinPacketLimitMs"));
   UpdateBudgetWithElapsedTime(min_packet_limit_ms_);
 }
 
@@ -184,7 +175,7 @@
       std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) *
       pacing_factor_;
   if (!alr_detector_)
-    alr_detector_ = absl::make_unique<AlrDetector>(nullptr /*event_log*/);
+    alr_detector_ = absl::make_unique<AlrDetector>(field_trials_);
   alr_detector_->SetEstimatedBitrate(bitrate_bps);
 }
 
@@ -248,7 +239,7 @@
 absl::optional<int64_t> PacedSender::GetApplicationLimitedRegionStartTime() {
   rtc::CritScope cs(&critsect_);
   if (!alr_detector_)
-    alr_detector_ = absl::make_unique<AlrDetector>(nullptr /*event_log*/);
+    alr_detector_ = absl::make_unique<AlrDetector>(field_trials_);
   return alr_detector_->GetApplicationLimitedRegionStartTime();
 }
 
diff --git a/modules/pacing/paced_sender.h b/modules/pacing/paced_sender.h
index a6aad24..8f9f413 100644
--- a/modules/pacing/paced_sender.h
+++ b/modules/pacing/paced_sender.h
@@ -150,11 +150,6 @@
   void SetQueueTimeLimit(int limit_ms);
 
  private:
-  PacedSender(Clock* clock,
-              PacketSender* packet_sender,
-              RtcEventLog* event_log,
-              const WebRtcKeyValueConfig& field_trials);
-
   int64_t UpdateTimeAndGetElapsedMs(int64_t now_us)
       RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
   bool ShouldSendKeepalive(int64_t at_time_us) const
@@ -179,6 +174,8 @@
 
   Clock* const clock_;
   PacketSender* const packet_sender_;
+  const std::unique_ptr<FieldTrialBasedConfig> fallback_field_trials_;
+  const WebRtcKeyValueConfig* field_trials_;
   std::unique_ptr<AlrDetector> alr_detector_ RTC_PT_GUARDED_BY(critsect_);
 
   const bool drain_large_queues_;
diff --git a/rtc_base/experiments/BUILD.gn b/rtc_base/experiments/BUILD.gn
index 70dcb5b..fc9673a 100644
--- a/rtc_base/experiments/BUILD.gn
+++ b/rtc_base/experiments/BUILD.gn
@@ -15,7 +15,8 @@
   ]
   deps = [
     "../:rtc_base_approved",
-    "../../system_wrappers:field_trial",
+    "../../api/transport:field_trial_based_config",
+    "../../api/transport:webrtc_key_value_config",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
 }
diff --git a/rtc_base/experiments/alr_experiment.cc b/rtc_base/experiments/alr_experiment.cc
index 15a3438..7bbca5c 100644
--- a/rtc_base/experiments/alr_experiment.cc
+++ b/rtc_base/experiments/alr_experiment.cc
@@ -14,8 +14,8 @@
 #include <stdio.h>
 #include <string>
 
+#include "api/transport/field_trial_based_config.h"
 #include "rtc_base/logging.h"
-#include "system_wrappers/include/field_trial.h"
 
 namespace webrtc {
 
@@ -26,16 +26,29 @@
 const char kDefaultProbingScreenshareBweSettings[] = "1.0,2875,80,40,-60,3";
 
 bool AlrExperimentSettings::MaxOneFieldTrialEnabled() {
-  return field_trial::FindFullName(kStrictPacingAndProbingExperimentName)
+  return AlrExperimentSettings::MaxOneFieldTrialEnabled(
+      FieldTrialBasedConfig());
+}
+
+bool AlrExperimentSettings::MaxOneFieldTrialEnabled(
+    const WebRtcKeyValueConfig& key_value_config) {
+  return key_value_config.Lookup(kStrictPacingAndProbingExperimentName)
              .empty() ||
-         field_trial::FindFullName(kScreenshareProbingBweExperimentName)
-             .empty();
+         key_value_config.Lookup(kScreenshareProbingBweExperimentName).empty();
 }
 
 absl::optional<AlrExperimentSettings>
 AlrExperimentSettings::CreateFromFieldTrial(const char* experiment_name) {
+  return AlrExperimentSettings::CreateFromFieldTrial(FieldTrialBasedConfig(),
+                                                     experiment_name);
+}
+
+absl::optional<AlrExperimentSettings>
+AlrExperimentSettings::CreateFromFieldTrial(
+    const WebRtcKeyValueConfig& key_value_config,
+    const char* experiment_name) {
   absl::optional<AlrExperimentSettings> ret;
-  std::string group_name = field_trial::FindFullName(experiment_name);
+  std::string group_name = key_value_config.Lookup(experiment_name);
 
   const std::string kIgnoredSuffix = "_Dogfood";
   std::string::size_type suffix_pos = group_name.rfind(kIgnoredSuffix);
diff --git a/rtc_base/experiments/alr_experiment.h b/rtc_base/experiments/alr_experiment.h
index 876bd02..5b0661c 100644
--- a/rtc_base/experiments/alr_experiment.h
+++ b/rtc_base/experiments/alr_experiment.h
@@ -14,6 +14,7 @@
 #include <stdint.h>
 
 #include "absl/types/optional.h"
+#include "api/transport/webrtc_key_value_config.h"
 
 namespace webrtc {
 struct AlrExperimentSettings {
@@ -32,7 +33,12 @@
   static const char kStrictPacingAndProbingExperimentName[];
   static absl::optional<AlrExperimentSettings> CreateFromFieldTrial(
       const char* experiment_name);
+  static absl::optional<AlrExperimentSettings> CreateFromFieldTrial(
+      const WebRtcKeyValueConfig& key_value_config,
+      const char* experiment_name);
   static bool MaxOneFieldTrialEnabled();
+  static bool MaxOneFieldTrialEnabled(
+      const WebRtcKeyValueConfig& key_value_config);
 
  private:
   AlrExperimentSettings() = default;