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,