Chromium Code Reviews| Index: webrtc/sdk/objc/Framework/Classes/RTCNSGLVideoView.m |
| diff --git a/webrtc/sdk/objc/Framework/Classes/RTCNSGLVideoView.m b/webrtc/sdk/objc/Framework/Classes/RTCNSGLVideoView.m |
| index 530d9a7e6a195e1d00afc10428f9e9a88b093d47..eec66625841da1a1db7f0bfe019d35afee727018 100644 |
| --- a/webrtc/sdk/objc/Framework/Classes/RTCNSGLVideoView.m |
| +++ b/webrtc/sdk/objc/Framework/Classes/RTCNSGLVideoView.m |
| @@ -18,7 +18,8 @@ |
| #import <CoreVideo/CVDisplayLink.h> |
| #import <OpenGL/gl3.h> |
| -#import "RTCShader+Private.h" |
| +#import "RTCI420TextureCache.h" |
| +#import "RTCDefaultShaderDelegate.h" |
| #import "WebRTC/RTCLogging.h" |
| #import "WebRTC/RTCVideoFrame.h" |
| @@ -26,7 +27,7 @@ |
| // |videoFrame| 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) RTCVideoFrame *videoFrame; |
| -@property(atomic, strong) id<RTCShader> i420Shader; |
| +@property(atomic, strong) RTCI420TextureCache *i420TextureCache; |
| - (void)drawFrame; |
| @end |
| @@ -45,11 +46,29 @@ static CVReturn OnDisplayLinkFired(CVDisplayLinkRef displayLink, |
| @implementation RTCNSGLVideoView { |
| CVDisplayLinkRef _displayLink; |
| RTCVideoFrame *_lastDrawnFrame; |
| + RTCDefaultShaderDelegate *_defaultShaderDelegate; |
| + __weak id<RTCVideoViewShaderDelegate> _shaderDelegate; |
| } |
| @synthesize delegate = _delegate; |
| @synthesize videoFrame = _videoFrame; |
| -@synthesize i420Shader = _i420Shader; |
| +@synthesize i420TextureCache = _i420TextureCache; |
| + |
| +- (instancetype)initWithFrame:(NSRect)frame pixelFormat:(NSOpenGLPixelFormat *)format { |
| + _defaultShaderDelegate = [[RTCDefaultShaderDelegate alloc] init]; |
| + return [self initWithFrame:frame |
| + pixelFormat:format |
| + shaderDelegate:_defaultShaderDelegate]; |
| +} |
| + |
| +- (instancetype)initWithFrame:(NSRect)frame |
| + pixelFormat:(NSOpenGLPixelFormat *)format |
| + shaderDelegate:(id<RTCVideoViewShaderDelegate>)shaderDelegate { |
| + if (self = [super initWithFrame:frame pixelFormat:format]) { |
| + _shaderDelegate = shaderDelegate; |
| + } |
| + return self; |
| +} |
| - (void)dealloc { |
| [self teardownDisplayLink]; |
| @@ -85,7 +104,7 @@ static CVReturn OnDisplayLinkFired(CVDisplayLinkRef displayLink, |
| - (void)clearGLContext { |
| [self ensureGLContext]; |
| - self.i420Shader = nil; |
| + self.i420TextureCache = nil; |
| [super clearGLContext]; |
| } |
| @@ -118,15 +137,21 @@ static CVReturn OnDisplayLinkFired(CVDisplayLinkRef displayLink, |
| glClear(GL_COLOR_BUFFER_BIT); |
| // Rendering native CVPixelBuffer is not supported on OS X. |
| + // TODO(magjed): Add support for NV12 texture cache on OS X. |
| frame = [frame newI420VideoFrame]; |
| - if (!self.i420Shader) { |
| - self.i420Shader = [[RTCI420Shader alloc] initWithContext:context]; |
| + if (!self.i420TextureCache) { |
| + self.i420TextureCache = [[RTCI420TextureCache alloc] initWithContext:context]; |
| } |
| - if (self.i420Shader && [self.i420Shader drawFrame:frame]) { |
| + RTCI420TextureCache *i420TextureCache = self.i420TextureCache; |
| + if (i420TextureCache) { |
| + [i420TextureCache uploadFrameToTextures:frame]; |
| + [_shaderDelegate videoView:self |
|
daniela-webrtc
2017/05/11 17:31:20
What if this is nil? Shouldn't the defaultDelegate
|
| + didReceiveFrameWithRotation:frame.rotation |
| + yPlane:i420TextureCache.yTexture |
| + uPlane:i420TextureCache.uTexture |
| + vPlane:i420TextureCache.vTexture]; |
| [context flushBuffer]; |
| _lastDrawnFrame = frame; |
| - } else { |
| - RTCLog(@"Failed to draw frame."); |
| } |
| CGLUnlockContext([context CGLContextObj]); |
| } |