add timeout to ICE gathering

This commit is contained in:
Daniel Gultsch 2023-11-14 08:57:22 +01:00
parent 5728cf13ea
commit c72a86a0a4
No known key found for this signature in database
GPG key ID: F43D18AD2A0982C2
2 changed files with 37 additions and 20 deletions

View file

@ -1528,11 +1528,10 @@ public class JingleRtpConnection extends AbstractJingleConnection
+ candidates.size()
+ " candidates in session accept");
sendSessionAccept(outgoingContentMap.withCandidates(candidates));
webRTCWrapper.resetPendingCandidates();
} else {
sendSessionAccept(outgoingContentMap);
webRTCWrapper.setIsReadyToReceiveIceCandidates(true);
}
webRTCWrapper.setIsReadyToReceiveIceCandidates(true);
}
@Override
@ -1994,11 +1993,10 @@ public class JingleRtpConnection extends AbstractJingleConnection
+ " candidates in session initiate");
sendSessionInitiate(
outgoingContentMap.withCandidates(candidates), targetState);
webRTCWrapper.resetPendingCandidates();
} else {
sendSessionInitiate(outgoingContentMap, targetState);
webRTCWrapper.setIsReadyToReceiveIceCandidates(true);
}
webRTCWrapper.setIsReadyToReceiveIceCandidates(true);
}
@Override

View file

@ -44,6 +44,8 @@ import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.annotation.Nonnull;
@ -456,11 +458,6 @@ public class WebRTCWrapper {
"setIsReadyToReceiveCandidates(" + ready + ") was=" + was + " is=" + is);
}
public void resetPendingCandidates() {
this.readyToReceivedIceCandidates.set(true);
this.iceCandidates.clear();
}
synchronized void close() {
final PeerConnection peerConnection = this.peerConnection;
final PeerConnectionFactory peerConnectionFactory = this.peerConnectionFactory;
@ -579,7 +576,8 @@ public class WebRTCWrapper {
throw new IllegalStateException("Local video track does not exist");
}
synchronized ListenableFuture<SessionDescription> setLocalDescription(final boolean waitForCandidates) {
synchronized ListenableFuture<SessionDescription> setLocalDescription(
final boolean waitForCandidates) {
this.setIsReadyToReceiveIceCandidates(false);
return Futures.transformAsync(
getPeerConnectionFuture(),
@ -593,16 +591,20 @@ public class WebRTCWrapper {
new SetSdpObserver() {
@Override
public void onSetSuccess() {
final var delay =
waitForCandidates
? iceGatheringComplete
: Futures.immediateVoidFuture();
final var delayedSessionDescription =
Futures.transformAsync(
delay,
v -> getLocalDescriptionFuture(),
MoreExecutors.directExecutor());
future.setFuture(delayedSessionDescription);
if (waitForCandidates) {
final var delay = getIceGatheringCompleteOrTimeout();
final var delayedSessionDescription =
Futures.transformAsync(
delay,
v -> {
iceCandidates.clear();
return getLocalDescriptionFuture();
},
MoreExecutors.directExecutor());
future.setFuture(delayedSessionDescription);
} else {
future.setFuture(getLocalDescriptionFuture());
}
}
@Override
@ -616,6 +618,23 @@ public class WebRTCWrapper {
MoreExecutors.directExecutor());
}
private ListenableFuture<Void> getIceGatheringCompleteOrTimeout() {
return Futures.catching(
Futures.withTimeout(
iceGatheringComplete,
2,
TimeUnit.SECONDS,
JingleConnectionManager.SCHEDULED_EXECUTOR_SERVICE),
TimeoutException.class,
ex -> {
Log.d(
EXTENDED_LOGGING_TAG,
"timeout while waiting for ICE gathering to complete");
return null;
},
MoreExecutors.directExecutor());
}
private ListenableFuture<SessionDescription> getLocalDescriptionFuture() {
return Futures.submit(
() -> {