commit 40c989b4f057de1be4688901156d55c63c87dc71
parent d08de09e11a7f9f993827e0c2cd1558ec55fec7f
Author: Michael Froman <mfroman@mozilla.com>
Date: Wed, 15 Oct 2025 11:09:07 -0500
Bug 1993083 - Vendor libwebrtc from 4a9606085e
Upstream commit: https://webrtc.googlesource.com/src/+/4a9606085e9597de9c9aaff3fd03638dc8d05776
Update receiver header extensions on SetRemoteContent
This triggers the correct suppression of TSN when CCFB is in use.
Bug: webrtc:383078466
Change-Id: Id594224494cb35c19895cc428169680fdd1a006a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/402441
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45235}
Diffstat:
5 files changed, 27 insertions(+), 44 deletions(-)
diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor
@@ -1,4 +1,4 @@
# ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc
-libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-15T16:07:44.122493+00:00.
+libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-15T16:08:58.408644+00:00.
# base of lastest vendoring
-4e039c999f
+4a9606085e
diff --git a/third_party/libwebrtc/pc/channel.cc b/third_party/libwebrtc/pc/channel.cc
@@ -122,12 +122,9 @@ void RtpSendParametersFromMediaDescription(
// response in new_params has no special packetization we amend
// old_params by ignoring the packetization and fall back to standard
// packetization instead.
-// Returns true if codecs need to be changed.
-RTCErrorOr<bool> MaybeIgnorePacketization(
- const MediaChannelParameters& new_params,
- MediaChannelParameters& old_params) {
+RTCError MaybeIgnorePacketization(const MediaChannelParameters& new_params,
+ MediaChannelParameters& old_params) {
flat_set<const Codec*> matched_codecs;
- bool needs_update = false;
for (Codec& codec : old_params.codecs) {
if (absl::c_any_of(matched_codecs,
[&](const Codec* c) { return codec.Matches(*c); })) {
@@ -155,7 +152,6 @@ RTCErrorOr<bool> MaybeIgnorePacketization(
if (may_ignore_packetization) {
// Note: this writes into old_params
codec.packetization = std::nullopt;
- needs_update = true;
} else if (!has_matching_packetization) {
std::string error_desc = StringFormat(
"Failed to set local answer due to incompatible codec "
@@ -168,7 +164,7 @@ RTCErrorOr<bool> MaybeIgnorePacketization(
matched_codecs.insert(&codec);
}
}
- return needs_update;
+ return RTCError::OK();
}
} // namespace
@@ -1108,14 +1104,11 @@ bool VideoChannel::SetLocalContent_w(const MediaContentDescription* content,
// offer by ignoring the packetiztion and fall back to standard packetization
// instead.
if (type == SdpType::kAnswer || type == SdpType::kPrAnswer) {
- RTCErrorOr<bool> changed_codecs =
- MaybeIgnorePacketization(recv_params, send_params);
- if (!changed_codecs.ok()) {
- error_desc = changed_codecs.error().message();
+ RTCError status = MaybeIgnorePacketization(recv_params, send_params);
+ if (!status.ok()) {
+ error_desc = status.message();
return false;
}
- // In this case, we don't care if codecs are changed, because
- // we always set the new send_params.
}
if (!media_receive_channel()->SetReceiverParameters(recv_params)) {
@@ -1187,15 +1180,12 @@ bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
// peer only accepts to send standard packetization we effectively amend our
// offer by ignoring the packetiztion and fall back to standard packetization
// instead.
- bool needs_recv_params_update = false;
if (type == SdpType::kAnswer || type == SdpType::kPrAnswer) {
- RTCErrorOr<bool> codecs_changed =
- MaybeIgnorePacketization(send_params, recv_params);
- if (!codecs_changed.ok()) {
- error_desc = codecs_changed.error().message();
+ RTCError status = MaybeIgnorePacketization(send_params, recv_params);
+ if (!status.ok()) {
+ error_desc = status.message();
return false;
}
- needs_recv_params_update = codecs_changed.value();
}
if (!media_send_channel()->SetSenderParameters(send_params)) {
@@ -1205,15 +1195,8 @@ bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
mid().c_str());
return false;
}
- // adjust receive streams based on send codec
- media_receive_channel()->SetReceiverFeedbackParameters(
- media_send_channel()->SendCodecHasLntf(),
- media_send_channel()->SendCodecHasNack(),
- media_send_channel()->SendCodecRtcpMode(),
- media_send_channel()->SendCodecRtxTime());
- last_send_params_ = send_params;
-
- if (needs_recv_params_update) {
+ if (type == SdpType::kAnswer || type == SdpType::kPrAnswer) {
+ recv_params.extensions = send_params.extensions;
if (!media_receive_channel()->SetReceiverParameters(recv_params)) {
error_desc = StringFormat(
"Failed to set recv parameters for m-section with mid='%s'.",
@@ -1222,6 +1205,13 @@ bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
}
last_recv_params_ = recv_params;
}
+ // adjust receive streams based on send codec
+ media_receive_channel()->SetReceiverFeedbackParameters(
+ media_send_channel()->SendCodecHasLntf(),
+ media_send_channel()->SendCodecHasNack(),
+ media_send_channel()->SendCodecRtcpMode(),
+ media_send_channel()->SendCodecRtxTime());
+ last_send_params_ = send_params;
return UpdateRemoteStreams_w(content, type, error_desc);
}
diff --git a/third_party/libwebrtc/pc/channel_unittest.cc b/third_party/libwebrtc/pc/channel_unittest.cc
@@ -2420,16 +2420,16 @@ TEST_F(VideoChannelSingleThreadTest,
ASSERT_TRUE(channel1_->SetRemoteContent(&remote, SdpType::kAnswer, err))
<< err;
- EXPECT_THAT(
- media_receive_channel1_impl()->recv_codecs(),
- ElementsAre(AllOf(Field(&webrtc::Codec::id, 96),
+ EXPECT_THAT(media_receive_channel1_impl()->recv_codecs(),
+ UnorderedElementsAre(
+ AllOf(Field(&webrtc::Codec::id, 96),
Field(&webrtc::Codec::packetization, std::nullopt)),
AllOf(Field(&webrtc::Codec::id, 97),
Field(&webrtc::Codec::packetization,
webrtc::kPacketizationParamRaw))));
- EXPECT_THAT(
- media_send_channel1_impl()->send_codecs(),
- ElementsAre(AllOf(Field(&webrtc::Codec::id, 97),
+ EXPECT_THAT(media_send_channel1_impl()->send_codecs(),
+ UnorderedElementsAre(
+ AllOf(Field(&webrtc::Codec::id, 97),
Field(&webrtc::Codec::packetization,
webrtc::kPacketizationParamRaw)),
AllOf(Field(&webrtc::Codec::id, 96),
diff --git a/third_party/libwebrtc/pc/congestion_control_integrationtest.cc b/third_party/libwebrtc/pc/congestion_control_integrationtest.cc
@@ -113,14 +113,11 @@ TEST_F(PeerConnectionCongestionControlTest, NegotiatingCcfbRemovesTsn) {
Not(Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kTransportSequenceNumberUri))))
<< " in caller sender parameters";
- /* Caller receivers are not fixed yet.
- TODO: issues.webrtc.org/383078466 - enable
parameters = caller()->pc()->GetReceivers()[0]->GetParameters();
EXPECT_THAT(parameters.header_extensions,
Not(Contains(Field("uri", &RtpExtension::uri,
RtpExtension::kTransportSequenceNumberUri))))
<< " in caller receiver parameters";
- */
/* Callee senders are not fixed yet.
TODO: issues.webrtc.org/383078466 - enable
parameters = callee()->pc()->GetSenders()[0]->GetParameters();
diff --git a/third_party/libwebrtc/test/peer_scenario/tests/l4s_test.cc b/third_party/libwebrtc/test/peer_scenario/tests/l4s_test.cc
@@ -186,11 +186,7 @@ TEST(L4STest, NegotiateAndUseCcfbIfEnabled) {
s.ProcessMessages(TimeDelta::Seconds(2));
EXPECT_GT(send_node_feedback_counter.FeedbackAccordingToRfc8888(), 0);
- // TODO: bugs.webrtc.org/42225697 - Fix bug. Caller sends both transport
- // sequence number feedback and congestion control feedback. So
- // callee still send packets with transport sequence number header extensions
- // even though it has been removed from the answer.
- // EXPECT_EQ(send_node_feedback_counter.FeedbackAccordingToTransportCc(), 0);
+ EXPECT_EQ(send_node_feedback_counter.FeedbackAccordingToTransportCc(), 0);
EXPECT_GT(ret_node_feedback_counter.FeedbackAccordingToRfc8888(), 0);
EXPECT_EQ(ret_node_feedback_counter.FeedbackAccordingToTransportCc(), 0);