From 6f3a45ff8c83005bfdec5e3f20b443e600c9c878 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 3 Feb 2017 20:43:35 -0500 Subject: [PATCH] Avoid crashes when deallocating remote video tracks. // FREEBIE --- Signal/src/call/CallService.swift | 2 -- Signal/src/call/PeerConnectionClient.swift | 23 +++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index 2694607d3..bedf912b6 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -1011,7 +1011,6 @@ protocol CallServiceObserver: class { } self.localVideoTrack = videoTrack - self.fireDidUpdateVideoTracks() } internal func peerConnectionClient(_ peerConnectionClient: PeerConnectionClient, didUpdateRemote videoTrack: RTCVideoTrack?) { @@ -1023,7 +1022,6 @@ protocol CallServiceObserver: class { } self.remoteVideoTrack = videoTrack - self.fireDidUpdateVideoTracks() } // MARK: Helpers diff --git a/Signal/src/call/PeerConnectionClient.swift b/Signal/src/call/PeerConnectionClient.swift index 8dc63b664..a89d4d795 100644 --- a/Signal/src/call/PeerConnectionClient.swift +++ b/Signal/src/call/PeerConnectionClient.swift @@ -115,7 +115,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD private var videoSender: RTCRtpSender? private var localVideoTrack: RTCVideoTrack? - private var remoteVideoTrack: RTCVideoTrack? + private weak var remoteVideoTrack: RTCVideoTrack? private var cameraConstraints: RTCMediaConstraints init(iceServers: [RTCIceServer], delegate: PeerConnectionClientDelegate, callType: CallType) { @@ -545,22 +545,23 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD /** Called when media is received on a new stream from remote peer. */ internal func peerConnection(_ peerConnection: RTCPeerConnection, didAdd stream: RTCMediaStream) { + guard stream.videoTracks.count > 0 else { + return + } + weak var remoteVideoTrack = stream.videoTracks[0] + Logger.debug("\(self.TAG) didAdd stream:\(stream) video tracks: \(stream.videoTracks.count) audio tracks: \(stream.audioTracks.count)") + PeerConnectionClient.signalingQueue.async { guard self.peerConnection != nil else { Logger.debug("\(self.TAG) \(#function) Ignoring obsolete event in terminated client") return } - Logger.debug("\(self.TAG) didAdd stream:\(stream) video tracks: \(stream.videoTracks.count) audio tracks: \(stream.audioTracks.count)") - if stream.videoTracks.count > 0 { - self.remoteVideoTrack = stream.videoTracks[0] - if let delegate = self.delegate { - let remoteVideoTrack = self.remoteVideoTrack - DispatchQueue.main.async { [weak self, weak remoteVideoTrack] in - guard let strongSelf = self else { return } - guard let strongRemoteVideoTrack = remoteVideoTrack else { return } - delegate.peerConnectionClient(strongSelf, didUpdateRemote: strongRemoteVideoTrack) - } + self.remoteVideoTrack = remoteVideoTrack + if let delegate = self.delegate { + DispatchQueue.main.async { [weak self] in + guard let strongSelf = self else { return } + delegate.peerConnectionClient(strongSelf, didUpdateRemote: remoteVideoTrack) } } }