rename initiateIceRestart to renegotiate to handle content adds

This commit is contained in:
Daniel Gultsch 2022-11-21 09:10:01 +01:00
parent 304205b2e3
commit 9897fa3a45

View file

@ -7,12 +7,14 @@ import androidx.annotation.Nullable;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.base.Predicates;
import com.google.common.base.Stopwatch; import com.google.common.base.Stopwatch;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.common.collect.Collections2; import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
@ -499,6 +501,10 @@ public class JingleRtpConnection extends AbstractJingleConnection
return isInitiator() ? this.responderRtpContentMap : this.initiatorRtpContentMap; return isInitiator() ? this.responderRtpContentMap : this.initiatorRtpContentMap;
} }
private RtpContentMap getLocalContentMap() {
return isInitiator() ? this.initiatorRtpContentMap : this.responderRtpContentMap;
}
private List<String> toIdentificationTags(final RtpContentMap rtpContentMap) { private List<String> toIdentificationTags(final RtpContentMap rtpContentMap) {
final Group originalGroup = rtpContentMap.group; final Group originalGroup = rtpContentMap.group;
final List<String> identificationTags = final List<String> identificationTags =
@ -1906,11 +1912,11 @@ public class JingleRtpConnection extends AbstractJingleConnection
@Override @Override
public void onRenegotiationNeeded() { public void onRenegotiationNeeded() {
this.webRTCWrapper.execute(this::initiateIceRestart); this.webRTCWrapper.execute(this::renegotiate);
} }
private void initiateIceRestart() { private void renegotiate() {
// TODO discover new TURN/STUN credentials //TODO needs to be called only for ice restarts; maybe in the call to restartICe()
this.stateHistory.clear(); this.stateHistory.clear();
this.webRTCWrapper.setIsReadyToReceiveIceCandidates(false); this.webRTCWrapper.setIsReadyToReceiveIceCandidates(false);
final SessionDescription sessionDescription; final SessionDescription sessionDescription;
@ -1919,10 +1925,41 @@ public class JingleRtpConnection extends AbstractJingleConnection
} catch (final Exception e) { } catch (final Exception e) {
final Throwable cause = Throwables.getRootCause(e); final Throwable cause = Throwables.getRootCause(e);
Log.d(Config.LOGTAG, "failed to renegotiate", cause); Log.d(Config.LOGTAG, "failed to renegotiate", cause);
webRTCWrapper.close();
sendSessionTerminate(Reason.FAILED_APPLICATION, cause.getMessage()); sendSessionTerminate(Reason.FAILED_APPLICATION, cause.getMessage());
return; return;
} }
final RtpContentMap rtpContentMap = RtpContentMap.of(sessionDescription, isInitiator()); final RtpContentMap rtpContentMap = RtpContentMap.of(sessionDescription, isInitiator());
final RtpContentMap currentContentMap = getLocalContentMap();
final boolean iceRestart = currentContentMap.iceRestart(rtpContentMap);
final RtpContentMap.Diff diff = currentContentMap.diff(rtpContentMap);
Log.d(
Config.LOGTAG,
id.getAccount().getJid().asBareJid()
+ ": renegotiate. iceRestart="
+ iceRestart
+ " content id diff="
+ diff);
if (diff.hasModifications() && iceRestart) {
webRTCWrapper.close();
sendSessionTerminate(Reason.FAILED_APPLICATION, "WebRTC unexpectedly tried to modify content and transport at once");
return;
}
if (iceRestart) {
initiateIceRestart(rtpContentMap);
return;
}
if (diff.added.size() > 0) {
sendContentAdd(rtpContentMap);
}
}
private void initiateIceRestart(final RtpContentMap rtpContentMap) {
final RtpContentMap transportInfo = rtpContentMap.transportInfo(); final RtpContentMap transportInfo = rtpContentMap.transportInfo();
final JinglePacket jinglePacket = final JinglePacket jinglePacket =
transportInfo.toJinglePacket(JinglePacket.Action.TRANSPORT_INFO, id.sessionId); transportInfo.toJinglePacket(JinglePacket.Action.TRANSPORT_INFO, id.sessionId);
@ -1952,6 +1989,10 @@ public class JingleRtpConnection extends AbstractJingleConnection
}); });
} }
private void sendContentAdd(final RtpContentMap rtpContentMap) {
}
private void setLocalContentMap(final RtpContentMap rtpContentMap) { private void setLocalContentMap(final RtpContentMap rtpContentMap) {
if (isInitiator()) { if (isInitiator()) {
this.initiatorRtpContentMap = rtpContentMap; this.initiatorRtpContentMap = rtpContentMap;