OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... | |
26 - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory | 26 - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory |
27 source:(RTCVideoSource *)source | 27 source:(RTCVideoSource *)source |
28 trackId:(NSString *)trackId { | 28 trackId:(NSString *)trackId { |
29 NSParameterAssert(factory); | 29 NSParameterAssert(factory); |
30 NSParameterAssert(source); | 30 NSParameterAssert(source); |
31 NSParameterAssert(trackId.length); | 31 NSParameterAssert(trackId.length); |
32 std::string nativeId = [NSString stdStringForString:trackId]; | 32 std::string nativeId = [NSString stdStringForString:trackId]; |
33 rtc::scoped_refptr<webrtc::VideoTrackInterface> track = | 33 rtc::scoped_refptr<webrtc::VideoTrackInterface> track = |
34 factory.nativeFactory->CreateVideoTrack(nativeId, | 34 factory.nativeFactory->CreateVideoTrack(nativeId, |
35 source.nativeVideoSource); | 35 source.nativeVideoSource); |
36 return [self initWithNativeTrack:track type:RTCMediaStreamTrackTypeVideo]; | 36 if ([self initWithNativeTrack:track type:RTCMediaStreamTrackTypeVideo]) { |
37 _source = source; | |
38 } | |
39 return self; | |
37 } | 40 } |
38 | 41 |
39 - (instancetype)initWithNativeMediaTrack: | 42 - (instancetype)initWithNativeTrack: |
40 (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeMediaTrack | 43 (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeMediaTrack |
41 type:(RTCMediaStreamTrackType)type { | 44 type:(RTCMediaStreamTrackType)type { |
42 NSParameterAssert(nativeMediaTrack); | 45 NSParameterAssert(nativeMediaTrack); |
43 NSParameterAssert(type == RTCMediaStreamTrackTypeVideo); | 46 NSParameterAssert(type == RTCMediaStreamTrackTypeVideo); |
44 if (self = [super initWithNativeTrack:nativeMediaTrack type:type]) { | 47 if (self = [super initWithNativeTrack:nativeMediaTrack type:type]) { |
45 _adapters = [NSMutableArray array]; | 48 _adapters = [NSMutableArray array]; |
46 rtc::scoped_refptr<webrtc::VideoSourceInterface> source = | |
47 self.nativeVideoTrack->GetSource(); | |
48 if (source) { | |
49 _source = [[RTCVideoSource alloc] initWithNativeVideoSource:source.get()]; | |
50 } | |
51 } | 49 } |
52 return self; | 50 return self; |
53 } | 51 } |
54 | 52 |
55 - (void)dealloc { | 53 - (void)dealloc { |
56 for (RTCVideoRendererAdapter *adapter in _adapters) { | 54 for (RTCVideoRendererAdapter *adapter in _adapters) { |
57 self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer); | 55 self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer); |
58 } | 56 } |
59 } | 57 } |
60 | 58 |
59 - (RTCVideoSource *)source { | |
60 if (!_source) { | |
61 rtc::scoped_refptr<webrtc::VideoSourceInterface> source = | |
62 self.nativeVideoTrack->GetSource(); | |
63 if (source) { | |
64 _source = [[RTCVideoSource alloc] initWithNativeVideoSource:source.get()]; | |
65 } | |
66 } | |
67 return _source; | |
68 } | |
69 | |
61 - (void)addRenderer:(id<RTCVideoRenderer>)renderer { | 70 - (void)addRenderer:(id<RTCVideoRenderer>)renderer { |
62 // Make sure we don't have this renderer yet. | 71 // Make sure we don't have this renderer yet. |
63 for (RTCVideoRendererAdapter *adapter in _adapters) { | 72 for (RTCVideoRendererAdapter *adapter in _adapters) { |
64 // Getting around unused variable error | 73 // Getting around unused variable error |
65 if (adapter.videoRenderer != renderer) { | 74 if (adapter.videoRenderer != renderer) { |
66 NSAssert(NO, @"|renderer| is already attached to this track"); | 75 NSAssert(NO, @"|renderer| is already attached to this track"); |
67 } | 76 } |
68 } | 77 } |
69 // Create a wrapper that provides a native pointer for us. | 78 // Create a wrapper that provides a native pointer for us. |
70 RTCVideoRendererAdapter* adapter = | 79 RTCVideoRendererAdapter* adapter = |
71 [[RTCVideoRendererAdapter alloc] initWithNativeRenderer:renderer]; | 80 [[RTCVideoRendererAdapter alloc] initWithNativeRenderer:renderer]; |
72 [_adapters addObject:adapter]; | 81 [_adapters addObject:adapter]; |
73 self.nativeVideoTrack->AddRenderer(adapter.nativeVideoRenderer); | 82 self.nativeVideoTrack->AddRenderer(adapter.nativeVideoRenderer); |
74 } | 83 } |
75 | 84 |
76 - (void)removeRenderer:(id<RTCVideoRenderer>)renderer { | 85 - (void)removeRenderer:(id<RTCVideoRenderer>)renderer { |
77 RTCVideoRendererAdapter *adapter; | 86 __block RTCVideoRendererAdapter *adapterToRemove; |
78 __block NSUInteger indexToRemove = NSNotFound; | 87 __block NSUInteger indexToRemove = NSNotFound; |
79 [_adapters enumerateObjectsUsingBlock:^(RTCVideoRendererAdapter *adapter, | 88 [_adapters enumerateObjectsUsingBlock:^(RTCVideoRendererAdapter *adapter, |
80 NSUInteger idx, | 89 NSUInteger idx, |
81 BOOL *stop) { | 90 BOOL *stop) { |
82 if (adapter.videoRenderer == renderer) { | 91 if (adapter.videoRenderer == renderer) { |
92 adapterToRemove = adapter; | |
83 indexToRemove = idx; | 93 indexToRemove = idx; |
84 *stop = YES; | 94 *stop = YES; |
85 } | 95 } |
86 }]; | 96 }]; |
87 if (indexToRemove == NSNotFound) { | 97 if (indexToRemove == NSNotFound) { |
88 return; | 98 return; |
89 } | 99 } |
90 self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer); | 100 self.nativeVideoTrack->RemoveRenderer(adapterToRemove.nativeVideoRenderer); |
tkchin_webrtc
2016/02/20 00:17:32
grab the adapter based on the index since we're al
hjon_webrtc
2016/02/22 23:03:06
Done.
| |
91 [_adapters removeObjectAtIndex:indexToRemove]; | 101 [_adapters removeObjectAtIndex:indexToRemove]; |
92 } | 102 } |
93 | 103 |
94 #pragma mark - Private | 104 #pragma mark - Private |
95 | 105 |
96 - (rtc::scoped_refptr<webrtc::VideoTrackInterface>)nativeVideoTrack { | 106 - (rtc::scoped_refptr<webrtc::VideoTrackInterface>)nativeVideoTrack { |
97 return static_cast<webrtc::VideoTrackInterface *>(self.nativeTrack.get()); | 107 return static_cast<webrtc::VideoTrackInterface *>(self.nativeTrack.get()); |
98 } | 108 } |
99 | 109 |
100 @end | 110 @end |
OLD | NEW |