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 2a18736b25071bba0b2636b9b2bc975295e47dc3..856fb4bee0b82f11fc4d13a1653e4c997df08ff5 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") |
kthelgason
2017/03/02 08:23:05
This frightens me a little bit. Can't we just not
|
+ |
@interface RTCMTLVideoView () <MTKViewDelegate> |
@property(nonatomic, strong) id<RTCMTLRenderer> renderer; |
-@property(nonatomic, strong) MTKView *metalView; |
+@property(nonatomic, strong) UIView *metalView; |
magjed_webrtc
2017/03/02 13:28:18
Why can't this still be an MTKView when we mock it
daniela-webrtc
2017/03/03 08:47:01
I thought it will give linking errors when using t
|
@property(atomic, strong) RTCVideoFrame *videoFrame; |
@end |
-@implementation RTCMTLVideoView { |
- id<RTCMTLRenderer> _renderer; |
-} |
+@implementation RTCMTLVideoView |
@synthesize renderer = _renderer; |
@synthesize metalView = _metalView; |
@@ -58,32 +61,61 @@ |
#endif |
} |
++ (UIView *)createMetalView:(CGRect)frame { |
+ UIView *view = [[MTKViewClass alloc] initWithFrame:frame]; |
+ return view; |
+} |
+ |
++ (id<RTCMTLRenderer>)createMetalRenderer { |
+ id<RTCMTLRenderer> renderer = [[RTCMTLNV12RendererClass alloc] init]; |
+ return renderer; |
+} |
+ |
- (void)configure { |
- if ([RTCMTLVideoView isMetalAvailable]) { |
- _metalView = [[MTKView alloc] initWithFrame:self.bounds]; |
- [self addSubview:_metalView]; |
- _metalView.delegate = self; |
- _metalView.contentMode = UIViewContentModeScaleAspectFit; |
- _metalView.translatesAutoresizingMaskIntoConstraints = NO; |
- UILayoutGuide *margins = self.layoutMarginsGuide; |
- [_metalView.topAnchor constraintEqualToAnchor:margins.topAnchor].active = YES; |
- [_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; |
- }; |
+ 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 { |
+ BOOL configurationSuccessful = NO; |
+ if ([_renderer addRenderingDestination:_metalView]) { |
magjed_webrtc
2017/03/02 13:28:18
do:
return [_renderer addRenderingDestination:_met
daniela-webrtc
2017/03/03 08:47:01
Done.
|
+ configurationSuccessful = YES; |
+ }; |
+ return configurationSuccessful; |
+} |
+ |
+- (void)configureMetalView { |
+ if (_metalView) { |
+ MTKView *metalView = (MTKView *)_metalView; |
+ metalView.delegate = self; |
+ [self addSubview:metalView]; |
+ metalView.contentMode = UIViewContentModeScaleAspectFit; |
+ metalView.translatesAutoresizingMaskIntoConstraints = NO; |
+ UILayoutGuide *margins = self.layoutMarginsGuide; |
+ [metalView.topAnchor constraintEqualToAnchor:margins.topAnchor].active = YES; |
+ [metalView.bottomAnchor constraintEqualToAnchor:margins.bottomAnchor].active = YES; |
+ [metalView.leftAnchor constraintEqualToAnchor:margins.leftAnchor].active = YES; |
+ [metalView.rightAnchor constraintEqualToAnchor:margins.rightAnchor].active = YES; |
+ } |
+} |
+ |
#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 +124,9 @@ |
#pragma mark - RTCVideoRenderer |
- (void)setSize:(CGSize)size { |
- _metalView.drawableSize = size; |
- [_metalView draw]; |
+ MTKView *metalView = (MTKView *)self.metalView; |
+ metalView.drawableSize = size; |
+ [metalView draw]; |
} |
- (void)renderFrame:(nullable RTCVideoFrame *)frame { |