Add firing of OnRemoveTrack and OnRenegotationNeeded during rollback
Bug: chromium:980875
Change-Id: I71439cea4c79e4a8dae6488404b0c303a9c33a97
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/157581
Commit-Queue: Eldar Rello <elrello@microsoft.com>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29563}
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index f019ec9..494a649 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -2264,7 +2264,7 @@
// For SLD we support only explicit rollback.
if (desc->GetType() == SdpType::kRollback) {
if (IsUnifiedPlan()) {
- RTCError error = Rollback();
+ RTCError error = Rollback(desc->GetType());
if (error.ok()) {
PostSetSessionDescriptionSuccess(observer);
} else {
@@ -2654,12 +2654,12 @@
if (configuration_.enable_implicit_rollback) {
if (desc->GetType() == SdpType::kOffer &&
signaling_state() == kHaveLocalOffer) {
- Rollback();
+ Rollback(desc->GetType());
}
}
// Explicit rollback.
if (desc->GetType() == SdpType::kRollback) {
- observer->OnSetRemoteDescriptionComplete(Rollback());
+ observer->OnSetRemoteDescriptionComplete(Rollback(desc->GetType()));
return;
}
} else if (desc->GetType() == SdpType::kRollback) {
@@ -7610,7 +7610,7 @@
return false;
}
-RTCError PeerConnection::Rollback() {
+RTCError PeerConnection::Rollback(SdpType sdp_type) {
auto state = signaling_state();
if (state != PeerConnectionInterface::kHaveLocalOffer &&
state != PeerConnectionInterface::kHaveRemoteOffer) {
@@ -7630,6 +7630,10 @@
transport_controller_->RollbackTransportForMid(mid);
DestroyTransceiverChannel(transceiver);
+ if (signaling_state() == PeerConnectionInterface::kHaveRemoteOffer &&
+ transceiver->receiver()) {
+ Observer()->OnRemoveTrack(transceiver->receiver());
+ }
if (state.newly_created()) {
// Remove added transceivers with no added track.
if (transceiver->internal()->sender()->track()) {
@@ -7654,6 +7658,15 @@
pending_local_description_.reset();
pending_remote_description_.reset();
ChangeSignalingState(PeerConnectionInterface::kStable);
+
+ // The assumption is that in case of implicit rollback UpdateNegotiationNeeded
+ // gets called in SetRemoteDescription.
+ if (sdp_type == SdpType::kRollback) {
+ UpdateNegotiationNeeded();
+ if (is_negotiation_needed_) {
+ Observer()->OnRenegotiationNeeded();
+ }
+ }
return RTCError::OK();
}