Added the API to create an RTCRtpSender to the Objective C wrapper.

Objective C applications can now create new RTCRtpSenders and change their tracks, which gives them more fine grained control than MediaStreams.

BUG=

Review-Url: https://codereview.webrtc.org/1888633002
Cr-Commit-Position: refs/heads/master@{#12570}
diff --git a/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m b/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m
index 7d060c9..86d18d1 100644
--- a/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m
+++ b/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m
@@ -22,6 +22,7 @@
 #import "WebRTC/RTCMediaConstraints.h"
 #import "WebRTC/RTCMediaStream.h"
 #import "WebRTC/RTCPeerConnectionFactory.h"
+#import "WebRTC/RTCRtpSender.h"
 
 #import "ARDAppEngineClient.h"
 #import "ARDCEODTURNClient.h"
@@ -48,6 +49,9 @@
 static NSInteger const kARDAppClientErrorSetSDP = -4;
 static NSInteger const kARDAppClientErrorInvalidClient = -5;
 static NSInteger const kARDAppClientErrorInvalidRoom = -6;
+static NSString * const kARDMediaStreamId = @"ARDAMS";
+static NSString * const kARDAudioTrackId = @"ARDAMSa0";
+static NSString * const kARDVideoTrackId = @"ARDAMSv0";
 
 // TODO(tkchin): Remove guard once rtc_sdk_common_objc compiles on Mac.
 #if defined(WEBRTC_IOS)
@@ -505,9 +509,9 @@
   _peerConnection = [_factory peerConnectionWithConfiguration:config
                                                   constraints:constraints
                                                      delegate:self];
-  // Create AV media stream and add it to the peer connection.
-  RTCMediaStream *localStream = [self createLocalMediaStream];
-  [_peerConnection addStream:localStream];
+  // Create AV senders.
+  [self createAudioSender];
+  [self createVideoSender];
   if (_isInitiator) {
     // Send offer.
     __weak ARDAppClient *weakSelf = self;
@@ -606,17 +610,25 @@
   }
 }
 
-- (RTCMediaStream *)createLocalMediaStream {
-  RTCMediaStream *localStream = [_factory mediaStreamWithStreamId:@"ARDAMS"];
-  RTCVideoTrack *localVideoTrack = [self createLocalVideoTrack];
-  if (localVideoTrack) {
-    [localStream addVideoTrack:localVideoTrack];
-    [_delegate appClient:self didReceiveLocalVideoTrack:localVideoTrack];
+- (RTCRtpSender *)createVideoSender {
+  RTCRtpSender *sender =
+      [_peerConnection senderWithKind:kRTCMediaStreamTrackKindVideo
+                             streamId:kARDMediaStreamId];
+  RTCVideoTrack *track = [self createLocalVideoTrack];
+  if (track) {
+    sender.track = track;
+    [_delegate appClient:self didReceiveLocalVideoTrack:track];
   }
-  RTCAudioTrack *localAudioTrack =
-      [_factory audioTrackWithTrackId:@"ARDAMSa0"];
-  [localStream addAudioTrack:localAudioTrack];
-  return localStream;
+  return sender;
+}
+
+- (RTCRtpSender *)createAudioSender {
+  RTCRtpSender *sender =
+      [_peerConnection senderWithKind:kRTCMediaStreamTrackKindAudio
+                             streamId:kARDMediaStreamId];
+  RTCAudioTrack *track = [_factory audioTrackWithTrackId:kARDAudioTrackId];
+  sender.track = track;
+  return sender;
 }
 
 - (RTCVideoTrack *)createLocalVideoTrack {
@@ -634,7 +646,7 @@
         [_factory avFoundationVideoSourceWithConstraints:mediaConstraints];
     localVideoTrack =
         [_factory videoTrackWithSource:source
-                               trackId:@"ARDAMSv0"];
+                               trackId:kARDVideoTrackId];
   }
 #endif
   return localVideoTrack;