Expose Environment as dependency for VoipEngine

This allows to inject field trials into VoipEngine
 without using global field trials.
Exposing full Environment also allows to share it across VoipEngine
 and other WebRTC components that require Environment.

Bug: webrtc:42220378
Change-Id: I18f96713d479371d5275e2350bc97b9a99df07cb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/383380
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44255}
diff --git a/api/voip/BUILD.gn b/api/voip/BUILD.gn
index 8e8f235..36d2e71 100644
--- a/api/voip/BUILD.gn
+++ b/api/voip/BUILD.gn
@@ -67,12 +67,13 @@
     sources = [ "test/voip_engine_factory_unittest.cc" ]
     deps = [
       ":voip_engine_factory",
+      "..:field_trials",
       "..:make_ref_counted",
       "../../modules/audio_device:mock_audio_device",
       "../../modules/audio_processing:mocks",
       "../../test:audio_codec_mocks",
       "../../test:test_support",
-      "../task_queue:default_task_queue_factory",
+      "../environment:environment_factory",
     ]
   }
 
diff --git a/api/voip/test/voip_engine_factory_unittest.cc b/api/voip/test/voip_engine_factory_unittest.cc
index dc8484b..8671b05 100644
--- a/api/voip/test/voip_engine_factory_unittest.cc
+++ b/api/voip/test/voip_engine_factory_unittest.cc
@@ -13,8 +13,9 @@
 #include <memory>
 #include <utility>
 
+#include "api/environment/environment_factory.h"
+#include "api/field_trials.h"
 #include "api/make_ref_counted.h"
-#include "api/task_queue/default_task_queue_factory.h"
 #include "modules/audio_device/include/mock_audio_device.h"
 #include "modules/audio_processing/include/mock_audio_processing.h"
 #include "test/gmock.h"
@@ -32,7 +33,7 @@
   VoipEngineConfig config;
   config.encoder_factory = rtc::make_ref_counted<MockAudioEncoderFactory>();
   config.decoder_factory = rtc::make_ref_counted<MockAudioDecoderFactory>();
-  config.task_queue_factory = CreateDefaultTaskQueueFactory();
+  config.env = CreateEnvironment(FieldTrials::CreateNoGlobal(""));
   config.audio_processing_builder =
       std::make_unique<NiceMock<test::MockAudioProcessingBuilder>>();
   config.audio_device_module = test::MockAudioDeviceModule::CreateNice();
@@ -41,12 +42,11 @@
   EXPECT_NE(voip_engine, nullptr);
 }
 
-// Create voip engine without setting audio processing as optional component.
+// Create voip engine without setting optional components.
 TEST(VoipEngineFactoryTest, UseNoAudioProcessing) {
   VoipEngineConfig config;
   config.encoder_factory = rtc::make_ref_counted<MockAudioEncoderFactory>();
   config.decoder_factory = rtc::make_ref_counted<MockAudioDecoderFactory>();
-  config.task_queue_factory = CreateDefaultTaskQueueFactory();
   config.audio_device_module = test::MockAudioDeviceModule::CreateNice();
 
   auto voip_engine = CreateVoipEngine(std::move(config));
diff --git a/api/voip/voip_engine_factory.cc b/api/voip/voip_engine_factory.cc
index 14a08e3..9087fb6 100644
--- a/api/voip/voip_engine_factory.cc
+++ b/api/voip/voip_engine_factory.cc
@@ -27,10 +27,13 @@
 std::unique_ptr<VoipEngine> CreateVoipEngine(VoipEngineConfig config) {
   RTC_CHECK(config.encoder_factory);
   RTC_CHECK(config.decoder_factory);
-  RTC_CHECK(config.task_queue_factory);
   RTC_CHECK(config.audio_device_module);
 
-  Environment env = CreateEnvironment(std::move(config.task_queue_factory));
+  RTC_CHECK(config.task_queue_factory == nullptr || !config.env.has_value());
+  Environment env =
+      config.env.has_value()
+          ? *config.env
+          : CreateEnvironment(std::move(config.task_queue_factory));
 
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
diff --git a/api/voip/voip_engine_factory.h b/api/voip/voip_engine_factory.h
index 378652a..2afb637 100644
--- a/api/voip/voip_engine_factory.h
+++ b/api/voip/voip_engine_factory.h
@@ -12,11 +12,13 @@
 #define API_VOIP_VOIP_ENGINE_FACTORY_H_
 
 #include <memory>
+#include <optional>
 
 #include "api/audio/audio_device.h"
 #include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
+#include "api/environment/environment.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/voip/voip_engine.h"
@@ -50,9 +52,10 @@
   // to limit the set to reduce application footprint.
   scoped_refptr<AudioDecoderFactory> decoder_factory;
 
-  // Mandatory (e.g. api/task_queue/default_task_queue_factory).
-  // TaskQeueuFactory provided for VoipEngine to work asynchronously on its
+  // Optional (e.g. api/task_queue/default_task_queue_factory).
+  // TaskQueueFactory provided for VoipEngine to work asynchronously on its
   // encoding flow.
+  // It is an error to provide both `env` and `task_queue_factory`.
   std::unique_ptr<TaskQueueFactory> task_queue_factory;
 
   // Mandatory (e.g. modules/audio_device/include).
@@ -61,6 +64,13 @@
   // play through its output device (e.g. speaker).
   scoped_refptr<AudioDeviceModule> audio_device_module;
 
+  // Optional. When not set, VoipEngine will use a default Environment created
+  // with `CreateEnvironment`, see api/environment/environment_factory.h
+  // Provides
+  // - TaskQueueFactory to work asynchronously on VoipEngine encoding flow
+  // - FieldTrialsView for experimentations
+  std::optional<Environment> env;
+
   // Optional (e.g. api/audio/builtin_audio_processing_builder).
   // AudioProcessing provides audio procesing functionalities (e.g. acoustic
   // echo cancellation, noise suppression, gain control, etc) on audio input