Require webrtc::Environment to create VP8 encoder
Bug: webrtc:15860
Change-Id: I5d2632127e8a701e8cb0fbf3f271f80e3102dbe0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/346860
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42067}
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 6e15396..aee6d60 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -587,7 +587,6 @@
"../../rtc_base/experiments:encoder_info_settings",
"../../rtc_base/experiments:field_trial_parser",
"../../rtc_base/experiments:rate_control_settings",
- "../../system_wrappers:field_trial",
"../../system_wrappers:metrics",
"svc:scalability_mode_util",
"//third_party/libyuv",
diff --git a/modules/video_coding/codecs/vp8/include/vp8.h b/modules/video_coding/codecs/vp8/include/vp8.h
index e86d758..8dd7c57 100644
--- a/modules/video_coding/codecs/vp8/include/vp8.h
+++ b/modules/video_coding/codecs/vp8/include/vp8.h
@@ -30,15 +30,6 @@
const Environment& env,
Vp8EncoderSettings settings = {});
-// Deprecated, use CreateVp8Encoder above, bugs.webrtc.org/15860
-class VP8Encoder {
- public:
- using Settings = Vp8EncoderSettings;
-
- static std::unique_ptr<VideoEncoder> Create();
- static std::unique_ptr<VideoEncoder> Create(Settings settings);
-};
-
std::unique_ptr<VideoDecoder> CreateVp8Decoder(const Environment& env);
} // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
index 3af0bdf..1708d23 100644
--- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
+++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
@@ -40,7 +40,6 @@
#include "rtc_base/experiments/field_trial_units.h"
#include "rtc_base/logging.h"
#include "rtc_base/trace_event.h"
-#include "system_wrappers/include/field_trial.h"
#include "third_party/libyuv/include/libyuv/scale.h"
#include "vpx/vp8cx.h"
@@ -249,12 +248,13 @@
const uint32_t original_frame_drop_threshold_;
};
-absl::optional<TimeDelta> ParseFrameDropInterval() {
+absl::optional<TimeDelta> ParseFrameDropInterval(
+ const FieldTrialsView& field_trials) {
FieldTrialFlag disabled = FieldTrialFlag("Disabled");
FieldTrialParameter<TimeDelta> interval("interval",
kDefaultMaxFrameDropInterval);
ParseFieldTrial({&disabled, &interval},
- field_trial::FindFullName("WebRTC-VP8-MaxFrameInterval"));
+ field_trials.Lookup("WebRTC-VP8-MaxFrameInterval"));
if (disabled.Get()) {
// Kill switch set, don't use any max frame interval.
return absl::nullopt;
@@ -270,17 +270,6 @@
LibvpxInterface::Create());
}
-std::unique_ptr<VideoEncoder> VP8Encoder::Create() {
- return std::make_unique<LibvpxVp8Encoder>(LibvpxInterface::Create(),
- VP8Encoder::Settings());
-}
-
-std::unique_ptr<VideoEncoder> VP8Encoder::Create(
- VP8Encoder::Settings settings) {
- return std::make_unique<LibvpxVp8Encoder>(LibvpxInterface::Create(),
- std::move(settings));
-}
-
vpx_enc_frame_flags_t LibvpxVp8Encoder::EncodeFlags(
const Vp8FrameConfig& references) {
RTC_DCHECK(!references.drop_frame);
@@ -310,19 +299,23 @@
return flags;
}
-LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface,
- VP8Encoder::Settings settings)
- : libvpx_(std::move(interface)),
- rate_control_settings_(RateControlSettings::ParseFromFieldTrials()),
+LibvpxVp8Encoder::LibvpxVp8Encoder(const Environment& env,
+ Vp8EncoderSettings settings,
+ std::unique_ptr<LibvpxInterface> interface)
+ : env_(env),
+ libvpx_(std::move(interface)),
+ rate_control_settings_(
+ RateControlSettings::ParseFromKeyValueConfig(&env_.field_trials())),
resolution_bitrate_limits_(std::move(settings.resolution_bitrate_limits)),
key_frame_request_(kMaxSimulcastStreams, false),
last_encoder_output_time_(kMaxSimulcastStreams,
Timestamp::MinusInfinity()),
variable_framerate_experiment_(ParseVariableFramerateConfig(
+ env_.field_trials(),
"WebRTC-VP8VariableFramerateScreenshare")),
framerate_controller_(variable_framerate_experiment_.framerate_limit),
- max_frame_drop_interval_(ParseFrameDropInterval()),
- android_specific_threading_settings_(webrtc::field_trial::IsEnabled(
+ max_frame_drop_interval_(ParseFrameDropInterval(env_.field_trials())),
+ android_specific_threading_settings_(env_.field_trials().IsEnabled(
"WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings")) {
// TODO(eladalon/ilnik): These reservations might be wasting memory.
// InitEncode() is resizing to the actual size, which might be smaller.
@@ -596,7 +589,7 @@
// Override the error resilience mode if this is not simulcast, but we are
// using temporal layers.
- if (field_trial::IsEnabled(kVp8ForcePartitionResilience) &&
+ if (env_.field_trials().IsEnabled(kVp8ForcePartitionResilience) &&
(number_of_streams == 1) &&
(SimulcastUtility::NumberOfTemporalLayers(*inst, 0) > 1)) {
RTC_LOG(LS_INFO) << "Overriding g_error_resilient from "
@@ -800,7 +793,7 @@
}
#elif defined(WEBRTC_IOS)
std::string trial_string =
- field_trial::FindFullName(kVP8IosMaxNumberOfThreadFieldTrial);
+ env_.field_trials().Lookup(kVP8IosMaxNumberOfThreadFieldTrial);
FieldTrialParameter<int> max_thread_number(
kVP8IosMaxNumberOfThreadFieldTrialParameter, 0);
ParseFieldTrial({&max_thread_number}, trial_string);
@@ -1504,13 +1497,15 @@
// static
LibvpxVp8Encoder::VariableFramerateExperiment
-LibvpxVp8Encoder::ParseVariableFramerateConfig(std::string group_name) {
+LibvpxVp8Encoder::ParseVariableFramerateConfig(
+ const FieldTrialsView& field_trials,
+ absl::string_view group_name) {
FieldTrialFlag disabled = FieldTrialFlag("Disabled");
FieldTrialParameter<double> framerate_limit("min_fps", 5.0);
FieldTrialParameter<int> qp("min_qp", 15);
FieldTrialParameter<int> undershoot_percentage("undershoot", 30);
ParseFieldTrial({&disabled, &framerate_limit, &qp, &undershoot_percentage},
- field_trial::FindFullName(group_name));
+ field_trials.Lookup(group_name));
VariableFramerateExperiment config;
config.enabled = !disabled.Get();
config.framerate_limit = framerate_limit.Get();
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h
index 989ce5e..c78da36 100644
--- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h
+++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h
@@ -16,7 +16,9 @@
#include <utility>
#include <vector>
+#include "absl/strings/string_view.h"
#include "api/fec_controller_override.h"
+#include "api/field_trials_view.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "api/video/encoded_image.h"
@@ -41,14 +43,8 @@
public:
LibvpxVp8Encoder(const Environment& env,
Vp8EncoderSettings settings,
- std::unique_ptr<LibvpxInterface> interface)
- // TODO: bugs.webrtc.org/15860 - Save `env` and use field trials from it
- // when constructor below can be removed.
- : LibvpxVp8Encoder(std::move(interface), std::move(settings)) {}
+ std::unique_ptr<LibvpxInterface> interface);
- // Deprecated, bugs.webrtc.org/15860
- LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface,
- VP8Encoder::Settings settings);
~LibvpxVp8Encoder() override;
int Release() override;
@@ -115,6 +111,7 @@
std::vector<rtc::scoped_refptr<VideoFrameBuffer>> PrepareBuffers(
rtc::scoped_refptr<VideoFrameBuffer> buffer);
+ const Environment env_;
const std::unique_ptr<LibvpxInterface> libvpx_;
const CpuSpeedExperiment experimental_cpu_speed_config_arm_;
@@ -155,7 +152,8 @@
int steady_state_undershoot_percentage = 30;
} variable_framerate_experiment_;
static VariableFramerateExperiment ParseVariableFramerateConfig(
- std::string group_name);
+ const FieldTrialsView& field_trials,
+ absl::string_view group_name);
FramerateControllerDeprecated framerate_controller_;
int num_steady_state_frames_ = 0;
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_simulcast_test.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_simulcast_test.cc
index 79bcb5e..c03f5c7 100644
--- a/modules/video_coding/codecs/vp8/libvpx_vp8_simulcast_test.cc
+++ b/modules/video_coding/codecs/vp8/libvpx_vp8_simulcast_test.cc
@@ -24,7 +24,9 @@
std::unique_ptr<SimulcastTestFixture> CreateSpecificSimulcastTestFixture() {
std::unique_ptr<VideoEncoderFactory> encoder_factory =
std::make_unique<FunctionVideoEncoderFactory>(
- []() { return VP8Encoder::Create(); });
+ [](const Environment& env, const SdpVideoFormat& format) {
+ return CreateVp8Encoder(env);
+ });
std::unique_ptr<VideoDecoderFactory> decoder_factory =
std::make_unique<FunctionVideoDecoderFactory>(
[](const Environment& env, const SdpVideoFormat& format) {
diff --git a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
index 1602c0d..8c03148 100644
--- a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
+++ b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
@@ -13,6 +13,7 @@
#include <algorithm>
#include <memory>
+#include "absl/memory/memory.h"
#include "api/environment/environment_factory.h"
#include "api/test/create_frame_generator.h"
#include "api/test/frame_generator_interface.h"
@@ -30,6 +31,7 @@
#include "rtc_base/time_utils.h"
#include "test/field_trial.h"
#include "test/mappable_native_buffer.h"
+#include "test/scoped_key_value_config.h"
#include "test/video_codec_settings.h"
namespace webrtc {
@@ -122,8 +124,7 @@
codec_settings_.simulcastStream[0].numberOfTemporalLayers = 1;
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(), {}, absl::WrapUnique(vpx));
EXPECT_CALL(*vpx,
codec_enc_init(
_, _, Field(&vpx_codec_enc_cfg_t::g_error_resilient, 0), _));
@@ -136,8 +137,7 @@
codec_settings_.VP8()->numberOfTemporalLayers = 2;
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(), {}, absl::WrapUnique(vpx));
EXPECT_CALL(*vpx,
codec_enc_init(_, _,
Field(&vpx_codec_enc_cfg_t::g_error_resilient,
@@ -155,8 +155,7 @@
codec_settings_.VP8()->numberOfTemporalLayers = 2;
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(), {}, absl::WrapUnique(vpx));
EXPECT_CALL(*vpx,
codec_enc_init(_, _,
Field(&vpx_codec_enc_cfg_t::g_error_resilient,
@@ -169,8 +168,7 @@
TEST_F(TestVp8Impl, SetRates) {
codec_settings_.SetFrameDropEnabled(true);
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(), {}, absl::WrapUnique(vpx));
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
encoder.InitEncode(&codec_settings_,
VideoEncoder::Settings(kCapabilities, 1, 1000)));
@@ -598,8 +596,7 @@
TEST_F(TestVp8Impl, KeepsTimestampOnReencode) {
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(), {}, absl::WrapUnique(vpx));
// Settings needed to trigger ScreenshareLayers usage, which is required for
// overshoot-drop-reencode logic.
@@ -638,8 +635,7 @@
TEST(LibvpxVp8EncoderTest, GetEncoderInfoReturnsStaticInformation) {
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(), {}, absl::WrapUnique(vpx));
const auto info = encoder.GetEncoderInfo();
@@ -654,13 +650,13 @@
}
TEST(LibvpxVp8EncoderTest, RequestedResolutionAlignmentFromFieldTrial) {
- test::ScopedFieldTrials field_trials(
+ test::ScopedKeyValueConfig field_trials(
"WebRTC-VP8-GetEncoderInfoOverride/"
"requested_resolution_alignment:10/");
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(&field_trials), {},
+ absl::WrapUnique(vpx));
EXPECT_EQ(encoder.GetEncoderInfo().requested_resolution_alignment, 10u);
EXPECT_FALSE(
@@ -669,7 +665,7 @@
}
TEST(LibvpxVp8EncoderTest, ResolutionBitrateLimitsFromFieldTrial) {
- test::ScopedFieldTrials field_trials(
+ test::ScopedKeyValueConfig field_trials(
"WebRTC-VP8-GetEncoderInfoOverride/"
"frame_size_pixels:123|456|789,"
"min_start_bitrate_bps:11000|22000|33000,"
@@ -677,8 +673,8 @@
"max_bitrate_bps:77000|88000|99000/");
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(&field_trials), {},
+ absl::WrapUnique(vpx));
EXPECT_THAT(
encoder.GetEncoderInfo().resolution_bitrate_limits,
@@ -691,8 +687,7 @@
TEST(LibvpxVp8EncoderTest,
GetEncoderInfoReturnsEmptyResolutionBitrateLimitsByDefault) {
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- VP8Encoder::Settings());
+ LibvpxVp8Encoder encoder(CreateEnvironment(), {}, absl::WrapUnique(vpx));
const auto info = encoder.GetEncoderInfo();
@@ -707,12 +702,12 @@
/*min_bitrate_bps=*/100,
/*max_bitrate_bps=*/1000),
VideoEncoder::ResolutionBitrateLimits(320 * 180, 100, 30, 500)};
- VP8Encoder::Settings settings;
+ Vp8EncoderSettings settings;
settings.resolution_bitrate_limits = resolution_bitrate_limits;
auto* const vpx = new NiceMock<MockLibvpxInterface>();
- LibvpxVp8Encoder encoder((std::unique_ptr<LibvpxInterface>(vpx)),
- std::move(settings));
+ LibvpxVp8Encoder encoder(CreateEnvironment(), std::move(settings),
+ absl::WrapUnique(vpx));
const auto info = encoder.GetEncoderInfo();