From dabe48bb4c8797d681b0463a61966c675f9bd2f9 Mon Sep 17 00:00:00 2001 From: Rasmus Brandt Date: Wed, 5 Aug 2020 11:32:38 +0200 Subject: [PATCH] Add WebRTC-VP8-GetEncoderInfoOverride field trial to libvpx. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This trial allows the downstream users to quickly set the requested resolution alignment. Bug: webrtc:11832 Change-Id: I55b3213179021455740311247829b44926722efe Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/180884 Reviewed-by: Åsa Persson Commit-Queue: Rasmus Brandt Cr-Commit-Position: refs/heads/master@{#31857} --- .../codecs/vp8/libvpx_vp8_encoder.cc | 26 ++++++++++++++++--- .../codecs/vp8/libvpx_vp8_encoder.h | 3 +++ .../codecs/vp8/test/vp8_impl_unittest.cc | 13 ++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc index 9b64d1654f..2f901ad811 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc @@ -44,12 +44,17 @@ namespace webrtc { namespace { #if defined(WEBRTC_IOS) -const char kVP8IosMaxNumberOfThreadFieldTrial[] = +constexpr char kVP8IosMaxNumberOfThreadFieldTrial[] = "WebRTC-VP8IosMaxNumberOfThread"; -const char kVP8IosMaxNumberOfThreadFieldTrialParameter[] = "max_thread"; +constexpr char kVP8IosMaxNumberOfThreadFieldTrialParameter[] = "max_thread"; #endif -const char kVp8ForcePartitionResilience[] = +constexpr char kVp8GetEncoderInfoOverrideFieldTrial[] = + "WebRTC-VP8-GetEncoderInfoOverride"; +constexpr char kVp8RequestedResolutionAlignmentFieldTrialParameter[] = + "requested_resolution_alignment"; + +constexpr char kVp8ForcePartitionResilience[] = "WebRTC-VP8-ForcePartitionResilience"; // QP is obtained from VP8-bitstream for HW, so the QP corresponds to the @@ -222,6 +227,15 @@ void ApplyVp8EncoderConfigToVpxConfig(const Vp8EncoderConfig& encoder_config, } } +absl::optional GetRequestedResolutionAlignmentOverride() { + const std::string trial_string = + field_trial::FindFullName(kVp8GetEncoderInfoOverrideFieldTrial); + FieldTrialOptional requested_resolution_alignment( + kVp8RequestedResolutionAlignmentFieldTrialParameter); + ParseFieldTrial({&requested_resolution_alignment}, trial_string); + return requested_resolution_alignment.GetOptional(); +} + } // namespace std::unique_ptr VP8Encoder::Create() { @@ -279,6 +293,8 @@ LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr interface, : libvpx_(std::move(interface)), experimental_cpu_speed_config_arm_(CpuSpeedExperiment::GetConfigs()), 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)), @@ -1233,6 +1249,10 @@ VideoEncoder::EncoderInfo LibvpxVp8Encoder::GetEncoderInfo() const { if (!resolution_bitrate_limits_.empty()) { info.resolution_bitrate_limits = resolution_bitrate_limits_; } + if (requested_resolution_alignment_override_) { + info.requested_resolution_alignment = + *requested_resolution_alignment_override_; + } const bool enable_scaling = num_active_streams_ == 1 && diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h index 8afcaae58f..f6cfd0ffe6 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h @@ -99,6 +99,9 @@ class LibvpxVp8Encoder : public VideoEncoder { experimental_cpu_speed_config_arm_; const RateControlSettings rate_control_settings_; + // EncoderInfo::requested_resolution_alignment override from field trial. + const absl::optional requested_resolution_alignment_override_; + EncodedImageCallback* encoded_complete_callback_ = nullptr; VideoCodec codec_; bool inited_ = false; 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 d3e4a1739e..342187b180 100644 --- a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc +++ b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc @@ -565,6 +565,19 @@ TEST(LibvpxVp8EncoderTest, GetEncoderInfoReturnsStaticInformation) { EXPECT_FALSE(info.has_internal_source); EXPECT_TRUE(info.supports_simulcast); EXPECT_EQ(info.implementation_name, "libvpx"); + EXPECT_EQ(info.requested_resolution_alignment, 1); +} + +TEST(LibvpxVp8EncoderTest, RequestedResolutionAlignmentFromFieldTrial) { + test::ScopedFieldTrials field_trials( + "WebRTC-VP8-GetEncoderInfoOverride/" + "requested_resolution_alignment:10/"); + + auto* const vpx = new NiceMock(); + LibvpxVp8Encoder encoder((std::unique_ptr(vpx)), + VP8Encoder::Settings()); + + EXPECT_EQ(encoder.GetEncoderInfo().requested_resolution_alignment, 10); } TEST(LibvpxVp8EncoderTest,