From 2a4e113c82bac4764af251aba153b5400d7d931c Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 4 Oct 2017 11:44:33 -0400 Subject: [PATCH] Cleanup // FREEBIE --- .../ViewControllers/CallViewController.swift | 80 -------- Signal/src/views/RemoteVideoView.h | 2 - Signal/src/views/RemoteVideoView.m | 179 ++---------------- 3 files changed, 20 insertions(+), 241 deletions(-) diff --git a/Signal/src/ViewControllers/CallViewController.swift b/Signal/src/ViewControllers/CallViewController.swift index f3103cb0c..354315fb9 100644 --- a/Signal/src/ViewControllers/CallViewController.swift +++ b/Signal/src/ViewControllers/CallViewController.swift @@ -65,11 +65,6 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver { var localVideoView: RTCCameraPreviewView! weak var localVideoTrack: RTCVideoTrack? weak var remoteVideoTrack: RTCVideoTrack? - - // TODO delete? - var remoteVideoSize: CGSize! = CGSize.zero - // TODO delete? - var remoteVideoConstraints: [NSLayoutConstraint] = [] var localVideoConstraints: [NSLayoutConstraint] = [] var shouldRemoteVideoControlsBeHidden = false { @@ -237,30 +232,9 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver { func createVideoViews() { localVideoView = RTCCameraPreviewView() - -// if isMetalAvailable { -// if #available(iOS 9, *) { -// remoteVideoView = RTCMTLVideoView(frame: CGRect(x: 50, y: 50, width: 200, height: 300)) -//// remoteVideoView.setSize(self.view.frame.size) -// } else { -// owsFail("metal should only be available on ios9+") -// } -// } else { -// let eaglVideoView = RTCEAGLVideoView() -// eaglVideoView.delegate = self -// remoteVideoView = eaglVideoView -// } -// -// guard let remoteVideoView = self.remoteVideoView else { -// owsFail("Failed to make remoteVideoView") -// return -// } - remoteVideoView = RemoteVideoView() - remoteVideoView.backgroundColor = UIColor.yellow remoteVideoView.isUserInteractionEnabled = false - remoteVideoView.layoutMargins = UIEdgeInsets.zero remoteVideoView.isHidden = true localVideoView.isHidden = true @@ -618,7 +592,6 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver { internal func updateRemoteVideoLayout() { remoteVideoView.isHidden = !self.hasRemoteVideoTrack self.remoteVideoView.setSize(self.view.frame.size) - self.remoteVideoView.updateRemoteVideoLayout() updateCallUI(callState: call.state) } @@ -990,10 +963,6 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver { self.remoteVideoTrack?.add(remoteVideoView) shouldRemoteVideoControlsBeHidden = false - if remoteVideoTrack == nil { - remoteVideoSize = CGSize.zero - } - updateRemoteVideoLayout() } @@ -1056,53 +1025,4 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver { updateLocalVideoTrack(localVideoTrack: localVideoTrack) updateRemoteVideoTrack(remoteVideoTrack: remoteVideoTrack) } -// -// // MARK: - RTCEAGLVideoViewDelegate -// -// internal func videoView(_ videoView: RTCEAGLVideoView, didChangeVideoSize size: CGSize) { -// AssertIsOnMainThread() -// assert(!isMetalAvailable) -// -// if videoView != remoteVideoView { -// return -// } -// -// Logger.info("\(TAG) \(#function): \(size)") -// -// remoteVideoSize = size -// updateRemoteVideoLayout() -// } } - -//protocol RemoteVideoViewAdaptee: RTCVideoRenderer { -// -//} -// -//class RemoteVideoViewAdapter: UIView, RTCVideoRenderer { -// let adaptee: RemoteVideoViewAdaptee -// -// var isMetalAvailable: Bool { -// // MetalKit is available on 64bit devices running iOS9+ -// if #available(iOS 9, *) { -// return objc_getClass("RTCMTLVideoView") != nil && RTCMTLVideoView.isMetalAvailable() -// } else { -// return false -// } -// } -// -// init() { -// #if defined(RTC_SUPPORTS_METAL) -// if #available(iOS 9, *) { -// adaptee = RTCMTLVideoView(frame: CGRect.zero) -// } -// #endif -// -// if adaptee == nil { -// let eaglVideoView = RTCEAGLVideoView() -// eaglVideoView.delegate = self -// adaptee = eaglVideoView -// } -// -// super.init() -// } -//} diff --git a/Signal/src/views/RemoteVideoView.h b/Signal/src/views/RemoteVideoView.h index 93da1cb2a..6e84de450 100644 --- a/Signal/src/views/RemoteVideoView.h +++ b/Signal/src/views/RemoteVideoView.h @@ -10,6 +10,4 @@ */ @interface RemoteVideoView : UIView -- (void)updateRemoteVideoLayout; - @end diff --git a/Signal/src/views/RemoteVideoView.m b/Signal/src/views/RemoteVideoView.m index ddba95794..0133ab96b 100644 --- a/Signal/src/views/RemoteVideoView.m +++ b/Signal/src/views/RemoteVideoView.m @@ -3,10 +3,11 @@ // #import "RemoteVideoView.h" +#import +#import #import #import #import -#import @interface RTCMTLVideoView (MakePrivatePublic) + (BOOL)isMetalAvailable; @@ -14,37 +15,11 @@ @interface RemoteVideoView () -@property (nonatomic, readonly) __kindof UIView *adaptee; - -// Used for legacy EAGLVideoView -@property (nonatomic) CGSize remoteVideoSize; -@property (nullable, nonatomic) NSMutableArray *remoteVideoConstraints; +@property (nonatomic, readonly) __kindof UIView *videoRenderer; @end @implementation RemoteVideoView -//@implementation RemoteVideoViewAdapter - -//protocol RemoteVideoViewAdaptee: RTCVideoRenderer { -// -//} -// -// -//#if defined(RTC_SUPPORTS_METAL) -// if #available(iOS 9, *) { -// -// } -//#endif -// -// if adaptee == nil { -// let eaglVideoView = RTCEAGLVideoView() -// eaglVideoView.delegate = self -// adaptee = eaglVideoView -// } -// -// super.init() -// } -//} - (instancetype)init { @@ -54,148 +29,34 @@ } // This class is defined in objc in order to access this compile time macro +// Currently RTC only supports metal on 64bit machines #if defined(RTC_SUPPORTS_METAL) - if ([RTCMTLVideoView isMetalAvailable]) { - _adaptee = [[RTCMTLVideoView alloc] initWithFrame:CGRectZero]; + // RTCMTLVideoView requires the MTKView class, available in the iOS9+ MetalKit framework + if ([MTKView class]) { + _videoRenderer = [[RTCMTLVideoView alloc] initWithFrame:CGRectZero]; } #endif - if (_adaptee == nil) { - RTCEAGLVideoView *eaglVideoView = [RTCEAGLVideoView new]; + if (_videoRenderer == nil) { + RTCEAGLVideoView *eaglVideoView = [[RTCEAGLVideoView alloc] initWithFrame:CGRectZero]; eaglVideoView.delegate = self; - _adaptee = eaglVideoView; + _videoRenderer = eaglVideoView; } - - [self addSubview:_adaptee]; - _adaptee.layoutMargins = UIEdgeInsetsZero; - [_adaptee autoPinEdgesToSuperviewEdges]; + [self addSubview:_videoRenderer]; - return self; -} - -- (void)updateRemoteVideoLayout -{ -// if isMetalAvailable { -// if #available(iOS 9, *) { -// assert(remoteVideoView as? RTCMTLVideoView != nil) -// } else { -// owsFail("metal should only be available on iOS9+") -// } -// Logger.debug("no additional layout needed for RTCMTLVideoView") -// } else if let videoView = remoteVideoView as? RTCEAGLVideoView { -// NSLayoutConstraint.deactivate(self.remoteVideoConstraints) -// -// var constraints: [NSLayoutConstraint] = [] -// // We fill the screen with the remote video. The remote video's -// // aspect ratio may not (and in fact will very rarely) match the -// // aspect ratio of the current device, so parts of the remote -// // video will be hidden offscreen. -// // -// // It's better to trim the remote video than to adopt a letterboxed -// // layout. -// if remoteVideoSize.width > 0 && remoteVideoSize.height > 0 && -// self.view.bounds.size.width > 0 && self.view.bounds.size.height > 0 { -// -// var remoteVideoWidth = self.view.bounds.size.width -// var remoteVideoHeight = self.view.bounds.size.height -// if remoteVideoSize.width / self.view.bounds.size.width > remoteVideoSize.height / self.view.bounds.size.height { -// remoteVideoWidth = round(self.view.bounds.size.height * remoteVideoSize.width / remoteVideoSize.height) -// } else { -// remoteVideoHeight = round(self.view.bounds.size.width * remoteVideoSize.height / remoteVideoSize.width) -// } -// constraints.append(videoView.autoSetDimension(.width, toSize:remoteVideoWidth)) -// constraints.append(videoView.autoSetDimension(.height, toSize:remoteVideoHeight)) -// constraints += videoView.autoCenterInSuperview() -// -// videoView.frame = CGRect(origin:CGPoint.zero, -// size:CGSize(width:remoteVideoWidth, -// height:remoteVideoHeight)) -// -// } else { -// constraints += videoView.autoPinEdgesToSuperviewEdges() -// } -// self.remoteVideoConstraints = constraints -// // We need to force relayout to occur immediately (and not -// // wait for a UIKit layout/render pass) or the remoteVideoView -// // (which presumably is updating its CALayer directly) will -// // ocassionally appear to have bad frames. -// videoView.setNeedsLayout() -// videoView.superview?.setNeedsLayout() -// videoView.layoutIfNeeded() -// videoView.superview?.layoutIfNeeded() -// } else { -// owsFail("in \(#function) with unhandled remoteVideoView type: \(remoteVideoView)") -// } - - UIView *containingView = [self superview]; - if (containingView == nil) { - DDLogDebug(@"%@ Cannot layout video view without superview", self.logTag); - return; - } + _videoRenderer.layoutMargins = UIEdgeInsetsZero; + [_videoRenderer autoPinEdgesToSuperviewEdges]; - // We fill the screen with the remote video. The remote video's - // aspect ratio may not (and in fact will very rarely) match the - // aspect ratio of the current device, so parts of the remote - // video will be hidden offscreen. - // - // It's better to trim the remote video than to adopt a letterboxed - // layout. - // This is only required on the legacy EAGL view. The modern MetalKit - // backed view can scale using the AspectFill content mode - if ([self.adaptee isKindOfClass:[RTCEAGLVideoView class]]) { - RTCEAGLVideoView *videoView = (RTCEAGLVideoView *)self.adaptee; - [NSLayoutConstraint deactivateConstraints:self.remoteVideoConstraints]; - - CGSize remoteVideoSize = self.remoteVideoSize; - - NSMutableArray *constraints = [NSMutableArray new]; - if (remoteVideoSize.width > 0 && remoteVideoSize.height > 0 && - containingView.bounds.size.width > 0 && containingView.bounds.size.height > 0) { - - CGFloat remoteVideoWidth = containingView.bounds.size.width; - CGFloat remoteVideoHeight = containingView.bounds.size.height; - - if (remoteVideoSize.width / containingView.bounds.size.width > remoteVideoSize.height / containingView.bounds.size.height) { - remoteVideoWidth = round(containingView.bounds.size.height * remoteVideoSize.width / remoteVideoSize.height); - } else { - remoteVideoHeight = round(containingView.bounds.size.width * remoteVideoSize.height / remoteVideoSize.width); - } - [constraints addObject:[videoView autoSetDimension:ALDimensionWidth toSize:remoteVideoWidth]]; - [constraints addObject:[videoView autoSetDimension:ALDimensionHeight toSize:remoteVideoHeight]]; - [constraints addObjectsFromArray:[videoView autoCenterInSuperview]]; - - videoView.frame = CGRectMake(0, 0, remoteVideoWidth, remoteVideoHeight); - - } else { - [constraints addObjectsFromArray:[videoView autoPinEdgesToSuperviewEdges]]; - } - - self.remoteVideoConstraints = constraints; - // We need to force relayout to occur immediately (and not - // wait for a UIKit layout/render pass) or the remoteVideoView - // (which presumably is updating its CALayer directly) will - // ocassionally appear to have bad frames. - [videoView setNeedsLayout]; - [[videoView superview] setNeedsLayout]; - [videoView layoutIfNeeded]; - [[videoView superview] layoutIfNeeded]; - } + return self; } -// MARK: - RTCEAGLVideoViewDelegate +#pragma mark - RTCEAGLVideoViewDelegate - (void)videoView:(RTCEAGLVideoView *)videoView didChangeVideoSize:(CGSize)size { - AssertIsOnMainThread(); - - // TODO -// if videoView != remoteVideoView { -// return -// } - DDLogInfo(@"%s called", __PRETTY_FUNCTION__); - - self.remoteVideoSize = size; - [self updateRemoteVideoLayout]; + // Do nothing. In older versions of WebRTC we used this to fit the video to fullscreen, + // but now we use the RTCVideoRenderer.setSize. + // However setting a delegate is *required* when using EAGL view. } #pragma mark - RTCVideoRenderer @@ -203,13 +64,13 @@ /** The size of the frame. */ - (void)setSize:(CGSize)size { - [self.adaptee setSize:size]; + [self.videoRenderer setSize:size]; } /** The frame to be displayed. */ - (void)renderFrame:(nullable RTCVideoFrame *)frame { - [self.adaptee renderFrame:frame]; + [self.videoRenderer renderFrame:frame]; } #pragma mark - Logging