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);
}
};