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 { |