Pass FecControllerOverride to Vp8FrameBufferControllerFactory::Create

Previously, FecControllerOverride was passed to
Vp8FrameBufferController::SetFecControllerOverride. Passing to
the factory is a more elegant way, since it's only used when
the controller is constructed.

TBR=kwiberg@webrtc.org

Bug: webrtc:10769
Change-Id: Iae599889e7ca9003e3200c2911239cbb763ee65a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/144380
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28443}
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 1646fe6..9d0c65b 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -848,6 +848,7 @@
       "../../api:array_view",
       "../../api:create_simulcast_test_fixture_api",
       "../../api:fec_controller_api",
+      "../../api:mock_fec_controller_override",
       "../../api:mock_video_decoder",
       "../../api:mock_video_encoder",
       "../../api:scoped_refptr",
diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers.cc b/modules/video_coding/codecs/vp8/default_temporal_layers.cc
index 07d6c16..84e948e 100644
--- a/modules/video_coding/codecs/vp8/default_temporal_layers.cc
+++ b/modules/video_coding/codecs/vp8/default_temporal_layers.cc
@@ -257,11 +257,6 @@
   // Ignore.
 }
 
-void DefaultTemporalLayers::SetFecControllerOverride(
-    FecControllerOverride* fec_controller_override) {
-  // Ignore.
-}
-
 size_t DefaultTemporalLayers::StreamCount() const {
   return 1;
 }
diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers.h b/modules/video_coding/codecs/vp8/default_temporal_layers.h
index e8a1cee..9f86d40 100644
--- a/modules/video_coding/codecs/vp8/default_temporal_layers.h
+++ b/modules/video_coding/codecs/vp8/default_temporal_layers.h
@@ -22,7 +22,6 @@
 #include <vector>
 
 #include "absl/types/optional.h"
-#include "api/fec_controller_override.h"
 #include "api/video_codecs/vp8_frame_config.h"
 #include "api/video_codecs/vp8_temporal_layers.h"
 #include "modules/video_coding/codecs/vp8/include/temporal_layers_checker.h"
@@ -37,9 +36,6 @@
 
   void SetQpLimits(size_t stream_index, int min_qp, int max_qp) override;
 
-  void SetFecControllerOverride(
-      FecControllerOverride* fec_controller_override) override;
-
   size_t StreamCount() const override;
 
   bool SupportsEncoderFrameDropping(size_t stream_index) const override;
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
index 9b984f7..c630e35 100644
--- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
+++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
@@ -290,7 +290,8 @@
       variable_framerate_experiment_(ParseVariableFramerateConfig(
           "WebRTC-VP8VariableFramerateScreenshare")),
       framerate_controller_(variable_framerate_experiment_.framerate_limit),
-      num_steady_state_frames_(0) {
+      num_steady_state_frames_(0),
+      fec_controller_override_(nullptr) {
   // TODO(eladalon/ilnik): These reservations might be wasting memory.
   // InitEncode() is resizing to the actual size, which might be smaller.
   raw_images_.reserve(kMaxSimulcastStreams);
@@ -452,8 +453,11 @@
 
 void LibvpxVp8Encoder::SetFecControllerOverride(
     FecControllerOverride* fec_controller_override) {
-  RTC_DCHECK(fec_controller_override);
-  // TODO(bugs.webrtc.og/10769): Pass on to the frame buffer controller.
+  // TODO(bugs.webrtc.org/10769): Update downstream and remove ability to
+  // pass nullptr.
+  // RTC_DCHECK(fec_controller_override);
+  RTC_DCHECK(!fec_controller_override_);
+  fec_controller_override_ = fec_controller_override;
 }
 
 // TODO(eladalon): s/inst/codec_settings/g.
@@ -491,11 +495,12 @@
 
   RTC_DCHECK(!frame_buffer_controller_);
   if (frame_buffer_controller_factory_) {
-    frame_buffer_controller_ =
-        frame_buffer_controller_factory_->Create(*inst, settings);
+    frame_buffer_controller_ = frame_buffer_controller_factory_->Create(
+        *inst, settings, fec_controller_override_);
   } else {
     Vp8TemporalLayersFactory factory;
-    frame_buffer_controller_ = factory.Create(*inst, settings);
+    frame_buffer_controller_ =
+        factory.Create(*inst, settings, fec_controller_override_);
   }
   RTC_DCHECK(frame_buffer_controller_);
 
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h
index 3caf3ab..49cf4cb 100644
--- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h
+++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h
@@ -141,6 +141,8 @@
       std::string group_name);
   FramerateController framerate_controller_;
   int num_steady_state_frames_;
+
+  FecControllerOverride* fec_controller_override_;
 };
 
 }  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.cc b/modules/video_coding/codecs/vp8/screenshare_layers.cc
index 84f3d11..b5b963e 100644
--- a/modules/video_coding/codecs/vp8/screenshare_layers.cc
+++ b/modules/video_coding/codecs/vp8/screenshare_layers.cc
@@ -87,11 +87,6 @@
   }
 }
 
-void ScreenshareLayers::SetFecControllerOverride(
-    FecControllerOverride* fec_controller_override) {
-  // Ignore.
-}
-
 size_t ScreenshareLayers::StreamCount() const {
   return 1;
 }
diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.h b/modules/video_coding/codecs/vp8/screenshare_layers.h
index 770ea01..5270ffe 100644
--- a/modules/video_coding/codecs/vp8/screenshare_layers.h
+++ b/modules/video_coding/codecs/vp8/screenshare_layers.h
@@ -14,7 +14,6 @@
 #include <utility>
 #include <vector>
 
-#include "api/fec_controller_override.h"
 #include "api/video_codecs/vp8_frame_config.h"
 #include "api/video_codecs/vp8_temporal_layers.h"
 #include "modules/video_coding/codecs/vp8/include/temporal_layers_checker.h"
@@ -39,9 +38,6 @@
 
   void SetQpLimits(size_t stream_index, int min_qp, int max_qp) override;
 
-  void SetFecControllerOverride(
-      FecControllerOverride* fec_controller_override) override;
-
   size_t StreamCount() const override;
 
   bool SupportsEncoderFrameDropping(size_t stream_index) const override;
diff --git a/modules/video_coding/video_codec_initializer_unittest.cc b/modules/video_coding/video_codec_initializer_unittest.cc
index 5cac795..36db33a 100644
--- a/modules/video_coding/video_codec_initializer_unittest.cc
+++ b/modules/video_coding/video_codec_initializer_unittest.cc
@@ -16,6 +16,7 @@
 
 #include "absl/types/optional.h"
 #include "api/scoped_refptr.h"
+#include "api/test/mock_fec_controller_override.h"
 #include "api/video/builtin_video_bitrate_allocator_factory.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "api/video/video_bitrate_allocator.h"
@@ -26,6 +27,7 @@
 #include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/ref_counted_object.h"
+#include "test/gmock.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -100,7 +102,8 @@
       Vp8TemporalLayersFactory factory;
       const VideoEncoder::Settings settings(VideoEncoder::Capabilities(false),
                                             1, 1000);
-      frame_buffer_controller_ = factory.Create(codec_out_, settings);
+      frame_buffer_controller_ =
+          factory.Create(codec_out_, settings, &fec_controller_override_);
     }
     return true;
   }
@@ -130,6 +133,8 @@
     return stream;
   }
 
+  MockFecControllerOverride fec_controller_override_;
+
   // Input settings.
   VideoEncoderConfig config_;
   std::vector<VideoStream> streams_;