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.