| Index: webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
|
| diff --git a/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m b/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
|
| index 1fb03bc909e27305eee7eb41bd9f6066983f7e3e..5713bf86e3e7a25b857410ec2fd73a64d36afc64 100644
|
| --- a/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
|
| +++ b/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
|
| @@ -12,7 +12,9 @@
|
|
|
| #import <GLKit/GLKit.h>
|
|
|
| -#import "RTCShader+Private.h"
|
| +#import "RTCDefaultShader.h"
|
| +#import "RTCI420TextureCache.h"
|
| +#import "RTCNV12TextureCache.h"
|
| #import "WebRTC/RTCLogging.h"
|
| #import "WebRTC/RTCVideoFrame.h"
|
|
|
| @@ -97,8 +99,9 @@
|
| // This flag should only be set and read on the main thread (e.g. by
|
| // setNeedsDisplay)
|
| BOOL _isDirty;
|
| - id<RTCShader> _i420Shader;
|
| - id<RTCShader> _nv12Shader;
|
| + id<RTCVideoViewShading> _shader;
|
| + RTCNV12TextureCache *_nv12TextureCache;
|
| + RTCI420TextureCache *_i420TextureCache;
|
| RTCVideoFrame *_lastDrawnFrame;
|
| }
|
|
|
| @@ -107,14 +110,24 @@
|
| @synthesize glkView = _glkView;
|
|
|
| - (instancetype)initWithFrame:(CGRect)frame {
|
| + return [self initWithFrame:frame shader:[[RTCDefaultShader alloc] init]];
|
| +}
|
| +
|
| +- (instancetype)initWithCoder:(NSCoder *)aDecoder {
|
| + return [self initWithCoder:aDecoder shader:[[RTCDefaultShader alloc] init]];
|
| +}
|
| +
|
| +- (instancetype)initWithFrame:(CGRect)frame shader:(id<RTCVideoViewShading>)shader {
|
| if (self = [super initWithFrame:frame]) {
|
| + _shader = shader;
|
| [self configure];
|
| }
|
| return self;
|
| }
|
|
|
| -- (instancetype)initWithCoder:(NSCoder *)aDecoder {
|
| +- (instancetype)initWithCoder:(NSCoder *)aDecoder shader:(id<RTCVideoViewShading>)shader {
|
| if (self = [super initWithCoder:aDecoder]) {
|
| + _shader = shader;
|
| [self configure];
|
| }
|
| return self;
|
| @@ -207,22 +220,26 @@
|
| }
|
| [self ensureGLContext];
|
| glClear(GL_COLOR_BUFFER_BIT);
|
| - id<RTCShader> shader = nil;
|
| if (frame.nativeHandle) {
|
| - if (!_nv12Shader) {
|
| - _nv12Shader = [[RTCNativeNV12Shader alloc] initWithContext:_glContext];
|
| + if (!_nv12TextureCache) {
|
| + _nv12TextureCache = [[RTCNV12TextureCache alloc] initWithContext:_glContext];
|
| }
|
| - shader = _nv12Shader;
|
| - } else {
|
| - if (!_i420Shader) {
|
| - _i420Shader = [[RTCI420Shader alloc] initWithContext:_glContext];
|
| + if (_nv12TextureCache) {
|
| + [_nv12TextureCache uploadFrameToTextures:frame];
|
| + [_shader applyShadingForFrameWithRotation:frame.rotation
|
| + yPlane:_nv12TextureCache.yTexture
|
| + uvPlane:_nv12TextureCache.uvTexture];
|
| + [_nv12TextureCache releaseTextures];
|
| }
|
| - shader = _i420Shader;
|
| - }
|
| - if (shader && [shader drawFrame:frame]) {
|
| - _lastDrawnFrame = frame;
|
| } else {
|
| - RTCLog(@"Failed to draw frame.");
|
| + if (!_i420TextureCache) {
|
| + _i420TextureCache = [[RTCI420TextureCache alloc] initWithContext:_glContext];
|
| + }
|
| + [_i420TextureCache uploadFrameToTextures:frame];
|
| + [_shader applyShadingForFrameWithRotation:frame.rotation
|
| + yPlane:_i420TextureCache.yTexture
|
| + uPlane:_i420TextureCache.uTexture
|
| + vPlane:_i420TextureCache.vTexture];
|
| }
|
| }
|
|
|
| @@ -275,8 +292,8 @@
|
| _timer.isPaused = YES;
|
| [_glkView deleteDrawable];
|
| [self ensureGLContext];
|
| - _i420Shader = nil;
|
| - _nv12Shader = nil;
|
| + _nv12TextureCache = nil;
|
| + _i420TextureCache = nil;
|
| }
|
|
|
| - (void)didBecomeActive {
|
|
|