Add the OnAddTrack callback for Objective-C wrapper.

Created an Obj-C wrapper for the callback OnAddTrack in this CL since it has been added to native C++ API
The callback function is called when a track is signaled by remote side and a new RtpReceiver is created.
The application can tell when tracks are added to the streams by listening to this callback.

BUG=webrtc:6112

Review-Url: https://codereview.webrtc.org/2513063003
Cr-Original-Commit-Position: refs/heads/master@{#16835}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 633f6fe0046131ed815098298b9a3120bac1d7a0
diff --git a/sdk/objc/Framework/Classes/RTCPeerConnection+Private.h b/sdk/objc/Framework/Classes/RTCPeerConnection+Private.h
index 60ab868..963b5f6 100644
--- a/sdk/objc/Framework/Classes/RTCPeerConnection+Private.h
+++ b/sdk/objc/Framework/Classes/RTCPeerConnection+Private.h
@@ -49,8 +49,12 @@
   void OnIceCandidatesRemoved(
       const std::vector<cricket::Candidate>& candidates) override;
 
+  void OnAddTrack(
+      rtc::scoped_refptr<RtpReceiverInterface> receiver,
+      const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) override;
+
  private:
-  __weak RTCPeerConnection *peer_connection_;
+  __weak RTCPeerConnection* peer_connection_;
 };
 
 } // namespace webrtc
@@ -102,6 +106,11 @@
 + (webrtc::PeerConnectionInterface::StatsOutputLevel)
     nativeStatsOutputLevelForLevel:(RTCStatsOutputLevel)level;
 
+- (RTCMediaStream *)mediaStreamForNativeStream:
+    (rtc::scoped_refptr<webrtc::MediaStreamInterface>)stream;
+
+- (void)removeNativeMediaStream:(rtc::scoped_refptr<webrtc::MediaStreamInterface>)stream;
+
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/RTCPeerConnection.mm b/sdk/objc/Framework/Classes/RTCPeerConnection.mm
index de7608c..e9428d3 100644
--- a/sdk/objc/Framework/Classes/RTCPeerConnection.mm
+++ b/sdk/objc/Framework/Classes/RTCPeerConnection.mm
@@ -27,6 +27,7 @@
 
 #include "webrtc/api/jsepicecandidate.h"
 #include "webrtc/base/checks.h"
+#include "webrtc/sdk/objc/Framework/Classes/helpers.h"
 
 NSString * const kRTCPeerConnectionErrorDomain =
     @"org.webrtc.RTCPeerConnection";
@@ -127,9 +128,8 @@
 
 void PeerConnectionDelegateAdapter::OnAddStream(
     rtc::scoped_refptr<MediaStreamInterface> stream) {
-  RTCMediaStream *mediaStream =
-      [[RTCMediaStream alloc] initWithNativeMediaStream:stream];
   RTCPeerConnection *peer_connection = peer_connection_;
+  RTCMediaStream *mediaStream = [peer_connection mediaStreamForNativeStream:stream];
   [peer_connection.delegate peerConnection:peer_connection
                               didAddStream:mediaStream];
 }
@@ -141,6 +141,7 @@
   RTCPeerConnection *peer_connection = peer_connection_;
   [peer_connection.delegate peerConnection:peer_connection
                            didRemoveStream:mediaStream];
+  [peer_connection removeNativeMediaStream:stream];
 }
 
 void PeerConnectionDelegateAdapter::OnDataChannel(
@@ -200,6 +201,28 @@
                     didRemoveIceCandidates:ice_candidates];
 }
 
+void PeerConnectionDelegateAdapter::OnAddTrack(
+    rtc::scoped_refptr<RtpReceiverInterface> receiver,
+    const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
+  RTCRtpReceiver* rtpReceiver =
+      [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:receiver];
+  NSMutableArray* mediaStreams =
+      [NSMutableArray arrayWithCapacity:streams.size()];
+
+  RTCPeerConnection* peer_connection = peer_connection_;
+  for (const auto stream : streams) {
+    RTCMediaStream* mediaStream =
+        [peer_connection mediaStreamForNativeStream:stream];
+    [mediaStreams addObject:mediaStream];
+  }
+  if ([peer_connection.delegate
+      respondsToSelector:@selector(peerConnection:didAddTrack:streams:)]) {
+    [peer_connection.delegate peerConnection:peer_connection
+                                 didAddTrack:rtpReceiver
+                                     streams:mediaStreams];
+  }
+}
+
 }  // namespace webrtc
 
 
@@ -209,6 +232,7 @@
   rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
   std::unique_ptr<webrtc::MediaConstraints> _nativeConstraints;
   BOOL _hasStartedRtcEventLog;
+  NSMutableDictionary<NSString *, RTCMediaStream *> *_mediaStreamsByStreamId;
 }
 
 @synthesize delegate = _delegate;
@@ -238,6 +262,7 @@
     }
     _localStreams = [[NSMutableArray alloc] init];
     _delegate = delegate;
+    _mediaStreamsByStreamId = [NSMutableDictionary dictionary];
   }
   return self;
 }
@@ -588,6 +613,21 @@
   }
 }
 
+- (RTCMediaStream *)mediaStreamForNativeStream:
+    (rtc::scoped_refptr<webrtc::MediaStreamInterface>)stream {
+  RTCMediaStream *mediaStream =
+      _mediaStreamsByStreamId[[NSString stringForStdString:stream->label()]];
+  if (!mediaStream) {
+    mediaStream = [[RTCMediaStream alloc] initWithNativeMediaStream:stream.get()];
+    _mediaStreamsByStreamId[[NSString stringForStdString:stream->label()]] = mediaStream;
+  }
+  return mediaStream;
+}
+
+- (void)removeNativeMediaStream:(rtc::scoped_refptr<webrtc::MediaStreamInterface>)stream {
+  [_mediaStreamsByStreamId removeObjectForKey:[NSString stringForStdString:stream->label()]];
+}
+
 - (rtc::scoped_refptr<webrtc::PeerConnectionInterface>)nativePeerConnection {
   return _peerConnection;
 }
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h b/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h
index 4438eb2..785dccf 100644
--- a/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h
+++ b/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h
@@ -106,6 +106,14 @@
 - (void)peerConnection:(RTCPeerConnection *)peerConnection
     didOpenDataChannel:(RTCDataChannel *)dataChannel;
 
+@optional
+/** Called when a new track is signaled from remote peer. The new track is
+ * attached to the RtpReceiver.
+ * TODO(zhihuang): Remove the @optional once the downstream applitions implement this method.*/
+- (void)peerConnection:(RTCPeerConnection *)peerConnection
+           didAddTrack:(RTCRtpReceiver *)rtpReceiver
+               streams:(NSArray<RTCMediaStream *> *)mediaStreams;
+
 @end
 
 RTC_EXPORT