Query EncoderInfoSettings through propagated field trials

Instead of from the global field trial string.

Bug: webrtc:42220378
Change-Id: Iddb41429e388792de02f702b4caa35689c57d9e5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/347720
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42201}
This commit is contained in:
Danil Chapovalov 2024-04-25 12:02:27 +02:00 committed by WebRTC LUCI CQ
parent a3458809fc
commit 652bd288b3
9 changed files with 54 additions and 36 deletions

View file

@ -265,7 +265,8 @@ SimulcastEncoderAdapter::SimulcastEncoderAdapter(
.Vp8BoostBaseLayerQuality()), .Vp8BoostBaseLayerQuality()),
prefer_temporal_support_on_base_layer_(env_.field_trials().IsEnabled( prefer_temporal_support_on_base_layer_(env_.field_trials().IsEnabled(
"WebRTC-Video-PreferTemporalSupportOnBaseLayer")), "WebRTC-Video-PreferTemporalSupportOnBaseLayer")),
per_layer_pli_(SupportsPerLayerPictureLossIndication(format.parameters)) { per_layer_pli_(SupportsPerLayerPictureLossIndication(format.parameters)),
encoder_info_override_(env.field_trials()) {
RTC_DCHECK(primary_factory); RTC_DCHECK(primary_factory);
// The adapter is typically created on the worker thread, but operated on // The adapter is typically created on the worker thread, but operated on

View file

@ -180,6 +180,7 @@ LibaomAv1Encoder::LibaomAv1Encoder(const Environment& env,
frame_for_encode_(nullptr), frame_for_encode_(nullptr),
encoded_image_callback_(nullptr), encoded_image_callback_(nullptr),
timestamp_(0), timestamp_(0),
encoder_info_override_(env.field_trials()),
disable_frame_dropping_(env.field_trials().IsEnabled( disable_frame_dropping_(env.field_trials().IsEnabled(
"WebRTC-LibaomAv1Encoder-DisableFrameDropping")), "WebRTC-LibaomAv1Encoder-DisableFrameDropping")),
max_consec_frame_drop_(GetMaxConsecutiveFrameDrop(env.field_trials())) {} max_consec_frame_drop_(GetMaxConsecutiveFrameDrop(env.field_trials())) {}

View file

@ -316,6 +316,7 @@ LibvpxVp8Encoder::LibvpxVp8Encoder(const Environment& env,
last_encoder_output_time_(kMaxSimulcastStreams, last_encoder_output_time_(kMaxSimulcastStreams,
Timestamp::MinusInfinity()), Timestamp::MinusInfinity()),
framerate_controller_(variable_framerate_screenshare::kMinFps), framerate_controller_(variable_framerate_screenshare::kMinFps),
encoder_info_override_(env_.field_trials()),
max_frame_drop_interval_(ParseFrameDropInterval(env_.field_trials())), max_frame_drop_interval_(ParseFrameDropInterval(env_.field_trials())),
android_specific_threading_settings_(env_.field_trials().IsEnabled( android_specific_threading_settings_(env_.field_trials().IsEnabled(
"WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings")) { "WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings")) {

View file

@ -264,6 +264,7 @@ LibvpxVp9Encoder::LibvpxVp9Encoder(const Environment& env,
performance_flags_(ParsePerformanceFlagsFromTrials(env.field_trials())), performance_flags_(ParsePerformanceFlagsFromTrials(env.field_trials())),
num_steady_state_frames_(0), num_steady_state_frames_(0),
config_changed_(true), config_changed_(true),
encoder_info_override_(env.field_trials()),
svc_frame_drop_config_(ParseSvcFrameDropConfig(env.field_trials())) { svc_frame_drop_config_(ParseSvcFrameDropConfig(env.field_trials())) {
codec_ = {}; codec_ = {};
memset(&svc_params_, 0, sizeof(vpx_svc_extra_cfg_t)); memset(&svc_params_, 0, sizeof(vpx_svc_extra_cfg_t));

View file

@ -145,8 +145,8 @@ rtc_library("encoder_info_settings") {
deps = [ deps = [
":field_trial_parser", ":field_trial_parser",
"..:logging", "..:logging",
"../../api:field_trials_view",
"../../api/video_codecs:video_codecs_api", "../../api/video_codecs:video_codecs_api",
"../../system_wrappers:field_trial",
] ]
absl_deps = [ absl_deps = [
"//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/strings",

View file

@ -13,9 +13,9 @@
#include <stdio.h> #include <stdio.h>
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "api/field_trials_view.h"
#include "rtc_base/experiments/field_trial_list.h" #include "rtc_base/experiments/field_trial_list.h"
#include "rtc_base/logging.h" #include "rtc_base/logging.h"
#include "system_wrappers/include/field_trial.h"
namespace webrtc { namespace webrtc {
namespace { namespace {
@ -175,7 +175,8 @@ EncoderInfoSettings::GetSinglecastBitrateLimitForResolutionWhenQpIsUntrusted(
} }
} }
EncoderInfoSettings::EncoderInfoSettings(absl::string_view name) EncoderInfoSettings::EncoderInfoSettings(const FieldTrialsView& field_trials,
absl::string_view name)
: requested_resolution_alignment_("requested_resolution_alignment"), : requested_resolution_alignment_("requested_resolution_alignment"),
apply_alignment_to_all_simulcast_layers_( apply_alignment_to_all_simulcast_layers_(
"apply_alignment_to_all_simulcast_layers") { "apply_alignment_to_all_simulcast_layers") {
@ -194,15 +195,15 @@ EncoderInfoSettings::EncoderInfoSettings(absl::string_view name)
[](BitrateLimit* b) { return &b->max_bitrate_bps; })}, [](BitrateLimit* b) { return &b->max_bitrate_bps; })},
{}); {});
std::string name_str(name); std::string experiment_string = field_trials.Lookup(name);
if (field_trial::FindFullName(name_str).empty()) { if (experiment_string.empty()) {
// Encoder name not found, use common string applying to all encoders. // Encoder name not found, use common string applying to all encoders.
name_str = "WebRTC-GetEncoderInfoOverride"; experiment_string = field_trials.Lookup("WebRTC-GetEncoderInfoOverride");
} }
ParseFieldTrial({&bitrate_limits, &requested_resolution_alignment_, ParseFieldTrial({&bitrate_limits, &requested_resolution_alignment_,
&apply_alignment_to_all_simulcast_layers_}, &apply_alignment_to_all_simulcast_layers_},
field_trial::FindFullName(name_str)); experiment_string);
resolution_bitrate_limits_ = ToResolutionBitrateLimits(bitrate_limits.Get()); resolution_bitrate_limits_ = ToResolutionBitrateLimits(bitrate_limits.Get());
} }
@ -220,17 +221,22 @@ absl::optional<uint32_t> EncoderInfoSettings::requested_resolution_alignment()
EncoderInfoSettings::~EncoderInfoSettings() {} EncoderInfoSettings::~EncoderInfoSettings() {}
SimulcastEncoderAdapterEncoderInfoSettings:: SimulcastEncoderAdapterEncoderInfoSettings::
SimulcastEncoderAdapterEncoderInfoSettings() SimulcastEncoderAdapterEncoderInfoSettings(
const FieldTrialsView& field_trials)
: EncoderInfoSettings( : EncoderInfoSettings(
field_trials,
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride") {} "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride") {}
LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings() LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings(
: EncoderInfoSettings("WebRTC-VP8-GetEncoderInfoOverride") {} const FieldTrialsView& field_trials)
: EncoderInfoSettings(field_trials, "WebRTC-VP8-GetEncoderInfoOverride") {}
LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings() LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings(
: EncoderInfoSettings("WebRTC-VP9-GetEncoderInfoOverride") {} const FieldTrialsView& field_trials)
: EncoderInfoSettings(field_trials, "WebRTC-VP9-GetEncoderInfoOverride") {}
LibaomAv1EncoderInfoSettings::LibaomAv1EncoderInfoSettings() LibaomAv1EncoderInfoSettings::LibaomAv1EncoderInfoSettings(
: EncoderInfoSettings("WebRTC-Av1-GetEncoderInfoOverride") {} const FieldTrialsView& field_trials)
: EncoderInfoSettings(field_trials, "WebRTC-Av1-GetEncoderInfoOverride") {}
} // namespace webrtc } // namespace webrtc

View file

@ -16,6 +16,7 @@
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "absl/types/optional.h" #include "absl/types/optional.h"
#include "api/field_trials_view.h"
#include "api/video_codecs/video_encoder.h" #include "api/video_codecs/video_encoder.h"
#include "rtc_base/experiments/field_trial_parser.h" #include "rtc_base/experiments/field_trial_parser.h"
@ -59,7 +60,8 @@ class EncoderInfoSettings {
resolution_bitrate_limits); resolution_bitrate_limits);
protected: protected:
explicit EncoderInfoSettings(absl::string_view name); EncoderInfoSettings(const FieldTrialsView& field_trials,
absl::string_view name);
private: private:
FieldTrialOptional<uint32_t> requested_resolution_alignment_; FieldTrialOptional<uint32_t> requested_resolution_alignment_;
@ -70,28 +72,29 @@ class EncoderInfoSettings {
// EncoderInfo settings for SimulcastEncoderAdapter. // EncoderInfo settings for SimulcastEncoderAdapter.
class SimulcastEncoderAdapterEncoderInfoSettings : public EncoderInfoSettings { class SimulcastEncoderAdapterEncoderInfoSettings : public EncoderInfoSettings {
public: public:
SimulcastEncoderAdapterEncoderInfoSettings(); explicit SimulcastEncoderAdapterEncoderInfoSettings(
const FieldTrialsView& field_trials);
~SimulcastEncoderAdapterEncoderInfoSettings() override {} ~SimulcastEncoderAdapterEncoderInfoSettings() override {}
}; };
// EncoderInfo settings for LibvpxVp8Encoder. // EncoderInfo settings for LibvpxVp8Encoder.
class LibvpxVp8EncoderInfoSettings : public EncoderInfoSettings { class LibvpxVp8EncoderInfoSettings : public EncoderInfoSettings {
public: public:
LibvpxVp8EncoderInfoSettings(); explicit LibvpxVp8EncoderInfoSettings(const FieldTrialsView& field_trials);
~LibvpxVp8EncoderInfoSettings() override {} ~LibvpxVp8EncoderInfoSettings() override {}
}; };
// EncoderInfo settings for LibvpxVp9Encoder. // EncoderInfo settings for LibvpxVp9Encoder.
class LibvpxVp9EncoderInfoSettings : public EncoderInfoSettings { class LibvpxVp9EncoderInfoSettings : public EncoderInfoSettings {
public: public:
LibvpxVp9EncoderInfoSettings(); explicit LibvpxVp9EncoderInfoSettings(const FieldTrialsView& field_trials);
~LibvpxVp9EncoderInfoSettings() override {} ~LibvpxVp9EncoderInfoSettings() override {}
}; };
// EncoderInfo settings for LibaomAv1Encoder. // EncoderInfo settings for LibaomAv1Encoder.
class LibaomAv1EncoderInfoSettings : public EncoderInfoSettings { class LibaomAv1EncoderInfoSettings : public EncoderInfoSettings {
public: public:
LibaomAv1EncoderInfoSettings(); explicit LibaomAv1EncoderInfoSettings(const FieldTrialsView& field_trials);
~LibaomAv1EncoderInfoSettings() override {} ~LibaomAv1EncoderInfoSettings() override {}
}; };

View file

@ -11,59 +11,63 @@
#include "rtc_base/experiments/encoder_info_settings.h" #include "rtc_base/experiments/encoder_info_settings.h"
#include "rtc_base/gunit.h" #include "rtc_base/gunit.h"
#include "test/field_trial.h" #include "test/explicit_key_value_config.h"
#include "test/gmock.h" #include "test/gmock.h"
namespace webrtc { namespace webrtc {
using test::ExplicitKeyValueConfig;
TEST(SimulcastEncoderAdapterSettingsTest, NoValuesWithoutFieldTrial) { TEST(SimulcastEncoderAdapterSettingsTest, NoValuesWithoutFieldTrial) {
SimulcastEncoderAdapterEncoderInfoSettings settings; ExplicitKeyValueConfig field_trials("");
SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials);
EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment()); EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment());
EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers());
EXPECT_TRUE(settings.resolution_bitrate_limits().empty()); EXPECT_TRUE(settings.resolution_bitrate_limits().empty());
} }
TEST(SimulcastEncoderAdapterSettingsTest, NoValueForInvalidAlignment) { TEST(SimulcastEncoderAdapterSettingsTest, NoValueForInvalidAlignment) {
webrtc::test::ScopedFieldTrials field_trials( ExplicitKeyValueConfig field_trials(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
"requested_resolution_alignment:0/"); "requested_resolution_alignment:0/");
SimulcastEncoderAdapterEncoderInfoSettings settings; SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials);
EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment()); EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment());
} }
TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionAlignment) { TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionAlignment) {
webrtc::test::ScopedFieldTrials field_trials( ExplicitKeyValueConfig field_trials(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
"requested_resolution_alignment:2/"); "requested_resolution_alignment:2/");
SimulcastEncoderAdapterEncoderInfoSettings settings; SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials);
EXPECT_EQ(2u, settings.requested_resolution_alignment()); EXPECT_EQ(2u, settings.requested_resolution_alignment());
EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers());
EXPECT_TRUE(settings.resolution_bitrate_limits().empty()); EXPECT_TRUE(settings.resolution_bitrate_limits().empty());
} }
TEST(SimulcastEncoderAdapterSettingsTest, GetApplyAlignment) { TEST(SimulcastEncoderAdapterSettingsTest, GetApplyAlignment) {
webrtc::test::ScopedFieldTrials field_trials( ExplicitKeyValueConfig field_trials(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
"requested_resolution_alignment:3," "requested_resolution_alignment:3,"
"apply_alignment_to_all_simulcast_layers/"); "apply_alignment_to_all_simulcast_layers/");
SimulcastEncoderAdapterEncoderInfoSettings settings; SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials);
EXPECT_EQ(3u, settings.requested_resolution_alignment()); EXPECT_EQ(3u, settings.requested_resolution_alignment());
EXPECT_TRUE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_TRUE(settings.apply_alignment_to_all_simulcast_layers());
EXPECT_TRUE(settings.resolution_bitrate_limits().empty()); EXPECT_TRUE(settings.resolution_bitrate_limits().empty());
} }
TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimits) { TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimits) {
webrtc::test::ScopedFieldTrials field_trials( ExplicitKeyValueConfig field_trials(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
"frame_size_pixels:123," "frame_size_pixels:123,"
"min_start_bitrate_bps:11000," "min_start_bitrate_bps:11000,"
"min_bitrate_bps:44000," "min_bitrate_bps:44000,"
"max_bitrate_bps:77000/"); "max_bitrate_bps:77000/");
SimulcastEncoderAdapterEncoderInfoSettings settings; SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials);
EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment()); EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment());
EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers());
EXPECT_THAT(settings.resolution_bitrate_limits(), EXPECT_THAT(settings.resolution_bitrate_limits(),
@ -72,14 +76,14 @@ TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimits) {
} }
TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimitsWithList) { TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimitsWithList) {
webrtc::test::ScopedFieldTrials field_trials( ExplicitKeyValueConfig field_trials(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
"frame_size_pixels:123|456|789," "frame_size_pixels:123|456|789,"
"min_start_bitrate_bps:11000|22000|33000," "min_start_bitrate_bps:11000|22000|33000,"
"min_bitrate_bps:44000|55000|66000," "min_bitrate_bps:44000|55000|66000,"
"max_bitrate_bps:77000|88000|99000/"); "max_bitrate_bps:77000|88000|99000/");
SimulcastEncoderAdapterEncoderInfoSettings settings; SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials);
EXPECT_THAT( EXPECT_THAT(
settings.resolution_bitrate_limits(), settings.resolution_bitrate_limits(),
::testing::ElementsAre( ::testing::ElementsAre(
@ -89,13 +93,13 @@ TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimitsWithList) {
} }
TEST(EncoderSettingsTest, CommonSettingsUsedIfEncoderNameUnspecified) { TEST(EncoderSettingsTest, CommonSettingsUsedIfEncoderNameUnspecified) {
webrtc::test::ScopedFieldTrials field_trials( ExplicitKeyValueConfig field_trials(
"WebRTC-VP8-GetEncoderInfoOverride/requested_resolution_alignment:2/" "WebRTC-VP8-GetEncoderInfoOverride/requested_resolution_alignment:2/"
"WebRTC-GetEncoderInfoOverride/requested_resolution_alignment:3/"); "WebRTC-GetEncoderInfoOverride/requested_resolution_alignment:3/");
LibvpxVp8EncoderInfoSettings vp8_settings; LibvpxVp8EncoderInfoSettings vp8_settings(field_trials);
EXPECT_EQ(2u, vp8_settings.requested_resolution_alignment()); EXPECT_EQ(2u, vp8_settings.requested_resolution_alignment());
LibvpxVp9EncoderInfoSettings vp9_settings; LibvpxVp9EncoderInfoSettings vp9_settings(field_trials);
EXPECT_EQ(3u, vp9_settings.requested_resolution_alignment()); EXPECT_EQ(3u, vp9_settings.requested_resolution_alignment());
} }

View file

@ -126,7 +126,8 @@ class InitEncodeTest : public test::EndToEndTest,
encoder_factory_(this), encoder_factory_(this),
payload_name_(payload_name), payload_name_(payload_name),
configs_(configs), configs_(configs),
expectations_(expectations) {} expectations_(expectations),
encoder_info_override_(env.field_trials()) {}
void OnFrameGeneratorCapturerCreated( void OnFrameGeneratorCapturerCreated(
test::FrameGeneratorCapturer* frame_generator_capturer) override { test::FrameGeneratorCapturer* frame_generator_capturer) override {