Use runtime enabled features API to enable dual stream mode

Bug: webrtc:8287
Change-Id: I1a366d959a8b7f2a704baa7ea8ace64c1c398d52
Reviewed-on: https://webrtc-review.googlesource.com/39008
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Patrik Höglund <phoglund@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21661}
diff --git a/BUILD.gn b/BUILD.gn
index bb5c953..9e24f37 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -434,6 +434,7 @@
       "rtc_base:sequenced_task_checker_unittests",
       "rtc_base:weak_ptr_unittests",
       "system_wrappers:metrics_default",
+      "system_wrappers:runtime_enabled_features_default",
     ]
 
     if (rtc_enable_protobuf) {
diff --git a/call/BUILD.gn b/call/BUILD.gn
index 03ed9b4..90b44cf 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -263,6 +263,7 @@
       "../rtc_base:rtc_base_approved",
       "../system_wrappers",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:direct_transport",
       "../test:fake_audio_device",
       "../test:field_trial",
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index 36065e4..1bbcf74 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -169,12 +169,14 @@
         ":AppRTCMobile_ios_frameworks",
         "../sdk:common_objc",
         "../system_wrappers:field_trial_default",
+        "../system_wrappers:runtime_enabled_features_default",
       ]
     } else {
       deps = [
         "../sdk:common_objc",
         "../system_wrappers:field_trial_default",
         "../system_wrappers:metrics_default",
+        "../system_wrappers:runtime_enabled_features_default",
       ]
     }
   }
@@ -556,6 +558,7 @@
       "../rtc_base:rtc_json",
       "../system_wrappers:field_trial_default",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "//third_party/libyuv",
     ]
   }
@@ -594,6 +597,7 @@
       "../rtc_base:rtc_base_approved",
       "../system_wrappers:field_trial_default",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
     ]
     if (!build_with_chromium && is_clang) {
       # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
@@ -612,6 +616,7 @@
       "../rtc_base:rtc_base_approved",
       "../system_wrappers:field_trial_default",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
     ]
     if (!build_with_chromium && is_clang) {
       # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
@@ -630,6 +635,7 @@
       "../rtc_base:rtc_base_approved",
       "../system_wrappers:field_trial_default",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
     ]
     if (!build_with_chromium && is_clang) {
       # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
@@ -689,6 +695,7 @@
       "../rtc_base:rtc_base",
       "../system_wrappers:field_trial_default",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
     ]
     if (is_android) {
       deps += [ "../sdk/android:libjingle_peerconnection_jni" ]
diff --git a/media/BUILD.gn b/media/BUILD.gn
index bfd91ce..9be093c 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -612,6 +612,7 @@
       "../rtc_base:rtc_base_tests_main",
       "../rtc_base:rtc_base_tests_utils",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:audio_codec_mocks",
       "../test:test_support",
       "../test:video_test_common",
diff --git a/modules/congestion_controller/BUILD.gn b/modules/congestion_controller/BUILD.gn
index cf303a5..84de71d 100644
--- a/modules/congestion_controller/BUILD.gn
+++ b/modules/congestion_controller/BUILD.gn
@@ -48,6 +48,7 @@
     "../../system_wrappers",
     "../../system_wrappers:field_trial_api",
     "../../system_wrappers:metrics_api",
+    "../../system_wrappers:runtime_enabled_features_api",
     "../bitrate_controller",
     "../pacing",
     "../remote_bitrate_estimator",
diff --git a/modules/congestion_controller/send_side_congestion_controller.cc b/modules/congestion_controller/send_side_congestion_controller.cc
index 2aeed51..cb3e610 100644
--- a/modules/congestion_controller/send_side_congestion_controller.cc
+++ b/modules/congestion_controller/send_side_congestion_controller.cc
@@ -28,6 +28,7 @@
 #include "rtc_base/socket.h"
 #include "rtc_base/timeutils.h"
 #include "system_wrappers/include/field_trial.h"
+#include "system_wrappers/include/runtime_enabled_features.h"
 
 namespace webrtc {
 namespace {
@@ -93,6 +94,13 @@
   std::sort(input->begin(), input->end(), PacketFeedbackComparator());
 }
 
+bool IsPacerPushbackExperimentEnabled() {
+  return webrtc::field_trial::IsEnabled(kPacerPushbackExperiment) || (
+      !webrtc::field_trial::IsDisabled(kPacerPushbackExperiment) &&
+      webrtc::runtime_enabled_features::IsFeatureEnabled(
+          webrtc::runtime_enabled_features::kDualStreamModeFeatureName));
+}
+
 }  // namespace
 
 SendSideCongestionController::SendSideCongestionController(
@@ -124,7 +132,7 @@
       accepted_queue_ms_(kDefaultAcceptedQueueMs),
       was_in_alr_(false),
       pacer_pushback_experiment_(
-          webrtc::field_trial::IsEnabled(kPacerPushbackExperiment)) {
+          IsPacerPushbackExperimentEnabled()) {
   delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
   if (in_cwnd_experiment_ &&
       !ReadCwndExperimentParameter(&accepted_queue_ms_)) {
diff --git a/modules/pacing/BUILD.gn b/modules/pacing/BUILD.gn
index 3734fcf..df83aa5 100644
--- a/modules/pacing/BUILD.gn
+++ b/modules/pacing/BUILD.gn
@@ -43,6 +43,7 @@
     "../../rtc_base/experiments:alr_experiment",
     "../../system_wrappers",
     "../../system_wrappers:field_trial_api",
+    "../../system_wrappers:runtime_enabled_features_api",
     "../remote_bitrate_estimator",
     "../rtp_rtcp",
     "../rtp_rtcp:rtp_rtcp_format",
@@ -69,6 +70,7 @@
       "../../rtc_base/experiments:alr_experiment",
       "../../system_wrappers",
       "../../system_wrappers:field_trial_api",
+      "../../system_wrappers:runtime_enabled_features_api",
       "../../test:field_trial",
       "../../test:test_support",
       "../rtp_rtcp",
diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc
index 6ca4599..f559ffc 100644
--- a/modules/pacing/paced_sender.cc
+++ b/modules/pacing/paced_sender.cc
@@ -27,6 +27,7 @@
 #include "rtc_base/ptr_util.h"
 #include "system_wrappers/include/clock.h"
 #include "system_wrappers/include/field_trial.h"
+#include "system_wrappers/include/runtime_enabled_features.h"
 
 namespace {
 // Time limit in milliseconds between packet bursts.
@@ -37,6 +38,15 @@
 // time.
 const int64_t kMaxIntervalTimeMs = 30;
 
+const char kRoundRobinExperimentName[] = "WebRTC-RoundRobinPacing";
+
+bool IsRoundRobinPacingEnabled() {
+  return webrtc::field_trial::IsEnabled(kRoundRobinExperimentName) || (
+      !webrtc::field_trial::IsDisabled(kRoundRobinExperimentName) &&
+      webrtc::runtime_enabled_features::IsFeatureEnabled(
+          webrtc::runtime_enabled_features::kDualStreamModeFeatureName));
+}
+
 }  // namespace
 
 namespace webrtc {
@@ -48,7 +58,7 @@
                          PacketSender* packet_sender,
                          RtcEventLog* event_log) :
     PacedSender(clock, packet_sender, event_log,
-                webrtc::field_trial::IsEnabled("WebRTC-RoundRobinPacing")
+                IsRoundRobinPacingEnabled()
                     ? rtc::MakeUnique<PacketQueue2>(clock)
                     : rtc::MakeUnique<PacketQueue>(clock)) {}
 
diff --git a/ortc/BUILD.gn b/ortc/BUILD.gn
index 0150d89..2005556 100644
--- a/ortc/BUILD.gn
+++ b/ortc/BUILD.gn
@@ -91,6 +91,7 @@
       "../rtc_base:rtc_base_tests_main",
       "../rtc_base:rtc_base_tests_utils",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
     ]
 
     if (!build_with_chromium && is_clang) {
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 27679ac..58e27c0 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -309,6 +309,7 @@
       "../rtc_base:rtc_base_tests_main",
       "../rtc_base:rtc_base_tests_utils",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:test_support",
     ]
 
@@ -495,6 +496,7 @@
       "../rtc_base:rtc_base_tests_main",
       "../rtc_base:rtc_base_tests_utils",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:audio_codec_mocks",
       "../test:test_support",
     ]
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 121e47c..b587a55 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -751,6 +751,7 @@
           "../rtc_base:rtc_base_approved",
           "../system_wrappers:field_trial_default",
           "../system_wrappers:metrics_default",
+          "../system_wrappers:runtime_enabled_features_default",
         ]
 
         libs = [
@@ -779,6 +780,7 @@
         ":ui_objc",
         "../system_wrappers:field_trial_default",
         "../system_wrappers:metrics_default",
+        "../system_wrappers:runtime_enabled_features_default",
       ]
     }
 
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index fa4a8f9..e484632 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -471,6 +471,7 @@
     "../../system_wrappers:field_trial_default",
     "../../system_wrappers:metrics_api",
     "../../system_wrappers:metrics_default",
+    "../../system_wrappers:runtime_enabled_features_default",
   ]
 }
 
diff --git a/system_wrappers/include/runtime_enabled_features.h b/system_wrappers/include/runtime_enabled_features.h
index a972cda..9ccbedc 100644
--- a/system_wrappers/include/runtime_enabled_features.h
+++ b/system_wrappers/include/runtime_enabled_features.h
@@ -21,8 +21,12 @@
 // TODO(ilnik): Find a more flexible way to use Chrome features.
 // This interface requires manual translation from feature name to
 // Chrome feature class in third_party/webrtc_overrides.
+
 namespace webrtc {
 namespace runtime_enabled_features {
+
+const char kDualStreamModeFeatureName[] = "WebRtcDualStreamMode";
+
 bool IsFeatureEnabled(std::string feature_name);
 
 }  // namespace runtime_enabled_features
diff --git a/system_wrappers/source/runtime_enabled_features_default.cc b/system_wrappers/source/runtime_enabled_features_default.cc
index cd0d157..31a3ff7 100644
--- a/system_wrappers/source/runtime_enabled_features_default.cc
+++ b/system_wrappers/source/runtime_enabled_features_default.cc
@@ -22,7 +22,7 @@
 namespace runtime_enabled_features {
 
 bool IsFeatureEnabled(std::string feature_name) {
-  if (feature_name == "WebRtcDualStreamMode")
+  if (feature_name == kDualStreamModeFeatureName)
     return flags::FLAG_enable_dual_stream_mode;
   return false;
 }
diff --git a/test/BUILD.gn b/test/BUILD.gn
index a83e8bb..d7a2e77 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -214,6 +214,7 @@
       ":perf_test",
       "../rtc_base:rtc_base_approved",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "//testing/gmock",
       "//testing/gtest",
     ]
@@ -626,6 +627,7 @@
     "../rtc_base:sequenced_task_checker",
     "../system_wrappers",
     "../system_wrappers:field_trial_api",
+    "../system_wrappers:runtime_enabled_features_api",
     "../video",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 0ccabfc..90fb62c 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -18,6 +18,7 @@
     "../../rtc_base:rtc_base_approved",
     "../../system_wrappers:field_trial_default",
     "../../system_wrappers:metrics_default",
+    "../../system_wrappers:runtime_enabled_features_default",
     "//testing/libfuzzer:libfuzzer_main",
   ]
 }
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 8502691..3d2d5e9 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -169,6 +169,7 @@
       ":video_quality_test",
       "../rtc_base:rtc_base_approved",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:field_trial",
       "../test:run_test",
       "../test:run_test_interface",
@@ -194,6 +195,7 @@
       ":video_quality_test",
       "../rtc_base:rtc_base_approved",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:field_trial",
       "../test:run_test",
       "../test:run_test_interface",
@@ -217,6 +219,7 @@
       ":video_quality_test",
       "../rtc_base:rtc_base_approved",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:field_trial",
       "../test:run_test",
       "../test:run_test_interface",
@@ -249,6 +252,7 @@
       "../rtc_base:rtc_base_approved",
       "../system_wrappers",
       "../system_wrappers:metrics_default",
+      "../system_wrappers:runtime_enabled_features_default",
       "../test:field_trial",
       "../test:rtp_test_utils",
       "../test:run_test",