Add option to configure AV1 EncoderInfo resolution_bitrate_limits.

bug: webrtc:14931
Change-Id: I8ade2a888d29f76a0f690fc3541b45b7304ad4d3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/294600
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Michael Horowitz <mhoro@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39426}
This commit is contained in:
Michael Horowitz 2023-02-28 09:59:50 -06:00 committed by WebRTC LUCI CQ
parent 8d33105015
commit b27efd487d
5 changed files with 41 additions and 0 deletions

View File

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

View File

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

View File

@ -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<VideoEncoder> 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<VideoEncoder> 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<VideoEncoder> encoder = CreateLibaomAv1Encoder();
VideoCodec codec_settings = DefaultCodecSettings();

View File

@ -211,4 +211,7 @@ LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings()
LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings()
: EncoderInfoSettings("WebRTC-VP9-GetEncoderInfoOverride") {}
LibaomAv1EncoderInfoSettings::LibaomAv1EncoderInfoSettings()
: EncoderInfoSettings("WebRTC-Av1-GetEncoderInfoOverride") {}
} // namespace webrtc

View File

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