LibvpxVp8Encoder: add option to configure resolution_bitrate_limits.

Bug: none
Change-Id: Ia01d630fc95e19a4a08cd7a004238c22d823b4dc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/205521
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33144}
This commit is contained in:
Åsa Persson 2021-02-03 10:16:30 +01:00 committed by Commit Bot
parent 22e37d8857
commit 9111bd18b1
6 changed files with 45 additions and 21 deletions

View File

@ -491,6 +491,7 @@ rtc_library("webrtc_vp8") {
"../../rtc_base:rtc_base_approved",
"../../rtc_base:rtc_numerics",
"../../rtc_base/experiments:cpu_speed_experiment",
"../../rtc_base/experiments:encoder_info_settings",
"../../rtc_base/experiments:field_trial_parser",
"../../rtc_base/experiments:rate_control_settings",
"../../system_wrappers:field_trial",

View File

@ -49,11 +49,6 @@ constexpr char kVP8IosMaxNumberOfThreadFieldTrial[] =
constexpr char kVP8IosMaxNumberOfThreadFieldTrialParameter[] = "max_thread";
#endif
constexpr char kVp8GetEncoderInfoOverrideFieldTrial[] =
"WebRTC-VP8-GetEncoderInfoOverride";
constexpr char kVp8RequestedResolutionAlignmentFieldTrialParameter[] =
"requested_resolution_alignment";
constexpr char kVp8ForcePartitionResilience[] =
"WebRTC-VP8-ForcePartitionResilience";
@ -165,15 +160,6 @@ void ApplyVp8EncoderConfigToVpxConfig(const Vp8EncoderConfig& encoder_config,
}
}
absl::optional<int> GetRequestedResolutionAlignmentOverride() {
const std::string trial_string =
field_trial::FindFullName(kVp8GetEncoderInfoOverrideFieldTrial);
FieldTrialOptional<int> requested_resolution_alignment(
kVp8RequestedResolutionAlignmentFieldTrialParameter);
ParseFieldTrial({&requested_resolution_alignment}, trial_string);
return requested_resolution_alignment.GetOptional();
}
} // namespace
std::unique_ptr<VideoEncoder> VP8Encoder::Create() {
@ -230,8 +216,6 @@ LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface,
VP8Encoder::Settings settings)
: libvpx_(std::move(interface)),
rate_control_settings_(RateControlSettings::ParseFromFieldTrials()),
requested_resolution_alignment_override_(
GetRequestedResolutionAlignmentOverride()),
frame_buffer_controller_factory_(
std::move(settings.frame_buffer_controller_factory)),
resolution_bitrate_limits_(std::move(settings.resolution_bitrate_limits)),
@ -1189,9 +1173,15 @@ VideoEncoder::EncoderInfo LibvpxVp8Encoder::GetEncoderInfo() const {
if (!resolution_bitrate_limits_.empty()) {
info.resolution_bitrate_limits = resolution_bitrate_limits_;
}
if (requested_resolution_alignment_override_) {
if (encoder_info_override_.requested_resolution_alignment()) {
info.requested_resolution_alignment =
*requested_resolution_alignment_override_;
*encoder_info_override_.requested_resolution_alignment();
info.apply_alignment_to_all_simulcast_layers =
encoder_info_override_.apply_alignment_to_all_simulcast_layers();
}
if (!encoder_info_override_.resolution_bitrate_limits().empty()) {
info.resolution_bitrate_limits =
encoder_info_override_.resolution_bitrate_limits();
}
const bool enable_scaling =

View File

@ -26,6 +26,7 @@
#include "modules/video_coding/include/video_codec_interface.h"
#include "modules/video_coding/utility/framerate_controller.h"
#include "rtc_base/experiments/cpu_speed_experiment.h"
#include "rtc_base/experiments/encoder_info_settings.h"
#include "rtc_base/experiments/rate_control_settings.h"
#include "vpx/vp8cx.h"
#include "vpx/vpx_encoder.h"
@ -102,9 +103,6 @@ class LibvpxVp8Encoder : public VideoEncoder {
const CpuSpeedExperiment experimental_cpu_speed_config_arm_;
const RateControlSettings rate_control_settings_;
// EncoderInfo::requested_resolution_alignment override from field trial.
const absl::optional<int> requested_resolution_alignment_override_;
EncodedImageCallback* encoded_complete_callback_ = nullptr;
VideoCodec codec_;
bool inited_ = false;
@ -146,6 +144,8 @@ class LibvpxVp8Encoder : public VideoEncoder {
int num_steady_state_frames_ = 0;
FecControllerOverride* fec_controller_override_ = nullptr;
const LibvpxVp8EncoderInfoSettings encoder_info_override_;
};
} // namespace webrtc

View File

@ -539,6 +539,29 @@ TEST(LibvpxVp8EncoderTest, RequestedResolutionAlignmentFromFieldTrial) {
VP8Encoder::Settings());
EXPECT_EQ(encoder.GetEncoderInfo().requested_resolution_alignment, 10);
EXPECT_FALSE(
encoder.GetEncoderInfo().apply_alignment_to_all_simulcast_layers);
EXPECT_TRUE(encoder.GetEncoderInfo().resolution_bitrate_limits.empty());
}
TEST(LibvpxVp8EncoderTest, ResolutionBitrateLimitsFromFieldTrial) {
test::ScopedFieldTrials field_trials(
"WebRTC-VP8-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/");
auto* const vpx = new NiceMock<MockLibvpxInterface>();
LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
VP8Encoder::Settings());
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(LibvpxVp8EncoderTest,

View File

@ -75,6 +75,9 @@ SimulcastEncoderAdapterEncoderInfoSettings::
: EncoderInfoSettings(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride") {}
LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings()
: EncoderInfoSettings("WebRTC-VP8-GetEncoderInfoOverride") {}
LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings()
: EncoderInfoSettings("WebRTC-LibvpxVp9Encoder-GetEncoderInfoOverride") {}

View File

@ -57,6 +57,13 @@ class SimulcastEncoderAdapterEncoderInfoSettings : public EncoderInfoSettings {
~SimulcastEncoderAdapterEncoderInfoSettings() override {}
};
// EncoderInfo settings for LibvpxVp8Encoder.
class LibvpxVp8EncoderInfoSettings : public EncoderInfoSettings {
public:
LibvpxVp8EncoderInfoSettings();
~LibvpxVp8EncoderInfoSettings() override {}
};
// EncoderInfo settings for LibvpxVp9Encoder.
class LibvpxVp9EncoderInfoSettings : public EncoderInfoSettings {
public: