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