summaryrefslogtreecommitdiff
path: root/app/webrtc/objc/RTCVideoTrack.mm
diff options
context:
space:
mode:
Diffstat (limited to 'app/webrtc/objc/RTCVideoTrack.mm')
-rw-r--r--app/webrtc/objc/RTCVideoTrack.mm47
1 files changed, 28 insertions, 19 deletions
diff --git a/app/webrtc/objc/RTCVideoTrack.mm b/app/webrtc/objc/RTCVideoTrack.mm
index beebde0..959bc6d 100644
--- a/app/webrtc/objc/RTCVideoTrack.mm
+++ b/app/webrtc/objc/RTCVideoTrack.mm
@@ -32,46 +32,55 @@
#import "RTCVideoTrack+Internal.h"
#import "RTCMediaStreamTrack+Internal.h"
-#import "RTCVideoRenderer+Internal.h"
+#import "RTCVideoRendererAdapter.h"
@implementation RTCVideoTrack {
- NSMutableArray* _rendererArray;
+ NSMutableArray* _adapters;
}
- (id)initWithMediaTrack:
(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)
mediaTrack {
if (self = [super initWithMediaTrack:mediaTrack]) {
- _rendererArray = [NSMutableArray array];
+ _adapters = [NSMutableArray array];
}
return self;
}
-- (void)addRenderer:(RTCVideoRenderer*)renderer {
- NSAssert1(![self.renderers containsObject:renderer],
- @"renderers already contains object [%@]",
- [renderer description]);
- [_rendererArray addObject:renderer];
- self.videoTrack->AddRenderer(renderer.videoRenderer);
-}
-
-- (void)removeRenderer:(RTCVideoRenderer*)renderer {
- NSUInteger index = [self.renderers indexOfObjectIdenticalTo:renderer];
- if (index != NSNotFound) {
- [_rendererArray removeObjectAtIndex:index];
- self.videoTrack->RemoveRenderer(renderer.videoRenderer);
+- (void)addRenderer:(id<RTCVideoRenderer>)renderer {
+ // Make sure we don't have this renderer yet.
+ for (RTCVideoRendererAdapter* adapter in _adapters) {
+ NSParameterAssert(adapter.videoRenderer != renderer);
}
+ // Create a wrapper that provides a native pointer for us.
+ RTCVideoRendererAdapter* adapter =
+ [[RTCVideoRendererAdapter alloc] initWithVideoRenderer:renderer];
+ [_adapters addObject:adapter];
+ self.nativeVideoTrack->AddRenderer(adapter.nativeVideoRenderer);
}
-- (NSArray*)renderers {
- return [_rendererArray copy];
+- (void)removeRenderer:(id<RTCVideoRenderer>)renderer {
+ RTCVideoRendererAdapter* adapter = nil;
+ NSUInteger indexToRemove = NSNotFound;
+ for (NSUInteger i = 0; i < _adapters.count; i++) {
+ adapter = _adapters[i];
+ if (adapter.videoRenderer == renderer) {
+ indexToRemove = i;
+ break;
+ }
+ }
+ if (indexToRemove == NSNotFound) {
+ return;
+ }
+ self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer);
+ [_adapters removeObjectAtIndex:indexToRemove];
}
@end
@implementation RTCVideoTrack (Internal)
-- (rtc::scoped_refptr<webrtc::VideoTrackInterface>)videoTrack {
+- (rtc::scoped_refptr<webrtc::VideoTrackInterface>)nativeVideoTrack {
return static_cast<webrtc::VideoTrackInterface*>(self.mediaTrack.get());
}