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 63ef23ad49433c8e136c646e33dda849d54e8ca5..427ae6c4a1138d4ca0207d8580eef61f5a8499c3 100644 |
--- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
+++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
@@ -18,15 +18,18 @@ |
#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") |
+ |
@interface RTCMTLVideoView () <MTKViewDelegate> |
-@property(nonatomic, strong) id<RTCMTLRenderer> renderer; |
+@property(nonatomic, strong) RTCMTLNV12Renderer *renderer; |
@property(nonatomic, strong) MTKView *metalView; |
@property(atomic, strong) RTCVideoFrame *videoFrame; |
@end |
-@implementation RTCMTLVideoView { |
- id<RTCMTLRenderer> _renderer; |
-} |
+@implementation RTCMTLVideoView |
@synthesize renderer = _renderer; |
@synthesize metalView = _metalView; |
@@ -58,11 +61,41 @@ |
#endif |
} |
++ (MTKView *)createMetalView:(CGRect)frame { |
+ MTKView *view = [[MTKViewClass alloc] initWithFrame:frame]; |
+ return view; |
+} |
+ |
++ (RTCMTLNV12Renderer *)createMetalRenderer { |
+ RTCMTLNV12Renderer *renderer = [[RTCMTLNV12RendererClass alloc] init]; |
+ return renderer; |
+} |
+ |
- (void)configure { |
- if ([RTCMTLVideoView isMetalAvailable]) { |
- _metalView = [[MTKView alloc] initWithFrame:self.bounds]; |
+ if (![RTCMTLVideoView isMetalAvailable]) { |
+ RTCLog("Metal unavailable"); |
+ return; |
+ } |
+ |
+ _metalView = [RTCMTLVideoView createMetalView:self.bounds]; |
+ _renderer = [RTCMTLVideoView createMetalRenderer]; |
+ |
+ if ([self configureMetalRenderer]) { |
+ [self configureMetalView]; |
+ } else { |
+ _renderer = nil; |
+ RTCLogError("Metal configuration falied."); |
+ } |
+} |
+ |
+- (BOOL)configureMetalRenderer { |
+ return [_renderer addRenderingDestination:_metalView]; |
+} |
+ |
+- (void)configureMetalView { |
+ if (_metalView) { |
+ _metalView.delegate = self; |
[self addSubview:_metalView]; |
- _metalView.delegate = self; |
_metalView.contentMode = UIViewContentModeScaleAspectFit; |
_metalView.translatesAutoresizingMaskIntoConstraints = NO; |
UILayoutGuide *margins = self.layoutMarginsGuide; |
@@ -70,20 +103,14 @@ |
[_metalView.bottomAnchor constraintEqualToAnchor:margins.bottomAnchor].active = YES; |
[_metalView.leftAnchor constraintEqualToAnchor:margins.leftAnchor].active = YES; |
[_metalView.rightAnchor constraintEqualToAnchor:margins.rightAnchor].active = YES; |
- |
- _renderer = [[RTCMTLNV12Renderer alloc] init]; |
- if (![(RTCMTLNV12Renderer *)_renderer addRenderingDestination:_metalView]) { |
- _renderer = nil; |
- }; |
- } else { |
- RTCLogError("Metal configuration falied."); |
} |
} |
+ |
#pragma mark - MTKViewDelegate methods |
- (void)drawInMTKView:(nonnull MTKView *)view { |
NSAssert(view == self.metalView, @"Receiving draw callbacks from foreign instance."); |
- [_renderer drawFrame:self.videoFrame]; |
+ [self.renderer drawFrame:self.videoFrame]; |
} |
- (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size { |
@@ -92,8 +119,8 @@ |
#pragma mark - RTCVideoRenderer |
- (void)setSize:(CGSize)size { |
- _metalView.drawableSize = size; |
- [_metalView draw]; |
+ self.metalView.drawableSize = size; |
+ [self.metalView draw]; |
} |
- (void)renderFrame:(nullable RTCVideoFrame *)frame { |