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