From a2fb30c8cb29eec755fe931db7bf5aecf0d8dbbf Mon Sep 17 00:00:00 2001 From: kthelgason Date: Thu, 9 Mar 2017 03:34:27 -0800 Subject: [PATCH] Reland of Add Metal video view in AppRTCMobile and metal availability macro. (patchset #1 id:1 of https://codereview.webrtc.org/2739793003/ ) Reason for revert: Fixing rendering issues in AppRTCMobile Original issue's description: > Revert of Add Metal video view in AppRTCMobile and metal availability macro. (patchset #5 id:80001 of https://codereview.webrtc.org/2722583002/ ) > > Reason for revert: > Breaks AppRTCMobile > > Original issue's description: > > Add Metal video view in AppRTCMobile and Metal availability macro. > > > > - The RTC_SUPPORTS_METAL macro allows consumers to gracefully handle compilation for different archs that are not supporting Metal. > > > > BUG=webrtc:7079 > > > > Review-Url: https://codereview.webrtc.org/2722583002 > > Cr-Commit-Position: refs/heads/master@{#17004} > > Committed: https://chromium.googlesource.com/external/webrtc/+/154a7bb877abefada22afe28b0a755cf621e8d9e > > TBR=magjed@webrtc.org,tkchin@webrtc.org,denicija@webrtc.org > # Not skipping CQ checks because original CL landed more than 1 days ago. > BUG=webrtc:7079 > > Review-Url: https://codereview.webrtc.org/2739793003 > Cr-Commit-Position: refs/heads/master@{#17119} > Committed: https://chromium.googlesource.com/external/webrtc/+/cbbd8c76e8a8a1cf3f1193ea50980bc9d858458d TBR=magjed@webrtc.org,tkchin@webrtc.org,denicija@webrtc.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=webrtc:7079 Review-Url: https://codereview.webrtc.org/2742603003 Cr-Commit-Position: refs/heads/master@{#17139} --- .../objc/AppRTCMobile/ios/ARDVideoCallView.h | 6 +++--- .../objc/AppRTCMobile/ios/ARDVideoCallView.m | 15 +++++++++++++-- .../Framework/Classes/Metal/RTCMTLNV12Renderer.mm | 14 ++++++++------ .../Framework/Classes/Metal/RTCMTLVideoView.m | 4 ++-- .../Framework/Headers/WebRTC/RTCMTLVideoView.h | 9 ++++++++- 5 files changed, 34 insertions(+), 14 deletions(-) diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.h b/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.h index dec1bfcba0..d76805f104 100644 --- a/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.h +++ b/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.h @@ -10,8 +10,8 @@ #import -#import "WebRTC/RTCCameraPreviewView.h" -#import "WebRTC/RTCEAGLVideoView.h" +#import +#import #import "ARDStatsView.h" @@ -38,7 +38,7 @@ @property(nonatomic, readonly) UILabel *statusLabel; @property(nonatomic, readonly) RTCCameraPreviewView *localVideoView; -@property(nonatomic, readonly) RTCEAGLVideoView *remoteVideoView; +@property(nonatomic, readonly) __kindof UIView *remoteVideoView; @property(nonatomic, readonly) ARDStatsView *statsView; @property(nonatomic, weak) id delegate; diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m b/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m index 6e5fc597e9..869d29cb6c 100644 --- a/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m +++ b/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m @@ -11,6 +11,10 @@ #import "ARDVideoCallView.h" #import + +#import +#import + #import "UIImage+ARDUtilities.h" static CGFloat const kButtonPadding = 16; @@ -38,8 +42,15 @@ static CGFloat const kStatusBarHeight = 20; - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { - _remoteVideoView = [[RTCEAGLVideoView alloc] initWithFrame:CGRectZero]; - _remoteVideoView.delegate = self; + +#if defined(RTC_SUPPORTS_METAL) + _remoteVideoView = [[RTCMTLVideoView alloc] initWithFrame:CGRectZero]; +#else + RTCEAGLVideoView *remoteView = [[RTCEAGLVideoView alloc] initWithFrame:CGRectZero]; + remoteView.delegate = self; + _remoteVideoView = remoteView; +#endif + [self addSubview:_remoteVideoView]; _localVideoView = [[RTCCameraPreviewView alloc] initWithFrame:CGRectZero]; diff --git a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm index 13bd3fb322..45e5905ec8 100644 --- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm +++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm @@ -239,10 +239,10 @@ static const NSInteger kMaxInflightBuffers = 1; dispatch_semaphore_signal(block_semaphore); }]; - MTLRenderPassDescriptor *_renderPassDescriptor = _view.currentRenderPassDescriptor; - if (_renderPassDescriptor) { // Valid drawable. + MTLRenderPassDescriptor *renderPassDescriptor = _view.currentRenderPassDescriptor; + if (renderPassDescriptor) { // Valid drawable. id renderEncoder = - [commandBuffer renderCommandEncoderWithDescriptor:_renderPassDescriptor]; + [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; renderEncoder.label = renderEncoderLabel; // Set context state. @@ -269,13 +269,13 @@ static const NSInteger kMaxInflightBuffers = 1; #pragma mark - RTCMTLRenderer - (void)drawFrame:(RTCVideoFrame *)frame { - [self setupTexturesForFrame:frame]; @autoreleasepool { - [self render]; + if ([self setupTexturesForFrame:frame]) + [self render]; } } -- (void)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame { +- (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame { CVPixelBufferRef pixelBuffer = frame.nativeHandle; id lumaTexture = nil; @@ -313,7 +313,9 @@ static const NSInteger kMaxInflightBuffers = 1; _yTexture = lumaTexture; _CrCbTexture = chromaTexture; _offset = offsetForRotation((webrtc::VideoRotation)frame.rotation); + return YES; } + return NO; } @end diff --git a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m index 2a18736b25..63ef23ad49 100644 --- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m +++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m @@ -51,9 +51,9 @@ #pragma mark - Private + (BOOL)isMetalAvailable { -#if defined(__OBJC__) && COREVIDEO_SUPPORTS_METAL +#if defined(RTC_SUPPORTS_METAL) return YES; -#elif +#else return NO; #endif } diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h index 681c457516..49e5963fd8 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h @@ -12,8 +12,13 @@ #import "WebRTC/RTCVideoRenderer.h" +// Check if metal is supported in WebRTC. +// NOTE: Currently arm64 == Metal. +#if defined(__aarch64__) +#define RTC_SUPPORTS_METAL +#endif + NS_ASSUME_NONNULL_BEGIN -RTC_EXPORT /** * RTCMTLVideoView is thin wrapper around MTKView. @@ -22,6 +27,8 @@ RTC_EXPORT * bounds using Metal. */ NS_CLASS_AVAILABLE_IOS(9) + +RTC_EXPORT @interface RTCMTLVideoView : UIView @end