| Index: webrtc/examples/objc/AppRTCDemo/ARDAppClient.m
 | 
| diff --git a/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m b/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m
 | 
| index 7d060c9e9f4509c6307d247c85e52f5ecbd363eb..6ab3932f67fe76d58158145ed8aa96140ab084ba 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,11 @@ static NSInteger const kARDAppClientErrorCreateSDP = -3;
 | 
|  static NSInteger const kARDAppClientErrorSetSDP = -4;
 | 
|  static NSInteger const kARDAppClientErrorInvalidClient = -5;
 | 
|  static NSInteger const kARDAppClientErrorInvalidRoom = -6;
 | 
| +static NSString * const kARDMediaTypeAudio = @"audio";
 | 
| +static NSString * const kARDMediaTypeVideo = @"video";
 | 
| +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 +511,9 @@ static BOOL const kARDAppClientEnableTracing = NO;
 | 
|    _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 +612,23 @@ static BOOL const kARDAppClientEnableTracing = NO;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -- (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:kARDMediaTypeVideo
 | 
| +                                                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:kARDMediaTypeAudio
 | 
| +                                                streamId:kARDMediaStreamId];
 | 
| +  RTCAudioTrack *track = [_factory audioTrackWithTrackId:kARDAudioTrackId];
 | 
| +  sender.track = track;
 | 
| +  return sender;
 | 
|  }
 | 
|  
 | 
|  - (RTCVideoTrack *)createLocalVideoTrack {
 | 
| @@ -634,7 +646,7 @@ static BOOL const kARDAppClientEnableTracing = NO;
 | 
|          [_factory avFoundationVideoSourceWithConstraints:mediaConstraints];
 | 
|      localVideoTrack =
 | 
|          [_factory videoTrackWithSource:source
 | 
| -                               trackId:@"ARDAMSv0"];
 | 
| +                               trackId:kARDVideoTrackId];
 | 
|    }
 | 
|  #endif
 | 
|    return localVideoTrack;
 | 
| 
 |