Add field trial for balanced degradation preference.
BUG=webrtc:7607
Review-Url: https://codereview.webrtc.org/2923563002
Cr-Commit-Position: refs/heads/master@{#18589}
diff --git a/webrtc/media/engine/webrtcvideoengine.cc b/webrtc/media/engine/webrtcvideoengine.cc
index 999dac2..9a2865b 100644
--- a/webrtc/media/engine/webrtcvideoengine.cc
+++ b/webrtc/media/engine/webrtcvideoengine.cc
@@ -1742,6 +1742,9 @@
} else {
if (parameters_.options.is_screencast.value_or(false)) {
degradation_preference = DegradationPreference::kMaintainResolution;
+ } else if (webrtc::field_trial::IsEnabled(
+ "WebRTC-Video-BalancedDegradation")) {
+ degradation_preference = DegradationPreference::kBalanced;
} else {
degradation_preference = DegradationPreference::kMaintainFramerate;
}
diff --git a/webrtc/media/engine/webrtcvideoengine_unittest.cc b/webrtc/media/engine/webrtcvideoengine_unittest.cc
index d13609f..e14f326 100644
--- a/webrtc/media/engine/webrtcvideoengine_unittest.cc
+++ b/webrtc/media/engine/webrtcvideoengine_unittest.cc
@@ -1215,6 +1215,9 @@
send_stream->GetConfig().rtp.extensions[0].uri);
}
+ void TestDegradationPreference(bool resolution_scaling_enabled,
+ bool fps_scaling_enabled);
+
void TestCpuAdaptation(bool enable_overuse, bool is_screenshare);
void TestReceiverLocalSsrcConfiguration(bool receiver_first);
void TestReceiveUnsignaledSsrcPacket(uint8_t payload_type,
@@ -2097,6 +2100,24 @@
VerifySettings(kNumSpatialLayers, kNumTemporalLayers);
}
+TEST_F(WebRtcVideoChannelTest,
+ BalancedDegradationPreferenceNotSupportedWithoutFieldtrial) {
+ webrtc::test::ScopedFieldTrials override_field_trials_(
+ "WebRTC-Video-BalancedDegradation/Disabled/");
+ const bool kResolutionScalingEnabled = true;
+ const bool kFpsScalingEnabled = false;
+ TestDegradationPreference(kResolutionScalingEnabled, kFpsScalingEnabled);
+}
+
+TEST_F(WebRtcVideoChannelTest,
+ BalancedDegradationPreferenceSupportedBehindFieldtrial) {
+ webrtc::test::ScopedFieldTrials override_field_trials_(
+ "WebRTC-Video-BalancedDegradation/Enabled/");
+ const bool kResolutionScalingEnabled = true;
+ const bool kFpsScalingEnabled = true;
+ TestDegradationPreference(kResolutionScalingEnabled, kFpsScalingEnabled);
+}
+
TEST_F(WebRtcVideoChannelTest, AdaptsOnOveruse) {
TestCpuAdaptation(true, false);
}
@@ -2263,6 +2284,40 @@
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
}
+// TODO(asapersson): Remove this test when the balanced field trial is removed.
+void WebRtcVideoChannelTest::TestDegradationPreference(
+ bool resolution_scaling_enabled,
+ bool fps_scaling_enabled) {
+ cricket::VideoCodec codec = GetEngineCodec("VP8");
+ cricket::VideoSendParameters parameters;
+ parameters.codecs.push_back(codec);
+
+ MediaConfig media_config = GetMediaConfig();
+ media_config.video.enable_cpu_overuse_detection = true;
+ channel_.reset(
+ engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
+ channel_->OnReadyToSend(true);
+
+ EXPECT_TRUE(channel_->SetSendParameters(parameters));
+
+ AddSendStream();
+
+ cricket::FakeVideoCapturer capturer;
+ VideoOptions options;
+ EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
+ cricket::VideoFormat capture_format = capturer.GetSupportedFormats()->front();
+ EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format));
+
+ EXPECT_TRUE(channel_->SetSend(true));
+
+ FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
+ EXPECT_EQ(resolution_scaling_enabled,
+ send_stream->resolution_scaling_enabled());
+ EXPECT_EQ(fps_scaling_enabled, send_stream->framerate_scaling_enabled());
+
+ EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
+}
+
void WebRtcVideoChannelTest::TestCpuAdaptation(bool enable_overuse,
bool is_screenshare) {
const int kDefaultFps = 30;
diff --git a/webrtc/video_send_stream.h b/webrtc/video_send_stream.h
index 45d1a55..266112e 100644
--- a/webrtc/video_send_stream.h
+++ b/webrtc/video_send_stream.h
@@ -224,9 +224,9 @@
enum class DegradationPreference {
// Don't take any actions based on over-utilization signals.
kDegradationDisabled,
- // On over-use, request lost resolution, possibly causing down-scaling.
+ // On over-use, request lower frame rate, possibly causing frame drops.
kMaintainResolution,
- // On over-use, request lower frame rate, possible causing frame drops.
+ // On over-use, request lower resolution, possibly causing down-scaling.
kMaintainFramerate,
// Try to strike a "pleasing" balance between frame rate or resolution.
kBalanced,