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();
 }