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:
parent
22e37d8857
commit
9111bd18b1
@ -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",
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -75,6 +75,9 @@ SimulcastEncoderAdapterEncoderInfoSettings::
|
||||
: EncoderInfoSettings(
|
||||
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride") {}
|
||||
|
||||
LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings()
|
||||
: EncoderInfoSettings("WebRTC-VP8-GetEncoderInfoOverride") {}
|
||||
|
||||
LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings()
|
||||
: EncoderInfoSettings("WebRTC-LibvpxVp9Encoder-GetEncoderInfoOverride") {}
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user