Avoid crashes when deallocating remote video tracks.

// FREEBIE
This commit is contained in:
Matthew Chen 2017-02-03 20:43:35 -05:00
parent 4ae786d0a2
commit 6f3a45ff8c
2 changed files with 12 additions and 13 deletions

View file

@ -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

View file

@ -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)
}
}
}