From 4b4266f00f809d10e871675d29841d46c9380e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Wed, 23 Jan 2019 12:48:13 +0100 Subject: [PATCH] Move parsing of trusted rate controller to RateControlSettings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:10223 Change-Id: Iadf46e278e0f994ed95ff1a240c1f39a0421ab7c Reviewed-on: https://webrtc-review.googlesource.com/c/119261 Reviewed-by: Ilya Nikolaevskiy Commit-Queue: Erik Språng Cr-Commit-Position: refs/heads/master@{#26371} --- modules/video_coding/BUILD.gn | 2 ++ .../codecs/vp8/libvpx_vp8_encoder.cc | 7 ++--- modules/video_coding/codecs/vp9/vp9_impl.cc | 8 ++---- rtc_base/experiments/rate_control_settings.cc | 28 +++++++++++++++++-- rtc_base/experiments/rate_control_settings.h | 5 ++++ 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index cce28dc734..0a8e9d0824 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn @@ -427,6 +427,7 @@ rtc_static_library("webrtc_vp8") { "../../rtc_base:rtc_numerics", "../../rtc_base/experiments:cpu_speed_experiment", "../../rtc_base/experiments:field_trial_parser", + "../../rtc_base/experiments:rate_control_settings", "../../system_wrappers", "../../system_wrappers:field_trial", "../../system_wrappers:metrics", @@ -531,6 +532,7 @@ rtc_static_library("webrtc_vp9") { "../../media:rtc_vp9_profile", "../../rtc_base:checks", "../../rtc_base:rtc_base", + "../../rtc_base/experiments:rate_control_settings", "../../system_wrappers", "../../system_wrappers:field_trial", "../rtp_rtcp:rtp_rtcp_format", diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc index 1384dee5ab..af435a553f 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc @@ -31,6 +31,7 @@ #include "modules/video_coding/utility/simulcast_utility.h" #include "rtc_base/checks.h" #include "rtc_base/experiments/field_trial_parser.h" +#include "rtc_base/experiments/rate_control_settings.h" #include "rtc_base/scoped_ref_ptr.h" #include "rtc_base/trace_event.h" #include "system_wrappers/include/field_trial.h" @@ -39,8 +40,6 @@ namespace webrtc { namespace { -const char kVp8TrustedRateControllerFieldTrial[] = - "WebRTC-LibvpxVp8TrustedRateController"; #if defined(WEBRTC_IOS) const char kVP8IosMaxNumberOfThreadFieldTrial[] = "WebRTC-VP8IosMaxNumberOfThread"; @@ -162,8 +161,8 @@ LibvpxVp8Encoder::LibvpxVp8Encoder() LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr interface) : libvpx_(std::move(interface)), experimental_cpu_speed_config_arm_(CpuSpeedExperiment::GetConfigs()), - trusted_rate_controller_( - field_trial::IsEnabled(kVp8TrustedRateControllerFieldTrial)), + trusted_rate_controller_(RateControlSettings::ParseFromFieldTrials() + .LibvpxVp8TrustedRateController()), encoded_complete_callback_(nullptr), inited_(false), timestamp_(0), diff --git a/modules/video_coding/codecs/vp9/vp9_impl.cc b/modules/video_coding/codecs/vp9/vp9_impl.cc index efc11bb708..250ad0e813 100644 --- a/modules/video_coding/codecs/vp9/vp9_impl.cc +++ b/modules/video_coding/codecs/vp9/vp9_impl.cc @@ -30,6 +30,7 @@ #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "modules/video_coding/codecs/vp9/svc_rate_allocator.h" #include "rtc_base/checks.h" +#include "rtc_base/experiments/rate_control_settings.h" #include "rtc_base/keep_ref_until_done.h" #include "rtc_base/logging.h" #include "rtc_base/time_utils.h" @@ -39,9 +40,6 @@ namespace webrtc { namespace { -const char kVp9TrustedRateControllerFieldTrial[] = - "WebRTC-LibvpxVp9TrustedRateController"; - // Maps from gof_idx to encoder internal reference frame buffer index. These // maps work for 1,2 and 3 temporal layers with GOF length of 1,2 and 4 frames. uint8_t kRefBufIdx[4] = {0, 0, 0, 1}; @@ -170,8 +168,8 @@ VP9EncoderImpl::VP9EncoderImpl(const cricket::VideoCodec& codec) is_svc_(false), inter_layer_pred_(InterLayerPredMode::kOn), external_ref_control_(false), // Set in InitEncode because of tests. - trusted_rate_controller_( - field_trial::IsEnabled(kVp9TrustedRateControllerFieldTrial)), + trusted_rate_controller_(RateControlSettings::ParseFromFieldTrials() + .LibvpxVp9TrustedRateController()), full_superframe_drop_(true), first_frame_in_picture_(true), ss_info_needed_(false), diff --git a/rtc_base/experiments/rate_control_settings.cc b/rtc_base/experiments/rate_control_settings.cc index 018ef1a9ff..317eb90640 100644 --- a/rtc_base/experiments/rate_control_settings.cc +++ b/rtc_base/experiments/rate_control_settings.cc @@ -30,6 +30,11 @@ const char* kCongestionWindowPushbackFieldTrialName = "WebRTC-CongestionWindowPushback"; const int kDefaultMinPushbackTargetBitrateBps = 30000; +const char kVp8TrustedRateControllerFieldTrialName[] = + "WebRTC-LibvpxVp8TrustedRateController"; +const char kVp9TrustedRateControllerFieldTrialName[] = + "WebRTC-LibvpxVp9TrustedRateController"; + absl::optional MaybeReadCwndExperimentParameter( const WebRtcKeyValueConfig* const key_value_config) { int64_t accepted_queue_ms; @@ -64,6 +69,11 @@ absl::optional MaybeReadCongestionWindowPushbackExperimentParameter( return absl::nullopt; } +bool IsEnabled(const WebRtcKeyValueConfig* const key_value_config, + absl::string_view key) { + return key_value_config->Lookup(key).find("Enabled") == 0; +} + } // namespace RateControlSettings::RateControlSettings( @@ -75,9 +85,15 @@ RateControlSettings::RateControlSettings( MaybeReadCongestionWindowPushbackExperimentParameter( key_value_config)), pacing_factor_("pacing_factor"), - alr_probing_("alr_probing", false) { + alr_probing_("alr_probing", false), + trust_vp8_( + "trust_vp8", + IsEnabled(key_value_config, kVp8TrustedRateControllerFieldTrialName)), + trust_vp9_("trust_vp9", + IsEnabled(key_value_config, + kVp9TrustedRateControllerFieldTrialName)) { ParseFieldTrial({&congestion_window_, &congestion_window_pushback_, - &pacing_factor_, &alr_probing_}, + &pacing_factor_, &alr_probing_, &trust_vp8_, &trust_vp9_}, key_value_config->Lookup("WebRTC-VideoRateControl")); } @@ -122,4 +138,12 @@ bool RateControlSettings::UseAlrProbing() const { return alr_probing_.Get(); } +bool RateControlSettings::LibvpxVp8TrustedRateController() const { + return trust_vp8_.Get(); +} + +bool RateControlSettings::LibvpxVp9TrustedRateController() const { + return trust_vp9_.Get(); +} + } // namespace webrtc diff --git a/rtc_base/experiments/rate_control_settings.h b/rtc_base/experiments/rate_control_settings.h index b4a3755268..7662b08a72 100644 --- a/rtc_base/experiments/rate_control_settings.h +++ b/rtc_base/experiments/rate_control_settings.h @@ -38,6 +38,9 @@ class RateControlSettings final { absl::optional GetPacingFactor() const; bool UseAlrProbing() const; + bool LibvpxVp8TrustedRateController() const; + bool LibvpxVp9TrustedRateController() const; + private: explicit RateControlSettings( const WebRtcKeyValueConfig* const key_value_config); @@ -46,6 +49,8 @@ class RateControlSettings final { FieldTrialOptional congestion_window_pushback_; FieldTrialOptional pacing_factor_; FieldTrialParameter alr_probing_; + FieldTrialParameter trust_vp8_; + FieldTrialParameter trust_vp9_; }; } // namespace webrtc