| OLD | NEW | 
 | (Empty) | 
|    1 /* |  | 
|    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 "RTCVideoTrack.h" |  | 
|   12  |  | 
|   13 #import "webrtc/api/objc/RTCMediaStreamTrack+Private.h" |  | 
|   14 #import "webrtc/api/objc/RTCPeerConnectionFactory+Private.h" |  | 
|   15 #import "webrtc/api/objc/RTCVideoRendererAdapter+Private.h" |  | 
|   16 #import "webrtc/api/objc/RTCVideoSource+Private.h" |  | 
|   17 #import "webrtc/api/objc/RTCVideoTrack+Private.h" |  | 
|   18 #import "webrtc/base/objc/NSString+StdString.h" |  | 
|   19  |  | 
|   20 @implementation RTCVideoTrack { |  | 
|   21   NSMutableArray *_adapters; |  | 
|   22 } |  | 
|   23  |  | 
|   24 @synthesize source = _source; |  | 
|   25  |  | 
|   26 - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory |  | 
|   27                          source:(RTCVideoSource *)source |  | 
|   28                         trackId:(NSString *)trackId { |  | 
|   29   NSParameterAssert(factory); |  | 
|   30   NSParameterAssert(source); |  | 
|   31   NSParameterAssert(trackId.length); |  | 
|   32   std::string nativeId = [NSString stdStringForString:trackId]; |  | 
|   33   rtc::scoped_refptr<webrtc::VideoTrackInterface> track = |  | 
|   34       factory.nativeFactory->CreateVideoTrack(nativeId, |  | 
|   35                                               source.nativeVideoSource); |  | 
|   36   if ([self initWithNativeTrack:track type:RTCMediaStreamTrackTypeVideo]) { |  | 
|   37     _source = source; |  | 
|   38   } |  | 
|   39   return self; |  | 
|   40 } |  | 
|   41  |  | 
|   42 - (instancetype)initWithNativeTrack: |  | 
|   43     (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeMediaTrack |  | 
|   44                                type:(RTCMediaStreamTrackType)type { |  | 
|   45   NSParameterAssert(nativeMediaTrack); |  | 
|   46   NSParameterAssert(type == RTCMediaStreamTrackTypeVideo); |  | 
|   47   if (self = [super initWithNativeTrack:nativeMediaTrack type:type]) { |  | 
|   48     _adapters = [NSMutableArray array]; |  | 
|   49   } |  | 
|   50   return self; |  | 
|   51 } |  | 
|   52  |  | 
|   53 - (void)dealloc { |  | 
|   54   for (RTCVideoRendererAdapter *adapter in _adapters) { |  | 
|   55     self.nativeVideoTrack->RemoveSink(adapter.nativeVideoRenderer); |  | 
|   56   } |  | 
|   57 } |  | 
|   58  |  | 
|   59 - (RTCVideoSource *)source { |  | 
|   60   if (!_source) { |  | 
|   61     rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source = |  | 
|   62         self.nativeVideoTrack->GetSource(); |  | 
|   63     if (source) { |  | 
|   64       _source = [[RTCVideoSource alloc] initWithNativeVideoSource:source.get()]; |  | 
|   65     } |  | 
|   66   } |  | 
|   67   return _source; |  | 
|   68 } |  | 
|   69  |  | 
|   70 - (void)addRenderer:(id<RTCVideoRenderer>)renderer { |  | 
|   71   // Make sure we don't have this renderer yet. |  | 
|   72   for (RTCVideoRendererAdapter *adapter in _adapters) { |  | 
|   73     // Getting around unused variable error |  | 
|   74     if (adapter.videoRenderer != renderer) { |  | 
|   75       NSAssert(NO, @"|renderer| is already attached to this track"); |  | 
|   76     } |  | 
|   77   } |  | 
|   78   // Create a wrapper that provides a native pointer for us. |  | 
|   79   RTCVideoRendererAdapter* adapter = |  | 
|   80       [[RTCVideoRendererAdapter alloc] initWithNativeRenderer:renderer]; |  | 
|   81   [_adapters addObject:adapter]; |  | 
|   82   self.nativeVideoTrack->AddOrUpdateSink(adapter.nativeVideoRenderer, |  | 
|   83                                          rtc::VideoSinkWants()); |  | 
|   84 } |  | 
|   85  |  | 
|   86 - (void)removeRenderer:(id<RTCVideoRenderer>)renderer { |  | 
|   87   __block NSUInteger indexToRemove = NSNotFound; |  | 
|   88   [_adapters enumerateObjectsUsingBlock:^(RTCVideoRendererAdapter *adapter, |  | 
|   89                                           NSUInteger idx, |  | 
|   90                                           BOOL *stop) { |  | 
|   91     if (adapter.videoRenderer == renderer) { |  | 
|   92       indexToRemove = idx; |  | 
|   93       *stop = YES; |  | 
|   94     } |  | 
|   95   }]; |  | 
|   96   if (indexToRemove == NSNotFound) { |  | 
|   97     return; |  | 
|   98   } |  | 
|   99   RTCVideoRendererAdapter *adapterToRemove = |  | 
|  100       [_adapters objectAtIndex:indexToRemove]; |  | 
|  101   self.nativeVideoTrack->RemoveSink(adapterToRemove.nativeVideoRenderer); |  | 
|  102   [_adapters removeObjectAtIndex:indexToRemove]; |  | 
|  103 } |  | 
|  104  |  | 
|  105 #pragma mark - Private |  | 
|  106  |  | 
|  107 - (rtc::scoped_refptr<webrtc::VideoTrackInterface>)nativeVideoTrack { |  | 
|  108   return static_cast<webrtc::VideoTrackInterface *>(self.nativeTrack.get()); |  | 
|  109 } |  | 
|  110  |  | 
|  111 @end |  | 
| OLD | NEW |