blob: 3c3e4d906455cedbc4e343d086df6903007f12a2 [file] [log] [blame]
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -08001/*
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#import "RTCMediaStream.h"
12
13#include <vector>
14
15#import "webrtc/api/objc/RTCAudioTrack+Private.h"
16#import "webrtc/api/objc/RTCMediaStream+Private.h"
17#import "webrtc/api/objc/RTCMediaStreamTrack+Private.h"
hjona2f77982016-03-04 07:09:09 -080018#import "webrtc/api/objc/RTCPeerConnectionFactory+Private.h"
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080019#import "webrtc/api/objc/RTCVideoTrack+Private.h"
20#import "webrtc/base/objc/NSString+StdString.h"
21
hjon6b039952016-02-25 12:32:58 -080022// TODO(hjon): Update nullability types. See http://crbug/webrtc/5592
23
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080024@implementation RTCMediaStream {
25 NSMutableArray *_audioTracks;
26 NSMutableArray *_videoTracks;
27 rtc::scoped_refptr<webrtc::MediaStreamInterface> _nativeMediaStream;
28}
29
hjona2f77982016-03-04 07:09:09 -080030- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
31 streamId:(NSString *)streamId {
32 NSParameterAssert(factory);
33 NSParameterAssert(streamId.length);
34 std::string nativeId = [NSString stdStringForString:streamId];
35 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
36 factory.nativeFactory->CreateLocalMediaStream(nativeId);
37 return [self initWithNativeMediaStream:stream];
38}
39
hjon6b039952016-02-25 12:32:58 -080040- (NSArray *)audioTracks {
41// - (NSArray<RTCAudioTrack *> *)audioTracks {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080042 return [_audioTracks copy];
43}
44
hjon6b039952016-02-25 12:32:58 -080045- (NSArray *)videoTracks {
46// - (NSArray<RTCVideoTrack *> *)videoTracks {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080047 return [_videoTracks copy];
48}
49
50- (NSString *)streamId {
51 return [NSString stringForStdString:_nativeMediaStream->label()];
52}
53
54- (void)addAudioTrack:(RTCAudioTrack *)audioTrack {
55 if (_nativeMediaStream->AddTrack(audioTrack.nativeAudioTrack)) {
56 [_audioTracks addObject:audioTrack];
57 }
58}
59
60- (void)addVideoTrack:(RTCVideoTrack *)videoTrack {
61 if (_nativeMediaStream->AddTrack(videoTrack.nativeVideoTrack)) {
62 [_videoTracks addObject:videoTrack];
63 }
64}
65
66- (void)removeAudioTrack:(RTCAudioTrack *)audioTrack {
67 NSUInteger index = [_audioTracks indexOfObjectIdenticalTo:audioTrack];
68 NSAssert(index != NSNotFound,
69 @"|removeAudioTrack| called on unexpected RTCAudioTrack");
70 if (index != NSNotFound &&
71 _nativeMediaStream->RemoveTrack(audioTrack.nativeAudioTrack)) {
72 [_audioTracks removeObjectAtIndex:index];
73 }
74}
75
76- (void)removeVideoTrack:(RTCVideoTrack *)videoTrack {
77 NSUInteger index = [_videoTracks indexOfObjectIdenticalTo:videoTrack];
78 NSAssert(index != NSNotFound,
79 @"|removeVideoTrack| called on unexpected RTCVideoTrack");
80 if (index != NSNotFound &&
81 _nativeMediaStream->RemoveTrack(videoTrack.nativeVideoTrack)) {
82 [_videoTracks removeObjectAtIndex:index];
83 }
84}
85
86- (NSString *)description {
87 return [NSString stringWithFormat:@"RTCMediaStream:\n%@\nA=%lu\nV=%lu",
88 self.streamId,
89 (unsigned long)self.audioTracks.count,
90 (unsigned long)self.videoTracks.count];
91}
92
93#pragma mark - Private
94
95- (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
96 return _nativeMediaStream;
97}
98
99- (instancetype)initWithNativeMediaStream:
100 (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
101 NSParameterAssert(nativeMediaStream);
102 if (self = [super init]) {
103 webrtc::AudioTrackVector audioTracks = nativeMediaStream->GetAudioTracks();
104 webrtc::VideoTrackVector videoTracks = nativeMediaStream->GetVideoTracks();
105
106 _audioTracks = [NSMutableArray arrayWithCapacity:audioTracks.size()];
107 _videoTracks = [NSMutableArray arrayWithCapacity:videoTracks.size()];
108 _nativeMediaStream = nativeMediaStream;
109
110 for (auto &track : audioTracks) {
111 RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeAudio;
112 RTCAudioTrack *audioTrack =
113 [[RTCAudioTrack alloc] initWithNativeTrack:track type:type];
114 [_audioTracks addObject:audioTrack];
115 }
116
117 for (auto &track : videoTracks) {
118 RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeVideo;
119 RTCVideoTrack *videoTrack =
120 [[RTCVideoTrack alloc] initWithNativeTrack:track type:type];
121 [_videoTracks addObject:videoTrack];
122 }
123 }
124 return self;
125}
126
127@end