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.