Fix degradation_preference setting being ignored using RtpSender.SetParameters.

RtpSenderBase::SetParametersInternal stores init_parameters_
if media_channel_ does not exist. When RtpSenderBase::SetSsrc is called,
init_parameters_ is used to set the initial encoding parameters and
degradation_preference. However, if no encoding parameter is specified,
degradation_preference will not be set.

This CL modifies the RtpSender so that degradation_preference is not
ignored even in this case.

Bug: webrtc:14279
Change-Id: I7e95ecdf5fcb19037e4f118981d1314d78ffca5a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/268960
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
Cr-Commit-Position: refs/heads/main@{#37574}
diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc
index 3cf876a..145179f 100644
--- a/pc/peer_connection_interface_unittest.cc
+++ b/pc/peer_connection_interface_unittest.cc
@@ -3649,6 +3649,32 @@
   EXPECT_FALSE(offer->description()->extmap_allow_mixed());
 }
 
+TEST_P(PeerConnectionInterfaceTest,
+       RtpSenderSetDegradationPreferenceWithoutEncodings) {
+  CreatePeerConnection();
+  AddVideoTrack("video_label");
+
+  std::vector<rtc::scoped_refptr<RtpSenderInterface>> rtp_senders =
+      pc_->GetSenders();
+  ASSERT_EQ(rtp_senders.size(), 1u);
+  ASSERT_EQ(rtp_senders[0]->media_type(), cricket::MEDIA_TYPE_VIDEO);
+  rtc::scoped_refptr<RtpSenderInterface> video_rtp_sender = rtp_senders[0];
+  RtpParameters parameters = video_rtp_sender->GetParameters();
+  ASSERT_NE(parameters.degradation_preference,
+            DegradationPreference::MAINTAIN_RESOLUTION);
+  parameters.degradation_preference =
+      DegradationPreference::MAINTAIN_RESOLUTION;
+  ASSERT_TRUE(video_rtp_sender->SetParameters(parameters).ok());
+
+  std::unique_ptr<SessionDescriptionInterface> local_offer;
+  ASSERT_TRUE(DoCreateOffer(&local_offer, nullptr));
+  ASSERT_TRUE(DoSetLocalDescription(std::move(local_offer)));
+
+  RtpParameters parameters_new = video_rtp_sender->GetParameters();
+  ASSERT_EQ(parameters_new.degradation_preference,
+            DegradationPreference::MAINTAIN_RESOLUTION);
+}
+
 INSTANTIATE_TEST_SUITE_P(PeerConnectionInterfaceTest,
                          PeerConnectionInterfaceTest,
                          Values(SdpSemantics::kPlanB_DEPRECATED,
diff --git a/pc/rtp_sender.cc b/pc/rtp_sender.cc
index 9a8f45c..0b9642d 100644
--- a/pc/rtp_sender.cc
+++ b/pc/rtp_sender.cc
@@ -305,7 +305,8 @@
     SetSend();
     AddTrackToStats();
   }
-  if (!init_parameters_.encodings.empty()) {
+  if (!init_parameters_.encodings.empty() ||
+      init_parameters_.degradation_preference.has_value()) {
     worker_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
       RTC_DCHECK(media_channel_);
       // Get the current parameters, which are constructed from the SDP.
@@ -328,6 +329,7 @@
           init_parameters_.degradation_preference;
       media_channel_->SetRtpSendParameters(ssrc_, current_parameters);
       init_parameters_.encodings.clear();
+      init_parameters_.degradation_preference = absl::nullopt;
     });
   }
   // Attempt to attach the frame decryptor to the current media channel.