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..63ef23ad49433c8e136c646e33dda849d54e8ca5 100644 |
--- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
+++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m |
@@ -18,18 +18,15 @@ |
#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) RTCMTLNV12Renderer *renderer; |
+@property(nonatomic, strong) id<RTCMTLRenderer> renderer; |
@property(nonatomic, strong) MTKView *metalView; |
@property(atomic, strong) RTCVideoFrame *videoFrame; |
@end |
-@implementation RTCMTLVideoView |
+@implementation RTCMTLVideoView { |
+ id<RTCMTLRenderer> _renderer; |
+} |
@synthesize renderer = _renderer; |
@synthesize metalView = _metalView; |
@@ -61,41 +58,11 @@ |
#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]) { |
- 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) { |
+ if ([RTCMTLVideoView isMetalAvailable]) { |
+ _metalView = [[MTKView alloc] initWithFrame:self.bounds]; |
+ [self addSubview:_metalView]; |
_metalView.delegate = self; |
- [self addSubview:_metalView]; |
_metalView.contentMode = UIViewContentModeScaleAspectFit; |
_metalView.translatesAutoresizingMaskIntoConstraints = NO; |
UILayoutGuide *margins = self.layoutMarginsGuide; |
@@ -103,14 +70,20 @@ |
[_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."); |
- [self.renderer drawFrame:self.videoFrame]; |
+ [_renderer drawFrame:self.videoFrame]; |
} |
- (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size { |
@@ -119,8 +92,8 @@ |
#pragma mark - RTCVideoRenderer |
- (void)setSize:(CGSize)size { |
- self.metalView.drawableSize = size; |
- [self.metalView draw]; |
+ _metalView.drawableSize = size; |
+ [_metalView draw]; |
} |
- (void)renderFrame:(nullable RTCVideoFrame *)frame { |