#error "This file requires ARC support."
#endif
-#import "RTCEAGLVideoView+Internal.h"
+#import "RTCEAGLVideoView.h"
#import <GLKit/GLKit.h>
+#import "RTCI420Frame.h"
#import "RTCOpenGLVideoRenderer.h"
-#import "RTCVideoRenderer.h"
-#import "RTCVideoTrack.h"
// RTCDisplayLinkTimer wraps a CADisplayLink and is set to fire every two screen
// refreshes, which should be 30fps. We wrap the display link in order to avoid
RTCDisplayLinkTimer* _timer;
GLKView* _glkView;
RTCOpenGLVideoRenderer* _glRenderer;
- RTCVideoRenderer* _videoRenderer;
}
- (instancetype)initWithFrame:(CGRect)frame {
// GLKViewDelegate method implemented below.
[strongSelf.glkView setNeedsDisplay];
}];
- _videoRenderer = [[RTCVideoRenderer alloc] initWithDelegate:self];
[self setupGL];
}
return self;
[_timer invalidate];
}
-- (void)setVideoTrack:(RTCVideoTrack*)videoTrack {
- if (_videoTrack == videoTrack) {
- return;
- }
- [_videoTrack removeRenderer:_videoRenderer];
- self.i420Frame = nil;
- _videoTrack = videoTrack;
- [_videoTrack addRenderer:_videoRenderer];
- // TODO(tkchin): potentially handle changes in track state - e.g. render
- // black if track fails.
-}
-
#pragma mark - UIView
- (void)layoutSubviews {
[_glRenderer drawFrame:self.i420Frame];
}
+#pragma mark - RTCVideoRenderer
+
+// These methods may be called on non-main thread.
+- (void)setSize:(CGSize)size {
+ __weak RTCEAGLVideoView* weakSelf = self;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ RTCEAGLVideoView* strongSelf = weakSelf;
+ [strongSelf.delegate videoView:strongSelf didChangeVideoSize:size];
+ });
+}
+
+- (void)renderFrame:(RTCI420Frame*)frame {
+ self.i420Frame = frame;
+}
+
#pragma mark - Private
- (void)setupGL {
+ self.i420Frame = nil;
[_glRenderer setupGL];
_timer.isPaused = NO;
}
- (void)teardownGL {
+ self.i420Frame = nil;
_timer.isPaused = YES;
[_glkView deleteDrawable];
[_glRenderer teardownGL];
}
@end
-
-@implementation RTCEAGLVideoView (Internal)
-
-#pragma mark - RTCVideoRendererDelegate
-
-// These methods are called when the video track has frame information to
-// provide. This occurs on non-main thread.
-- (void)renderer:(RTCVideoRenderer*)renderer
- didSetSize:(CGSize)size {
- __weak RTCEAGLVideoView* weakSelf = self;
- dispatch_async(dispatch_get_main_queue(), ^{
- RTCEAGLVideoView* strongSelf = weakSelf;
- [strongSelf.delegate videoView:strongSelf didChangeVideoSize:size];
- });
-}
-
-- (void)renderer:(RTCVideoRenderer*)renderer
- didReceiveFrame:(RTCI420Frame*)frame {
- self.i420Frame = frame;
-}
-
-@end