Update SupportsScalabilityMode functions to use enum ScalabilityMode.

And add missing values to ScalabilityMode.

Bug: webrtc:11607
Change-Id: I892ac35a3528db11b0901d26902699ecfe8f49a4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/260982
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36792}
diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn
index 253030b..ed53291 100644
--- a/api/video_codecs/BUILD.gn
+++ b/api/video_codecs/BUILD.gn
@@ -124,7 +124,10 @@
   allow_poison = [ "software_video_codecs" ]
   public = [ "video_encoder_factory_template.h" ]
 
-  deps = [ ":video_codecs_api" ]
+  deps = [
+    ":video_codecs_api",
+    "../../modules/video_coding/svc:scalability_mode_util",
+  ]
   absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container" ]
 }
 
@@ -159,9 +162,9 @@
 
   deps = [
     ":scalability_mode",
+    "../../modules/video_coding/codecs/av1:av1_svc_config",
     "../../modules/video_coding/codecs/av1:libaom_av1_encoder",
     "../../modules/video_coding/svc:scalability_mode_util",
-    "../../modules/video_coding/svc:scalability_structures",
   ]
 }
 
diff --git a/api/video_codecs/scalability_mode.h b/api/video_codecs/scalability_mode.h
index e5809ed..262e7ce 100644
--- a/api/video_codecs/scalability_mode.h
+++ b/api/video_codecs/scalability_mode.h
@@ -21,16 +21,27 @@
 enum class ScalabilityMode {
   kL1T1,
   kL1T2,
+  kL1T2h,
   kL1T3,
+  kL1T3h,
   kL2T1,
   kL2T1h,
   kL2T1_KEY,
   kL2T2,
+  kL2T2h,
   kL2T2_KEY,
   kL2T2_KEY_SHIFT,
+  kL2T3,
+  kL2T3h,
   kL2T3_KEY,
   kL3T1,
+  kL3T1h,
+  kL3T1_KEY,
+  kL3T2,
+  kL3T2h,
+  kL3T2_KEY,
   kL3T3,
+  kL3T3h,
   kL3T3_KEY,
   kS2T1,
   kS3T3,
diff --git a/api/video_codecs/test/video_encoder_factory_template_tests.cc b/api/video_codecs/test/video_encoder_factory_template_tests.cc
index e54b46c..b9dfac9 100644
--- a/api/video_codecs/test/video_encoder_factory_template_tests.cc
+++ b/api/video_codecs/test/video_encoder_factory_template_tests.cc
@@ -40,9 +40,9 @@
     return std::make_unique<testing::StrictMock<MockVideoEncoder>>();
   }
 
-  static bool IsScalabilityModeSupported(
-      const absl::string_view scalability_mode) {
-    return scalability_mode == "L1T2" || scalability_mode == "L1T3";
+  static bool IsScalabilityModeSupported(ScalabilityMode scalability_mode) {
+    return scalability_mode == ScalabilityMode::kL1T2 ||
+           scalability_mode == ScalabilityMode::kL1T3;
   }
 };
 
@@ -56,10 +56,11 @@
     return std::make_unique<testing::StrictMock<MockVideoEncoder>>();
   }
 
-  static bool IsScalabilityModeSupported(
-      const absl::string_view scalability_mode) {
-    return scalability_mode == "L1T2" || scalability_mode == "L1T3" ||
-           scalability_mode == "S2T2" || scalability_mode == "S2T3";
+  static bool IsScalabilityModeSupported(ScalabilityMode scalability_mode) {
+    return scalability_mode == ScalabilityMode::kL1T2 ||
+           scalability_mode == ScalabilityMode::kL1T3 ||
+           scalability_mode == ScalabilityMode::kS2T1 ||
+           scalability_mode == ScalabilityMode::kS3T3;
   }
 };
 
@@ -76,7 +77,7 @@
               Field(&CodecSupport::is_supported, true));
   EXPECT_THAT(factory.QueryCodecSupport(kFooSdp, "L1T2"),
               Field(&CodecSupport::is_supported, true));
-  EXPECT_THAT(factory.QueryCodecSupport(kFooSdp, "S2T3"),
+  EXPECT_THAT(factory.QueryCodecSupport(kFooSdp, "S3T3"),
               Field(&CodecSupport::is_supported, false));
   EXPECT_THAT(factory.QueryCodecSupport(SdpVideoFormat("FooX"), absl::nullopt),
               Field(&CodecSupport::is_supported, false));
@@ -110,13 +111,13 @@
               Field(&CodecSupport::is_supported, true));
   EXPECT_THAT(factory.QueryCodecSupport(kFooSdp, "L1T2"),
               Field(&CodecSupport::is_supported, true));
-  EXPECT_THAT(factory.QueryCodecSupport(kFooSdp, "S2T3"),
+  EXPECT_THAT(factory.QueryCodecSupport(kFooSdp, "S3T3"),
               Field(&CodecSupport::is_supported, false));
   EXPECT_THAT(factory.QueryCodecSupport(kBarLowSdp, absl::nullopt),
               Field(&CodecSupport::is_supported, true));
   EXPECT_THAT(factory.QueryCodecSupport(kBarHighSdp, absl::nullopt),
               Field(&CodecSupport::is_supported, true));
-  EXPECT_THAT(factory.QueryCodecSupport(kBarLowSdp, "S2T2"),
+  EXPECT_THAT(factory.QueryCodecSupport(kBarLowSdp, "S2T1"),
               Field(&CodecSupport::is_supported, true));
   EXPECT_THAT(factory.QueryCodecSupport(kBarHighSdp, "S3T2"),
               Field(&CodecSupport::is_supported, false));
diff --git a/api/video_codecs/video_encoder_factory_template.h b/api/video_codecs/video_encoder_factory_template.h
index f1581c5..4913039 100644
--- a/api/video_codecs/video_encoder_factory_template.h
+++ b/api/video_codecs/video_encoder_factory_template.h
@@ -18,6 +18,7 @@
 #include "absl/algorithm/container.h"
 #include "api/video_codecs/video_encoder.h"
 #include "api/video_codecs/video_encoder_factory.h"
+#include "modules/video_coding/svc/scalability_mode_util.h"
 
 namespace webrtc {
 // The VideoEncoderFactoryTemplate supports encoders implementations given as
@@ -35,7 +36,7 @@
 //
 //   // Returns true if the encoder supports the given scalability mode.
 //   static bool
-//       IsScalabilityModeSupported(const absl::string_view scalability_mode);
+//       IsScalabilityModeSupported(ScalabilityMode scalability_mode);
 //
 // Note that the order of the template arguments matter as the factory will
 // query/return the first encoder implementation supporting the given
@@ -66,6 +67,18 @@
     return absl::c_count(V::SupportedFormats(), format) > 0;
   }
 
+  template <typename V>
+  bool IsScalabilityModeSupported(
+      const absl::optional<std::string>& scalability_mode_string) const {
+    if (!scalability_mode_string.has_value()) {
+      return true;
+    }
+    absl::optional<ScalabilityMode> scalability_mode =
+        ScalabilityModeFromString(*scalability_mode_string);
+    return scalability_mode.has_value() &&
+           V::IsScalabilityModeSupported(*scalability_mode);
+  }
+
   template <typename V, typename... Vs>
   void GetSupportedFormatsInternal(std::vector<SdpVideoFormat>& formats) const {
     auto supported_formats = V::SupportedFormats();
@@ -99,8 +112,7 @@
       const SdpVideoFormat& format,
       const absl::optional<std::string>& scalability_mode) const {
     if (IsFormatSupported<V>(format)) {
-      return {.is_supported = !scalability_mode ||
-                              V::IsScalabilityModeSupported(*scalability_mode)};
+      return {.is_supported = IsScalabilityModeSupported<V>(scalability_mode)};
     }
 
     if constexpr (sizeof...(Vs) > 0) {
diff --git a/api/video_codecs/video_encoder_factory_template_libaom_av1_adapter.h b/api/video_codecs/video_encoder_factory_template_libaom_av1_adapter.h
index e0363dd..d71cc00 100644
--- a/api/video_codecs/video_encoder_factory_template_libaom_av1_adapter.h
+++ b/api/video_codecs/video_encoder_factory_template_libaom_av1_adapter.h
@@ -14,9 +14,8 @@
 #include <memory>
 #include <vector>
 
+#include "modules/video_coding/codecs/av1/av1_svc_config.h"
 #include "modules/video_coding/codecs/av1/libaom_av1_encoder.h"
-#include "modules/video_coding/svc/create_scalability_structure.h"
-#include "modules/video_coding/svc/scalability_mode_util.h"
 
 namespace webrtc {
 struct LibaomAv1EncoderTemplateAdapter {
@@ -29,13 +28,8 @@
     return CreateLibaomAv1Encoder();
   }
 
-  static bool IsScalabilityModeSupported(absl::string_view mode_string) {
-    // For libaom AV1, the scalability mode is supported if we can create the
-    // scalability structure.
-    absl::optional<ScalabilityMode> scalability_mode =
-        ScalabilityModeFromString(mode_string);
-    return scalability_mode != absl::nullopt &&
-           ScalabilityStructureConfig(*scalability_mode) != absl::nullopt;
+  static bool IsScalabilityModeSupported(ScalabilityMode scalability_mode) {
+    return LibaomAv1EncoderSupportsScalabilityMode(scalability_mode);
   }
 };
 
diff --git a/api/video_codecs/video_encoder_factory_template_libvpx_vp8_adapter.h b/api/video_codecs/video_encoder_factory_template_libvpx_vp8_adapter.h
index 935a87a..7bbf1fd 100644
--- a/api/video_codecs/video_encoder_factory_template_libvpx_vp8_adapter.h
+++ b/api/video_codecs/video_encoder_factory_template_libvpx_vp8_adapter.h
@@ -27,8 +27,7 @@
     return VP8Encoder::Create();
   }
 
-  static bool IsScalabilityModeSupported(
-      const absl::string_view scalability_mode) {
+  static bool IsScalabilityModeSupported(ScalabilityMode scalability_mode) {
     return VP8Encoder::SupportsScalabilityMode(scalability_mode);
   }
 };
diff --git a/api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h b/api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h
index e203b07..c317cda 100644
--- a/api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h
+++ b/api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h
@@ -27,8 +27,7 @@
     return VP9Encoder::Create();
   }
 
-  static bool IsScalabilityModeSupported(
-      const absl::string_view scalability_mode) {
+  static bool IsScalabilityModeSupported(ScalabilityMode scalability_mode) {
     return VP9Encoder::SupportsScalabilityMode(scalability_mode);
   }
 };
diff --git a/api/video_codecs/video_encoder_factory_template_open_h264_adapter.h b/api/video_codecs/video_encoder_factory_template_open_h264_adapter.h
index b127009..9959617 100644
--- a/api/video_codecs/video_encoder_factory_template_open_h264_adapter.h
+++ b/api/video_codecs/video_encoder_factory_template_open_h264_adapter.h
@@ -30,8 +30,7 @@
     return H264Encoder::Create(cricket::VideoCodec(format));
   }
 
-  static bool IsScalabilityModeSupported(
-      const absl::string_view scalability_mode) {
+  static bool IsScalabilityModeSupported(ScalabilityMode scalability_mode) {
     return H264Encoder::SupportsScalabilityMode(scalability_mode);
   }
 };