diff --git a/webrtc/api/android/java/src/org/webrtc/PeerConnection.java b/webrtc/api/android/java/src/org/webrtc/PeerConnection.java index ad8362d485..04fd563e11 100644 --- a/webrtc/api/android/java/src/org/webrtc/PeerConnection.java +++ b/webrtc/api/android/java/src/org/webrtc/PeerConnection.java @@ -146,6 +146,7 @@ public class PeerConnection { public KeyType keyType; public ContinualGatheringPolicy continualGatheringPolicy; public int iceCandidatePoolSize; + public boolean presumeWritableWhenFullyRelayed; public RTCConfiguration(List iceServers) { iceTransportsType = IceTransportsType.ALL; @@ -161,6 +162,7 @@ public class PeerConnection { keyType = KeyType.ECDSA; continualGatheringPolicy = ContinualGatheringPolicy.GATHER_ONCE; iceCandidatePoolSize = 0; + presumeWritableWhenFullyRelayed = false; } }; diff --git a/webrtc/api/android/jni/peerconnection_jni.cc b/webrtc/api/android/jni/peerconnection_jni.cc index b92e31a699..759e5abe61 100644 --- a/webrtc/api/android/jni/peerconnection_jni.cc +++ b/webrtc/api/android/jni/peerconnection_jni.cc @@ -1589,6 +1589,8 @@ static void JavaRTCConfigurationToJsepRTCConfiguration( jfieldID j_ice_candidate_pool_size_id = GetFieldID(jni, j_rtc_config_class, "iceCandidatePoolSize", "I"); + jfieldID j_presume_writable_when_fully_relayed_id = GetFieldID( + jni, j_rtc_config_class, "presumeWritableWhenFullyRelayed", "Z"); rtc_config->type = JavaIceTransportsTypeToNativeType(jni, j_ice_transports_type); @@ -1614,6 +1616,8 @@ static void JavaRTCConfigurationToJsepRTCConfiguration( jni, j_continual_gathering_policy); rtc_config->ice_candidate_pool_size = GetIntField(jni, j_rtc_config, j_ice_candidate_pool_size_id); + rtc_config->presume_writable_when_fully_relayed = GetBooleanField( + jni, j_rtc_config, j_presume_writable_when_fully_relayed_id); } JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnection)( diff --git a/webrtc/api/peerconnectioninterface.h b/webrtc/api/peerconnectioninterface.h index 3757dad8bb..e28a27e20e 100644 --- a/webrtc/api/peerconnectioninterface.h +++ b/webrtc/api/peerconnectioninterface.h @@ -301,6 +301,9 @@ class PeerConnectionInterface : public rtc::RefCountInterface { rtc::Optional enable_dtls_srtp; int ice_candidate_pool_size = 0; bool prune_turn_ports = false; + // If set to true, this means the ICE transport should presume TURN-to-TURN + // candidate pairs will succeed, even before a binding response is received. + bool presume_writable_when_fully_relayed = false; }; struct RTCOfferAnswerOptions { diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc index 9801d58f17..231d0ad4de 100644 --- a/webrtc/api/webrtcsession.cc +++ b/webrtc/api/webrtcsession.cc @@ -1136,6 +1136,8 @@ cricket::IceConfig WebRtcSession::ParseIceConfig( config.ice_backup_candidate_pair_ping_interval; ice_config.gather_continually = (config.continual_gathering_policy == PeerConnectionInterface::GATHER_CONTINUALLY); + ice_config.presume_writable_when_fully_relayed = + config.presume_writable_when_fully_relayed; return ice_config; } diff --git a/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm b/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm index b315e5073f..2a11f2d316 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm +++ b/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm @@ -33,6 +33,7 @@ _iceBackupCandidatePairPingInterval; @synthesize keyType = _keyType; @synthesize iceCandidatePoolSize = _iceCandidatePoolSize; +@synthesize presumeWritableWhenFullyRelayed = _presumeWritableWhenFullyRelayed; - (instancetype)init { if (self = [super init]) { @@ -59,13 +60,15 @@ config.ice_backup_candidate_pair_ping_interval; _keyType = RTCEncryptionKeyTypeECDSA; _iceCandidatePoolSize = config.ice_candidate_pool_size; + _presumeWritableWhenFullyRelayed = + config.presume_writable_when_fully_relayed; } return self; } - (NSString *)description { return [NSString stringWithFormat: - @"RTCConfiguration: {\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n}\n", + @"RTCConfiguration: {\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n%d\n}\n", _iceServers, [[self class] stringForTransportPolicy:_iceTransportPolicy], [[self class] stringForBundlePolicy:_bundlePolicy], @@ -77,7 +80,8 @@ _audioJitterBufferMaxPackets, _iceConnectionReceivingTimeout, _iceBackupCandidatePairPingInterval, - _iceCandidatePoolSize]; + _iceCandidatePoolSize, + _presumeWritableWhenFullyRelayed]; } #pragma mark - Private @@ -121,6 +125,8 @@ nativeConfig->certificates.push_back(certificate); } nativeConfig->ice_candidate_pool_size = _iceCandidatePoolSize; + nativeConfig->presume_writable_when_fully_relayed = + _presumeWritableWhenFullyRelayed; return nativeConfig.release(); } diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h index 5ebcb73dc0..04cf9fc15e 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h @@ -93,6 +93,11 @@ RTC_EXPORT /** ICE candidate pool size as defined in JSEP. Default is 0. */ @property(nonatomic, assign) int iceCandidatePoolSize; +/** If set to true, this means the ICE transport should presume TURN-to-TURN + * candidate pairs will succeed, even before a binding response is received. + */ +@property(nonatomic, assign) bool presumeWritableWhenFullyRelayed; + - (instancetype)init NS_DESIGNATED_INITIALIZER; @end