blob: a6292b547c8031f3d83af06323b12928434bafd5 [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
tkchin9eeb6242016-04-27 01:54:20 -070011#import "RTCMediaStream+Private.h"
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080012
13#include <vector>
14
tkchin9eeb6242016-04-27 01:54:20 -070015#import "RTCAudioTrack+Private.h"
16#import "RTCMediaStreamTrack+Private.h"
17#import "RTCPeerConnectionFactory+Private.h"
18#import "RTCVideoTrack+Private.h"
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020019#import "helpers/NSString+StdString.h"
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080020
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020021@implementation RTC_OBJC_TYPE (RTCMediaStream) {
22 RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory;
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080023 NSMutableArray *_audioTracks;
24 NSMutableArray *_videoTracks;
25 rtc::scoped_refptr<webrtc::MediaStreamInterface> _nativeMediaStream;
26}
27
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020028- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory
hjona2f77982016-03-04 07:09:09 -080029 streamId:(NSString *)streamId {
30 NSParameterAssert(factory);
31 NSParameterAssert(streamId.length);
32 std::string nativeId = [NSString stdStringForString:streamId];
33 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
34 factory.nativeFactory->CreateLocalMediaStream(nativeId);
Yura Yaroshevichc806c1d2018-06-21 12:51:11 +030035 return [self initWithFactory:factory nativeMediaStream:stream];
hjona2f77982016-03-04 07:09:09 -080036}
37
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020038- (NSArray<RTC_OBJC_TYPE(RTCAudioTrack) *> *)audioTracks {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080039 return [_audioTracks copy];
40}
41
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020042- (NSArray<RTC_OBJC_TYPE(RTCVideoTrack) *> *)videoTracks {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080043 return [_videoTracks copy];
44}
45
46- (NSString *)streamId {
Seth Hampson513449e2018-03-06 09:35:56 -080047 return [NSString stringForStdString:_nativeMediaStream->id()];
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080048}
49
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020050- (void)addAudioTrack:(RTC_OBJC_TYPE(RTCAudioTrack) *)audioTrack {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080051 if (_nativeMediaStream->AddTrack(audioTrack.nativeAudioTrack)) {
52 [_audioTracks addObject:audioTrack];
53 }
54}
55
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020056- (void)addVideoTrack:(RTC_OBJC_TYPE(RTCVideoTrack) *)videoTrack {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080057 if (_nativeMediaStream->AddTrack(videoTrack.nativeVideoTrack)) {
58 [_videoTracks addObject:videoTrack];
59 }
60}
61
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020062- (void)removeAudioTrack:(RTC_OBJC_TYPE(RTCAudioTrack) *)audioTrack {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080063 NSUInteger index = [_audioTracks indexOfObjectIdenticalTo:audioTrack];
64 NSAssert(index != NSNotFound,
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020065 @"|removeAudioTrack| called on unexpected RTC_OBJC_TYPE(RTCAudioTrack)");
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080066 if (index != NSNotFound &&
67 _nativeMediaStream->RemoveTrack(audioTrack.nativeAudioTrack)) {
68 [_audioTracks removeObjectAtIndex:index];
69 }
70}
71
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020072- (void)removeVideoTrack:(RTC_OBJC_TYPE(RTCVideoTrack) *)videoTrack {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080073 NSUInteger index = [_videoTracks indexOfObjectIdenticalTo:videoTrack];
74 NSAssert(index != NSNotFound,
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020075 @"|removeVideoTrack| called on unexpected RTC_OBJC_TYPE(RTCVideoTrack)");
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080076 if (index != NSNotFound &&
77 _nativeMediaStream->RemoveTrack(videoTrack.nativeVideoTrack)) {
78 [_videoTracks removeObjectAtIndex:index];
79 }
80}
81
82- (NSString *)description {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020083 return [NSString stringWithFormat:@"RTC_OBJC_TYPE(RTCMediaStream):\n%@\nA=%lu\nV=%lu",
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080084 self.streamId,
85 (unsigned long)self.audioTracks.count,
86 (unsigned long)self.videoTracks.count];
87}
88
89#pragma mark - Private
90
91- (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
92 return _nativeMediaStream;
93}
94
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020095- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory
Yura Yaroshevichc806c1d2018-06-21 12:51:11 +030096 nativeMediaStream:
97 (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -080098 NSParameterAssert(nativeMediaStream);
99 if (self = [super init]) {
Yura Yaroshevichc806c1d2018-06-21 12:51:11 +0300100 _factory = factory;
101
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -0800102 webrtc::AudioTrackVector audioTracks = nativeMediaStream->GetAudioTracks();
103 webrtc::VideoTrackVector videoTracks = nativeMediaStream->GetVideoTracks();
104
105 _audioTracks = [NSMutableArray arrayWithCapacity:audioTracks.size()];
106 _videoTracks = [NSMutableArray arrayWithCapacity:videoTracks.size()];
107 _nativeMediaStream = nativeMediaStream;
108
109 for (auto &track : audioTracks) {
110 RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeAudio;
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200111 RTC_OBJC_TYPE(RTCAudioTrack) *audioTrack =
112 [[RTC_OBJC_TYPE(RTCAudioTrack) alloc] initWithFactory:_factory
113 nativeTrack:track
114 type:type];
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -0800115 [_audioTracks addObject:audioTrack];
116 }
117
118 for (auto &track : videoTracks) {
119 RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeVideo;
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200120 RTC_OBJC_TYPE(RTCVideoTrack) *videoTrack =
121 [[RTC_OBJC_TYPE(RTCVideoTrack) alloc] initWithFactory:_factory
122 nativeTrack:track
123 type:type];
Jon Hjelle2bf9a5f2016-01-21 16:14:11 -0800124 [_videoTracks addObject:videoTrack];
125 }
126 }
127 return self;
128}
129
130@end