From b27efd487d26a677a6d772986229d5f2f07b21f8 Mon Sep 17 00:00:00 2001 From: Michael Horowitz Date: Tue, 28 Feb 2023 09:59:50 -0600 Subject: [PATCH] Add option to configure AV1 EncoderInfo resolution_bitrate_limits. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bug: webrtc:14931 Change-Id: I8ade2a888d29f76a0f690fc3541b45b7304ad4d3 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/294600 Reviewed-by: Åsa Persson Commit-Queue: Michael Horowitz Cr-Commit-Position: refs/heads/main@{#39426} --- modules/video_coding/codecs/av1/BUILD.gn | 2 ++ .../codecs/av1/libaom_av1_encoder.cc | 6 +++++ .../codecs/av1/libaom_av1_encoder_unittest.cc | 23 +++++++++++++++++++ rtc_base/experiments/encoder_info_settings.cc | 3 +++ rtc_base/experiments/encoder_info_settings.h | 7 ++++++ 5 files changed, 41 insertions(+) diff --git a/modules/video_coding/codecs/av1/BUILD.gn b/modules/video_coding/codecs/av1/BUILD.gn index 678080dc90..54149bcb89 100644 --- a/modules/video_coding/codecs/av1/BUILD.gn +++ b/modules/video_coding/codecs/av1/BUILD.gn @@ -63,6 +63,7 @@ rtc_library("libaom_av1_encoder") { "../../../../rtc_base:checks", "../../../../rtc_base:logging", "../../../../rtc_base:rtc_numerics", + "../../../../rtc_base/experiments:encoder_info_settings", "../../svc:scalability_structures", "../../svc:scalable_video_controller", "//third_party/libaom", @@ -102,6 +103,7 @@ if (rtc_include_tests) { "../../../../api/units:data_size", "../../../../api/units:time_delta", "../../../../api/video:video_frame", + "../../../../test:field_trial", "../../svc:scalability_mode_util", "../../svc:scalability_structures", "../../svc:scalable_video_controller", diff --git a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc index 7e1795251f..55695180de 100644 --- a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc +++ b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc @@ -32,6 +32,7 @@ #include "modules/video_coding/svc/scalable_video_controller.h" #include "modules/video_coding/svc/scalable_video_controller_no_layering.h" #include "rtc_base/checks.h" +#include "rtc_base/experiments/encoder_info_settings.h" #include "rtc_base/logging.h" #include "third_party/libaom/source/libaom/aom/aom_codec.h" #include "third_party/libaom/source/libaom/aom/aom_encoder.h" @@ -120,6 +121,7 @@ class LibaomAv1Encoder final : public VideoEncoder { aom_codec_enc_cfg_t cfg_; EncodedImageCallback* encoded_image_callback_; int64_t timestamp_; + const LibaomAv1EncoderInfoSettings encoder_info_override_; }; int32_t VerifyCodecSettings(const VideoCodec& codec_settings) { @@ -810,6 +812,10 @@ VideoEncoder::EncoderInfo LibaomAv1Encoder::GetEncoderInfo() const { } } } + if (!encoder_info_override_.resolution_bitrate_limits().empty()) { + info.resolution_bitrate_limits = + encoder_info_override_.resolution_bitrate_limits(); + } return info; } 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 addbf5f1c4..cca8c58439 100644 --- a/modules/video_coding/codecs/av1/libaom_av1_encoder_unittest.cc +++ b/modules/video_coding/codecs/av1/libaom_av1_encoder_unittest.cc @@ -21,6 +21,7 @@ #include "api/video_codecs/video_encoder.h" #include "modules/video_coding/codecs/test/encoded_video_frame_producer.h" #include "modules/video_coding/include/video_error_codes.h" +#include "test/field_trial.h" #include "test/gmock.h" #include "test/gtest.h" @@ -186,6 +187,28 @@ TEST(LibaomAv1EncoderTest, CheckOddDimensionsWithSpatialLayers) { ASSERT_THAT(encoded_frames, SizeIs(6)); } +TEST(LibaomAv1EncoderTest, EncoderInfoWithoutResolutionBitrateLimits) { + std::unique_ptr encoder = CreateLibaomAv1Encoder(); + EXPECT_TRUE(encoder->GetEncoderInfo().resolution_bitrate_limits.empty()); +} + +TEST(LibaomAv1EncoderTest, EncoderInfoWithBitrateLimitsFromFieldTrial) { + test::ScopedFieldTrials field_trials( + "WebRTC-Av1-GetEncoderInfoOverride/" + "frame_size_pixels:123|456|789," + "min_start_bitrate_bps:11000|22000|33000," + "min_bitrate_bps:44000|55000|66000," + "max_bitrate_bps:77000|88000|99000/"); + std::unique_ptr encoder = CreateLibaomAv1Encoder(); + + EXPECT_THAT( + encoder->GetEncoderInfo().resolution_bitrate_limits, + ::testing::ElementsAre( + VideoEncoder::ResolutionBitrateLimits{123, 11000, 44000, 77000}, + VideoEncoder::ResolutionBitrateLimits{456, 22000, 55000, 88000}, + VideoEncoder::ResolutionBitrateLimits{789, 33000, 66000, 99000})); +} + TEST(LibaomAv1EncoderTest, EncoderInfoProvidesFpsAllocation) { std::unique_ptr encoder = CreateLibaomAv1Encoder(); VideoCodec codec_settings = DefaultCodecSettings(); diff --git a/rtc_base/experiments/encoder_info_settings.cc b/rtc_base/experiments/encoder_info_settings.cc index 5f0bf2d7ac..062ba0248c 100644 --- a/rtc_base/experiments/encoder_info_settings.cc +++ b/rtc_base/experiments/encoder_info_settings.cc @@ -211,4 +211,7 @@ LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings() LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings() : EncoderInfoSettings("WebRTC-VP9-GetEncoderInfoOverride") {} +LibaomAv1EncoderInfoSettings::LibaomAv1EncoderInfoSettings() + : EncoderInfoSettings("WebRTC-Av1-GetEncoderInfoOverride") {} + } // namespace webrtc diff --git a/rtc_base/experiments/encoder_info_settings.h b/rtc_base/experiments/encoder_info_settings.h index f4227ed631..416bf6be7a 100644 --- a/rtc_base/experiments/encoder_info_settings.h +++ b/rtc_base/experiments/encoder_info_settings.h @@ -88,6 +88,13 @@ class LibvpxVp9EncoderInfoSettings : public EncoderInfoSettings { ~LibvpxVp9EncoderInfoSettings() override {} }; +// EncoderInfo settings for LibaomAv1Encoder. +class LibaomAv1EncoderInfoSettings : public EncoderInfoSettings { + public: + LibaomAv1EncoderInfoSettings(); + ~LibaomAv1EncoderInfoSettings() override {} +}; + } // namespace webrtc #endif // RTC_BASE_EXPERIMENTS_ENCODER_INFO_SETTINGS_H_