mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.4 KiB
Swift
59 lines
2.4 KiB
Swift
import UIKit
|
|
import AVFoundation
|
|
import WebRTC
|
|
|
|
final class VideoCallVC : UIViewController {
|
|
private var localVideoView: UIView!
|
|
private var remoteVideoView: UIView!
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
setUpViewHierarchy()
|
|
CameraManager.shared.delegate = self
|
|
}
|
|
|
|
private func setUpViewHierarchy() {
|
|
// Create video views
|
|
#if arch(arm64)
|
|
// Use Metal
|
|
let localRenderer = RTCMTLVideoView(frame: self.localVideoView.frame)
|
|
localRenderer.contentMode = .scaleAspectFill
|
|
let remoteRenderer = RTCMTLVideoView(frame: self.remoteVideoView.frame)
|
|
remoteRenderer.contentMode = .scaleAspectFill
|
|
#else
|
|
// Use OpenGLES
|
|
let localRenderer = RTCEAGLVideoView(frame: self.localVideoView.frame)
|
|
let remoteRenderer = RTCEAGLVideoView(frame: self.remoteVideoView.frame)
|
|
#endif
|
|
// Set up stack view
|
|
let stackView = UIStackView(arrangedSubviews: [ localVideoView, remoteVideoView ])
|
|
stackView.axis = .vertical
|
|
stackView.distribution = .fillEqually
|
|
stackView.alignment = .fill
|
|
view.addSubview(stackView)
|
|
stackView.translatesAutoresizingMaskIntoConstraints = false
|
|
stackView.pin(to: view)
|
|
// Attach video views
|
|
CallManager.shared.attachLocalRenderer(localRenderer)
|
|
CallManager.shared.attachRemoteRenderer(remoteRenderer)
|
|
localVideoView.addSubview(localRenderer)
|
|
localRenderer.translatesAutoresizingMaskIntoConstraints = false
|
|
localRenderer.pin(to: localVideoView)
|
|
remoteVideoView.addSubview(remoteRenderer)
|
|
remoteRenderer.translatesAutoresizingMaskIntoConstraints = false
|
|
remoteRenderer.pin(to: remoteVideoView)
|
|
}
|
|
}
|
|
|
|
// MARK: Camera
|
|
extension VideoCallVC : CameraCaptureDelegate {
|
|
|
|
func captureVideoOutput(sampleBuffer: CMSampleBuffer) {
|
|
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
|
|
let rtcpixelBuffer = RTCCVPixelBuffer(pixelBuffer: pixelBuffer)
|
|
let timeStampNs = Int64(CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) * 1000000000)
|
|
let videoFrame = RTCVideoFrame(buffer: rtcpixelBuffer, rotation: RTCVideoRotation._0, timeStampNs: timeStampNs)
|
|
CallManager.shared.handleLocalFrameCaptured(videoFrame)
|
|
}
|
|
}
|