Provide Environment to create an audio encoder in tests

Bug: webrtc:343086059
Change-Id: I73a48770ae67e529eb5065e957ea6420dea44975
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/354881
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42542}
diff --git a/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc b/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc
index fdf04de..5b8e35d 100644
--- a/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc
+++ b/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc
@@ -216,8 +216,6 @@
           audio_encoder_factory_template_impl::AudioEncoderFactoryT<>>());
   EXPECT_THAT(factory->GetSupportedEncoders(), ::testing::IsEmpty());
   EXPECT_EQ(absl::nullopt, factory->QueryAudioEncoder({"foo", 8000, 1}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"bar", 16000, 1}, absl::nullopt));
 
   EXPECT_THAT(factory->Create(env, {"bar", 16000, 1}, {}), IsNull());
 }
@@ -231,11 +229,6 @@
   EXPECT_EQ(absl::nullopt, factory->QueryAudioEncoder({"foo", 8000, 1}));
   EXPECT_EQ(AudioCodecInfo(8000, 1, 12345),
             factory->QueryAudioEncoder({"bogus", 8000, 1}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"bar", 16000, 1}, absl::nullopt));
-  auto enc = factory->MakeAudioEncoder(17, {"bogus", 8000, 1}, absl::nullopt);
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(8000, enc->SampleRateHz());
 
   EXPECT_THAT(factory->Create(env, {"bar", 16000, 1}, {}), IsNull());
   EXPECT_THAT(factory->Create(env, {"bogus", 8000, 1}, {}),
@@ -257,27 +250,18 @@
   EXPECT_EQ(
       AudioCodecInfo(16000, 2, 23456),
       factory->QueryAudioEncoder({"sham", 16000, 2, {{"param", "value"}}}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"bar", 16000, 1}, absl::nullopt));
-  auto enc1 = factory->MakeAudioEncoder(17, {"bogus", 8000, 1}, absl::nullopt);
-  ASSERT_NE(nullptr, enc1);
-  EXPECT_EQ(8000, enc1->SampleRateHz());
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"sham", 16000, 2}, absl::nullopt));
-  auto enc2 = factory->MakeAudioEncoder(
-      17, {"sham", 16000, 2, {{"param", "value"}}}, absl::nullopt);
-  ASSERT_NE(nullptr, enc2);
-  EXPECT_EQ(16000, enc2->SampleRateHz());
 
   EXPECT_THAT(factory->Create(env, {"bar", 16000, 1}, {}), IsNull());
   EXPECT_THAT(factory->Create(env, {"bogus", 8000, 1}, {}),
               Pointer(Property(&AudioEncoder::SampleRateHz, 8000)));
+  EXPECT_THAT(factory->Create(env, {"sham", 16000, 2}, {}), IsNull());
   EXPECT_THAT(
       factory->Create(env, {"sham", 16000, 2, {{"param", "value"}}}, {}),
       Pointer(Property(&AudioEncoder::SampleRateHz, 16000)));
 }
 
 TEST(AudioEncoderFactoryTemplateTest, G711) {
+  const Environment env = CreateEnvironment();
   auto factory = CreateAudioEncoderFactory<AudioEncoderG711>();
   EXPECT_THAT(factory->GetSupportedEncoders(),
               ::testing::ElementsAre(
@@ -286,17 +270,16 @@
   EXPECT_EQ(absl::nullopt, factory->QueryAudioEncoder({"PCMA", 16000, 1}));
   EXPECT_EQ(AudioCodecInfo(8000, 1, 64000),
             factory->QueryAudioEncoder({"PCMA", 8000, 1}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"PCMU", 16000, 1}, absl::nullopt));
-  auto enc1 = factory->MakeAudioEncoder(17, {"PCMU", 8000, 1}, absl::nullopt);
-  ASSERT_NE(nullptr, enc1);
-  EXPECT_EQ(8000, enc1->SampleRateHz());
-  auto enc2 = factory->MakeAudioEncoder(17, {"PCMA", 8000, 1}, absl::nullopt);
-  ASSERT_NE(nullptr, enc2);
-  EXPECT_EQ(8000, enc2->SampleRateHz());
+
+  EXPECT_THAT(factory->Create(env, {"PCMU", 16000, 1}, {}), IsNull());
+  EXPECT_THAT(factory->Create(env, {"PCMU", 8000, 1}, {}),
+              Pointer(Property(&AudioEncoder::SampleRateHz, 8000)));
+  EXPECT_THAT(factory->Create(env, {"PCMA", 8000, 1}, {}),
+              Pointer(Property(&AudioEncoder::SampleRateHz, 8000)));
 }
 
 TEST(AudioEncoderFactoryTemplateTest, G722) {
+  const Environment env = CreateEnvironment();
   auto factory = CreateAudioEncoderFactory<AudioEncoderG722>();
   EXPECT_THAT(factory->GetSupportedEncoders(),
               ::testing::ElementsAre(
@@ -304,14 +287,14 @@
   EXPECT_EQ(absl::nullopt, factory->QueryAudioEncoder({"foo", 8000, 1}));
   EXPECT_EQ(AudioCodecInfo(16000, 1, 64000),
             factory->QueryAudioEncoder({"G722", 8000, 1}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"bar", 16000, 1}, absl::nullopt));
-  auto enc = factory->MakeAudioEncoder(17, {"G722", 8000, 1}, absl::nullopt);
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(16000, enc->SampleRateHz());
+
+  EXPECT_THAT(factory->Create(env, {"bar", 16000, 1}, {}), IsNull());
+  EXPECT_THAT(factory->Create(env, {"G722", 8000, 1}, {}),
+              Pointer(Property(&AudioEncoder::SampleRateHz, 16000)));
 }
 
 TEST(AudioEncoderFactoryTemplateTest, Ilbc) {
+  const Environment env = CreateEnvironment();
   auto factory = CreateAudioEncoderFactory<AudioEncoderIlbc>();
   EXPECT_THAT(factory->GetSupportedEncoders(),
               ::testing::ElementsAre(
@@ -319,14 +302,14 @@
   EXPECT_EQ(absl::nullopt, factory->QueryAudioEncoder({"foo", 8000, 1}));
   EXPECT_EQ(AudioCodecInfo(8000, 1, 13333),
             factory->QueryAudioEncoder({"ilbc", 8000, 1}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"bar", 8000, 1}, absl::nullopt));
-  auto enc = factory->MakeAudioEncoder(17, {"ilbc", 8000, 1}, absl::nullopt);
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(8000, enc->SampleRateHz());
+
+  EXPECT_THAT(factory->Create(env, {"bar", 8000, 1}, {}), IsNull());
+  EXPECT_THAT(factory->Create(env, {"ilbc", 8000, 1}, {}),
+              Pointer(Property(&AudioEncoder::SampleRateHz, 8000)));
 }
 
 TEST(AudioEncoderFactoryTemplateTest, L16) {
+  const Environment env = CreateEnvironment();
   auto factory = CreateAudioEncoderFactory<AudioEncoderL16>();
   EXPECT_THAT(
       factory->GetSupportedEncoders(),
@@ -340,14 +323,14 @@
   EXPECT_EQ(absl::nullopt, factory->QueryAudioEncoder({"L16", 8000, 0}));
   EXPECT_EQ(AudioCodecInfo(48000, 1, 48000 * 16),
             factory->QueryAudioEncoder({"L16", 48000, 1}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"L16", 8000, 0}, absl::nullopt));
-  auto enc = factory->MakeAudioEncoder(17, {"L16", 48000, 2}, absl::nullopt);
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(48000, enc->SampleRateHz());
+
+  EXPECT_THAT(factory->Create(env, {"L16", 8000, 0}, {}), IsNull());
+  EXPECT_THAT(factory->Create(env, {"L16", 48000, 2}, {}),
+              Pointer(Property(&AudioEncoder::SampleRateHz, 48000)));
 }
 
 TEST(AudioEncoderFactoryTemplateTest, Opus) {
+  const Environment env = CreateEnvironment();
   auto factory = CreateAudioEncoderFactory<AudioEncoderOpus>();
   AudioCodecInfo info = {48000, 1, 32000, 6000, 510000};
   info.allow_comfort_noise = false;
@@ -362,11 +345,11 @@
       info,
       factory->QueryAudioEncoder(
           {"opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}}));
-  EXPECT_EQ(nullptr,
-            factory->MakeAudioEncoder(17, {"bar", 16000, 1}, absl::nullopt));
-  auto enc = factory->MakeAudioEncoder(17, {"opus", 48000, 2}, absl::nullopt);
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(48000, enc->SampleRateHz());
+
+  EXPECT_THAT(factory->Create(env, {"bar", 16000, 1}, {.payload_type = 17}),
+              IsNull());
+  EXPECT_THAT(factory->Create(env, {"opus", 48000, 2}, {.payload_type = 17}),
+              Pointer(Property(&AudioEncoder::SampleRateHz, 48000)));
 }
 
 }  // namespace
diff --git a/audio/channel_send_unittest.cc b/audio/channel_send_unittest.cc
index 3d67e8a..5755776 100644
--- a/audio/channel_send_unittest.cc
+++ b/audio/channel_send_unittest.cc
@@ -67,7 +67,7 @@
     encoder_factory_ = CreateBuiltinAudioEncoderFactory();
     SdpAudioFormat opus = SdpAudioFormat("opus", kRtpRateHz, 2);
     std::unique_ptr<AudioEncoder> encoder =
-        encoder_factory_->MakeAudioEncoder(kPayloadType, opus, {});
+        encoder_factory_->Create(env_, opus, {.payload_type = kPayloadType});
     channel_->SetEncoder(kPayloadType, opus, std::move(encoder));
     transport_controller_.EnsureStarted();
     channel_->RegisterSenderCongestionControlObjects(&transport_controller_);
diff --git a/audio/voip/test/BUILD.gn b/audio/voip/test/BUILD.gn
index 5dae888..7f12006 100644
--- a/audio/voip/test/BUILD.gn
+++ b/audio/voip/test/BUILD.gn
@@ -49,6 +49,8 @@
       "../../../api:transport_api",
       "../../../api/audio_codecs:builtin_audio_decoder_factory",
       "../../../api/audio_codecs:builtin_audio_encoder_factory",
+      "../../../api/environment",
+      "../../../api/environment:environment_factory",
       "../../../api/task_queue:task_queue",
       "../../../modules/audio_mixer:audio_mixer_impl",
       "../../../modules/audio_mixer:audio_mixer_test_utils",
@@ -70,6 +72,8 @@
       "../../../api:transport_api",
       "../../../api/audio_codecs:builtin_audio_decoder_factory",
       "../../../api/audio_codecs:builtin_audio_encoder_factory",
+      "../../../api/environment",
+      "../../../api/environment:environment_factory",
       "../../../api/task_queue:default_task_queue_factory",
       "../../../api/units:time_delta",
       "../../../api/units:timestamp",
@@ -91,6 +95,8 @@
       "..:audio_egress",
       "../../../api:transport_api",
       "../../../api/audio_codecs:builtin_audio_encoder_factory",
+      "../../../api/environment",
+      "../../../api/environment:environment_factory",
       "../../../api/task_queue:default_task_queue_factory",
       "../../../api/units:time_delta",
       "../../../api/units:timestamp",
diff --git a/audio/voip/test/audio_channel_unittest.cc b/audio/voip/test/audio_channel_unittest.cc
index 0c8312b..08ca47d 100644
--- a/audio/voip/test/audio_channel_unittest.cc
+++ b/audio/voip/test/audio_channel_unittest.cc
@@ -14,6 +14,8 @@
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/call/transport.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "audio/voip/test/mock_task_queue.h"
@@ -44,8 +46,11 @@
   const SdpAudioFormat kPcmuFormat = {"pcmu", 8000, 1};
 
   AudioChannelTest()
-      : fake_clock_(kStartTime), wave_generator_(1000.0, kAudioLevel) {
-    task_queue_factory_ = std::make_unique<MockTaskQueueFactory>(&task_queue_);
+      : fake_clock_(kStartTime),
+        wave_generator_(1000.0, kAudioLevel),
+        env_(CreateEnvironment(
+            &fake_clock_,
+            std::make_unique<MockTaskQueueFactory>(&task_queue_))) {
     audio_mixer_ = AudioMixerImpl::Create();
     encoder_factory_ = CreateBuiltinAudioEncoderFactory();
     decoder_factory_ = CreateBuiltinAudioDecoderFactory();
@@ -68,11 +73,12 @@
     // simplify network routing logic.
     rtc::scoped_refptr<AudioChannel> audio_channel =
         rtc::make_ref_counted<AudioChannel>(
-            &transport_, ssrc, task_queue_factory_.get(), audio_mixer_.get(),
+            &transport_, ssrc, &env_.task_queue_factory(), audio_mixer_.get(),
             decoder_factory_);
-    audio_channel->SetEncoder(kPcmuPayload, kPcmuFormat,
-                              encoder_factory_->MakeAudioEncoder(
-                                  kPcmuPayload, kPcmuFormat, absl::nullopt));
+    audio_channel->SetEncoder(
+        kPcmuPayload, kPcmuFormat,
+        encoder_factory_->Create(env_, kPcmuFormat,
+                                 {.payload_type = kPcmuPayload}));
     audio_channel->SetReceiveCodecs({{kPcmuPayload, kPcmuFormat}});
     audio_channel->StartSend();
     audio_channel->StartPlay();
@@ -93,7 +99,7 @@
   SineWaveGenerator wave_generator_;
   NiceMock<MockTransport> transport_;
   NiceMock<MockTaskQueue> task_queue_;
-  std::unique_ptr<TaskQueueFactory> task_queue_factory_;
+  const Environment env_;
   rtc::scoped_refptr<AudioMixer> audio_mixer_;
   rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
   rtc::scoped_refptr<AudioEncoderFactory> encoder_factory_;
diff --git a/audio/voip/test/audio_egress_unittest.cc b/audio/voip/test/audio_egress_unittest.cc
index 83df26e..c42b78f 100644
--- a/audio/voip/test/audio_egress_unittest.cc
+++ b/audio/voip/test/audio_egress_unittest.cc
@@ -12,7 +12,8 @@
 
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/call/transport.h"
-#include "api/task_queue/default_task_queue_factory.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "modules/audio_mixer/sine_wave_generator.h"
@@ -74,8 +75,8 @@
         time_controller_.GetTaskQueueFactory());
     constexpr int kPcmuPayload = 0;
     egress_->SetEncoder(kPcmuPayload, kPcmuFormat,
-                        encoder_factory_->MakeAudioEncoder(
-                            kPcmuPayload, kPcmuFormat, absl::nullopt));
+                        encoder_factory_->Create(
+                            env_, kPcmuFormat, {.payload_type = kPcmuPayload}));
     egress_->StartSend();
     rtp_rtcp_->SetSequenceNumber(kSeqNum);
     rtp_rtcp_->SetSendingStatus(true);
@@ -104,6 +105,9 @@
   }
 
   GlobalSimulatedTimeController time_controller_{Timestamp::Micros(kStartTime)};
+  const Environment env_ =
+      CreateEnvironment(time_controller_.GetClock(),
+                        time_controller_.GetTaskQueueFactory());
   NiceMock<MockTransport> transport_;
   SineWaveGenerator wave_generator_;
   std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_;
@@ -235,8 +239,8 @@
   const SdpAudioFormat kOpusFormat = {"opus", 48000, 2};
 
   egress_->SetEncoder(kOpusPayload, kOpusFormat,
-                      encoder_factory_->MakeAudioEncoder(
-                          kOpusPayload, kOpusFormat, absl::nullopt));
+                      encoder_factory_->Create(env_, kOpusFormat,
+                                               {.payload_type = kOpusPayload}));
 
   absl::optional<SdpAudioFormat> opus = egress_->GetEncoderFormat();
   EXPECT_TRUE(opus);
diff --git a/audio/voip/test/audio_ingress_unittest.cc b/audio/voip/test/audio_ingress_unittest.cc
index c7736b2..194d97a 100644
--- a/audio/voip/test/audio_ingress_unittest.cc
+++ b/audio/voip/test/audio_ingress_unittest.cc
@@ -13,6 +13,8 @@
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/call/transport.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/units/time_delta.h"
 #include "audio/voip/audio_egress.h"
@@ -70,8 +72,8 @@
         rtp_rtcp_.get(), time_controller_.GetClock(),
         time_controller_.GetTaskQueueFactory());
     egress_->SetEncoder(kPcmuPayload, kPcmuFormat,
-                        encoder_factory_->MakeAudioEncoder(
-                            kPcmuPayload, kPcmuFormat, absl::nullopt));
+                        encoder_factory_->Create(
+                            env_, kPcmuFormat, {.payload_type = kPcmuPayload}));
     egress_->StartSend();
     ingress_->StartPlay();
     rtp_rtcp_->SetSendingStatus(true);
@@ -96,6 +98,9 @@
   }
 
   GlobalSimulatedTimeController time_controller_{Timestamp::Micros(123456789)};
+  const Environment env_ =
+      CreateEnvironment(time_controller_.GetClock(),
+                        time_controller_.GetTaskQueueFactory());
   SineWaveGenerator wave_generator_;
   NiceMock<MockTransport> transport_;
   std::unique_ptr<ReceiveStatistics> receive_statistics_;
diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn
index 5416f83..bb70777 100644
--- a/modules/audio_coding/BUILD.gn
+++ b/modules/audio_coding/BUILD.gn
@@ -942,6 +942,8 @@
     "../../api/audio:audio_frame_api",
     "../../api/audio_codecs:builtin_audio_decoder_factory",
     "../../api/audio_codecs:builtin_audio_encoder_factory",
+    "../../api/environment",
+    "../../api/environment:environment_factory",
     "../../api/neteq:neteq_api",
     "../../api/units:timestamp",
     "../../rtc_base:checks",
@@ -1073,6 +1075,8 @@
       "../../api/audio_codecs/ilbc:audio_encoder_ilbc",
       "../../api/audio_codecs/opus:audio_decoder_opus",
       "../../api/audio_codecs/opus:audio_encoder_opus",
+      "../../api/environment",
+      "../../api/environment:environment_factory",
       "../../api/units:timestamp",
       "../../common_audio",
       "../../rtc_base:checks",
@@ -1155,6 +1159,8 @@
       "../../api/audio_codecs:audio_codecs_api",
       "../../api/audio_codecs:builtin_audio_decoder_factory",
       "../../api/audio_codecs:builtin_audio_encoder_factory",
+      "../../api/environment",
+      "../../api/environment:environment_factory",
       "../../rtc_base:checks",
       "../../rtc_base:stringutils",
       "../../test:test_support",
@@ -1686,6 +1692,8 @@
         "../../api/audio_codecs/opus:audio_decoder_opus",
         "../../api/audio_codecs/opus:audio_encoder_multiopus",
         "../../api/audio_codecs/opus:audio_encoder_opus",
+        "../../api/environment",
+        "../../api/environment:environment_factory",
         "../../api/neteq:default_neteq_controller_factory",
         "../../api/neteq:neteq_api",
         "../../api/neteq:neteq_controller_api",
diff --git a/modules/audio_coding/acm2/acm_receiver_unittest.cc b/modules/audio_coding/acm2/acm_receiver_unittest.cc
index e86c718..8b63424 100644
--- a/modules/audio_coding/acm2/acm_receiver_unittest.cc
+++ b/modules/audio_coding/acm2/acm_receiver_unittest.cc
@@ -16,6 +16,8 @@
 #include "absl/types/optional.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/units/timestamp.h"
 #include "modules/audio_coding/codecs/cng/audio_encoder_cng.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
@@ -69,7 +71,7 @@
         encoder_factory_->QueryAudioEncoder(format);
     RTC_CHECK(info.has_value());
     std::unique_ptr<AudioEncoder> enc =
-        encoder_factory_->MakeAudioEncoder(payload_type, format, absl::nullopt);
+        encoder_factory_->Create(env_, format, {.payload_type = payload_type});
 
     // If we have a compatible CN specification, stack a CNG on top.
     auto it = cng_payload_types.find(info->sample_rate_hz);
@@ -132,6 +134,7 @@
     return 0;
   }
 
+  const Environment env_ = CreateEnvironment();
   const rtc::scoped_refptr<AudioEncoderFactory> encoder_factory_ =
       CreateBuiltinAudioEncoderFactory();
   const rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_ =
diff --git a/modules/audio_coding/acm2/acm_send_test.cc b/modules/audio_coding/acm2/acm_send_test.cc
index fddaa87..c08fd4d 100644
--- a/modules/audio_coding/acm2/acm_send_test.cc
+++ b/modules/audio_coding/acm2/acm_send_test.cc
@@ -18,6 +18,7 @@
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "api/environment/environment_factory.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
 #include "modules/audio_coding/neteq/tools/input_audio_file.h"
 #include "modules/audio_coding/neteq/tools/packet.h"
@@ -32,6 +33,7 @@
                                      int source_rate_hz,
                                      int test_duration_ms)
     : clock_(0),
+      env_(CreateEnvironment(&clock_)),
       acm_(webrtc::AudioCodingModule::Create()),
       audio_source_(audio_source),
       source_rate_hz_(source_rate_hz),
@@ -73,7 +75,7 @@
       frame_size_samples, rtc::CheckedDivExact(clockrate_hz, 1000)));
   auto factory = CreateBuiltinAudioEncoderFactory();
   acm_->SetEncoder(
-      factory->MakeAudioEncoder(payload_type, format, absl::nullopt));
+      factory->Create(env_, format, {.payload_type = payload_type}));
   codec_registered_ = true;
   input_frame_.num_channels_ = num_channels;
   RTC_DCHECK_LE(input_block_size_samples_ * input_frame_.num_channels_,
diff --git a/modules/audio_coding/acm2/acm_send_test.h b/modules/audio_coding/acm2/acm_send_test.h
index 0bd2470..1bba676 100644
--- a/modules/audio_coding/acm2/acm_send_test.h
+++ b/modules/audio_coding/acm2/acm_send_test.h
@@ -16,6 +16,7 @@
 
 #include "absl/strings/string_view.h"
 #include "api/audio/audio_frame.h"
+#include "api/environment/environment.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
 #include "modules/audio_coding/neteq/tools/packet_source.h"
 #include "system_wrappers/include/clock.h"
@@ -70,6 +71,7 @@
   std::unique_ptr<Packet> CreatePacket();
 
   SimulatedClock clock_;
+  const Environment env_;
   std::unique_ptr<AudioCodingModule> acm_;
   InputAudioFile* audio_source_;
   int source_rate_hz_;
diff --git a/modules/audio_coding/acm2/audio_coding_module_unittest.cc b/modules/audio_coding/acm2/audio_coding_module_unittest.cc
index 44e7bce..8eaa2bf 100644
--- a/modules/audio_coding/acm2/audio_coding_module_unittest.cc
+++ b/modules/audio_coding/acm2/audio_coding_module_unittest.cc
@@ -25,6 +25,8 @@
 #include "api/audio_codecs/opus/audio_decoder_opus.h"
 #include "api/audio_codecs/opus/audio_encoder_multi_channel_opus.h"
 #include "api/audio_codecs/opus/audio_encoder_opus.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/units/timestamp.h"
 #include "modules/audio_coding/acm2/acm_receive_test.h"
 #include "modules/audio_coding/acm2/acm_send_test.h"
@@ -163,8 +165,8 @@
 class AudioCodingModuleTestOldApi : public ::testing::Test {
  protected:
   AudioCodingModuleTestOldApi()
-      : rtp_utility_(new RtpData(kFrameSizeSamples, kPayloadType)),
-        clock_(Clock::GetRealTimeClock()) {}
+      : env_(CreateEnvironment()),
+        rtp_utility_(new RtpData(kFrameSizeSamples, kPayloadType)) {}
 
   ~AudioCodingModuleTestOldApi() {}
 
@@ -173,7 +175,7 @@
   void SetUp() {
     acm_ = AudioCodingModule::Create();
     acm2::AcmReceiver::Config config;
-    config.clock = *clock_;
+    config.clock = env_.clock();
     config.decoder_factory = CreateBuiltinAudioDecoderFactory();
     acm_receiver_ = std::make_unique<acm2::AcmReceiver>(config);
 
@@ -199,8 +201,8 @@
 
   virtual void RegisterCodec() {
     acm_receiver_->SetCodecs({{kPayloadType, *audio_format_}});
-    acm_->SetEncoder(CreateBuiltinAudioEncoderFactory()->MakeAudioEncoder(
-        kPayloadType, *audio_format_, absl::nullopt));
+    acm_->SetEncoder(CreateBuiltinAudioEncoderFactory()->Create(
+        env_, *audio_format_, {.payload_type = kPayloadType}));
   }
 
   virtual void InsertPacketAndPullAudio() {
@@ -240,6 +242,7 @@
     VerifyEncoding();
   }
 
+  Environment env_;
   std::unique_ptr<RtpData> rtp_utility_;
   std::unique_ptr<AudioCodingModule> acm_;
   std::unique_ptr<acm2::AcmReceiver> acm_receiver_;
@@ -249,8 +252,6 @@
 
   absl::optional<SdpAudioFormat> audio_format_;
   int pac_size_ = -1;
-
-  Clock* clock_;
 };
 
 class AudioCodingModuleTestOldApiDeathTest
@@ -381,7 +382,9 @@
         pull_audio_count_(0),
         next_insert_packet_time_ms_(0),
         fake_clock_(new SimulatedClock(0)) {
-    clock_ = fake_clock_.get();
+    EnvironmentFactory override_clock(env_);
+    override_clock.Set(fake_clock_.get());
+    env_ = override_clock.Create();
   }
 
   void SetUp() {
@@ -458,7 +461,7 @@
     SleepMs(1);
     {
       MutexLock lock(&mutex_);
-      if (clock_->TimeInMilliseconds() < next_insert_packet_time_ms_) {
+      if (env_.clock().TimeInMilliseconds() < next_insert_packet_time_ms_) {
         return;
       }
       next_insert_packet_time_ms_ += 10;
@@ -473,7 +476,7 @@
     {
       MutexLock lock(&mutex_);
       // Don't let the insert thread fall behind.
-      if (next_insert_packet_time_ms_ < clock_->TimeInMilliseconds()) {
+      if (next_insert_packet_time_ms_ < env_.clock().TimeInMilliseconds()) {
         return;
       }
       ++pull_audio_count_;
@@ -534,9 +537,10 @@
     rtc::scoped_refptr<AudioEncoderFactory> codec_factory =
         CreateBuiltinAudioEncoderFactory();
     acm_ = AudioCodingModule::Create();
-    std::unique_ptr<AudioEncoder> encoder = codec_factory->MakeAudioEncoder(
-        111, SdpAudioFormat("OPUS", kSampleRateHz, kNumChannels),
-        absl::nullopt);
+    std::unique_ptr<AudioEncoder> encoder = codec_factory->Create(
+        CreateEnvironment(),
+        SdpAudioFormat("OPUS", kSampleRateHz, kNumChannels),
+        {.payload_type = 111});
     encoder->SetDtx(true);
     encoder->SetReceiverFrameLengthRange(kPTimeMs, kPTimeMs);
     acm_->SetEncoder(std::move(encoder));
diff --git a/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc b/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
index 95b67de..6ca08b5 100644
--- a/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
+++ b/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
@@ -14,6 +14,8 @@
 #include <memory>
 #include <vector>
 
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "rtc_base/numerics/safe_conversions.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -40,11 +42,12 @@
 }
 
 TEST_P(AudioEncoderFactoryTest, CanConstructAllSupportedEncoders) {
+  const Environment env = CreateEnvironment();
   auto factory = GetParam();
   auto supported_encoders = factory->GetSupportedEncoders();
   for (const auto& spec : supported_encoders) {
     auto info = factory->QueryAudioEncoder(spec.format);
-    auto encoder = factory->MakeAudioEncoder(127, spec.format, absl::nullopt);
+    auto encoder = factory->Create(env, spec.format, {.payload_type = 127});
     EXPECT_TRUE(encoder);
     EXPECT_EQ(encoder->SampleRateHz(), info->sample_rate_hz);
     EXPECT_EQ(encoder->NumChannels(), info->num_channels);
@@ -54,6 +57,7 @@
 
 TEST_P(AudioEncoderFactoryTest, CanRunAllSupportedEncoders) {
   constexpr int kTestPayloadType = 127;
+  const Environment env = CreateEnvironment();
   auto factory = GetParam();
   auto supported_encoders = factory->GetSupportedEncoders();
   for (const auto& spec : supported_encoders) {
@@ -64,7 +68,7 @@
     }
 #endif
     auto encoder =
-        factory->MakeAudioEncoder(kTestPayloadType, spec.format, absl::nullopt);
+        factory->Create(env, spec.format, {.payload_type = kTestPayloadType});
     EXPECT_TRUE(encoder);
     encoder->Reset();
     const int num_samples = rtc::checked_cast<int>(
@@ -153,6 +157,7 @@
 
 // Tests that using more channels than the maximum does not work.
 TEST(BuiltinAudioEncoderFactoryTest, MaxNrOfChannels) {
+  const Environment env = CreateEnvironment();
   rtc::scoped_refptr<AudioEncoderFactory> aef =
       CreateBuiltinAudioEncoderFactory();
   std::vector<std::string> codecs = {
@@ -173,11 +178,10 @@
   };
 
   for (auto codec : codecs) {
-    EXPECT_FALSE(aef->MakeAudioEncoder(
-        /*payload_type=*/111,
-        /*format=*/
+    EXPECT_FALSE(aef->Create(
+        env, /*format=*/
         SdpAudioFormat(codec, 32000, AudioEncoder::kMaxNumberOfChannels + 1),
-        /*codec_pair_id=*/absl::nullopt));
+        {.payload_type = 111}));
   }
 }
 
diff --git a/modules/audio_coding/test/EncodeDecodeTest.cc b/modules/audio_coding/test/EncodeDecodeTest.cc
index c51ad37..a480773 100644
--- a/modules/audio_coding/test/EncodeDecodeTest.cc
+++ b/modules/audio_coding/test/EncodeDecodeTest.cc
@@ -18,6 +18,8 @@
 #include "absl/strings/string_view.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
 #include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
@@ -67,8 +69,8 @@
   // Fast-forward 1 second (100 blocks) since the file starts with silence.
   _pcmFile.FastForward(100);
 
-  acm->SetEncoder(CreateBuiltinAudioEncoderFactory()->MakeAudioEncoder(
-      payload_type, format, absl::nullopt));
+  acm->SetEncoder(CreateBuiltinAudioEncoderFactory()->Create(
+      CreateEnvironment(), format, {.payload_type = payload_type}));
   _packetization = new TestPacketization(rtpStream, format.clockrate_hz);
   EXPECT_EQ(0, acm->RegisterTransportCallback(_packetization));
 
diff --git a/modules/audio_coding/test/TestAllCodecs.cc b/modules/audio_coding/test/TestAllCodecs.cc
index 9d9c317..821b881 100644
--- a/modules/audio_coding/test/TestAllCodecs.cc
+++ b/modules/audio_coding/test/TestAllCodecs.cc
@@ -17,6 +17,7 @@
 #include "absl/strings/match.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "api/environment/environment_factory.h"
 #include "modules/audio_coding/include/audio_coding_module_typedefs.h"
 #include "modules/include/module_common_types.h"
 #include "rtc_base/logging.h"
@@ -107,7 +108,8 @@
 }
 
 TestAllCodecs::TestAllCodecs()
-    : acm_a_(AudioCodingModule::Create()),
+    : env_(CreateEnvironment()),
+      acm_a_(AudioCodingModule::Create()),
       acm_b_(std::make_unique<acm2::AcmReceiver>(
           acm2::AcmReceiver::Config(CreateBuiltinAudioDecoderFactory()))),
       channel_a_to_b_(NULL),
@@ -319,12 +321,10 @@
   }
 
   auto factory = CreateBuiltinAudioEncoderFactory();
-  constexpr int payload_type = 17;
   SdpAudioFormat format = {codec_name, clockrate_hz, num_channels};
   format.parameters["ptime"] = rtc::ToString(rtc::CheckedDivExact(
       packet_size, rtc::CheckedDivExact(sampling_freq_hz, 1000)));
-  acm_a_->SetEncoder(
-      factory->MakeAudioEncoder(payload_type, format, absl::nullopt));
+  acm_a_->SetEncoder(factory->Create(env_, format, {.payload_type = 17}));
 }
 
 void TestAllCodecs::Run(TestPack* channel) {
diff --git a/modules/audio_coding/test/TestAllCodecs.h b/modules/audio_coding/test/TestAllCodecs.h
index a17038a..e078f49 100644
--- a/modules/audio_coding/test/TestAllCodecs.h
+++ b/modules/audio_coding/test/TestAllCodecs.h
@@ -13,6 +13,7 @@
 
 #include <memory>
 
+#include "api/environment/environment.h"
 #include "modules/audio_coding/acm2/acm_receiver.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
 #include "modules/audio_coding/test/PCMFile.h"
@@ -68,6 +69,7 @@
   void Run(TestPack* channel);
   void OpenOutFile(int test_number);
 
+  const Environment env_;
   std::unique_ptr<AudioCodingModule> acm_a_;
   std::unique_ptr<acm2::AcmReceiver> acm_b_;
   TestPack* channel_a_to_b_;
diff --git a/modules/audio_coding/test/TestRedFec.cc b/modules/audio_coding/test/TestRedFec.cc
index 83e5d61..6f765e9 100644
--- a/modules/audio_coding/test/TestRedFec.cc
+++ b/modules/audio_coding/test/TestRedFec.cc
@@ -24,6 +24,7 @@
 #include "api/audio_codecs/g722/audio_encoder_g722.h"
 #include "api/audio_codecs/opus/audio_decoder_opus.h"
 #include "api/audio_codecs/opus/audio_encoder_opus.h"
+#include "api/environment/environment_factory.h"
 #include "modules/audio_coding/codecs/cng/audio_encoder_cng.h"
 #include "modules/audio_coding/codecs/red/audio_encoder_copy_red.h"
 #include "modules/audio_coding/include/audio_coding_module_typedefs.h"
@@ -34,7 +35,8 @@
 namespace webrtc {
 
 TestRedFec::TestRedFec()
-    : encoder_factory_(CreateAudioEncoderFactory<AudioEncoderG711,
+    : env_(CreateEnvironment(&field_trials_)),
+      encoder_factory_(CreateAudioEncoderFactory<AudioEncoderG711,
                                                  AudioEncoderG722,
                                                  AudioEncoderL16,
                                                  AudioEncoderOpus>()),
@@ -136,8 +138,8 @@
     bool use_red) {
   constexpr int payload_type = 17, cn_payload_type = 27, red_payload_type = 37;
 
-  auto encoder = encoder_factory_->MakeAudioEncoder(payload_type, codec_format,
-                                                    absl::nullopt);
+  auto encoder = encoder_factory_->Create(env_, codec_format,
+                                          {.payload_type = payload_type});
   EXPECT_NE(encoder, nullptr);
   std::map<int, SdpAudioFormat> receive_codecs = {{payload_type, codec_format}};
   if (!absl::EqualsIgnoreCase(codec_format.name, "opus")) {
diff --git a/modules/audio_coding/test/TestRedFec.h b/modules/audio_coding/test/TestRedFec.h
index 173b03f..8c43c1d 100644
--- a/modules/audio_coding/test/TestRedFec.h
+++ b/modules/audio_coding/test/TestRedFec.h
@@ -16,6 +16,7 @@
 
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
+#include "api/environment/environment.h"
 #include "common_audio/vad/include/vad.h"
 #include "modules/audio_coding/acm2/acm_receiver.h"
 #include "modules/audio_coding/test/Channel.h"
@@ -40,6 +41,7 @@
   void OpenOutFile(int16_t testNumber);
 
   test::ScopedKeyValueConfig field_trials_;
+  const Environment env_;
   const rtc::scoped_refptr<AudioEncoderFactory> encoder_factory_;
   const rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
   std::unique_ptr<AudioCodingModule> _acmA;
diff --git a/modules/audio_coding/test/TestStereo.cc b/modules/audio_coding/test/TestStereo.cc
index cf1f913..535aadb 100644
--- a/modules/audio_coding/test/TestStereo.cc
+++ b/modules/audio_coding/test/TestStereo.cc
@@ -15,6 +15,7 @@
 #include "absl/strings/match.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "api/environment/environment_factory.h"
 #include "modules/audio_coding/include/audio_coding_module_typedefs.h"
 #include "modules/include/module_common_types.h"
 #include "rtc_base/strings/string_builder.h"
@@ -98,7 +99,8 @@
 }
 
 TestStereo::TestStereo()
-    : acm_a_(AudioCodingModule::Create()),
+    : env_(CreateEnvironment()),
+      acm_a_(AudioCodingModule::Create()),
       acm_b_(std::make_unique<acm2::AcmReceiver>(
           acm2::AcmReceiver::Config(CreateBuiltinAudioDecoderFactory()))),
       channel_a2b_(NULL),
@@ -488,10 +490,9 @@
     channels = 2;
     params["maxaveragebitrate"] = rtc::ToString(rate);
   }
-  constexpr int payload_type = 17;
-  auto encoder = encoder_factory->MakeAudioEncoder(
-      payload_type, SdpAudioFormat(codec_name, clockrate_hz, channels, params),
-      absl::nullopt);
+  auto encoder = encoder_factory->Create(
+      env_, SdpAudioFormat(codec_name, clockrate_hz, channels, params),
+      {.payload_type = 17});
   EXPECT_NE(nullptr, encoder);
   my_acm->SetEncoder(std::move(encoder));
 
diff --git a/modules/audio_coding/test/TestStereo.h b/modules/audio_coding/test/TestStereo.h
index a215c90..b53187b 100644
--- a/modules/audio_coding/test/TestStereo.h
+++ b/modules/audio_coding/test/TestStereo.h
@@ -15,6 +15,7 @@
 
 #include <memory>
 
+#include "api/environment/environment.h"
 #include "modules/audio_coding/acm2/acm_receiver.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
 #include "modules/audio_coding/test/PCMFile.h"
@@ -81,6 +82,7 @@
            int percent_loss = 0);
   void OpenOutFile(int16_t test_number);
 
+  const Environment env_;
   std::unique_ptr<AudioCodingModule> acm_a_;
   std::unique_ptr<acm2::AcmReceiver> acm_b_;
 
diff --git a/modules/audio_coding/test/TestVADDTX.cc b/modules/audio_coding/test/TestVADDTX.cc
index d6595c0..17eba26 100644
--- a/modules/audio_coding/test/TestVADDTX.cc
+++ b/modules/audio_coding/test/TestVADDTX.cc
@@ -20,6 +20,7 @@
 #include "api/audio_codecs/ilbc/audio_encoder_ilbc.h"
 #include "api/audio_codecs/opus/audio_decoder_opus.h"
 #include "api/audio_codecs/opus/audio_encoder_opus.h"
+#include "api/environment/environment_factory.h"
 #include "modules/audio_coding/codecs/cng/audio_encoder_cng.h"
 #include "modules/audio_coding/test/PCMFile.h"
 #include "rtc_base/strings/string_builder.h"
@@ -66,7 +67,8 @@
 }
 
 TestVadDtx::TestVadDtx()
-    : encoder_factory_(
+    : env_(CreateEnvironment()),
+      encoder_factory_(
           CreateAudioEncoderFactory<AudioEncoderIlbc, AudioEncoderOpus>()),
       decoder_factory_(
           CreateAudioDecoderFactory<AudioDecoderIlbc, AudioDecoderOpus>()),
@@ -87,8 +89,8 @@
   constexpr int payload_type = 17, cn_payload_type = 117;
   bool added_comfort_noise = false;
 
-  auto encoder = encoder_factory_->MakeAudioEncoder(payload_type, codec_format,
-                                                    absl::nullopt);
+  auto encoder = encoder_factory_->Create(env_, codec_format,
+                                          {.payload_type = payload_type});
   if (vad_mode.has_value() &&
       !absl::EqualsIgnoreCase(codec_format.name, "opus")) {
     AudioEncoderCngConfig config;
diff --git a/modules/audio_coding/test/TestVADDTX.h b/modules/audio_coding/test/TestVADDTX.h
index 17b3f41..427c94c 100644
--- a/modules/audio_coding/test/TestVADDTX.h
+++ b/modules/audio_coding/test/TestVADDTX.h
@@ -16,6 +16,7 @@
 #include "absl/strings/string_view.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
+#include "api/environment/environment.h"
 #include "common_audio/vad/include/vad.h"
 #include "modules/audio_coding/acm2/acm_receiver.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
@@ -82,6 +83,7 @@
            bool append,
            const int* expects);
 
+  const Environment env_;
   const rtc::scoped_refptr<AudioEncoderFactory> encoder_factory_;
   const rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
   std::unique_ptr<AudioCodingModule> acm_send_;
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 51025ec..062980c 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -2338,6 +2338,7 @@
       "../api/crypto:frame_decryptor_interface",
       "../api/crypto:frame_encryptor_interface",
       "../api/crypto:options",
+      "../api/environment",
       "../api/environment:environment_factory",
       "../api/rtc_event_log",
       "../api/rtc_event_log:rtc_event_log_factory",
diff --git a/pc/peer_connection_end_to_end_unittest.cc b/pc/peer_connection_end_to_end_unittest.cc
index 5881cf4..516a01e 100644
--- a/pc/peer_connection_end_to_end_unittest.cc
+++ b/pc/peer_connection_end_to_end_unittest.cc
@@ -34,6 +34,7 @@
 #include "api/audio_codecs/opus_audio_encoder_factory.h"
 #include "api/audio_options.h"
 #include "api/data_channel_interface.h"
+#include "api/environment/environment.h"
 #include "api/media_stream_interface.h"
 #include "api/peer_connection_interface.h"
 #include "api/rtc_error.h"
@@ -63,11 +64,11 @@
 using ::testing::Invoke;
 using ::testing::StrictMock;
 using ::testing::Values;
-
-using webrtc::DataChannelInterface;
-using webrtc::MediaStreamInterface;
-using webrtc::PeerConnectionInterface;
-using webrtc::SdpSemantics;
+using ::webrtc::DataChannelInterface;
+using ::webrtc::Environment;
+using ::webrtc::MediaStreamInterface;
+using ::webrtc::PeerConnectionInterface;
+using ::webrtc::SdpSemantics;
 
 namespace {
 
@@ -427,6 +428,14 @@
       codec_ids_->push_back(*codec_pair_id);
       return fact_->MakeAudioEncoder(payload_type, format, codec_pair_id);
     }
+    std::unique_ptr<webrtc::AudioEncoder> Create(
+        const Environment& env,
+        const webrtc::SdpAudioFormat& format,
+        Options options) override {
+      EXPECT_TRUE(options.codec_pair_id.has_value());
+      codec_ids_->push_back(*options.codec_pair_id);
+      return fact_->Create(env, format, options);
+    }
 
    private:
     const rtc::scoped_refptr<webrtc::AudioEncoderFactory> fact_;