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}
This commit is contained in:
Byoungchan Lee 2022-07-20 21:49:17 +09:00 committed by WebRTC LUCI CQ
parent 714e3cbb48
commit 10a7d23be5
2 changed files with 29 additions and 1 deletions

View file

@ -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<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,

View file

@ -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<void>(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.