blob: 56d584e75a3194b9bbce1e47eac623ac49618c3e [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
henrike@webrtc.org28e20752013-07-10 00:45:36 +000011package org.webrtc;
12
Byoungchan Lee02334e02021-08-14 11:41:59 +090013import androidx.annotation.Nullable;
Magnus Jedvert6062f372017-11-16 16:53:12 +010014import java.util.ArrayList;
Qingsi Wanga0d45802019-01-15 13:33:11 -080015import java.util.Arrays;
Sami Kalliomäki3e189a62017-11-24 11:13:39 +010016import java.util.Collections;
Alex Drake68c2a562019-08-13 15:56:07 -070017import java.util.HashMap;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018import java.util.List;
Alex Drake68c2a562019-08-13 15:56:07 -070019import java.util.Map;
Alex Drake43faee02019-08-12 16:27:34 -070020import org.webrtc.CandidatePairChangeEvent;
Patrik Höglundbd6ffaf2018-11-16 14:55:16 +010021import org.webrtc.DataChannel;
22import org.webrtc.MediaStreamTrack;
23import org.webrtc.RtpTransceiver;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000024
25/**
26 * Java-land version of the PeerConnection APIs; wraps the C++ API
27 * http://www.webrtc.org/reference/native-apis, which in turn is inspired by the
28 * JS APIs: http://dev.w3.org/2011/webrtc/editor/webrtc.html and
29 * http://www.w3.org/TR/mediacapture-streams/
30 */
31public class PeerConnection {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032 /** Tracks PeerConnectionInterface::IceGatheringState */
Magnus Jedvertba700f62017-12-04 13:43:27 +010033 public enum IceGatheringState {
34 NEW,
35 GATHERING,
36 COMPLETE;
37
38 @CalledByNative("IceGatheringState")
39 static IceGatheringState fromNativeIndex(int nativeIndex) {
40 return values()[nativeIndex];
41 }
42 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043
44 /** Tracks PeerConnectionInterface::IceConnectionState */
45 public enum IceConnectionState {
sakalb6760f92016-09-29 04:12:44 -070046 NEW,
47 CHECKING,
48 CONNECTED,
49 COMPLETED,
50 FAILED,
51 DISCONNECTED,
Magnus Jedvertba700f62017-12-04 13:43:27 +010052 CLOSED;
53
54 @CalledByNative("IceConnectionState")
55 static IceConnectionState fromNativeIndex(int nativeIndex) {
56 return values()[nativeIndex];
57 }
sakalb6760f92016-09-29 04:12:44 -070058 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059
Jonas Olssonf01d8c82018-11-08 15:19:04 +010060 /** Tracks PeerConnectionInterface::PeerConnectionState */
61 public enum PeerConnectionState {
62 NEW,
63 CONNECTING,
64 CONNECTED,
65 DISCONNECTED,
66 FAILED,
67 CLOSED;
68
69 @CalledByNative("PeerConnectionState")
70 static PeerConnectionState fromNativeIndex(int nativeIndex) {
71 return values()[nativeIndex];
72 }
73 }
74
hnsl04833622017-01-09 08:35:45 -080075 /** Tracks PeerConnectionInterface::TlsCertPolicy */
76 public enum TlsCertPolicy {
77 TLS_CERT_POLICY_SECURE,
78 TLS_CERT_POLICY_INSECURE_NO_CHECK,
79 }
80
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081 /** Tracks PeerConnectionInterface::SignalingState */
82 public enum SignalingState {
sakalb6760f92016-09-29 04:12:44 -070083 STABLE,
84 HAVE_LOCAL_OFFER,
85 HAVE_LOCAL_PRANSWER,
86 HAVE_REMOTE_OFFER,
87 HAVE_REMOTE_PRANSWER,
Magnus Jedvertba700f62017-12-04 13:43:27 +010088 CLOSED;
89
90 @CalledByNative("SignalingState")
91 static SignalingState fromNativeIndex(int nativeIndex) {
92 return values()[nativeIndex];
93 }
sakalb6760f92016-09-29 04:12:44 -070094 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095
96 /** Java version of PeerConnectionObserver. */
97 public static interface Observer {
98 /** Triggered when the SignalingState changes. */
Magnus Jedvertba700f62017-12-04 13:43:27 +010099 @CalledByNative("Observer") void onSignalingChange(SignalingState newState);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100
101 /** Triggered when the IceConnectionState changes. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100102 @CalledByNative("Observer") void onIceConnectionChange(IceConnectionState newState);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103
Qingsi Wang36e31472019-05-29 11:37:26 -0700104 /* Triggered when the standard-compliant state transition of IceConnectionState happens. */
105 @CalledByNative("Observer")
106 default void onStandardizedIceConnectionChange(IceConnectionState newState) {}
107
Jonas Olssonf01d8c82018-11-08 15:19:04 +0100108 /** Triggered when the PeerConnectionState changes. */
109 @CalledByNative("Observer")
110 default void onConnectionChange(PeerConnectionState newState) {}
111
Peter Thatcher54360512015-07-08 11:08:35 -0700112 /** Triggered when the ICE connection receiving status changes. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100113 @CalledByNative("Observer") void onIceConnectionReceivingChange(boolean receiving);
Peter Thatcher54360512015-07-08 11:08:35 -0700114
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 /** Triggered when the IceGatheringState changes. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100116 @CalledByNative("Observer") void onIceGatheringChange(IceGatheringState newState);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117
118 /** Triggered when a new ICE candidate has been found. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100119 @CalledByNative("Observer") void onIceCandidate(IceCandidate candidate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120
Jaehyun Kod2110982021-11-30 19:01:43 +0900121 /** Triggered when gathering of an ICE candidate failed. */
122 default @CalledByNative("Observer") void onIceCandidateError(IceCandidateErrorEvent event) {}
123
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700124 /** Triggered when some ICE candidates have been removed. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100125 @CalledByNative("Observer") void onIceCandidatesRemoved(IceCandidate[] candidates);
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700126
Alex Drake43faee02019-08-12 16:27:34 -0700127 /** Triggered when the ICE candidate pair is changed. */
128 @CalledByNative("Observer")
129 default void onSelectedCandidatePairChanged(CandidatePairChangeEvent event) {}
130
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131 /** Triggered when media is received on a new stream from remote peer. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100132 @CalledByNative("Observer") void onAddStream(MediaStream stream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133
134 /** Triggered when a remote peer close a stream. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100135 @CalledByNative("Observer") void onRemoveStream(MediaStream stream);
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000136
137 /** Triggered when a remote peer opens a DataChannel. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100138 @CalledByNative("Observer") void onDataChannel(DataChannel dataChannel);
fischman@webrtc.orgd7568a02014-01-13 22:04:12 +0000139
140 /** Triggered when renegotiation is necessary. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100141 @CalledByNative("Observer") void onRenegotiationNeeded();
zhihuangdcccda72016-12-21 14:08:03 -0800142
143 /**
144 * Triggered when a new track is signaled by the remote peer, as a result of
145 * setRemoteDescription.
146 */
Jesús Leganés-Combarro 'pirannaffbfba92021-05-25 10:35:10 +0200147 @CalledByNative("Observer")
148 default void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams){};
149
150 /**
151 * Triggered when a previously added remote track is removed by the remote
152 * peer, as a result of setRemoteDescription.
153 */
154 @CalledByNative("Observer") default void onRemoveTrack(RtpReceiver receiver){};
Seth Hampson31dbc242018-05-07 09:28:19 -0700155
156 /**
157 * Triggered when the signaling from SetRemoteDescription indicates that a transceiver
158 * will be receiving media from a remote endpoint. This is only called if UNIFIED_PLAN
159 * semantics are specified. The transceiver will be disposed automatically.
160 */
161 @CalledByNative("Observer") default void onTrack(RtpTransceiver transceiver){};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 }
163
164 /** Java version of PeerConnectionInterface.IceServer. */
165 public static class IceServer {
Emad Omaradab1d2d2017-06-16 15:43:11 -0700166 // List of URIs associated with this server. Valid formats are described
167 // in RFC7064 and RFC7065, and more may be added in the future. The "host"
168 // part of the URI may contain either an IP address or a hostname.
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700169 @Deprecated public final String uri;
170 public final List<String> urls;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 public final String username;
172 public final String password;
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000173 public final TlsCertPolicy tlsCertPolicy;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174
Artem Titovd7ac5812021-07-27 12:23:39 +0200175 // If the URIs in `urls` only contain IP addresses, this field can be used
Emad Omaradab1d2d2017-06-16 15:43:11 -0700176 // to indicate the hostname, which may be necessary for TLS (using the SNI
Artem Titovd7ac5812021-07-27 12:23:39 +0200177 // extension). If `urls` itself contains the hostname, this isn't
Emad Omaradab1d2d2017-06-16 15:43:11 -0700178 // necessary.
179 public final String hostname;
180
Diogo Real1dca9d52017-08-29 12:18:32 -0700181 // List of protocols to be used in the TLS ALPN extension.
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000182 public final List<String> tlsAlpnProtocols;
Diogo Real1dca9d52017-08-29 12:18:32 -0700183
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700184 // List of elliptic curves to be used in the TLS elliptic curves extension.
185 // Only curve names supported by OpenSSL should be used (eg. "P-256","X25519").
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000186 public final List<String> tlsEllipticCurves;
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700187
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000188 /** Convenience constructor for STUN servers. */
Diogo Real05ea2b32017-08-31 00:12:58 -0700189 @Deprecated
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000190 public IceServer(String uri) {
191 this(uri, "", "");
192 }
193
Diogo Real05ea2b32017-08-31 00:12:58 -0700194 @Deprecated
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 public IceServer(String uri, String username, String password) {
hnsl04833622017-01-09 08:35:45 -0800196 this(uri, username, password, TlsCertPolicy.TLS_CERT_POLICY_SECURE);
197 }
198
Diogo Real05ea2b32017-08-31 00:12:58 -0700199 @Deprecated
hnsl04833622017-01-09 08:35:45 -0800200 public IceServer(String uri, String username, String password, TlsCertPolicy tlsCertPolicy) {
Emad Omaradab1d2d2017-06-16 15:43:11 -0700201 this(uri, username, password, tlsCertPolicy, "");
202 }
203
Diogo Real05ea2b32017-08-31 00:12:58 -0700204 @Deprecated
Emad Omaradab1d2d2017-06-16 15:43:11 -0700205 public IceServer(String uri, String username, String password, TlsCertPolicy tlsCertPolicy,
206 String hostname) {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700207 this(uri, Collections.singletonList(uri), username, password, tlsCertPolicy, hostname, null,
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000208 null);
Diogo Real1dca9d52017-08-29 12:18:32 -0700209 }
210
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700211 private IceServer(String uri, List<String> urls, String username, String password,
212 TlsCertPolicy tlsCertPolicy, String hostname, List<String> tlsAlpnProtocols,
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000213 List<String> tlsEllipticCurves) {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700214 if (uri == null || urls == null || urls.isEmpty()) {
215 throw new IllegalArgumentException("uri == null || urls == null || urls.isEmpty()");
216 }
217 for (String it : urls) {
218 if (it == null) {
219 throw new IllegalArgumentException("urls element is null: " + urls);
220 }
221 }
222 if (username == null) {
223 throw new IllegalArgumentException("username == null");
224 }
225 if (password == null) {
226 throw new IllegalArgumentException("password == null");
227 }
228 if (hostname == null) {
229 throw new IllegalArgumentException("hostname == null");
230 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 this.uri = uri;
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700232 this.urls = urls;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 this.username = username;
234 this.password = password;
hnsl04833622017-01-09 08:35:45 -0800235 this.tlsCertPolicy = tlsCertPolicy;
Emad Omaradab1d2d2017-06-16 15:43:11 -0700236 this.hostname = hostname;
Diogo Real1dca9d52017-08-29 12:18:32 -0700237 this.tlsAlpnProtocols = tlsAlpnProtocols;
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700238 this.tlsEllipticCurves = tlsEllipticCurves;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 }
240
Sami Kalliomäkibde473e2017-10-30 13:34:41 +0100241 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000242 public String toString() {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700243 return urls + " [" + username + ":" + password + "] [" + tlsCertPolicy + "] [" + hostname
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000244 + "] [" + tlsAlpnProtocols + "] [" + tlsEllipticCurves + "]";
Diogo Real1dca9d52017-08-29 12:18:32 -0700245 }
246
Qingsi Wanga0d45802019-01-15 13:33:11 -0800247 @Override
248 public boolean equals(@Nullable Object obj) {
249 if (obj == null) {
250 return false;
251 }
252 if (obj == this) {
253 return true;
254 }
255 if (!(obj instanceof IceServer)) {
256 return false;
257 }
258 IceServer other = (IceServer) obj;
259 return (uri.equals(other.uri) && urls.equals(other.urls) && username.equals(other.username)
260 && password.equals(other.password) && tlsCertPolicy.equals(other.tlsCertPolicy)
261 && hostname.equals(other.hostname) && tlsAlpnProtocols.equals(other.tlsAlpnProtocols)
262 && tlsEllipticCurves.equals(other.tlsEllipticCurves));
263 }
264
265 @Override
266 public int hashCode() {
267 Object[] values = {uri, urls, username, password, tlsCertPolicy, hostname, tlsAlpnProtocols,
268 tlsEllipticCurves};
269 return Arrays.hashCode(values);
270 }
271
Diogo Real1dca9d52017-08-29 12:18:32 -0700272 public static Builder builder(String uri) {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700273 return new Builder(Collections.singletonList(uri));
274 }
275
276 public static Builder builder(List<String> urls) {
277 return new Builder(urls);
Diogo Real1dca9d52017-08-29 12:18:32 -0700278 }
279
280 public static class Builder {
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100281 @Nullable private final List<String> urls;
Diogo Real1dca9d52017-08-29 12:18:32 -0700282 private String username = "";
283 private String password = "";
284 private TlsCertPolicy tlsCertPolicy = TlsCertPolicy.TLS_CERT_POLICY_SECURE;
285 private String hostname = "";
286 private List<String> tlsAlpnProtocols;
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700287 private List<String> tlsEllipticCurves;
Diogo Real1dca9d52017-08-29 12:18:32 -0700288
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700289 private Builder(List<String> urls) {
290 if (urls == null || urls.isEmpty()) {
291 throw new IllegalArgumentException("urls == null || urls.isEmpty(): " + urls);
292 }
293 this.urls = urls;
Diogo Real1dca9d52017-08-29 12:18:32 -0700294 }
295
296 public Builder setUsername(String username) {
297 this.username = username;
298 return this;
299 }
300
301 public Builder setPassword(String password) {
302 this.password = password;
303 return this;
304 }
305
306 public Builder setTlsCertPolicy(TlsCertPolicy tlsCertPolicy) {
307 this.tlsCertPolicy = tlsCertPolicy;
308 return this;
309 }
310
311 public Builder setHostname(String hostname) {
312 this.hostname = hostname;
313 return this;
314 }
315
316 public Builder setTlsAlpnProtocols(List<String> tlsAlpnProtocols) {
317 this.tlsAlpnProtocols = tlsAlpnProtocols;
318 return this;
319 }
320
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700321 public Builder setTlsEllipticCurves(List<String> tlsEllipticCurves) {
322 this.tlsEllipticCurves = tlsEllipticCurves;
323 return this;
324 }
325
Diogo Real1dca9d52017-08-29 12:18:32 -0700326 public IceServer createIceServer() {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700327 return new IceServer(urls.get(0), urls, username, password, tlsCertPolicy, hostname,
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000328 tlsAlpnProtocols, tlsEllipticCurves);
Diogo Real1dca9d52017-08-29 12:18:32 -0700329 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000330 }
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100331
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100332 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100333 @CalledByNative("IceServer")
334 List<String> getUrls() {
335 return urls;
336 }
337
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100338 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100339 @CalledByNative("IceServer")
340 String getUsername() {
341 return username;
342 }
343
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100344 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100345 @CalledByNative("IceServer")
346 String getPassword() {
347 return password;
348 }
349
350 @CalledByNative("IceServer")
351 TlsCertPolicy getTlsCertPolicy() {
352 return tlsCertPolicy;
353 }
354
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100355 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100356 @CalledByNative("IceServer")
357 String getHostname() {
358 return hostname;
359 }
360
361 @CalledByNative("IceServer")
362 List<String> getTlsAlpnProtocols() {
363 return tlsAlpnProtocols;
364 }
365
366 @CalledByNative("IceServer")
367 List<String> getTlsEllipticCurves() {
368 return tlsEllipticCurves;
369 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 }
371
Jiayang Liucac1b382015-04-30 12:35:24 -0700372 /** Java version of PeerConnectionInterface.IceTransportsType */
sakalb6760f92016-09-29 04:12:44 -0700373 public enum IceTransportsType { NONE, RELAY, NOHOST, ALL }
Jiayang Liucac1b382015-04-30 12:35:24 -0700374
375 /** Java version of PeerConnectionInterface.BundlePolicy */
sakalb6760f92016-09-29 04:12:44 -0700376 public enum BundlePolicy { BALANCED, MAXBUNDLE, MAXCOMPAT }
Jiayang Liucac1b382015-04-30 12:35:24 -0700377
Peter Thatcheraf55ccc2015-05-21 07:48:41 -0700378 /** Java version of PeerConnectionInterface.RtcpMuxPolicy */
sakalb6760f92016-09-29 04:12:44 -0700379 public enum RtcpMuxPolicy { NEGOTIATE, REQUIRE }
glaznev97579a42015-09-01 11:31:27 -0700380
Peter Thatcheraf55ccc2015-05-21 07:48:41 -0700381 /** Java version of PeerConnectionInterface.TcpCandidatePolicy */
sakalb6760f92016-09-29 04:12:44 -0700382 public enum TcpCandidatePolicy { ENABLED, DISABLED }
Jiayang Liucac1b382015-04-30 12:35:24 -0700383
honghaiz60347052016-05-31 18:29:12 -0700384 /** Java version of PeerConnectionInterface.CandidateNetworkPolicy */
sakalb6760f92016-09-29 04:12:44 -0700385 public enum CandidateNetworkPolicy { ALL, LOW_COST }
honghaiz60347052016-05-31 18:29:12 -0700386
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800387 // Keep in sync with webrtc/rtc_base/network_constants.h.
388 public enum AdapterType {
Alex Drake68c2a562019-08-13 15:56:07 -0700389 UNKNOWN(0),
390 ETHERNET(1 << 0),
391 WIFI(1 << 1),
392 CELLULAR(1 << 2),
393 VPN(1 << 3),
394 LOOPBACK(1 << 4),
Jonas Oreland0cc37302020-04-02 18:26:26 +0200395 ADAPTER_TYPE_ANY(1 << 5),
396 CELLULAR_2G(1 << 6),
397 CELLULAR_3G(1 << 7),
398 CELLULAR_4G(1 << 8),
399 CELLULAR_5G(1 << 9);
Alex Drake68c2a562019-08-13 15:56:07 -0700400
401 public final Integer bitMask;
402 private AdapterType(Integer bitMask) {
403 this.bitMask = bitMask;
404 }
405 private static final Map<Integer, AdapterType> BY_BITMASK = new HashMap<>();
406 static {
407 for (AdapterType t : values()) {
408 BY_BITMASK.put(t.bitMask, t);
409 }
410 }
411
Yves Gerey29e07e52019-11-19 12:13:25 +0100412 @Nullable
Alex Drake68c2a562019-08-13 15:56:07 -0700413 @CalledByNative("AdapterType")
414 static AdapterType fromNativeIndex(int nativeIndex) {
415 return BY_BITMASK.get(nativeIndex);
416 }
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800417 }
418
glaznev97579a42015-09-01 11:31:27 -0700419 /** Java version of rtc::KeyType */
sakalb6760f92016-09-29 04:12:44 -0700420 public enum KeyType { RSA, ECDSA }
glaznev97579a42015-09-01 11:31:27 -0700421
honghaiz1f429e32015-09-28 07:57:34 -0700422 /** Java version of PeerConnectionInterface.ContinualGatheringPolicy */
sakalb6760f92016-09-29 04:12:44 -0700423 public enum ContinualGatheringPolicy { GATHER_ONCE, GATHER_CONTINUALLY }
honghaiz1f429e32015-09-28 07:57:34 -0700424
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700425 /** Java version of webrtc::PortPrunePolicy */
426 public enum PortPrunePolicy {
427 NO_PRUNE, // Do not prune turn port.
428 PRUNE_BASED_ON_PRIORITY, // Prune turn port based the priority on the same network
429 KEEP_FIRST_READY // Keep the first ready port and prune the rest on the same network.
430 }
431
Seth Hampsonc384e142018-03-06 15:47:10 -0800432 /**
433 * Java version of webrtc::SdpSemantics.
434 *
Henrik Boström277a3b42022-01-14 10:44:03 +0100435 * Configure the SDP semantics used by this PeerConnection. That the WebRTC
436 * 1.0 specification requires UNIFIED_PLAN semantics and the RtpTransceiver
437 * API is only available with UNIFIED_PLAN semantics. PLAN_B is being
438 * deprecated and will be removed at a future date.
Seth Hampsonc384e142018-03-06 15:47:10 -0800439 *
440 * <p>PLAN_B will cause PeerConnection to create offers and answers with at
441 * most one audio and one video m= section with multiple RtpSenders and
442 * RtpReceivers specified as multiple a=ssrc lines within the section. This
443 * will also cause PeerConnection to ignore all but the first m= section of
444 * the same media type.
445 *
446 * <p>UNIFIED_PLAN will cause PeerConnection to create offers and answers with
447 * multiple m= sections where each m= section maps to one RtpSender and one
448 * RtpReceiver (an RtpTransceiver), either both audio or both video. This
449 * will also cause PeerConnection to ignore all but the first a=ssrc lines
450 * that form a Plan B stream.
451 *
Henrik Boström277a3b42022-01-14 10:44:03 +0100452 * <p>For users who have to interwork with legacy WebRTC implementations, it
453 * is possible to specify PLAN_B until the code is finally removed
454 * (https://crbug.com/webrtc/13528).
Seth Hampsonc384e142018-03-06 15:47:10 -0800455 *
Henrik Boström277a3b42022-01-14 10:44:03 +0100456 * <p>The default SdpSemantics value is about to change to UNIFIED_PLAN.
457 * During a short transition period, NOT_SPECIFIED is used to ensure clients
458 * that don't set SdpSemantics are aware of the change by CHECK-crashing.
459 * TODO(https://crbug.com/webrtc/11121): When the default has changed to
460 * UNIFIED_PLAN, delete NOT_SPECIFIED.
Seth Hampsonc384e142018-03-06 15:47:10 -0800461 */
Henrik Boström277a3b42022-01-14 10:44:03 +0100462 public enum SdpSemantics {
463 // TODO(https://crbug.com/webrtc/13528): Remove support for PLAN_B.
464 @Deprecated PLAN_B,
465 UNIFIED_PLAN,
466 // The default SdpSemantics value is about to change to UNIFIED_PLAN. During
467 // a short transition period, NOT_SPECIFIED is used to ensure clients that
468 // don't set SdpSemantics are aware of the change by CHECK-crashing.
469 // TODO(https://crbug.com/webrtc/11121): When the default has changed to
470 // kUnifiedPlan, delete kNotSpecified.
471 NOT_SPECIFIED
472 }
Seth Hampsonc384e142018-03-06 15:47:10 -0800473
Jiayang Liucac1b382015-04-30 12:35:24 -0700474 /** Java version of PeerConnectionInterface.RTCConfiguration */
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800475 // TODO(qingsi): Resolve the naming inconsistency of fields with/without units.
Jiayang Liucac1b382015-04-30 12:35:24 -0700476 public static class RTCConfiguration {
477 public IceTransportsType iceTransportsType;
478 public List<IceServer> iceServers;
479 public BundlePolicy bundlePolicy;
Michael Iedema02137862018-10-09 15:30:01 +0200480 @Nullable public RtcCertificatePem certificate;
Peter Thatcheraf55ccc2015-05-21 07:48:41 -0700481 public RtcpMuxPolicy rtcpMuxPolicy;
Jiayang Liucac1b382015-04-30 12:35:24 -0700482 public TcpCandidatePolicy tcpCandidatePolicy;
honghaiz60347052016-05-31 18:29:12 -0700483 public CandidateNetworkPolicy candidateNetworkPolicy;
Henrik Lundin64dad832015-05-11 12:44:23 +0200484 public int audioJitterBufferMaxPackets;
Henrik Lundin5263b3c2015-06-01 10:29:41 +0200485 public boolean audioJitterBufferFastAccelerate;
honghaiz4edc39c2015-09-01 09:53:56 -0700486 public int iceConnectionReceivingTimeout;
Honghai Zhang381b4212015-12-04 12:24:03 -0800487 public int iceBackupCandidatePairPingInterval;
glaznev97579a42015-09-01 11:31:27 -0700488 public KeyType keyType;
honghaiz1f429e32015-09-28 07:57:34 -0700489 public ContinualGatheringPolicy continualGatheringPolicy;
deadbeefbe0c96f2016-05-18 16:20:14 -0700490 public int iceCandidatePoolSize;
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700491 @Deprecated // by the turnPortPrunePolicy. See bugs.webrtc.org/11026
Honghai Zhangd78ecf72016-07-01 14:40:40 -0700492 public boolean pruneTurnPorts;
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700493 public PortPrunePolicy turnPortPrunePolicy;
Taylor Brandstettere9851112016-07-01 11:11:13 -0700494 public boolean presumeWritableWhenFullyRelayed;
Qingsi Wang1fe119f2019-05-31 16:55:33 -0700495 public boolean surfaceIceCandidatesOnIceTransportTypeChanged;
Qingsi Wange6826d22018-03-08 14:55:14 -0800496 // The following fields define intervals in milliseconds at which ICE
497 // connectivity checks are sent.
498 //
499 // We consider ICE is "strongly connected" for an agent when there is at
500 // least one candidate pair that currently succeeds in connectivity check
501 // from its direction i.e. sending a ping and receives a ping response, AND
502 // all candidate pairs have sent a minimum number of pings for connectivity
503 // (this number is implementation-specific). Otherwise, ICE is considered in
504 // "weak connectivity".
505 //
506 // Note that the above notion of strong and weak connectivity is not defined
507 // in RFC 5245, and they apply to our current ICE implementation only.
508 //
509 // 1) iceCheckIntervalStrongConnectivityMs defines the interval applied to
510 // ALL candidate pairs when ICE is strongly connected,
511 // 2) iceCheckIntervalWeakConnectivityMs defines the counterpart for ALL
512 // pairs when ICE is weakly connected, and
513 // 3) iceCheckMinInterval defines the minimal interval (equivalently the
514 // maximum rate) that overrides the above two intervals when either of them
515 // is less.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100516 @Nullable public Integer iceCheckIntervalStrongConnectivityMs;
517 @Nullable public Integer iceCheckIntervalWeakConnectivityMs;
518 @Nullable public Integer iceCheckMinInterval;
Qingsi Wang22e623a2018-03-13 10:53:57 -0700519 // The time period in milliseconds for which a candidate pair must wait for response to
520 // connectivitiy checks before it becomes unwritable.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100521 @Nullable public Integer iceUnwritableTimeMs;
Qingsi Wang22e623a2018-03-13 10:53:57 -0700522 // The minimum number of connectivity checks that a candidate pair must sent without receiving
523 // response before it becomes unwritable.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100524 @Nullable public Integer iceUnwritableMinChecks;
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800525 // The interval in milliseconds at which STUN candidates will resend STUN binding requests
526 // to keep NAT bindings open.
527 // The default value in the implementation is used if this field is null.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100528 @Nullable public Integer stunCandidateKeepaliveIntervalMs;
Derek Bailey6c127a12021-04-15 12:42:41 -0700529 // The interval in milliseconds of pings sent when the connection is stable and writable.
530 // The default value in the implementation is used if this field is null.
531 @Nullable public Integer stableWritableConnectionPingIntervalMs;
zhihuangb09b3f92017-03-07 14:40:51 -0800532 public boolean disableIPv6OnWifi;
deadbeef28e29192017-07-27 09:14:38 -0700533 // By default, PeerConnection will use a limited number of IPv6 network
534 // interfaces, in order to avoid too many ICE candidate pairs being created
535 // and delaying ICE completion.
536 //
537 // Can be set to Integer.MAX_VALUE to effectively disable the limit.
538 public int maxIPv6Networks;
Jiayang Liucac1b382015-04-30 12:35:24 -0700539
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100540 // These values will be overridden by MediaStream constraints if deprecated constraints-based
541 // create peerconnection interface is used.
542 public boolean disableIpv6;
543 public boolean enableDscp;
544 public boolean enableCpuOveruseDetection;
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100545 public boolean suspendBelowMinBitrate;
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100546 @Nullable public Integer screencastMinBitrate;
547 @Nullable public Boolean combinedAudioVideoBwe;
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800548 // Use "Unknown" to represent no preference of adapter types, not the
549 // preference of adapters of unknown types.
550 public AdapterType networkPreference;
Seth Hampsonc384e142018-03-06 15:47:10 -0800551 public SdpSemantics sdpSemantics;
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100552
Jonas Orelandbdcee282017-10-10 14:01:40 +0200553 // This is an optional wrapper for the C++ webrtc::TurnCustomizer.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100554 @Nullable public TurnCustomizer turnCustomizer;
Jonas Orelandbdcee282017-10-10 14:01:40 +0200555
Zhi Huangb57e1692018-06-12 11:41:11 -0700556 // Actively reset the SRTP parameters whenever the DTLS transports underneath are reset for
557 // every offer/answer negotiation.This is only intended to be a workaround for crbug.com/835958
558 public boolean activeResetSrtpParams;
559
philipel16cec3b2019-10-25 12:23:02 +0200560 // Whether this client is allowed to switch encoding codec mid-stream. This is a workaround for
561 // a WebRTC bug where the receiver could get confussed if a codec switch happened mid-call.
562 // Null indicates no change to currently configured value.
563 @Nullable public Boolean allowCodecSwitching;
564
Benjamin Wright8c27cca2018-10-25 10:16:44 -0700565 /**
566 * Defines advanced optional cryptographic settings related to SRTP and
567 * frame encryption for native WebRTC. Setting this will overwrite any
568 * options set through the PeerConnectionFactory (which is deprecated).
569 */
570 @Nullable public CryptoOptions cryptoOptions;
571
Jonas Oreland228900f2019-08-28 09:08:58 +0200572 /**
573 * An optional string that if set will be attached to the
574 * TURN_ALLOCATE_REQUEST which can be used to correlate client
575 * logs with backend logs
576 */
577 @Nullable public String turnLoggingId;
578
Yura Yaroshevich90fab632021-03-22 17:10:33 +0300579 /**
580 * Allow implicit rollback of local description when remote description
581 * conflicts with local description.
582 * See: https://w3c.github.io/webrtc-pc/#dom-peerconnection-setremotedescription
583 */
584 public boolean enableImplicitRollback;
585
586 /**
587 * Control if "a=extmap-allow-mixed" is included in the offer.
588 * See: https://www.chromestatus.com/feature/6269234631933952
589 */
590 public boolean offerExtmapAllowMixed;
591
deadbeef28e29192017-07-27 09:14:38 -0700592 // TODO(deadbeef): Instead of duplicating the defaults here, we should do
593 // something to pick up the defaults from C++. The Objective-C equivalent
594 // of RTCConfiguration does that.
Jiayang Liucac1b382015-04-30 12:35:24 -0700595 public RTCConfiguration(List<IceServer> iceServers) {
596 iceTransportsType = IceTransportsType.ALL;
597 bundlePolicy = BundlePolicy.BALANCED;
zhihuang4dfb8ce2016-11-23 10:30:12 -0800598 rtcpMuxPolicy = RtcpMuxPolicy.REQUIRE;
Jiayang Liucac1b382015-04-30 12:35:24 -0700599 tcpCandidatePolicy = TcpCandidatePolicy.ENABLED;
Sami Kalliomäki9828beb2017-10-26 16:21:22 +0200600 candidateNetworkPolicy = CandidateNetworkPolicy.ALL;
Jiayang Liucac1b382015-04-30 12:35:24 -0700601 this.iceServers = iceServers;
Henrik Lundin64dad832015-05-11 12:44:23 +0200602 audioJitterBufferMaxPackets = 50;
Henrik Lundin5263b3c2015-06-01 10:29:41 +0200603 audioJitterBufferFastAccelerate = false;
honghaiz4edc39c2015-09-01 09:53:56 -0700604 iceConnectionReceivingTimeout = -1;
Honghai Zhang381b4212015-12-04 12:24:03 -0800605 iceBackupCandidatePairPingInterval = -1;
glaznev97579a42015-09-01 11:31:27 -0700606 keyType = KeyType.ECDSA;
honghaiz1f429e32015-09-28 07:57:34 -0700607 continualGatheringPolicy = ContinualGatheringPolicy.GATHER_ONCE;
deadbeefbe0c96f2016-05-18 16:20:14 -0700608 iceCandidatePoolSize = 0;
Honghai Zhangd78ecf72016-07-01 14:40:40 -0700609 pruneTurnPorts = false;
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700610 turnPortPrunePolicy = PortPrunePolicy.NO_PRUNE;
Taylor Brandstettere9851112016-07-01 11:11:13 -0700611 presumeWritableWhenFullyRelayed = false;
Qingsi Wang1fe119f2019-05-31 16:55:33 -0700612 surfaceIceCandidatesOnIceTransportTypeChanged = false;
Qingsi Wange6826d22018-03-08 14:55:14 -0800613 iceCheckIntervalStrongConnectivityMs = null;
614 iceCheckIntervalWeakConnectivityMs = null;
skvlad51072462017-02-02 11:50:14 -0800615 iceCheckMinInterval = null;
Qingsi Wang22e623a2018-03-13 10:53:57 -0700616 iceUnwritableTimeMs = null;
617 iceUnwritableMinChecks = null;
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800618 stunCandidateKeepaliveIntervalMs = null;
Derek Bailey6c127a12021-04-15 12:42:41 -0700619 stableWritableConnectionPingIntervalMs = null;
zhihuangb09b3f92017-03-07 14:40:51 -0800620 disableIPv6OnWifi = false;
deadbeef28e29192017-07-27 09:14:38 -0700621 maxIPv6Networks = 5;
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100622 disableIpv6 = false;
623 enableDscp = false;
624 enableCpuOveruseDetection = true;
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100625 suspendBelowMinBitrate = false;
626 screencastMinBitrate = null;
627 combinedAudioVideoBwe = null;
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800628 networkPreference = AdapterType.UNKNOWN;
Henrik Boström277a3b42022-01-14 10:44:03 +0100629 sdpSemantics = SdpSemantics.NOT_SPECIFIED;
Zhi Huangb57e1692018-06-12 11:41:11 -0700630 activeResetSrtpParams = false;
Benjamin Wright8c27cca2018-10-25 10:16:44 -0700631 cryptoOptions = null;
Jonas Oreland228900f2019-08-28 09:08:58 +0200632 turnLoggingId = null;
philipel16cec3b2019-10-25 12:23:02 +0200633 allowCodecSwitching = null;
Yura Yaroshevich90fab632021-03-22 17:10:33 +0300634 enableImplicitRollback = false;
635 offerExtmapAllowMixed = true;
Jiayang Liucac1b382015-04-30 12:35:24 -0700636 }
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100637
638 @CalledByNative("RTCConfiguration")
639 IceTransportsType getIceTransportsType() {
640 return iceTransportsType;
641 }
642
643 @CalledByNative("RTCConfiguration")
644 List<IceServer> getIceServers() {
645 return iceServers;
646 }
647
648 @CalledByNative("RTCConfiguration")
649 BundlePolicy getBundlePolicy() {
650 return bundlePolicy;
651 }
652
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700653 @CalledByNative("RTCConfiguration")
654 PortPrunePolicy getTurnPortPrunePolicy() {
655 return turnPortPrunePolicy;
656 }
657
Michael Iedema02137862018-10-09 15:30:01 +0200658 @Nullable
659 @CalledByNative("RTCConfiguration")
660 RtcCertificatePem getCertificate() {
661 return certificate;
662 }
663
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100664 @CalledByNative("RTCConfiguration")
665 RtcpMuxPolicy getRtcpMuxPolicy() {
666 return rtcpMuxPolicy;
667 }
668
669 @CalledByNative("RTCConfiguration")
670 TcpCandidatePolicy getTcpCandidatePolicy() {
671 return tcpCandidatePolicy;
672 }
673
674 @CalledByNative("RTCConfiguration")
675 CandidateNetworkPolicy getCandidateNetworkPolicy() {
676 return candidateNetworkPolicy;
677 }
678
679 @CalledByNative("RTCConfiguration")
680 int getAudioJitterBufferMaxPackets() {
681 return audioJitterBufferMaxPackets;
682 }
683
684 @CalledByNative("RTCConfiguration")
685 boolean getAudioJitterBufferFastAccelerate() {
686 return audioJitterBufferFastAccelerate;
687 }
688
689 @CalledByNative("RTCConfiguration")
690 int getIceConnectionReceivingTimeout() {
691 return iceConnectionReceivingTimeout;
692 }
693
694 @CalledByNative("RTCConfiguration")
695 int getIceBackupCandidatePairPingInterval() {
696 return iceBackupCandidatePairPingInterval;
697 }
698
699 @CalledByNative("RTCConfiguration")
700 KeyType getKeyType() {
701 return keyType;
702 }
703
704 @CalledByNative("RTCConfiguration")
705 ContinualGatheringPolicy getContinualGatheringPolicy() {
706 return continualGatheringPolicy;
707 }
708
709 @CalledByNative("RTCConfiguration")
710 int getIceCandidatePoolSize() {
711 return iceCandidatePoolSize;
712 }
713
714 @CalledByNative("RTCConfiguration")
715 boolean getPruneTurnPorts() {
716 return pruneTurnPorts;
717 }
718
719 @CalledByNative("RTCConfiguration")
720 boolean getPresumeWritableWhenFullyRelayed() {
721 return presumeWritableWhenFullyRelayed;
722 }
723
Qingsi Wang1fe119f2019-05-31 16:55:33 -0700724 @CalledByNative("RTCConfiguration")
725 boolean getSurfaceIceCandidatesOnIceTransportTypeChanged() {
726 return surfaceIceCandidatesOnIceTransportTypeChanged;
727 }
728
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100729 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100730 @CalledByNative("RTCConfiguration")
Qingsi Wange6826d22018-03-08 14:55:14 -0800731 Integer getIceCheckIntervalStrongConnectivity() {
732 return iceCheckIntervalStrongConnectivityMs;
733 }
734
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100735 @Nullable
Qingsi Wange6826d22018-03-08 14:55:14 -0800736 @CalledByNative("RTCConfiguration")
737 Integer getIceCheckIntervalWeakConnectivity() {
738 return iceCheckIntervalWeakConnectivityMs;
739 }
740
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100741 @Nullable
Qingsi Wange6826d22018-03-08 14:55:14 -0800742 @CalledByNative("RTCConfiguration")
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100743 Integer getIceCheckMinInterval() {
744 return iceCheckMinInterval;
745 }
746
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100747 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100748 @CalledByNative("RTCConfiguration")
Qingsi Wang22e623a2018-03-13 10:53:57 -0700749 Integer getIceUnwritableTimeout() {
750 return iceUnwritableTimeMs;
751 }
752
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100753 @Nullable
Qingsi Wang22e623a2018-03-13 10:53:57 -0700754 @CalledByNative("RTCConfiguration")
755 Integer getIceUnwritableMinChecks() {
756 return iceUnwritableMinChecks;
757 }
758
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100759 @Nullable
Qingsi Wang22e623a2018-03-13 10:53:57 -0700760 @CalledByNative("RTCConfiguration")
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800761 Integer getStunCandidateKeepaliveInterval() {
762 return stunCandidateKeepaliveIntervalMs;
763 }
764
Derek Bailey6c127a12021-04-15 12:42:41 -0700765 @Nullable
766 @CalledByNative("RTCConfiguration")
767 Integer getStableWritableConnectionPingIntervalMs() {
768 return stableWritableConnectionPingIntervalMs;
769 }
770
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800771 @CalledByNative("RTCConfiguration")
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100772 boolean getDisableIPv6OnWifi() {
773 return disableIPv6OnWifi;
774 }
775
776 @CalledByNative("RTCConfiguration")
777 int getMaxIPv6Networks() {
778 return maxIPv6Networks;
779 }
780
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100781 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100782 @CalledByNative("RTCConfiguration")
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100783 TurnCustomizer getTurnCustomizer() {
784 return turnCustomizer;
785 }
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100786
787 @CalledByNative("RTCConfiguration")
788 boolean getDisableIpv6() {
789 return disableIpv6;
790 }
791
792 @CalledByNative("RTCConfiguration")
793 boolean getEnableDscp() {
794 return enableDscp;
795 }
796
797 @CalledByNative("RTCConfiguration")
798 boolean getEnableCpuOveruseDetection() {
799 return enableCpuOveruseDetection;
800 }
801
802 @CalledByNative("RTCConfiguration")
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100803 boolean getSuspendBelowMinBitrate() {
804 return suspendBelowMinBitrate;
805 }
806
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100807 @Nullable
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100808 @CalledByNative("RTCConfiguration")
809 Integer getScreencastMinBitrate() {
810 return screencastMinBitrate;
811 }
812
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100813 @Nullable
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100814 @CalledByNative("RTCConfiguration")
815 Boolean getCombinedAudioVideoBwe() {
816 return combinedAudioVideoBwe;
817 }
818
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800819 @CalledByNative("RTCConfiguration")
820 AdapterType getNetworkPreference() {
821 return networkPreference;
822 }
Seth Hampsonc384e142018-03-06 15:47:10 -0800823
824 @CalledByNative("RTCConfiguration")
825 SdpSemantics getSdpSemantics() {
826 return sdpSemantics;
827 }
Zhi Huangb57e1692018-06-12 11:41:11 -0700828
829 @CalledByNative("RTCConfiguration")
830 boolean getActiveResetSrtpParams() {
831 return activeResetSrtpParams;
832 }
Piotr (Peter) Slatala09beff22018-10-17 07:22:40 -0700833
philipel16cec3b2019-10-25 12:23:02 +0200834 @Nullable
835 @CalledByNative("RTCConfiguration")
836 Boolean getAllowCodecSwitching() {
837 return allowCodecSwitching;
838 }
839
Benjamin Wright8c27cca2018-10-25 10:16:44 -0700840 @Nullable
841 @CalledByNative("RTCConfiguration")
842 CryptoOptions getCryptoOptions() {
843 return cryptoOptions;
844 }
Jonas Oreland228900f2019-08-28 09:08:58 +0200845
846 @Nullable
847 @CalledByNative("RTCConfiguration")
848 String getTurnLoggingId() {
849 return turnLoggingId;
850 }
Yura Yaroshevich90fab632021-03-22 17:10:33 +0300851
852 @CalledByNative("RTCConfiguration")
853 boolean getEnableImplicitRollback() {
854 return enableImplicitRollback;
855 }
856
857 @CalledByNative("RTCConfiguration")
858 boolean getOfferExtmapAllowMixed() {
859 return offerExtmapAllowMixed;
860 }
Jiayang Liucac1b382015-04-30 12:35:24 -0700861 };
862
Magnus Jedvert6062f372017-11-16 16:53:12 +0100863 private final List<MediaStream> localStreams = new ArrayList<>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864 private final long nativePeerConnection;
Magnus Jedvert6062f372017-11-16 16:53:12 +0100865 private List<RtpSender> senders = new ArrayList<>();
866 private List<RtpReceiver> receivers = new ArrayList<>();
Seth Hampsonc384e142018-03-06 15:47:10 -0800867 private List<RtpTransceiver> transceivers = new ArrayList<>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868
Sami Kalliomäki1ece1ed2017-12-20 11:59:22 +0100869 /**
870 * Wraps a PeerConnection created by the factory. Can be used by clients that want to implement
871 * their PeerConnection creation in JNI.
872 */
873 public PeerConnection(NativePeerConnectionFactory factory) {
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +0100874 this(factory.createNativePeerConnection());
Sami Kalliomäki1ece1ed2017-12-20 11:59:22 +0100875 }
876
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +0100877 PeerConnection(long nativePeerConnection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878 this.nativePeerConnection = nativePeerConnection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879 }
880
881 // JsepInterface.
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100882 public SessionDescription getLocalDescription() {
883 return nativeGetLocalDescription();
884 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000885
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100886 public SessionDescription getRemoteDescription() {
887 return nativeGetRemoteDescription();
888 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000889
Michael Iedema02137862018-10-09 15:30:01 +0200890 public RtcCertificatePem getCertificate() {
891 return nativeGetCertificate();
892 }
893
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100894 public DataChannel createDataChannel(String label, DataChannel.Init init) {
895 return nativeCreateDataChannel(label, init);
896 }
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000897
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100898 public void createOffer(SdpObserver observer, MediaConstraints constraints) {
899 nativeCreateOffer(observer, constraints);
900 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000901
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100902 public void createAnswer(SdpObserver observer, MediaConstraints constraints) {
903 nativeCreateAnswer(observer, constraints);
904 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905
Yura Yaroshevich4e9e7232021-03-22 11:45:43 +0300906 public void setLocalDescription(SdpObserver observer) {
907 nativeSetLocalDescriptionAutomatically(observer);
908 }
909
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100910 public void setLocalDescription(SdpObserver observer, SessionDescription sdp) {
911 nativeSetLocalDescription(observer, sdp);
912 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100914 public void setRemoteDescription(SdpObserver observer, SessionDescription sdp) {
915 nativeSetRemoteDescription(observer, sdp);
916 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917
Seth Hampsonc384e142018-03-06 15:47:10 -0800918 /**
Yura Yaroshevichd8d9ac32021-03-22 12:46:47 +0300919 * Tells the PeerConnection that ICE should be restarted.
920 */
921 public void restartIce() {
922 nativeRestartIce();
923 }
924
925 /**
Seth Hampsonc384e142018-03-06 15:47:10 -0800926 * Enables/disables playout of received audio streams. Enabled by default.
927 *
928 * Note that even if playout is enabled, streams will only be played out if
929 * the appropriate SDP is also applied. The main purpose of this API is to
930 * be able to control the exact time when audio playout starts.
931 */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100932 public void setAudioPlayout(boolean playout) {
933 nativeSetAudioPlayout(playout);
934 }
henrika5f6bf242017-11-01 11:06:56 +0100935
Seth Hampsonc384e142018-03-06 15:47:10 -0800936 /**
937 * Enables/disables recording of transmitted audio streams. Enabled by default.
938 *
939 * Note that even if recording is enabled, streams will only be recorded if
940 * the appropriate SDP is also applied. The main purpose of this API is to
941 * be able to control the exact time when audio recording starts.
942 */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100943 public void setAudioRecording(boolean recording) {
944 nativeSetAudioRecording(recording);
945 }
henrika5f6bf242017-11-01 11:06:56 +0100946
deadbeef5d0b6d82017-01-09 16:05:28 -0800947 public boolean setConfiguration(RTCConfiguration config) {
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +0100948 return nativeSetConfiguration(config);
deadbeef5d0b6d82017-01-09 16:05:28 -0800949 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950
951 public boolean addIceCandidate(IceCandidate candidate) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100952 return nativeAddIceCandidate(candidate.sdpMid, candidate.sdpMLineIndex, candidate.sdp);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 }
954
Yura Yaroshevich1cdeb0a2021-04-08 16:56:56 +0300955 public void addIceCandidate(IceCandidate candidate, AddIceObserver observer) {
956 nativeAddIceCandidateWithObserver(
957 candidate.sdpMid, candidate.sdpMLineIndex, candidate.sdp, observer);
958 }
959
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700960 public boolean removeIceCandidates(final IceCandidate[] candidates) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100961 return nativeRemoveIceCandidates(candidates);
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700962 }
963
Seth Hampsonc384e142018-03-06 15:47:10 -0800964 /**
965 * Adds a new MediaStream to be sent on this peer connection.
966 * Note: This method is not supported with SdpSemantics.UNIFIED_PLAN. Please
967 * use addTrack instead.
968 */
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:29 +0000969 public boolean addStream(MediaStream stream) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200970 boolean ret = nativeAddLocalStream(stream.getNativeMediaStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 if (!ret) {
972 return false;
973 }
974 localStreams.add(stream);
975 return true;
976 }
977
Seth Hampsonc384e142018-03-06 15:47:10 -0800978 /**
979 * Removes the given media stream from this peer connection.
980 * This method is not supported with SdpSemantics.UNIFIED_PLAN. Please use
981 * removeTrack instead.
982 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000983 public void removeStream(MediaStream stream) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200984 nativeRemoveLocalStream(stream.getNativeMediaStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985 localStreams.remove(stream);
986 }
987
deadbeef7a246882017-08-09 08:40:10 -0700988 /**
989 * Creates an RtpSender without a track.
Seth Hampsonc384e142018-03-06 15:47:10 -0800990 *
991 * <p>This method allows an application to cause the PeerConnection to negotiate
deadbeef7a246882017-08-09 08:40:10 -0700992 * sending/receiving a specific media type, but without having a track to
993 * send yet.
Seth Hampsonc384e142018-03-06 15:47:10 -0800994 *
995 * <p>When the application does want to begin sending a track, it can call
deadbeef7a246882017-08-09 08:40:10 -0700996 * RtpSender.setTrack, which doesn't require any additional SDP negotiation.
Seth Hampsonc384e142018-03-06 15:47:10 -0800997 *
998 * <p>Example use:
deadbeef7a246882017-08-09 08:40:10 -0700999 * <pre>
1000 * {@code
1001 * audioSender = pc.createSender("audio", "stream1");
1002 * videoSender = pc.createSender("video", "stream1");
1003 * // Do normal SDP offer/answer, which will kick off ICE/DTLS and negotiate
1004 * // media parameters....
1005 * // Later, when the endpoint is ready to actually begin sending:
1006 * audioSender.setTrack(audioTrack, false);
1007 * videoSender.setTrack(videoTrack, false);
1008 * }
1009 * </pre>
Seth Hampsonc384e142018-03-06 15:47:10 -08001010 * <p>Note: This corresponds most closely to "addTransceiver" in the official
deadbeef7a246882017-08-09 08:40:10 -07001011 * WebRTC API, in that it creates a sender without a track. It was
1012 * implemented before addTransceiver because it provides useful
1013 * functionality, and properly implementing transceivers would have required
1014 * a great deal more work.
1015 *
Seth Hampsonc384e142018-03-06 15:47:10 -08001016 * <p>Note: This is only available with SdpSemantics.PLAN_B specified. Please use
1017 * addTransceiver instead.
1018 *
deadbeef7a246882017-08-09 08:40:10 -07001019 * @param kind Corresponds to MediaStreamTrack kinds (must be "audio" or
1020 * "video").
1021 * @param stream_id The ID of the MediaStream that this sender's track will
1022 * be associated with when SDP is applied to the remote
1023 * PeerConnection. If createSender is used to create an
1024 * audio and video sender that should be synchronized, they
1025 * should use the same stream ID.
1026 * @return A new RtpSender object if successful, or null otherwise.
1027 */
deadbeefbd7d8f72015-12-18 16:58:44 -08001028 public RtpSender createSender(String kind, String stream_id) {
Seth Hampsonc384e142018-03-06 15:47:10 -08001029 RtpSender newSender = nativeCreateSender(kind, stream_id);
1030 if (newSender != null) {
1031 senders.add(newSender);
deadbeefee524f72015-12-02 11:27:40 -08001032 }
Seth Hampsonc384e142018-03-06 15:47:10 -08001033 return newSender;
deadbeefee524f72015-12-02 11:27:40 -08001034 }
1035
Seth Hampsonc384e142018-03-06 15:47:10 -08001036 /**
1037 * Gets all RtpSenders associated with this peer connection.
1038 * Note that calling getSenders will dispose of the senders previously
1039 * returned.
1040 */
deadbeef4139c0f2015-10-06 12:29:25 -07001041 public List<RtpSender> getSenders() {
1042 for (RtpSender sender : senders) {
1043 sender.dispose();
1044 }
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001045 senders = nativeGetSenders();
deadbeef4139c0f2015-10-06 12:29:25 -07001046 return Collections.unmodifiableList(senders);
1047 }
1048
Seth Hampsonc384e142018-03-06 15:47:10 -08001049 /**
1050 * Gets all RtpReceivers associated with this peer connection.
1051 * Note that calling getReceivers will dispose of the receivers previously
1052 * returned.
1053 */
deadbeef4139c0f2015-10-06 12:29:25 -07001054 public List<RtpReceiver> getReceivers() {
1055 for (RtpReceiver receiver : receivers) {
1056 receiver.dispose();
1057 }
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001058 receivers = nativeGetReceivers();
deadbeef4139c0f2015-10-06 12:29:25 -07001059 return Collections.unmodifiableList(receivers);
1060 }
1061
Seth Hampsonc384e142018-03-06 15:47:10 -08001062 /**
1063 * Gets all RtpTransceivers associated with this peer connection.
1064 * Note that calling getTransceivers will dispose of the transceivers previously
1065 * returned.
1066 * Note: This is only available with SdpSemantics.UNIFIED_PLAN specified.
1067 */
1068 public List<RtpTransceiver> getTransceivers() {
1069 for (RtpTransceiver transceiver : transceivers) {
1070 transceiver.dispose();
1071 }
1072 transceivers = nativeGetTransceivers();
1073 return Collections.unmodifiableList(transceivers);
1074 }
1075
1076 /**
1077 * Adds a new media stream track to be sent on this peer connection, and returns
1078 * the newly created RtpSender. If streamIds are specified, the RtpSender will
1079 * be associated with the streams specified in the streamIds list.
1080 *
1081 * @throws IllegalStateException if an error accors in C++ addTrack.
1082 * An error can occur if:
1083 * - A sender already exists for the track.
1084 * - The peer connection is closed.
1085 */
1086 public RtpSender addTrack(MediaStreamTrack track) {
1087 return addTrack(track, Collections.emptyList());
1088 }
1089
1090 public RtpSender addTrack(MediaStreamTrack track, List<String> streamIds) {
1091 if (track == null || streamIds == null) {
1092 throw new NullPointerException("No MediaStreamTrack specified in addTrack.");
1093 }
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001094 RtpSender newSender = nativeAddTrack(track.getNativeMediaStreamTrack(), streamIds);
Seth Hampsonc384e142018-03-06 15:47:10 -08001095 if (newSender == null) {
1096 throw new IllegalStateException("C++ addTrack failed.");
1097 }
1098 senders.add(newSender);
1099 return newSender;
1100 }
1101
1102 /**
1103 * Stops sending media from sender. The sender will still appear in getSenders. Future
1104 * calls to createOffer will mark the m section for the corresponding transceiver as
1105 * receive only or inactive, as defined in JSEP. Returns true on success.
1106 */
1107 public boolean removeTrack(RtpSender sender) {
1108 if (sender == null) {
1109 throw new NullPointerException("No RtpSender specified for removeTrack.");
1110 }
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001111 return nativeRemoveTrack(sender.getNativeRtpSender());
Seth Hampsonc384e142018-03-06 15:47:10 -08001112 }
1113
1114 /**
1115 * Creates a new RtpTransceiver and adds it to the set of transceivers. Adding a
1116 * transceiver will cause future calls to CreateOffer to add a media description
1117 * for the corresponding transceiver.
1118 *
Artem Titovd7ac5812021-07-27 12:23:39 +02001119 * <p>The initial value of `mid` in the returned transceiver is null. Setting a
Seth Hampsonc384e142018-03-06 15:47:10 -08001120 * new session description may change it to a non-null value.
1121 *
1122 * <p>https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtransceiver
1123 *
1124 * <p>If a MediaStreamTrack is specified then a transceiver will be added with a
1125 * sender set to transmit the given track. The kind
1126 * of the transceiver (and sender/receiver) will be derived from the kind of
1127 * the track.
1128 *
1129 * <p>If MediaType is specified then a transceiver will be added based upon that type.
1130 * This can be either MEDIA_TYPE_AUDIO or MEDIA_TYPE_VIDEO.
1131 *
1132 * <p>Optionally, an RtpTransceiverInit structure can be specified to configure
1133 * the transceiver from construction. If not specified, the transceiver will
1134 * default to having a direction of kSendRecv and not be part of any streams.
1135 *
1136 * <p>Note: These methods are only available with SdpSemantics.UNIFIED_PLAN specified.
1137 * @throws IllegalStateException if an error accors in C++ addTransceiver
1138 */
1139 public RtpTransceiver addTransceiver(MediaStreamTrack track) {
1140 return addTransceiver(track, new RtpTransceiver.RtpTransceiverInit());
1141 }
1142
1143 public RtpTransceiver addTransceiver(
Sami Kalliomäkie7592d82018-03-22 13:32:44 +01001144 MediaStreamTrack track, @Nullable RtpTransceiver.RtpTransceiverInit init) {
Seth Hampsonc384e142018-03-06 15:47:10 -08001145 if (track == null) {
1146 throw new NullPointerException("No MediaStreamTrack specified for addTransceiver.");
1147 }
1148 if (init == null) {
1149 init = new RtpTransceiver.RtpTransceiverInit();
1150 }
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001151 RtpTransceiver newTransceiver =
1152 nativeAddTransceiverWithTrack(track.getNativeMediaStreamTrack(), init);
Seth Hampsonc384e142018-03-06 15:47:10 -08001153 if (newTransceiver == null) {
1154 throw new IllegalStateException("C++ addTransceiver failed.");
1155 }
1156 transceivers.add(newTransceiver);
1157 return newTransceiver;
1158 }
1159
1160 public RtpTransceiver addTransceiver(MediaStreamTrack.MediaType mediaType) {
1161 return addTransceiver(mediaType, new RtpTransceiver.RtpTransceiverInit());
1162 }
1163
1164 public RtpTransceiver addTransceiver(
Sami Kalliomäkie7592d82018-03-22 13:32:44 +01001165 MediaStreamTrack.MediaType mediaType, @Nullable RtpTransceiver.RtpTransceiverInit init) {
Seth Hampsonc384e142018-03-06 15:47:10 -08001166 if (mediaType == null) {
1167 throw new NullPointerException("No MediaType specified for addTransceiver.");
1168 }
1169 if (init == null) {
1170 init = new RtpTransceiver.RtpTransceiverInit();
1171 }
1172 RtpTransceiver newTransceiver = nativeAddTransceiverOfType(mediaType, init);
1173 if (newTransceiver == null) {
1174 throw new IllegalStateException("C++ addTransceiver failed.");
1175 }
1176 transceivers.add(newTransceiver);
1177 return newTransceiver;
1178 }
1179
deadbeef82215872017-04-18 10:27:51 -07001180 // Older, non-standard implementation of getStats.
1181 @Deprecated
Sami Kalliomäkie7592d82018-03-22 13:32:44 +01001182 public boolean getStats(StatsObserver observer, @Nullable MediaStreamTrack track) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001183 return nativeOldGetStats(observer, (track == null) ? 0 : track.getNativeMediaStreamTrack());
deadbeef82215872017-04-18 10:27:51 -07001184 }
1185
Seth Hampsonc384e142018-03-06 15:47:10 -08001186 /**
1187 * Gets stats using the new stats collection API, see webrtc/api/stats/. These
1188 * will replace old stats collection API when the new API has matured enough.
1189 */
deadbeef82215872017-04-18 10:27:51 -07001190 public void getStats(RTCStatsCollectorCallback callback) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001191 nativeNewGetStats(callback);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 }
1193
Seth Hampsonc384e142018-03-06 15:47:10 -08001194 /**
1195 * Limits the bandwidth allocated for all RTP streams sent by this
1196 * PeerConnection. Pass null to leave a value unchanged.
1197 */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001198 public boolean setBitrate(Integer min, Integer current, Integer max) {
1199 return nativeSetBitrate(min, current, max);
1200 }
zsteind89b0bc2017-08-03 11:11:40 -07001201
Seth Hampsonc384e142018-03-06 15:47:10 -08001202 /**
1203 * Starts recording an RTC event log.
1204 *
1205 * Ownership of the file is transfered to the native code. If an RTC event
1206 * log is already being recorded, it will be stopped and a new one will start
1207 * using the provided file. Logging will continue until the stopRtcEventLog
1208 * function is called. The max_size_bytes argument is ignored, it is added
1209 * for future use.
1210 */
ivoc0c6f0f62016-07-06 04:34:23 -07001211 public boolean startRtcEventLog(int file_descriptor, int max_size_bytes) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001212 return nativeStartRtcEventLog(file_descriptor, max_size_bytes);
ivoc14d5dbe2016-07-04 07:06:55 -07001213 }
1214
Seth Hampsonc384e142018-03-06 15:47:10 -08001215 /**
1216 * Stops recording an RTC event log. If no RTC event log is currently being
1217 * recorded, this call will have no effect.
1218 */
ivoc14d5dbe2016-07-04 07:06:55 -07001219 public void stopRtcEventLog() {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001220 nativeStopRtcEventLog();
ivoc14d5dbe2016-07-04 07:06:55 -07001221 }
1222
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001223 // TODO(fischman): add support for DTMF-related methods once that API
1224 // stabilizes.
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001225 public SignalingState signalingState() {
1226 return nativeSignalingState();
1227 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001229 public IceConnectionState iceConnectionState() {
1230 return nativeIceConnectionState();
1231 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232
Jonas Olssonf01d8c82018-11-08 15:19:04 +01001233 public PeerConnectionState connectionState() {
1234 return nativeConnectionState();
1235 }
1236
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001237 public IceGatheringState iceGatheringState() {
1238 return nativeIceGatheringState();
1239 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001241 public void close() {
1242 nativeClose();
1243 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001244
deadbeef43697f62017-09-12 10:52:14 -07001245 /**
1246 * Free native resources associated with this PeerConnection instance.
Seth Hampsonc384e142018-03-06 15:47:10 -08001247 *
deadbeef43697f62017-09-12 10:52:14 -07001248 * This method removes a reference count from the C++ PeerConnection object,
1249 * which should result in it being destroyed. It also calls equivalent
1250 * "dispose" methods on the Java objects attached to this PeerConnection
1251 * (streams, senders, receivers), such that their associated C++ objects
1252 * will also be destroyed.
Seth Hampsonc384e142018-03-06 15:47:10 -08001253 *
1254 * <p>Note that this method cannot be safely called from an observer callback
deadbeef43697f62017-09-12 10:52:14 -07001255 * (PeerConnection.Observer, DataChannel.Observer, etc.). If you want to, for
1256 * example, destroy the PeerConnection after an "ICE failed" callback, you
1257 * must do this asynchronously (in other words, unwind the stack first). See
1258 * <a href="https://bugs.chromium.org/p/webrtc/issues/detail?id=3721">bug
1259 * 3721</a> for more details.
1260 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261 public void dispose() {
1262 close();
1263 for (MediaStream stream : localStreams) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001264 nativeRemoveLocalStream(stream.getNativeMediaStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 stream.dispose();
1266 }
1267 localStreams.clear();
deadbeef4139c0f2015-10-06 12:29:25 -07001268 for (RtpSender sender : senders) {
1269 sender.dispose();
1270 }
1271 senders.clear();
1272 for (RtpReceiver receiver : receivers) {
1273 receiver.dispose();
1274 }
Seth Hampsonc384e142018-03-06 15:47:10 -08001275 for (RtpTransceiver transceiver : transceivers) {
1276 transceiver.dispose();
1277 }
1278 transceivers.clear();
deadbeef4139c0f2015-10-06 12:29:25 -07001279 receivers.clear();
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001280 nativeFreeOwnedPeerConnection(nativePeerConnection);
1281 }
1282
1283 /** Returns a pointer to the native webrtc::PeerConnectionInterface. */
1284 public long getNativePeerConnection() {
1285 return nativeGetNativePeerConnection();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001286 }
1287
Magnus Jedvert9060eb12017-12-12 12:52:54 +01001288 @CalledByNative
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001289 long getNativeOwnedPeerConnection() {
Magnus Jedvert9060eb12017-12-12 12:52:54 +01001290 return nativePeerConnection;
1291 }
1292
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001293 public static long createNativePeerConnectionObserver(Observer observer) {
1294 return nativeCreatePeerConnectionObserver(observer);
1295 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001297 private native long nativeGetNativePeerConnection();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001298 private native SessionDescription nativeGetLocalDescription();
1299 private native SessionDescription nativeGetRemoteDescription();
Michael Iedema02137862018-10-09 15:30:01 +02001300 private native RtcCertificatePem nativeGetCertificate();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001301 private native DataChannel nativeCreateDataChannel(String label, DataChannel.Init init);
1302 private native void nativeCreateOffer(SdpObserver observer, MediaConstraints constraints);
1303 private native void nativeCreateAnswer(SdpObserver observer, MediaConstraints constraints);
Yura Yaroshevich4e9e7232021-03-22 11:45:43 +03001304 private native void nativeSetLocalDescriptionAutomatically(SdpObserver observer);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001305 private native void nativeSetLocalDescription(SdpObserver observer, SessionDescription sdp);
1306 private native void nativeSetRemoteDescription(SdpObserver observer, SessionDescription sdp);
Yura Yaroshevichd8d9ac32021-03-22 12:46:47 +03001307 private native void nativeRestartIce();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001308 private native void nativeSetAudioPlayout(boolean playout);
1309 private native void nativeSetAudioRecording(boolean recording);
1310 private native boolean nativeSetBitrate(Integer min, Integer current, Integer max);
1311 private native SignalingState nativeSignalingState();
1312 private native IceConnectionState nativeIceConnectionState();
Jonas Olssonf01d8c82018-11-08 15:19:04 +01001313 private native PeerConnectionState nativeConnectionState();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001314 private native IceGatheringState nativeIceGatheringState();
1315 private native void nativeClose();
1316 private static native long nativeCreatePeerConnectionObserver(Observer observer);
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001317 private static native void nativeFreeOwnedPeerConnection(long ownedPeerConnection);
1318 private native boolean nativeSetConfiguration(RTCConfiguration config);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001319 private native boolean nativeAddIceCandidate(
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 String sdpMid, int sdpMLineIndex, String iceCandidateSdp);
Yura Yaroshevich1cdeb0a2021-04-08 16:56:56 +03001321 private native void nativeAddIceCandidateWithObserver(
1322 String sdpMid, int sdpMLineIndex, String iceCandidateSdp, AddIceObserver observer);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001323 private native boolean nativeRemoveIceCandidates(final IceCandidate[] candidates);
1324 private native boolean nativeAddLocalStream(long stream);
1325 private native void nativeRemoveLocalStream(long stream);
1326 private native boolean nativeOldGetStats(StatsObserver observer, long nativeTrack);
1327 private native void nativeNewGetStats(RTCStatsCollectorCallback callback);
1328 private native RtpSender nativeCreateSender(String kind, String stream_id);
1329 private native List<RtpSender> nativeGetSenders();
1330 private native List<RtpReceiver> nativeGetReceivers();
Seth Hampsonc384e142018-03-06 15:47:10 -08001331 private native List<RtpTransceiver> nativeGetTransceivers();
1332 private native RtpSender nativeAddTrack(long track, List<String> streamIds);
1333 private native boolean nativeRemoveTrack(long sender);
1334 private native RtpTransceiver nativeAddTransceiverWithTrack(
1335 long track, RtpTransceiver.RtpTransceiverInit init);
1336 private native RtpTransceiver nativeAddTransceiverOfType(
1337 MediaStreamTrack.MediaType mediaType, RtpTransceiver.RtpTransceiverInit init);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001338 private native boolean nativeStartRtcEventLog(int file_descriptor, int max_size_bytes);
1339 private native void nativeStopRtcEventLog();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340}