Pass Environment to custom FecController at construction

To allow custom FecController use propagated rather than global field trials
note that there is one FecControllerFactory per peer connection factory,
but FecController is created per peer connection and may use per peer connection field trials.

Bug: webrtc:10335
Change-Id: Id25bfaf4b49d4f6d551730c8fd55596ddc49ab47
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/333400
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41478}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 3413b93..d92962c 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -889,6 +889,8 @@
 
   deps = [
     "../modules:module_fec_api",
+    "../rtc_base:checks",
+    "environment",
     "video:video_frame_type",
   ]
 }
diff --git a/api/fec_controller.h b/api/fec_controller.h
index a9be656..6f45ccb 100644
--- a/api/fec_controller.h
+++ b/api/fec_controller.h
@@ -14,8 +14,10 @@
 #include <memory>
 #include <vector>
 
+#include "api/environment/environment.h"
 #include "api/video/video_frame_type.h"
 #include "modules/include/module_fec_types.h"
+#include "rtc_base/checks.h"
 
 namespace webrtc {
 // TODO(yinwa): work in progress. API in class FecController should not be
@@ -87,8 +89,23 @@
 
 class FecControllerFactoryInterface {
  public:
-  virtual std::unique_ptr<FecController> CreateFecController() = 0;
   virtual ~FecControllerFactoryInterface() = default;
+
+  // TODO: bugs.webrtc.org/10335 - make pure virtual when implemented by derived
+  // classes.
+  virtual std::unique_ptr<FecController> CreateFecController(
+      const Environment& env) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+    return CreateFecController();
+#pragma clang diagnostic pop
+  }
+
+  // TODO: bugs.webrtc.org/10335 - delete when implementation is removed from
+  // the derived classes.
+  [[deprecated]] virtual std::unique_ptr<FecController> CreateFecController() {
+    RTC_CHECK_NOTREACHED();
+  }
 };
 
 }  // namespace webrtc
diff --git a/call/call.cc b/call/call.cc
index e35502f..0013bb3 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -920,7 +920,7 @@
   }
   std::unique_ptr<FecController> fec_controller =
       config_.fec_controller_factory
-          ? config_.fec_controller_factory->CreateFecController()
+          ? config_.fec_controller_factory->CreateFecController(env_)
           : std::make_unique<FecControllerDefault>(&env_.clock());
   return CreateVideoSendStream(std::move(config), std::move(encoder_config),
                                std::move(fec_controller));
diff --git a/test/call_test.cc b/test/call_test.cc
index 09099cc..6cdd8da 100644
--- a/test/call_test.cc
+++ b/test/call_test.cc
@@ -572,7 +572,7 @@
     if (fec_controller_factory_.get()) {
       video_send_streams_[i] = sender_call_->CreateVideoSendStream(
           video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy(),
-          fec_controller_factory_->CreateFecController());
+          fec_controller_factory_->CreateFecController(send_env_));
     } else {
       video_send_streams_[i] = sender_call_->CreateVideoSendStream(
           video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy());
diff --git a/test/scenario/video_stream.cc b/test/scenario/video_stream.cc
index eb20f8d..654aed7 100644
--- a/test/scenario/video_stream.cc
+++ b/test/scenario/video_stream.cc
@@ -430,7 +430,8 @@
     if (config.stream.fec_controller_factory) {
       send_stream_ = sender_->call_->CreateVideoSendStream(
           std::move(send_config), std::move(encoder_config),
-          config.stream.fec_controller_factory->CreateFecController());
+          config.stream.fec_controller_factory->CreateFecController(
+              sender_->env_));
     } else {
       send_stream_ = sender_->call_->CreateVideoSendStream(
           std::move(send_config), std::move(encoder_config));