Chromium Code Reviews| Index: webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
| diff --git a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
| index 427ae6c4a1138d4ca0207d8580eef61f5a8499c3..8620ee2bd04dd90bbf77a58431b146f566f7b5e6 100644 |
| --- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
| +++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
| @@ -16,22 +16,26 @@ |
| #import "WebRTC/RTCLogging.h" |
| #import "WebRTC/RTCVideoFrame.h" |
| +#import "RTCMTLI420Renderer.h" |
| #import "RTCMTLNV12Renderer.h" |
| // To avoid unreconized symbol linker errors, we're taking advantage of the objc runtime. |
| // Linking errors occur when compiling for architectures that don't support Metal. |
| #define MTKViewClass NSClassFromString(@"MTKView") |
| #define RTCMTLNV12RendererClass NSClassFromString(@"RTCMTLNV12Renderer") |
| +#define RTCMTLI420RendererClass NSClassFromString(@"RTCMTLI420Renderer") |
| @interface RTCMTLVideoView () <MTKViewDelegate> |
| -@property(nonatomic, strong) RTCMTLNV12Renderer *renderer; |
| +@property(nonatomic, strong) RTCMTLI420Renderer *rendererI420; |
| +@property(nonatomic, strong) RTCMTLNV12Renderer *rendererNV12; |
| @property(nonatomic, strong) MTKView *metalView; |
| @property(atomic, strong) RTCVideoFrame *videoFrame; |
| @end |
| @implementation RTCMTLVideoView |
| -@synthesize renderer = _renderer; |
| +@synthesize rendererI420 = _rendererI420; |
| +@synthesize rendererNV12 = _rendererNV12; |
| @synthesize metalView = _metalView; |
| @synthesize videoFrame = _videoFrame; |
| @@ -66,11 +70,16 @@ |
| return view; |
| } |
| -+ (RTCMTLNV12Renderer *)createMetalRenderer { |
| ++ (RTCMTLNV12Renderer *)createNV12Renderer { |
| RTCMTLNV12Renderer *renderer = [[RTCMTLNV12RendererClass alloc] init]; |
|
magjed_webrtc
2017/04/04 08:07:36
nit: Maybe just return the result directly?
|
| return renderer; |
| } |
| ++ (RTCMTLI420Renderer *)createI420Renderer { |
| + RTCMTLI420Renderer *renderer = [[RTCMTLI420RendererClass alloc] init]; |
| + return renderer; |
| +} |
| + |
| - (void)configure { |
| if (![RTCMTLVideoView isMetalAvailable]) { |
| RTCLog("Metal unavailable"); |
| @@ -78,18 +87,25 @@ |
| } |
| _metalView = [RTCMTLVideoView createMetalView:self.bounds]; |
| - _renderer = [RTCMTLVideoView createMetalRenderer]; |
| + _rendererI420 = [RTCMTLVideoView createI420Renderer]; |
|
magjed_webrtc
2017/04/04 08:07:36
Are these expensive to set up? If they are, we cou
daniela-webrtc
2017/04/05 11:49:31
Sadly the configuration is quite expensive and ent
magjed_webrtc
2017/04/05 12:10:38
Ok, so can we try to move the configuration of the
|
| + _rendererNV12 = [RTCMTLVideoView createNV12Renderer]; |
| - if ([self configureMetalRenderer]) { |
| + if ([self configureMetalRenderers]) { |
| [self configureMetalView]; |
| } else { |
| - _renderer = nil; |
| RTCLogError("Metal configuration falied."); |
| } |
| } |
| -- (BOOL)configureMetalRenderer { |
| - return [_renderer addRenderingDestination:_metalView]; |
| +- (BOOL)configureMetalRenderers { |
| + if (![_rendererI420 addRenderingDestination:_metalView]) { |
| + _rendererI420 = nil; |
| + } |
| + |
| + if (![_rendererNV12 addRenderingDestination:_metalView]) { |
| + _rendererNV12 = nil; |
| + } |
| + return _rendererNV12 || _rendererI420; |
| } |
| - (void)configureMetalView { |
| @@ -110,7 +126,15 @@ |
| - (void)drawInMTKView:(nonnull MTKView *)view { |
| NSAssert(view == self.metalView, @"Receiving draw callbacks from foreign instance."); |
| - [self.renderer drawFrame:self.videoFrame]; |
| + if (!self.videoFrame) { |
| + return; |
| + } |
| + |
| + if (self.videoFrame.nativeHandle) { |
| + [self.rendererNV12 drawFrame:self.videoFrame]; |
| + } else { |
| + [self.rendererI420 drawFrame:self.videoFrame]; |
| + } |
| } |
| - (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size { |