Preserve mid of sections added with AddTrack after a rollback

Since AddTrack now has an implicit init_encodings value, it will also
have a StableState saved when associating a transceiver.
That state may not have a saved mid and mline_index, and so on a
rollback, it could blindly reset the mid and mline_index of an
associated transceiver.

This is wrong, the mid and mline_index of associated transceivers
should only be updated when the StableState objects actually
have one saved.

Bug: chromium:1424238
Change-Id: I8e80a04cd072d90200ca7643de892c0ef29b1f1a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/297920
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39577}
This commit is contained in:
Florent Castelli 2023-03-15 16:47:43 +01:00 committed by WebRTC LUCI CQ
parent faf33878ef
commit b3d424cd48
2 changed files with 67 additions and 2 deletions

View File

@ -3079,8 +3079,10 @@ RTCError SdpOfferAnswerHandler::Rollback(SdpType desc_type) {
}
transceiver->internal()->sender_internal()->set_transport(nullptr);
transceiver->internal()->receiver_internal()->set_transport(nullptr);
transceiver->internal()->set_mid(state.mid());
transceiver->internal()->set_mline_index(state.mline_index());
if (state.has_m_section()) {
transceiver->internal()->set_mid(state.mid());
transceiver->internal()->set_mline_index(state.mline_index());
}
}
RTCError e = transport_controller_s()->RollbackTransports();
if (!e.ok()) {

View File

@ -388,4 +388,67 @@ TEST_F(SdpOfferAnswerTest, LargeMidsAreRejected) {
EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
}
TEST_F(SdpOfferAnswerTest, RollbackPreservesAddTrackMid) {
std::string sdp =
"v=0\r\n"
"o=- 4131505339648218884 3 IN IP4 **-----**\r\n"
"s=-\r\n"
"t=0 0\r\n"
"a=ice-lite\r\n"
"a=msid-semantic: WMS 100030878598094:4Qs1PjbLM32RK5u3\r\n"
"a=ice-ufrag:zGWFZ+fVXDeN6UoI/136\r\n"
"a=ice-pwd:9AUNgUqRNI5LSIrC1qFD2iTR\r\n"
"a=fingerprint:sha-256 "
"AD:52:52:E0:B1:37:34:21:0E:15:8E:B7:56:56:7B:B4:39:0E:6D:1C:F5:84:A7:EE:"
"B5:27:3E:30:B1:7D:69:42\r\n"
"a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n"
"a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\n"
"a=group:BUNDLE 0 1\r\n"
"m=audio 40005 UDP/TLS/RTP/SAVPF 111\r\n"
"a=rtpmap:111 opus/48000/2\r\n"
"a=fmtp:111 "
"maxaveragebitrate=20000;maxplaybackrate=16000;minptime=10;usedtx=1;"
"useinbandfec=1;stereo=0\r\n"
"a=rtcp-fb:111 nack\r\n"
"a=setup:passive\r\n"
"a=mid:0\r\n"
"a=msid:- 75156ebd-e705-4da1-920e-2dac39794dfd\r\n"
"a=ptime:60\r\n"
"a=recvonly\r\n"
"a=rtcp-mux\r\n"
"m=audio 40005 UDP/TLS/RTP/SAVPF 111\r\n"
"a=rtpmap:111 opus/48000/2\r\n"
"a=fmtp:111 "
"maxaveragebitrate=20000;maxplaybackrate=16000;minptime=10;usedtx=1;"
"useinbandfec=1;stereo=0\r\n"
"a=rtcp-fb:111 nack\r\n"
"a=setup:passive\r\n"
"a=mid:1\r\n"
"a=msid:100030878598094:4Qs1PjbLM32RK5u3 9695447562408476674\r\n"
"a=ptime:60\r\n"
"a=sendonly\r\n"
"a=ssrc:2565730539 cname:100030878598094:4Qs1PjbLM32RK5u3\r\n"
"a=rtcp-mux\r\n";
auto pc = CreatePeerConnection();
auto audio_track = pc->AddAudioTrack("audio_track", {});
auto first_transceiver = pc->pc()->GetTransceivers()[0];
EXPECT_FALSE(first_transceiver->mid().has_value());
auto desc = CreateSessionDescription(SdpType::kOffer, sdp);
ASSERT_NE(desc, nullptr);
RTCError error;
ASSERT_TRUE(pc->SetRemoteDescription(std::move(desc)));
pc->CreateAnswerAndSetAsLocal();
auto saved_mid = first_transceiver->mid();
EXPECT_TRUE(saved_mid.has_value());
auto offer_before_rollback = pc->CreateOfferAndSetAsLocal();
EXPECT_EQ(saved_mid, first_transceiver->mid());
auto rollback = pc->CreateRollback();
ASSERT_NE(rollback, nullptr);
ASSERT_TRUE(pc->SetLocalDescription(std::move(rollback)));
EXPECT_EQ(saved_mid, first_transceiver->mid());
auto offer2 = pc->CreateOfferAndSetAsLocal();
ASSERT_NE(offer2, nullptr);
EXPECT_EQ(saved_mid, first_transceiver->mid());
}
} // namespace webrtc