From 10a7d23be543f1dfbfc1efa26a9ed51e936cc4c7 Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Wed, 20 Jul 2022 21:49:17 +0900 Subject: [PATCH] Fix degradation_preference setting being ignored using RtpSender.SetParameters. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Commit-Queue: Daniel.L (Byoungchan) Lee Cr-Commit-Position: refs/heads/main@{#37574} --- pc/peer_connection_interface_unittest.cc | 26 ++++++++++++++++++++++++ pc/rtp_sender.cc | 4 +++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc index 3cf876af9a..145179f3d4 100644 --- a/pc/peer_connection_interface_unittest.cc +++ b/pc/peer_connection_interface_unittest.cc @@ -3649,6 +3649,32 @@ TEST_P(PeerConnectionInterfaceTest, ExtmapAllowMixedIsConfigurable) { EXPECT_FALSE(offer->description()->extmap_allow_mixed()); } +TEST_P(PeerConnectionInterfaceTest, + RtpSenderSetDegradationPreferenceWithoutEncodings) { + CreatePeerConnection(); + AddVideoTrack("video_label"); + + std::vector> rtp_senders = + pc_->GetSenders(); + ASSERT_EQ(rtp_senders.size(), 1u); + ASSERT_EQ(rtp_senders[0]->media_type(), cricket::MEDIA_TYPE_VIDEO); + rtc::scoped_refptr 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 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 9a8f45c257..0b9642df34 100644 --- a/pc/rtp_sender.cc +++ b/pc/rtp_sender.cc @@ -305,7 +305,8 @@ void RtpSenderBase::SetSsrc(uint32_t ssrc) { SetSend(); AddTrackToStats(); } - if (!init_parameters_.encodings.empty()) { + if (!init_parameters_.encodings.empty() || + init_parameters_.degradation_preference.has_value()) { worker_thread_->Invoke(RTC_FROM_HERE, [&] { RTC_DCHECK(media_channel_); // Get the current parameters, which are constructed from the SDP. @@ -328,6 +329,7 @@ void RtpSenderBase::SetSsrc(uint32_t ssrc) { 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.