Control PeerConnectionFactory's default min/starting/max bitrates from experiment

Bug: webrtc:10865
Change-Id: Ida88d34d9ee4f390af44d157eef55288fde3773e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/148840
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28842}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index ddb6c33..f5c6254 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -221,6 +221,7 @@
     "../api:scoped_refptr",
     "../api/rtc_event_log",
     "../api/task_queue",
+    "../api/units:data_rate",
     "../api/video:builtin_video_bitrate_allocator_factory",
     "../api/video:video_frame",
     "../api/video:video_rtp_headers",
diff --git a/pc/peer_connection_factory.cc b/pc/peer_connection_factory.cc
index 52d1f82..08ef0d4 100644
--- a/pc/peer_connection_factory.cc
+++ b/pc/peer_connection_factory.cc
@@ -24,6 +24,7 @@
 #include "api/peer_connection_proxy.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/turn_customizer.h"
+#include "api/units/data_rate.h"
 #include "api/video_track_source_proxy.h"
 #include "media/base/rtp_data_engine.h"
 #include "media/sctp/sctp_transport.h"
@@ -37,6 +38,9 @@
 #include "pc/video_track.h"
 #include "rtc_base/bind.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/numerics/safe_conversions.h"
 #include "rtc_base/system/file_wrapper.h"
 #include "system_wrappers/include/field_trial.h"
 
@@ -334,19 +338,25 @@
     RtcEventLog* event_log) {
   RTC_DCHECK_RUN_ON(worker_thread_);
 
-  const int kMinBandwidthBps = 30000;
-  const int kStartBandwidthBps = 300000;
-  const int kMaxBandwidthBps = 2000000;
-
   webrtc::Call::Config call_config(event_log);
   if (!channel_manager_->media_engine() || !call_factory_) {
     return nullptr;
   }
   call_config.audio_state =
       channel_manager_->media_engine()->voice().GetAudioState();
-  call_config.bitrate_config.min_bitrate_bps = kMinBandwidthBps;
-  call_config.bitrate_config.start_bitrate_bps = kStartBandwidthBps;
-  call_config.bitrate_config.max_bitrate_bps = kMaxBandwidthBps;
+
+  FieldTrialParameter<DataRate> min_bandwidth("min", DataRate::kbps(30));
+  FieldTrialParameter<DataRate> start_bandwidth("start", DataRate::kbps(300));
+  FieldTrialParameter<DataRate> max_bandwidth("max", DataRate::kbps(2000));
+  ParseFieldTrial({&min_bandwidth, &start_bandwidth, &max_bandwidth},
+                  field_trial::FindFullName("WebRTC-PcFactoryDefaultBitrates"));
+
+  call_config.bitrate_config.min_bitrate_bps =
+      rtc::saturated_cast<int>(min_bandwidth->bps());
+  call_config.bitrate_config.start_bitrate_bps =
+      rtc::saturated_cast<int>(start_bandwidth->bps());
+  call_config.bitrate_config.max_bitrate_bps =
+      rtc::saturated_cast<int>(max_bandwidth->bps());
 
   call_config.fec_controller_factory = fec_controller_factory_.get();
   call_config.task_queue_factory = task_queue_factory_.get();