// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import WebRTC import Foundation // MARK: RemoteVideoView class RemoteVideoView: RTCMTLVideoView { override func renderFrame(_ frame: RTCVideoFrame?) { super.renderFrame(frame) guard let frame = frame else { return } DispatchMainThreadSafe { let frameRatio = Double(frame.height) / Double(frame.width) let frameRotation = frame.rotation let deviceRotation = UIDevice.current.orientation var rotationOverride: RTCVideoRotation? = nil switch deviceRotation { case .portrait, .portraitUpsideDown: // We don't have to do anything, the renderer will automatically make sure it's right-side-up. break case .landscapeLeft: switch frameRotation { case RTCVideoRotation._0: rotationOverride = RTCVideoRotation._90 // Landscape left case RTCVideoRotation._90: rotationOverride = RTCVideoRotation._180 // Portrait case RTCVideoRotation._180: rotationOverride = RTCVideoRotation._270 // Landscape right case RTCVideoRotation._270: rotationOverride = RTCVideoRotation._0 // Portrait upside-down default: break } case .landscapeRight: switch frameRotation { case RTCVideoRotation._0: rotationOverride = RTCVideoRotation._270 // Landscape left case RTCVideoRotation._90: rotationOverride = RTCVideoRotation._0 // Portrait case RTCVideoRotation._180: rotationOverride = RTCVideoRotation._90 // Landscape right case RTCVideoRotation._270: rotationOverride = RTCVideoRotation._180 // Portrait upside-down default: break } default: // Do nothing if we're face down, up, etc. // Assume we're already setup for the correct orientation. break } if let rotationOverride = rotationOverride { self.rotationOverride = NSNumber(value: rotationOverride.rawValue) if [ RTCVideoRotation._0, RTCVideoRotation._180 ].contains(rotationOverride) { self.videoContentMode = .scaleAspectFill } else { self.videoContentMode = .scaleAspectFit } } else { self.rotationOverride = nil if [ RTCVideoRotation._0, RTCVideoRotation._180 ].contains(frameRotation) { self.videoContentMode = .scaleAspectFill } else { self.videoContentMode = .scaleAspectFit } } // if not a mobile ratio, always use .scaleAspectFit if frameRatio < 1.5 { self.videoContentMode = .scaleAspectFit } } } } // MARK: LocalVideoView class LocalVideoView: RTCMTLVideoView { static let width: CGFloat = 80 static let height: CGFloat = 173 override func renderFrame(_ frame: RTCVideoFrame?) { super.renderFrame(frame) DispatchMainThreadSafe { // This is a workaround for a weird issue that // sometimes the rotationOverride is not working // if it is only set once on initialization self.rotationOverride = NSNumber(value: RTCVideoRotation._0.rawValue) self.videoContentMode = .scaleAspectFill } } }