Inform FrameBufferController of encoder capabilities

Bug: webrtc:10720
Change-Id: I958b83e29e8e87252e08419b8e16d554983a1a63
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/140941
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28242}
diff --git a/api/video_codecs/vp8_frame_buffer_controller.h b/api/video_codecs/vp8_frame_buffer_controller.h
index bcfbd97..a0e1c78 100644
--- a/api/video_codecs/vp8_frame_buffer_controller.h
+++ b/api/video_codecs/vp8_frame_buffer_controller.h
@@ -174,8 +174,18 @@
  public:
   virtual ~Vp8FrameBufferControllerFactory() = default;
 
+  // TODO(bugs.webrtc.org/10720): Update downstream and remove.
   virtual std::unique_ptr<Vp8FrameBufferController> Create(
-      const VideoCodec& codec) = 0;
+      const VideoCodec& codec) {
+    return nullptr;
+  }
+
+  // TODO(bugs.webrtc.org/10720): Update downstream and make pure-virtual.
+  virtual std::unique_ptr<Vp8FrameBufferController> Create(
+      const VideoCodec& codec,
+      const VideoEncoder::Settings& settings) {
+    return nullptr;
+  }
 };
 
 }  // namespace webrtc
diff --git a/api/video_codecs/vp8_temporal_layers_factory.cc b/api/video_codecs/vp8_temporal_layers_factory.cc
index 2eb7bb9..878fa79 100644
--- a/api/video_codecs/vp8_temporal_layers_factory.cc
+++ b/api/video_codecs/vp8_temporal_layers_factory.cc
@@ -23,7 +23,8 @@
 namespace webrtc {
 
 std::unique_ptr<Vp8FrameBufferController> Vp8TemporalLayersFactory::Create(
-    const VideoCodec& codec) {
+    const VideoCodec& codec,
+    const VideoEncoder::Settings& settings) {
   std::vector<std::unique_ptr<Vp8FrameBufferController>> controllers;
   const int num_streams = SimulcastUtility::NumberOfSimulcastStreams(codec);
   RTC_DCHECK_GE(num_streams, 1);
diff --git a/api/video_codecs/vp8_temporal_layers_factory.h b/api/video_codecs/vp8_temporal_layers_factory.h
index 9c65d4c..fd5e5d6 100644
--- a/api/video_codecs/vp8_temporal_layers_factory.h
+++ b/api/video_codecs/vp8_temporal_layers_factory.h
@@ -22,7 +22,8 @@
   ~Vp8TemporalLayersFactory() override = default;
 
   std::unique_ptr<Vp8FrameBufferController> Create(
-      const VideoCodec& codec) override;
+      const VideoCodec& codec,
+      const VideoEncoder::Settings& settings) override;
 };
 
 }  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
index 06cf870..70a00d2 100644
--- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
+++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
@@ -486,10 +486,11 @@
 
   RTC_DCHECK(!frame_buffer_controller_);
   if (frame_buffer_controller_factory_) {
-    frame_buffer_controller_ = frame_buffer_controller_factory_->Create(*inst);
+    frame_buffer_controller_ =
+        frame_buffer_controller_factory_->Create(*inst, settings);
   } else {
     Vp8TemporalLayersFactory factory;
-    frame_buffer_controller_ = factory.Create(*inst);
+    frame_buffer_controller_ = factory.Create(*inst, settings);
   }
   RTC_DCHECK(frame_buffer_controller_);
 
diff --git a/modules/video_coding/video_codec_initializer_unittest.cc b/modules/video_coding/video_codec_initializer_unittest.cc
index 09b01f6..5cac795 100644
--- a/modules/video_coding/video_codec_initializer_unittest.cc
+++ b/modules/video_coding/video_codec_initializer_unittest.cc
@@ -98,7 +98,9 @@
     // Make sure temporal layers instances have been created.
     if (codec_out_.codecType == VideoCodecType::kVideoCodecVP8) {
       Vp8TemporalLayersFactory factory;
-      frame_buffer_controller_ = factory.Create(codec_out_);
+      const VideoEncoder::Settings settings(VideoEncoder::Capabilities(false),
+                                            1, 1000);
+      frame_buffer_controller_ = factory.Create(codec_out_, settings);
     }
     return true;
   }
diff --git a/test/fake_vp8_encoder.cc b/test/fake_vp8_encoder.cc
index ee7a7ab..9d8d510 100644
--- a/test/fake_vp8_encoder.cc
+++ b/test/fake_vp8_encoder.cc
@@ -58,7 +58,7 @@
   }
 
   Vp8TemporalLayersFactory factory;
-  frame_buffer_controller_ = factory.Create(*config);
+  frame_buffer_controller_ = factory.Create(*config, settings);
 
   return WEBRTC_VIDEO_CODEC_OK;
 }
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
index 1486606d..12e2163 100644
--- a/video/video_stream_encoder_unittest.cc
+++ b/video/video_stream_encoder_unittest.cc
@@ -726,7 +726,7 @@
         // Simulate setting up temporal layers, in order to validate the life
         // cycle of these objects.
         Vp8TemporalLayersFactory factory;
-        frame_buffer_controller_ = factory.Create(*config);
+        frame_buffer_controller_ = factory.Create(*config, settings);
       }
       if (force_init_encode_failed_) {
         initialized_ = EncoderState::kInitializationFailed;