Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Unified Diff: webrtc/sdk/objc/Framework/Classes/RTCNSGLVideoView.m

Issue 2869143002: iOS: Add interface for injecting custom shaders (Closed)
Patch Set: Address comments. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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]);
}

Powered by Google App Engine
This is Rietveld 408576698