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