#import <CoreVideo/CVDisplayLink.h>
#import <OpenGL/gl3.h>
+#import "RTCI420Frame.h"
#import "RTCOpenGLVideoRenderer.h"
-#import "RTCVideoRenderer.h"
-@interface RTCNSGLVideoView () <RTCVideoRendererDelegate>
+@interface RTCNSGLVideoView ()
// |i420Frame| is set when we receive a frame from a worker thread and is read
// from the display link callback so atomicity is required.
@property(atomic, strong) RTCI420Frame* i420Frame;
@implementation RTCNSGLVideoView {
CVDisplayLinkRef _displayLink;
- RTCVideoRenderer* _videoRenderer;
-}
-
-- (instancetype)initWithFrame:(NSRect)frame
- pixelFormat:(NSOpenGLPixelFormat*)format {
- if (self = [super initWithFrame:frame pixelFormat:format]) {
- _videoRenderer = [[RTCVideoRenderer alloc] initWithDelegate:self];
- }
- return self;
}
- (void)dealloc {
[super clearGLContext];
}
-- (void)setVideoTrack:(RTCVideoTrack*)videoTrack {
- if (_videoTrack == videoTrack) {
- return;
- }
- if (_videoTrack) {
- [_videoTrack removeRenderer:_videoRenderer];
- CVDisplayLinkStop(_displayLink);
- // Clear contents.
- self.i420Frame = nil;
- [self drawFrame];
- }
- _videoTrack = videoTrack;
- if (_videoTrack) {
- [_videoTrack addRenderer:_videoRenderer];
- CVDisplayLinkStart(_displayLink);
- }
-}
-
-#pragma mark - RTCVideoRendererDelegate
+#pragma mark - RTCVideoRenderer
-// 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 {
+// These methods may be called on non-main thread.
+- (void)setSize:(CGSize)size {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate videoView:self didChangeVideoSize:size];
});
}
-- (void)renderer:(RTCVideoRenderer*)renderer
- didReceiveFrame:(RTCI420Frame*)frame {
+- (void)renderFrame:(RTCI420Frame*)frame {
self.i420Frame = frame;
}
CGLPixelFormatObj cglPixelFormat = [[self pixelFormat] CGLPixelFormatObj];
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(
_displayLink, cglContext, cglPixelFormat);
- if (_videoTrack) {
- CVDisplayLinkStart(_displayLink);
- }
+ CVDisplayLinkStart(_displayLink);
}
- (void)teardownDisplayLink {