Migrate WebRTC from plan b to unified plan

The in 'MagicPeerConnectionWrapper#removePeerConnection' used method
'PeerConnection#removeStream' was not longer available in the unified
plan. So to make sure that the local stream is disposed, it will now be
done in 'CallActivity#hangup'.

Resolves: #1773
See: [1]

[1] https://webrtc.org/getting-started/unified-plan-transition-guide
Signed-off-by: Tim Krüger <t@timkrueger.me>
This commit is contained in:
Tim Krüger 2022-02-21 15:59:02 +01:00
parent bad5b5f9bc
commit 86f20dcfd3
No known key found for this signature in database
GPG key ID: FECE3A7222C52A4E
2 changed files with 29 additions and 12 deletions

View file

@ -1608,7 +1608,13 @@ public class CallActivity extends CallBaseActivity {
peerConnectionFactory = null; peerConnectionFactory = null;
} }
localMediaStream = null; if(localMediaStream != null) {
localMediaStream.dispose();
localMediaStream = null;
Log.d(TAG, "Disposed localMediaStream");
} else {
Log.d(TAG, "localMediaStream is null");
}
localAudioTrack = null; localAudioTrack = null;
localVideoTrack = null; localVideoTrack = null;

View file

@ -2,6 +2,8 @@
* Nextcloud Talk application * Nextcloud Talk application
* *
* @author Mario Danic * @author Mario Danic
* @author Tim Krüger
* Copyright (C) 2022 Tim Krüger <t@timkrueger.me>
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com> * Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -37,6 +39,7 @@ import com.nextcloud.talk.models.json.signaling.DataChannelMessageNick;
import com.nextcloud.talk.models.json.signaling.NCIceCandidate; import com.nextcloud.talk.models.json.signaling.NCIceCandidate;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.webrtc.AudioTrack;
import org.webrtc.DataChannel; import org.webrtc.DataChannel;
import org.webrtc.IceCandidate; import org.webrtc.IceCandidate;
import org.webrtc.MediaConstraints; import org.webrtc.MediaConstraints;
@ -46,10 +49,12 @@ import org.webrtc.PeerConnectionFactory;
import org.webrtc.RtpReceiver; import org.webrtc.RtpReceiver;
import org.webrtc.SdpObserver; import org.webrtc.SdpObserver;
import org.webrtc.SessionDescription; import org.webrtc.SessionDescription;
import org.webrtc.VideoTrack;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -60,7 +65,7 @@ import autodagger.AutoInjector;
@AutoInjector(NextcloudTalkApplication.class) @AutoInjector(NextcloudTalkApplication.class)
public class MagicPeerConnectionWrapper { public class MagicPeerConnectionWrapper {
private static final String TAG = "MagicPeerConWrapper"; private static final String TAG = MagicPeerConnectionWrapper.class.getCanonicalName();
private List<IceCandidate> iceCandidates = new ArrayList<>(); private List<IceCandidate> iceCandidates = new ArrayList<>();
private PeerConnection peerConnection; private PeerConnection peerConnection;
@ -107,14 +112,18 @@ public class MagicPeerConnectionWrapper {
this.isMCUPublisher = isMCUPublisher; this.isMCUPublisher = isMCUPublisher;
PeerConnection.RTCConfiguration configuration = new PeerConnection.RTCConfiguration(iceServerList); PeerConnection.RTCConfiguration configuration = new PeerConnection.RTCConfiguration(iceServerList);
configuration.sdpSemantics = PeerConnection.SdpSemantics.PLAN_B; configuration.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN;
peerConnection = peerConnectionFactory.createPeerConnection(configuration, new MagicPeerConnectionObserver());
peerConnection = peerConnectionFactory.createPeerConnection(configuration, sdpConstraints,
new MagicPeerConnectionObserver());
if (peerConnection != null) { if (peerConnection != null) {
if (localMediaStream != null) { if (localStream != null) {
peerConnection.addStream(localMediaStream); List<String> localMediaStreamIds = Collections.singletonList(localMediaStream.getId());
for(AudioTrack track : localMediaStream.audioTracks) {
peerConnection.addTrack(track, localMediaStreamIds);
}
for(VideoTrack track : localStream.videoTracks) {
peerConnection.addTrack(track, localMediaStreamIds);
}
} }
if (hasMCU || hasInitiated) { if (hasMCU || hasInitiated) {
@ -145,15 +154,17 @@ public class MagicPeerConnectionWrapper {
if (magicDataChannel != null) { if (magicDataChannel != null) {
magicDataChannel.dispose(); magicDataChannel.dispose();
magicDataChannel = null; magicDataChannel = null;
Log.d(TAG, "Disposed DataChannel");
} else {
Log.d(TAG, "DataChannel is null.");
} }
if (peerConnection != null) { if (peerConnection != null) {
if (localMediaStream != null) {
peerConnection.removeStream(localMediaStream);
}
peerConnection.close(); peerConnection.close();
peerConnection = null; peerConnection = null;
Log.d(TAG, "Disposed PeerConnection");
} else {
Log.d(TAG, "PeerConnection is null.");
} }
} }