Require scalability mode to initialize av1 encoder.

To make VideoCodec::scalability_mode the only option to set and
change the scalability structure, for easier maintainability.

Bug: webrtc:11404
Change-Id: I6570e9a93ddf2897ff7584c5d20a246346e853e2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/192361
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33056}
diff --git a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc
index e728837..ab6ac7c 100644
--- a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc
+++ b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc
@@ -64,8 +64,7 @@
 
 class LibaomAv1Encoder final : public VideoEncoder {
  public:
-  explicit LibaomAv1Encoder(
-      std::unique_ptr<ScalableVideoController> svc_controller);
+  LibaomAv1Encoder();
   ~LibaomAv1Encoder();
 
   int InitEncode(const VideoCodec* codec_settings,
@@ -132,14 +131,10 @@
   return WEBRTC_VIDEO_CODEC_OK;
 }
 
-LibaomAv1Encoder::LibaomAv1Encoder(
-    std::unique_ptr<ScalableVideoController> svc_controller)
-    : svc_controller_(std::move(svc_controller)),
-      inited_(false),
+LibaomAv1Encoder::LibaomAv1Encoder()
+    : inited_(false),
       frame_for_encode_(nullptr),
-      encoded_image_callback_(nullptr) {
-  RTC_DCHECK(svc_controller_);
-}
+      encoded_image_callback_(nullptr) {}
 
 LibaomAv1Encoder::~LibaomAv1Encoder() {
   Release();
@@ -173,11 +168,11 @@
     return result;
   }
   absl::string_view scalability_mode = encoder_settings_.ScalabilityMode();
-  // When scalability_mode is not set, keep using svc_controller_ created
-  // at construction of the encoder.
-  if (!scalability_mode.empty()) {
-    svc_controller_ = CreateScalabilityStructure(scalability_mode);
+  if (scalability_mode.empty()) {
+    RTC_LOG(LS_WARNING) << "Scalability mode is not set.";
+    return WEBRTC_VIDEO_CODEC_ERROR;
   }
+  svc_controller_ = CreateScalabilityStructure(scalability_mode);
   if (svc_controller_ == nullptr) {
     RTC_LOG(LS_WARNING) << "Failed to set scalability mode "
                         << scalability_mode;
@@ -689,13 +684,7 @@
 const bool kIsLibaomAv1EncoderSupported = true;
 
 std::unique_ptr<VideoEncoder> CreateLibaomAv1Encoder() {
-  return std::make_unique<LibaomAv1Encoder>(
-      std::make_unique<ScalableVideoControllerNoLayering>());
-}
-
-std::unique_ptr<VideoEncoder> CreateLibaomAv1Encoder(
-    std::unique_ptr<ScalableVideoController> svc_controller) {
-  return std::make_unique<LibaomAv1Encoder>(std::move(svc_controller));
+  return std::make_unique<LibaomAv1Encoder>();
 }
 
 }  // namespace webrtc
diff --git a/modules/video_coding/codecs/av1/libaom_av1_encoder.h b/modules/video_coding/codecs/av1/libaom_av1_encoder.h
index 04a2b65..4b0ee28 100644
--- a/modules/video_coding/codecs/av1/libaom_av1_encoder.h
+++ b/modules/video_coding/codecs/av1/libaom_av1_encoder.h
@@ -14,15 +14,12 @@
 
 #include "absl/base/attributes.h"
 #include "api/video_codecs/video_encoder.h"
-#include "modules/video_coding/svc/scalable_video_controller.h"
 
 namespace webrtc {
 
 ABSL_CONST_INIT extern const bool kIsLibaomAv1EncoderSupported;
 
 std::unique_ptr<VideoEncoder> CreateLibaomAv1Encoder();
-std::unique_ptr<VideoEncoder> CreateLibaomAv1Encoder(
-    std::unique_ptr<ScalableVideoController> controller);
 
 }  // namespace webrtc
 
diff --git a/modules/video_coding/codecs/av1/libaom_av1_encoder_unittest.cc b/modules/video_coding/codecs/av1/libaom_av1_encoder_unittest.cc
index 146397f..cd86f5a 100644
--- a/modules/video_coding/codecs/av1/libaom_av1_encoder_unittest.cc
+++ b/modules/video_coding/codecs/av1/libaom_av1_encoder_unittest.cc
@@ -54,6 +54,7 @@
   std::unique_ptr<VideoEncoder> encoder = CreateLibaomAv1Encoder();
   ASSERT_TRUE(encoder);
   VideoCodec codec_settings = DefaultCodecSettings();
+  codec_settings.SetScalabilityMode("NONE");
   EXPECT_EQ(encoder->InitEncode(&codec_settings, DefaultEncoderSettings()),
             WEBRTC_VIDEO_CODEC_OK);
   EXPECT_EQ(encoder->Release(), WEBRTC_VIDEO_CODEC_OK);
@@ -61,9 +62,9 @@
 
 TEST(LibaomAv1EncoderTest, NoBitrateOnTopLayerRefecltedInActiveDecodeTargets) {
   // Configure encoder with 2 temporal layers.
-  std::unique_ptr<VideoEncoder> encoder =
-      CreateLibaomAv1Encoder(std::make_unique<ScalabilityStructureL1T2>());
+  std::unique_ptr<VideoEncoder> encoder = CreateLibaomAv1Encoder();
   VideoCodec codec_settings = DefaultCodecSettings();
+  codec_settings.SetScalabilityMode("L1T2");
   ASSERT_EQ(encoder->InitEncode(&codec_settings, DefaultEncoderSettings()),
             WEBRTC_VIDEO_CODEC_OK);
 
diff --git a/modules/video_coding/codecs/av1/libaom_av1_unittest.cc b/modules/video_coding/codecs/av1/libaom_av1_unittest.cc
index 78725ab..18bf883 100644
--- a/modules/video_coding/codecs/av1/libaom_av1_unittest.cc
+++ b/modules/video_coding/codecs/av1/libaom_av1_unittest.cc
@@ -55,6 +55,7 @@
 
 VideoCodec DefaultCodecSettings() {
   VideoCodec codec_settings;
+  codec_settings.SetScalabilityMode("NONE");
   codec_settings.width = kWidth;
   codec_settings.height = kHeight;
   codec_settings.maxFramerate = kFramerate;
@@ -250,10 +251,10 @@
                           kv.second.bps());
   }
 
-  std::unique_ptr<VideoEncoder> encoder =
-      CreateLibaomAv1Encoder(CreateScalabilityStructure(param.name));
+  std::unique_ptr<VideoEncoder> encoder = CreateLibaomAv1Encoder();
   ASSERT_TRUE(encoder);
   VideoCodec codec_settings = DefaultCodecSettings();
+  codec_settings.SetScalabilityMode(param.name);
   codec_settings.maxBitrate = allocation.get_sum_kbps();
   codec_settings.maxFramerate = 30;
   ASSERT_EQ(encoder->InitEncode(&codec_settings, DefaultEncoderSettings()),
diff --git a/modules/video_coding/codecs/test/videocodec_test_libaom.cc b/modules/video_coding/codecs/test/videocodec_test_libaom.cc
index 18852e0..a87b8fd 100644
--- a/modules/video_coding/codecs/test/videocodec_test_libaom.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_libaom.cc
@@ -42,6 +42,7 @@
   auto config = CreateConfig("foreman_cif");
   config.SetCodecSettings(cricket::kAv1CodecName, 1, 1, 1, false, true, true,
                           kCifWidth, kCifHeight);
+  config.codec_settings.SetScalabilityMode("NONE");
   config.num_frames = kNumFramesLong;
   auto fixture = CreateVideoCodecTestFixture(config);
 
@@ -59,6 +60,7 @@
   auto config = CreateConfig("foreman_cif");
   config.SetCodecSettings(cricket::kAv1CodecName, 1, 1, 1, false, true, true,
                           kCifWidth, kCifHeight);
+  config.codec_settings.SetScalabilityMode("NONE");
   auto fixture = CreateVideoCodecTestFixture(config);
 
   std::vector<RateProfile> rate_profiles = {{50, 30, 0}};
@@ -78,6 +80,7 @@
   auto config = CreateConfig("ConferenceMotion_1280_720_50");
   config.SetCodecSettings(cricket::kAv1CodecName, 1, 1, 1, false, true, true,
                           kHdWidth, kHdHeight);
+  config.codec_settings.SetScalabilityMode("NONE");
   config.num_frames = kNumFramesLong;
   auto fixture = CreateVideoCodecTestFixture(config);