diff --git a/pc/sdp_offer_answer.cc b/pc/sdp_offer_answer.cc index 0b4183f86c..0cfa147e3d 100644 --- a/pc/sdp_offer_answer.cc +++ b/pc/sdp_offer_answer.cc @@ -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()) { diff --git a/pc/sdp_offer_answer_unittest.cc b/pc/sdp_offer_answer_unittest.cc index bdd3301060..e16cd6aafc 100644 --- a/pc/sdp_offer_answer_unittest.cc +++ b/pc/sdp_offer_answer_unittest.cc @@ -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