Reland "Add TaskQueueStdlib experiment."

This is a reland of commit 83db78e854ff35d57124f04aff9464c0862cd833

Original change's description:
> Add TaskQueueStdlib experiment.
>
> Bug: webrtc:14389
> Change-Id: I23c6e0ae675748ec35a99c334104dd2654995a33
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265802
> Commit-Queue: Ali Tofigh <alito@webrtc.org>
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
> Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#37888}

Bug: webrtc:14389
Change-Id: If84c7043e5f0f63ae8d9eae651daf900a72f2ee3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/273320
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Ali Tofigh <alito@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37923}
diff --git a/api/create_peerconnection_factory.cc b/api/create_peerconnection_factory.cc
index 4a01b2f..f9cc7ad 100644
--- a/api/create_peerconnection_factory.cc
+++ b/api/create_peerconnection_factory.cc
@@ -40,19 +40,20 @@
     rtc::scoped_refptr<AudioProcessing> audio_processing,
     AudioFrameProcessor* audio_frame_processor,
     std::unique_ptr<FieldTrialsView> field_trials) {
+  if (!field_trials) {
+    field_trials = std::make_unique<webrtc::FieldTrialBasedConfig>();
+  }
+
   PeerConnectionFactoryDependencies dependencies;
   dependencies.network_thread = network_thread;
   dependencies.worker_thread = worker_thread;
   dependencies.signaling_thread = signaling_thread;
-  dependencies.task_queue_factory = CreateDefaultTaskQueueFactory();
+  dependencies.task_queue_factory =
+      CreateDefaultTaskQueueFactory(field_trials.get());
   dependencies.call_factory = CreateCallFactory();
   dependencies.event_log_factory = std::make_unique<RtcEventLogFactory>(
       dependencies.task_queue_factory.get());
-  if (field_trials) {
-    dependencies.trials = std::move(field_trials);
-  } else {
-    dependencies.trials = std::make_unique<webrtc::FieldTrialBasedConfig>();
-  }
+  dependencies.trials = std::move(field_trials);
 
   if (network_thread) {
     // TODO(bugs.webrtc.org/13145): Add an rtc::SocketFactory* argument.
diff --git a/api/task_queue/BUILD.gn b/api/task_queue/BUILD.gn
index 8daa01d..2406bc0 100644
--- a/api/task_queue/BUILD.gn
+++ b/api/task_queue/BUILD.gn
@@ -61,7 +61,9 @@
     ]
   } else {
     deps = [
+      ":default_task_queue_factory",
       ":task_queue",
+      "../../api:field_trials_view",
       "../../api/units:time_delta",
       "../../rtc_base:refcount",
       "../../rtc_base:rtc_event",
@@ -81,11 +83,26 @@
     poisonous = [ "default_task_queue" ]
   }
   sources = [ "default_task_queue_factory.h" ]
-  deps = [ ":task_queue" ]
+  deps = [
+    ":task_queue",
+    "../../api:field_trials_view",
+    "../../rtc_base/memory:always_valid_pointer",
+  ]
 
   if (rtc_enable_libevent) {
-    sources += [ "default_task_queue_factory_libevent.cc" ]
-    deps += [ "../../rtc_base:rtc_task_queue_libevent" ]
+    if (is_android) {
+      sources +=
+          [ "default_task_queue_factory_stdlib_or_libevent_experiment.cc" ]
+      deps += [
+        "../../api/transport:field_trial_based_config",
+        "../../rtc_base:logging",
+        "../../rtc_base:rtc_task_queue_libevent",
+        "../../rtc_base:rtc_task_queue_stdlib",
+      ]
+    } else {
+      sources += [ "default_task_queue_factory_libevent.cc" ]
+      deps += [ "../../rtc_base:rtc_task_queue_libevent" ]
+    }
   } else if (is_mac || is_ios) {
     sources += [ "default_task_queue_factory_gcd.cc" ]
     deps += [ "../../rtc_base:rtc_task_queue_gcd" ]
diff --git a/api/task_queue/default_task_queue_factory.h b/api/task_queue/default_task_queue_factory.h
index ccdd1eb..1d2dbd7 100644
--- a/api/task_queue/default_task_queue_factory.h
+++ b/api/task_queue/default_task_queue_factory.h
@@ -12,11 +12,13 @@
 
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 
 namespace webrtc {
 
-std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory();
+std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory(
+    const FieldTrialsView* field_trials = nullptr);
 
 }  // namespace webrtc
 
diff --git a/api/task_queue/default_task_queue_factory_gcd.cc b/api/task_queue/default_task_queue_factory_gcd.cc
index 7e17b48..391f09b 100644
--- a/api/task_queue/default_task_queue_factory_gcd.cc
+++ b/api/task_queue/default_task_queue_factory_gcd.cc
@@ -9,12 +9,14 @@
  */
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "rtc_base/task_queue_gcd.h"
 
 namespace webrtc {
 
-std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory(
+    const FieldTrialsView* field_trials) {
   return CreateTaskQueueGcdFactory();
 }
 
diff --git a/api/task_queue/default_task_queue_factory_libevent.cc b/api/task_queue/default_task_queue_factory_libevent.cc
index f2fb418..89079f5 100644
--- a/api/task_queue/default_task_queue_factory_libevent.cc
+++ b/api/task_queue/default_task_queue_factory_libevent.cc
@@ -9,12 +9,14 @@
  */
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "rtc_base/task_queue_libevent.h"
 
 namespace webrtc {
 
-std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory(
+    const FieldTrialsView* field_trials) {
   return CreateTaskQueueLibeventFactory();
 }
 
diff --git a/api/task_queue/default_task_queue_factory_stdlib.cc b/api/task_queue/default_task_queue_factory_stdlib.cc
index ca7d720..10cda7c 100644
--- a/api/task_queue/default_task_queue_factory_stdlib.cc
+++ b/api/task_queue/default_task_queue_factory_stdlib.cc
@@ -9,12 +9,14 @@
  */
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "rtc_base/task_queue_stdlib.h"
 
 namespace webrtc {
 
-std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory(
+    const FieldTrialsView* field_trials) {
   return CreateTaskQueueStdlibFactory();
 }
 
diff --git a/api/task_queue/default_task_queue_factory_stdlib_or_libevent_experiment.cc b/api/task_queue/default_task_queue_factory_stdlib_or_libevent_experiment.cc
new file mode 100644
index 0000000..dc6e835
--- /dev/null
+++ b/api/task_queue/default_task_queue_factory_stdlib_or_libevent_experiment.cc
@@ -0,0 +1,38 @@
+/*
+ *  Copyright 2022 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include <memory>
+
+#include "api/field_trials_view.h"
+#include "api/task_queue/task_queue_factory.h"
+#include "api/transport/field_trial_based_config.h"
+#include "rtc_base/logging.h"
+#include "rtc_base/memory/always_valid_pointer.h"
+#include "rtc_base/task_queue_libevent.h"
+#include "rtc_base/task_queue_stdlib.h"
+
+namespace webrtc {
+
+std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory(
+    const FieldTrialsView* field_trials_view) {
+  AlwaysValidPointer<const FieldTrialsView, FieldTrialBasedConfig> field_trials(
+      field_trials_view);
+  if (field_trials->IsEnabled("WebRTC-TaskQueue-ReplaceLibeventWithStdlib")) {
+    RTC_LOG(LS_INFO) << "WebRTC-TaskQueue-ReplaceLibeventWithStdlib: "
+                     << "using TaskQueueStdlibFactory.";
+    return CreateTaskQueueStdlibFactory();
+  }
+
+  RTC_LOG(LS_INFO) << "WebRTC-TaskQueue-ReplaceLibeventWithStdlib: "
+                   << "using TaskQueueLibeventFactory.";
+  return CreateTaskQueueLibeventFactory();
+}
+
+}  // namespace webrtc
diff --git a/api/task_queue/default_task_queue_factory_win.cc b/api/task_queue/default_task_queue_factory_win.cc
index 493ea66..e3adc07 100644
--- a/api/task_queue/default_task_queue_factory_win.cc
+++ b/api/task_queue/default_task_queue_factory_win.cc
@@ -9,12 +9,14 @@
  */
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "rtc_base/task_queue_win.h"
 
 namespace webrtc {
 
-std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory(
+    const FieldTrialsView* field_trials) {
   return CreateTaskQueueWinFactory();
 }
 
diff --git a/api/task_queue/task_queue_test.cc b/api/task_queue/task_queue_test.cc
index 69532d6..0f6b1d0 100644
--- a/api/task_queue/task_queue_test.cc
+++ b/api/task_queue/task_queue_test.cc
@@ -13,6 +13,7 @@
 
 #include "absl/cleanup/cleanup.h"
 #include "absl/strings/string_view.h"
+#include "api/task_queue/default_task_queue_factory.h"
 #include "api/units/time_delta.h"
 #include "rtc_base/event.h"
 #include "rtc_base/ref_counter.h"
@@ -29,13 +30,13 @@
 }
 
 TEST_P(TaskQueueTest, Construct) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   auto queue = CreateTaskQueue(factory, "Construct");
   EXPECT_FALSE(queue->IsCurrent());
 }
 
 TEST_P(TaskQueueTest, PostAndCheckCurrent) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   rtc::Event event;
   auto queue = CreateTaskQueue(factory, "PostAndCheckCurrent");
 
@@ -53,7 +54,7 @@
 }
 
 TEST_P(TaskQueueTest, PostCustomTask) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   rtc::Event ran;
   auto queue = CreateTaskQueue(factory, "PostCustomImplementation");
 
@@ -72,7 +73,7 @@
 }
 
 TEST_P(TaskQueueTest, PostDelayedZero) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   rtc::Event event;
   auto queue = CreateTaskQueue(factory, "PostDelayedZero");
 
@@ -81,7 +82,7 @@
 }
 
 TEST_P(TaskQueueTest, PostFromQueue) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   rtc::Event event;
   auto queue = CreateTaskQueue(factory, "PostFromQueue");
 
@@ -91,7 +92,7 @@
 }
 
 TEST_P(TaskQueueTest, PostDelayed) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   rtc::Event event;
   auto queue =
       CreateTaskQueue(factory, "PostDelayed", TaskQueueFactory::Priority::HIGH);
@@ -113,7 +114,7 @@
 }
 
 TEST_P(TaskQueueTest, PostMultipleDelayed) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   auto queue = CreateTaskQueue(factory, "PostMultipleDelayed");
 
   std::vector<rtc::Event> events(100);
@@ -132,7 +133,7 @@
 }
 
 TEST_P(TaskQueueTest, PostDelayedAfterDestruct) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   rtc::Event run;
   rtc::Event deleted;
   auto queue = CreateTaskQueue(factory, "PostDelayedAfterDestruct");
@@ -147,7 +148,7 @@
 }
 
 TEST_P(TaskQueueTest, PostAndReuse) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   rtc::Event event;
   auto post_queue = CreateTaskQueue(factory, "PostQueue");
   auto reply_queue = CreateTaskQueue(factory, "ReplyQueue");
@@ -203,7 +204,7 @@
     rtc::Event event_;
   };
 
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   static constexpr int kTaskCount = 0xffff;
   rtc::Event posting_done;
   BlockingCounter all_destroyed(kTaskCount);
@@ -247,7 +248,7 @@
 // unit test, run it under TSan or some other tool that is able to
 // directly detect data races.
 TEST_P(TaskQueueTest, PostTwoWithSharedUnprotectedState) {
-  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+  std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
   struct SharedState {
     // First task will set this value to 1 and second will assert it.
     int state = 0;
diff --git a/api/task_queue/task_queue_test.h b/api/task_queue/task_queue_test.h
index e2e4730..214f950 100644
--- a/api/task_queue/task_queue_test.h
+++ b/api/task_queue/task_queue_test.h
@@ -13,6 +13,7 @@
 #include <functional>
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "test/gtest.h"
 
@@ -31,9 +32,9 @@
 // INSTANTIATE_TEST_SUITE_P(My, TaskQueueTest, Values(CreateMyFactory));
 //
 // }  // namespace
-class TaskQueueTest : public ::testing::TestWithParam<
-                          std::function<std::unique_ptr<TaskQueueFactory>()>> {
-};
+class TaskQueueTest
+    : public ::testing::TestWithParam<std::function<
+          std::unique_ptr<TaskQueueFactory>(const FieldTrialsView*)>> {};
 
 }  // namespace webrtc
 
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 9938be8..b7a9ec4 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -1758,6 +1758,7 @@
         ":threading",
         ":timeutils",
         "../api:array_view",
+        "../api:field_trials_view",
         "../api:make_ref_counted",
         "../api/task_queue",
         "../api/task_queue:pending_task_safety_flag",
diff --git a/rtc_base/thread_unittest.cc b/rtc_base/thread_unittest.cc
index a800671..a6b2494 100644
--- a/rtc_base/thread_unittest.cc
+++ b/rtc_base/thread_unittest.cc
@@ -12,6 +12,7 @@
 
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/task_queue/task_queue_test.h"
 #include "api/units/time_delta.h"
@@ -1083,11 +1084,16 @@
   }
 };
 
+std::unique_ptr<webrtc::TaskQueueFactory> CreateDefaultThreadFactory(
+    const webrtc::FieldTrialsView*) {
+  return std::make_unique<ThreadFactory>();
+}
+
 using ::webrtc::TaskQueueTest;
 
 INSTANTIATE_TEST_SUITE_P(RtcThread,
                          TaskQueueTest,
-                         ::testing::Values(std::make_unique<ThreadFactory>));
+                         ::testing::Values(CreateDefaultThreadFactory));
 
 }  // namespace
 }  // namespace rtc
diff --git a/rtc_tools/video_replay.cc b/rtc_tools/video_replay.cc
index 7d331ad..1a7bfad 100644
--- a/rtc_tools/video_replay.cc
+++ b/rtc_tools/video_replay.cc
@@ -340,21 +340,22 @@
   // Replay a rtp dump with an optional json configuration.
   static void Replay(const std::string& replay_config_path,
                      const std::string& rtp_dump_path) {
+    webrtc::RtcEventLogNull event_log;
+    Call::Config call_config(&event_log);
+    call_config.trials = new FieldTrialBasedConfig();
+
     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
-        webrtc::CreateDefaultTaskQueueFactory();
+        webrtc::CreateDefaultTaskQueueFactory(call_config.trials);
     auto worker_thread = task_queue_factory->CreateTaskQueue(
         "worker_thread", TaskQueueFactory::Priority::NORMAL);
     rtc::Event sync_event(/*manual_reset=*/false,
                           /*initially_signalled=*/false);
-    webrtc::RtcEventLogNull event_log;
-    Call::Config call_config(&event_log);
     call_config.task_queue_factory = task_queue_factory.get();
-    call_config.trials = new FieldTrialBasedConfig();
-    std::unique_ptr<Call> call;
-    std::unique_ptr<StreamState> stream_state;
 
     // Creation of the streams must happen inside a task queue because it is
     // resued as a worker thread.
+    std::unique_ptr<Call> call;
+    std::unique_ptr<StreamState> stream_state;
     worker_thread->PostTask([&]() {
       call.reset(Call::Create(call_config));
 
diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm
index 84c5f02..e2215c8 100644
--- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm
+++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm
@@ -173,8 +173,9 @@
     if (webrtc::field_trial::IsEnabled("WebRTC-Network-UseNWPathMonitor")) {
       dependencies.network_monitor_factory = webrtc::CreateNetworkMonitorFactory();
     }
-    dependencies.task_queue_factory = webrtc::CreateDefaultTaskQueueFactory();
     dependencies.trials = std::make_unique<webrtc::FieldTrialBasedConfig>();
+    dependencies.task_queue_factory =
+        webrtc::CreateDefaultTaskQueueFactory(dependencies.trials.get());
     cricket::MediaEngineDependencies media_deps;
     media_deps.adm = std::move(audioDeviceModule);
     media_deps.task_queue_factory = dependencies.task_queue_factory.get();