diff --git a/Signal/src/ViewControllers/CallViewController.swift b/Signal/src/ViewControllers/CallViewController.swift index 7dc23929d..4aff7ff13 100644 --- a/Signal/src/ViewControllers/CallViewController.swift +++ b/Signal/src/ViewControllers/CallViewController.swift @@ -73,6 +73,7 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver, var localVideoView: RTCCameraPreviewView! var hasShownLocalVideo = false weak var localVideoTrack: RTCVideoTrack? + weak var localCaptureSession: AVCaptureSession? weak var remoteVideoTrack: RTCVideoTrack? override public var canBecomeFirstResponder: Bool { @@ -1001,18 +1002,19 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver, // MARK: - Video - internal func updateLocalVideoTrack(localVideoTrack: RTCVideoTrack?) { + // MJK TODO remove localVideoTrack? + internal func updateLocalVideoTrack(localVideoTrack: RTCVideoTrack?, + captureSession: AVCaptureSession?) { + SwiftAssertIsOnMainThread(#function) guard self.localVideoTrack != localVideoTrack else { return } self.localVideoTrack = localVideoTrack + localVideoView.captureSession = captureSession + let isHidden = captureSession == nil - let source = localVideoTrack?.source as? RTCAVFoundationVideoSource - - localVideoView.captureSession = source?.captureSession - let isHidden = source == nil Logger.info("\(TAG) \(#function) isHidden: \(isHidden)") localVideoView.isHidden = isHidden @@ -1117,12 +1119,14 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver, // Do nothing. } + // TODO remove localCaptureSession: internal func didUpdateVideoTracks(call: SignalCall?, localVideoTrack: RTCVideoTrack?, + localCaptureSession: AVCaptureSession?, remoteVideoTrack: RTCVideoTrack?) { SwiftAssertIsOnMainThread(#function) - updateLocalVideoTrack(localVideoTrack: localVideoTrack) + updateLocalVideoTrack(localVideoTrack: localVideoTrack, captureSession: localCaptureSession) updateRemoteVideoTrack(remoteVideoTrack: remoteVideoTrack) } } diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index 7195b250f..b38ce6ec1 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -93,8 +93,10 @@ protocol CallServiceObserver: class { /** * Fired whenever the local or remote video track become active or inactive. */ + // TODO remove localCaptureSession: func didUpdateVideoTracks(call: SignalCall?, localVideoTrack: RTCVideoTrack?, + localCaptureSession: AVCaptureSession?, remoteVideoTrack: RTCVideoTrack?) } @@ -125,6 +127,14 @@ private class SignalCallData: NSObject { } } + weak var localCaptureSession: AVCaptureSession? { + didSet { + SwiftAssertIsOnMainThread(#function) + + Logger.info("\(self.logTag) \(#function)") + } + } + weak var remoteVideoTrack: RTCVideoTrack? { didSet { SwiftAssertIsOnMainThread(#function) @@ -282,6 +292,15 @@ private class SignalCallData: NSObject { return callData?.localVideoTrack } } + + weak var localCaptureSession: AVCaptureSession? { + get { + SwiftAssertIsOnMainThread(#function) + + return callData?.localCaptureSession + } + } + var remoteVideoTrack: RTCVideoTrack? { get { SwiftAssertIsOnMainThread(#function) @@ -1622,11 +1641,10 @@ private class SignalCallData: NSObject { observers.append(Weak(value: observer)) // Synchronize observer with current call state - let call = self.call - let localVideoTrack = self.localVideoTrack let remoteVideoTrack = self.isRemoteVideoEnabled ? self.remoteVideoTrack : nil - observer.didUpdateVideoTracks(call: call, - localVideoTrack: localVideoTrack, + observer.didUpdateVideoTracks(call: self.call, + localVideoTrack: self.localVideoTrack, + localCaptureSession: self.localCaptureSession, remoteVideoTrack: remoteVideoTrack) } @@ -1649,13 +1667,11 @@ private class SignalCallData: NSObject { private func fireDidUpdateVideoTracks() { SwiftAssertIsOnMainThread(#function) - let call = self.call - let localVideoTrack = self.localVideoTrack let remoteVideoTrack = self.isRemoteVideoEnabled ? self.remoteVideoTrack : nil - for observer in observers { - observer.value?.didUpdateVideoTracks(call: call, - localVideoTrack: localVideoTrack, + observer.value?.didUpdateVideoTracks(call: self.call, + localVideoTrack: self.localVideoTrack, + localCaptureSession: self.localCaptureSession, remoteVideoTrack: remoteVideoTrack) } } diff --git a/Signal/src/call/PeerConnectionClient.swift b/Signal/src/call/PeerConnectionClient.swift index ed39d674a..326122a22 100644 --- a/Signal/src/call/PeerConnectionClient.swift +++ b/Signal/src/call/PeerConnectionClient.swift @@ -235,7 +235,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD private var videoCaptureSession: AVCaptureSession? private var videoSender: RTCRtpSender? private var localVideoTrack: RTCVideoTrack? - private var localVideoSource: RTCAVFoundationVideoSource? + private var localVideoSource: RTCVideoSource? // RTCVideoTrack is fragile and prone to throwing exceptions and/or // causing deadlock in its destructor. Therefore we take great care diff --git a/Signal/src/call/UserInterface/CallUIAdapter.swift b/Signal/src/call/UserInterface/CallUIAdapter.swift index 1437bf34b..bfbf45d09 100644 --- a/Signal/src/call/UserInterface/CallUIAdapter.swift +++ b/Signal/src/call/UserInterface/CallUIAdapter.swift @@ -273,6 +273,7 @@ extension CallUIAdaptee { internal func didUpdateVideoTracks(call: SignalCall?, localVideoTrack: RTCVideoTrack?, + localCaptureSession: AVCaptureSession?, remoteVideoTrack: RTCVideoTrack?) { SwiftAssertIsOnMainThread(#function)