Fire OnAddStream with Unified Plan

Bug: webrtc:7600
Change-Id: Ic4e5560fdeb9848c65c59e0f45ca3a2a4a22a2ad
Reviewed-on: https://webrtc-review.googlesource.com/53401
Reviewed-by: Peter Thatcher <pthatcher@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Commit-Queue: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22042}
diff --git a/api/peerconnectioninterface.h b/api/peerconnectioninterface.h
index 8b4db9a..5786859 100644
--- a/api/peerconnectioninterface.h
+++ b/api/peerconnectioninterface.h
@@ -1007,8 +1007,6 @@
       PeerConnectionInterface::SignalingState new_state) = 0;
 
   // Triggered when media is received on a new stream from remote peer.
-  // Deprecated: This callback will no longer be fired with Unified Plan
-  // semantics. Consider switching to OnAddTrack.
   virtual void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) {}
 
   // Triggered when a remote peer close a stream.
diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc
index fe34578..4f5bd8e 100644
--- a/pc/peerconnection.cc
+++ b/pc/peerconnection.cc
@@ -2158,6 +2158,7 @@
 
   if (IsUnifiedPlan()) {
     std::vector<TrackEvent> track_events;
+    std::vector<rtc::scoped_refptr<MediaStreamInterface>> added_streams;
     for (auto transceiver : transceivers_) {
       const ContentInfo* content =
           FindMediaSectionForTransceiver(transceiver, remote_description());
@@ -2183,6 +2184,7 @@
           stream = MediaStreamProxy::Create(rtc::Thread::Current(),
                                             MediaStream::Create(sync_label));
           remote_streams_->AddStream(stream);
+          added_streams.push_back(stream);
         }
         transceiver->internal()->receiver_internal()->SetStreams({stream});
         TrackEvent track_event;
@@ -2209,9 +2211,13 @@
             media_desc->streams()[0].first_ssrc());
       }
     }
+    // Once all processing has finished, fire off callbacks.
     for (auto event : track_events) {
       observer_->OnAddTrack(event.receiver, event.streams);
     }
+    for (auto stream : added_streams) {
+      observer_->OnAddStream(stream);
+    }
   }
 
   const cricket::ContentInfo* audio_content =