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}
This commit is contained in:
Danil Chapovalov
2021-01-21 15:56:05 +01:00
committed by Commit Bot
parent 2ed56fefef
commit 11215febb9
5 changed files with 18 additions and 27 deletions

View File

@ -64,8 +64,7 @@ int GetCpuSpeed(int width, int height, int number_of_cores) {
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 @@ int32_t VerifyCodecSettings(const VideoCodec& codec_settings) {
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 @@ int LibaomAv1Encoder::InitEncode(const VideoCodec* codec_settings,
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 @@ VideoEncoder::EncoderInfo LibaomAv1Encoder::GetEncoderInfo() const {
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

View File

@ -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

View File

@ -54,6 +54,7 @@ TEST(LibaomAv1EncoderTest, InitAndRelease) {
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, InitAndRelease) {
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);

View File

@ -55,6 +55,7 @@ constexpr int kFramerate = 30;
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 @@ TEST_P(LibaomAv1SvcTest, SetRatesMatchMeasuredBitrate) {
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()),

View File

@ -42,6 +42,7 @@ TEST(VideoCodecTestLibaom, HighBitrateAV1) {
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 @@ TEST(VideoCodecTestLibaom, VeryLowBitrateAV1) {
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 @@ TEST(VideoCodecTestLibaom, HdAV1) {
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);