blob: bf5a73482bf0c16aa54607dc412134eb8fe8e103 [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
Artem Titarenko69540f42018-12-10 12:30:46 +010013import android.support.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
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700121 /** Triggered when some ICE candidates have been removed. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100122 @CalledByNative("Observer") void onIceCandidatesRemoved(IceCandidate[] candidates);
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700123
Alex Drake43faee02019-08-12 16:27:34 -0700124 /** Triggered when the ICE candidate pair is changed. */
125 @CalledByNative("Observer")
126 default void onSelectedCandidatePairChanged(CandidatePairChangeEvent event) {}
127
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 /** Triggered when media is received on a new stream from remote peer. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100129 @CalledByNative("Observer") void onAddStream(MediaStream stream);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130
131 /** Triggered when a remote peer close a stream. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100132 @CalledByNative("Observer") void onRemoveStream(MediaStream stream);
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000133
134 /** Triggered when a remote peer opens a DataChannel. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100135 @CalledByNative("Observer") void onDataChannel(DataChannel dataChannel);
fischman@webrtc.orgd7568a02014-01-13 22:04:12 +0000136
137 /** Triggered when renegotiation is necessary. */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100138 @CalledByNative("Observer") void onRenegotiationNeeded();
zhihuangdcccda72016-12-21 14:08:03 -0800139
140 /**
141 * Triggered when a new track is signaled by the remote peer, as a result of
142 * setRemoteDescription.
143 */
Magnus Jedvertba700f62017-12-04 13:43:27 +0100144 @CalledByNative("Observer") void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams);
Seth Hampson31dbc242018-05-07 09:28:19 -0700145
146 /**
147 * Triggered when the signaling from SetRemoteDescription indicates that a transceiver
148 * will be receiving media from a remote endpoint. This is only called if UNIFIED_PLAN
149 * semantics are specified. The transceiver will be disposed automatically.
150 */
151 @CalledByNative("Observer") default void onTrack(RtpTransceiver transceiver){};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 }
153
154 /** Java version of PeerConnectionInterface.IceServer. */
155 public static class IceServer {
Emad Omaradab1d2d2017-06-16 15:43:11 -0700156 // List of URIs associated with this server. Valid formats are described
157 // in RFC7064 and RFC7065, and more may be added in the future. The "host"
158 // part of the URI may contain either an IP address or a hostname.
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700159 @Deprecated public final String uri;
160 public final List<String> urls;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000161 public final String username;
162 public final String password;
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000163 public final TlsCertPolicy tlsCertPolicy;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000164
Emad Omaradab1d2d2017-06-16 15:43:11 -0700165 // If the URIs in |urls| only contain IP addresses, this field can be used
166 // to indicate the hostname, which may be necessary for TLS (using the SNI
167 // extension). If |urls| itself contains the hostname, this isn't
168 // necessary.
169 public final String hostname;
170
Diogo Real1dca9d52017-08-29 12:18:32 -0700171 // List of protocols to be used in the TLS ALPN extension.
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000172 public final List<String> tlsAlpnProtocols;
Diogo Real1dca9d52017-08-29 12:18:32 -0700173
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700174 // List of elliptic curves to be used in the TLS elliptic curves extension.
175 // Only curve names supported by OpenSSL should be used (eg. "P-256","X25519").
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000176 public final List<String> tlsEllipticCurves;
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700177
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178 /** Convenience constructor for STUN servers. */
Diogo Real05ea2b32017-08-31 00:12:58 -0700179 @Deprecated
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000180 public IceServer(String uri) {
181 this(uri, "", "");
182 }
183
Diogo Real05ea2b32017-08-31 00:12:58 -0700184 @Deprecated
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 public IceServer(String uri, String username, String password) {
hnsl04833622017-01-09 08:35:45 -0800186 this(uri, username, password, TlsCertPolicy.TLS_CERT_POLICY_SECURE);
187 }
188
Diogo Real05ea2b32017-08-31 00:12:58 -0700189 @Deprecated
hnsl04833622017-01-09 08:35:45 -0800190 public IceServer(String uri, String username, String password, TlsCertPolicy tlsCertPolicy) {
Emad Omaradab1d2d2017-06-16 15:43:11 -0700191 this(uri, username, password, tlsCertPolicy, "");
192 }
193
Diogo Real05ea2b32017-08-31 00:12:58 -0700194 @Deprecated
Emad Omaradab1d2d2017-06-16 15:43:11 -0700195 public IceServer(String uri, String username, String password, TlsCertPolicy tlsCertPolicy,
196 String hostname) {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700197 this(uri, Collections.singletonList(uri), username, password, tlsCertPolicy, hostname, null,
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000198 null);
Diogo Real1dca9d52017-08-29 12:18:32 -0700199 }
200
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700201 private IceServer(String uri, List<String> urls, String username, String password,
202 TlsCertPolicy tlsCertPolicy, String hostname, List<String> tlsAlpnProtocols,
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000203 List<String> tlsEllipticCurves) {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700204 if (uri == null || urls == null || urls.isEmpty()) {
205 throw new IllegalArgumentException("uri == null || urls == null || urls.isEmpty()");
206 }
207 for (String it : urls) {
208 if (it == null) {
209 throw new IllegalArgumentException("urls element is null: " + urls);
210 }
211 }
212 if (username == null) {
213 throw new IllegalArgumentException("username == null");
214 }
215 if (password == null) {
216 throw new IllegalArgumentException("password == null");
217 }
218 if (hostname == null) {
219 throw new IllegalArgumentException("hostname == null");
220 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000221 this.uri = uri;
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700222 this.urls = urls;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000223 this.username = username;
224 this.password = password;
hnsl04833622017-01-09 08:35:45 -0800225 this.tlsCertPolicy = tlsCertPolicy;
Emad Omaradab1d2d2017-06-16 15:43:11 -0700226 this.hostname = hostname;
Diogo Real1dca9d52017-08-29 12:18:32 -0700227 this.tlsAlpnProtocols = tlsAlpnProtocols;
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700228 this.tlsEllipticCurves = tlsEllipticCurves;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 }
230
Sami Kalliomäkibde473e2017-10-30 13:34:41 +0100231 @Override
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 public String toString() {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700233 return urls + " [" + username + ":" + password + "] [" + tlsCertPolicy + "] [" + hostname
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000234 + "] [" + tlsAlpnProtocols + "] [" + tlsEllipticCurves + "]";
Diogo Real1dca9d52017-08-29 12:18:32 -0700235 }
236
Qingsi Wanga0d45802019-01-15 13:33:11 -0800237 @Override
238 public boolean equals(@Nullable Object obj) {
239 if (obj == null) {
240 return false;
241 }
242 if (obj == this) {
243 return true;
244 }
245 if (!(obj instanceof IceServer)) {
246 return false;
247 }
248 IceServer other = (IceServer) obj;
249 return (uri.equals(other.uri) && urls.equals(other.urls) && username.equals(other.username)
250 && password.equals(other.password) && tlsCertPolicy.equals(other.tlsCertPolicy)
251 && hostname.equals(other.hostname) && tlsAlpnProtocols.equals(other.tlsAlpnProtocols)
252 && tlsEllipticCurves.equals(other.tlsEllipticCurves));
253 }
254
255 @Override
256 public int hashCode() {
257 Object[] values = {uri, urls, username, password, tlsCertPolicy, hostname, tlsAlpnProtocols,
258 tlsEllipticCurves};
259 return Arrays.hashCode(values);
260 }
261
Diogo Real1dca9d52017-08-29 12:18:32 -0700262 public static Builder builder(String uri) {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700263 return new Builder(Collections.singletonList(uri));
264 }
265
266 public static Builder builder(List<String> urls) {
267 return new Builder(urls);
Diogo Real1dca9d52017-08-29 12:18:32 -0700268 }
269
270 public static class Builder {
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100271 @Nullable private final List<String> urls;
Diogo Real1dca9d52017-08-29 12:18:32 -0700272 private String username = "";
273 private String password = "";
274 private TlsCertPolicy tlsCertPolicy = TlsCertPolicy.TLS_CERT_POLICY_SECURE;
275 private String hostname = "";
276 private List<String> tlsAlpnProtocols;
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700277 private List<String> tlsEllipticCurves;
Diogo Real1dca9d52017-08-29 12:18:32 -0700278
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700279 private Builder(List<String> urls) {
280 if (urls == null || urls.isEmpty()) {
281 throw new IllegalArgumentException("urls == null || urls.isEmpty(): " + urls);
282 }
283 this.urls = urls;
Diogo Real1dca9d52017-08-29 12:18:32 -0700284 }
285
286 public Builder setUsername(String username) {
287 this.username = username;
288 return this;
289 }
290
291 public Builder setPassword(String password) {
292 this.password = password;
293 return this;
294 }
295
296 public Builder setTlsCertPolicy(TlsCertPolicy tlsCertPolicy) {
297 this.tlsCertPolicy = tlsCertPolicy;
298 return this;
299 }
300
301 public Builder setHostname(String hostname) {
302 this.hostname = hostname;
303 return this;
304 }
305
306 public Builder setTlsAlpnProtocols(List<String> tlsAlpnProtocols) {
307 this.tlsAlpnProtocols = tlsAlpnProtocols;
308 return this;
309 }
310
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700311 public Builder setTlsEllipticCurves(List<String> tlsEllipticCurves) {
312 this.tlsEllipticCurves = tlsEllipticCurves;
313 return this;
314 }
315
Diogo Real1dca9d52017-08-29 12:18:32 -0700316 public IceServer createIceServer() {
korniltsev.anatoly0ea03102017-09-11 06:41:38 -0700317 return new IceServer(urls.get(0), urls, username, password, tlsCertPolicy, hostname,
Sergey Silkin9c147dd2018-09-12 10:45:38 +0000318 tlsAlpnProtocols, tlsEllipticCurves);
Diogo Real1dca9d52017-08-29 12:18:32 -0700319 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320 }
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100321
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100322 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100323 @CalledByNative("IceServer")
324 List<String> getUrls() {
325 return urls;
326 }
327
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100328 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100329 @CalledByNative("IceServer")
330 String getUsername() {
331 return username;
332 }
333
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100334 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100335 @CalledByNative("IceServer")
336 String getPassword() {
337 return password;
338 }
339
340 @CalledByNative("IceServer")
341 TlsCertPolicy getTlsCertPolicy() {
342 return tlsCertPolicy;
343 }
344
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100345 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100346 @CalledByNative("IceServer")
347 String getHostname() {
348 return hostname;
349 }
350
351 @CalledByNative("IceServer")
352 List<String> getTlsAlpnProtocols() {
353 return tlsAlpnProtocols;
354 }
355
356 @CalledByNative("IceServer")
357 List<String> getTlsEllipticCurves() {
358 return tlsEllipticCurves;
359 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 }
361
Jiayang Liucac1b382015-04-30 12:35:24 -0700362 /** Java version of PeerConnectionInterface.IceTransportsType */
sakalb6760f92016-09-29 04:12:44 -0700363 public enum IceTransportsType { NONE, RELAY, NOHOST, ALL }
Jiayang Liucac1b382015-04-30 12:35:24 -0700364
365 /** Java version of PeerConnectionInterface.BundlePolicy */
sakalb6760f92016-09-29 04:12:44 -0700366 public enum BundlePolicy { BALANCED, MAXBUNDLE, MAXCOMPAT }
Jiayang Liucac1b382015-04-30 12:35:24 -0700367
Peter Thatcheraf55ccc2015-05-21 07:48:41 -0700368 /** Java version of PeerConnectionInterface.RtcpMuxPolicy */
sakalb6760f92016-09-29 04:12:44 -0700369 public enum RtcpMuxPolicy { NEGOTIATE, REQUIRE }
glaznev97579a42015-09-01 11:31:27 -0700370
Peter Thatcheraf55ccc2015-05-21 07:48:41 -0700371 /** Java version of PeerConnectionInterface.TcpCandidatePolicy */
sakalb6760f92016-09-29 04:12:44 -0700372 public enum TcpCandidatePolicy { ENABLED, DISABLED }
Jiayang Liucac1b382015-04-30 12:35:24 -0700373
honghaiz60347052016-05-31 18:29:12 -0700374 /** Java version of PeerConnectionInterface.CandidateNetworkPolicy */
sakalb6760f92016-09-29 04:12:44 -0700375 public enum CandidateNetworkPolicy { ALL, LOW_COST }
honghaiz60347052016-05-31 18:29:12 -0700376
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800377 // Keep in sync with webrtc/rtc_base/network_constants.h.
378 public enum AdapterType {
Alex Drake68c2a562019-08-13 15:56:07 -0700379 UNKNOWN(0),
380 ETHERNET(1 << 0),
381 WIFI(1 << 1),
382 CELLULAR(1 << 2),
383 VPN(1 << 3),
384 LOOPBACK(1 << 4),
385 ADAPTER_TYPE_ANY(1 << 5);
386
387 public final Integer bitMask;
388 private AdapterType(Integer bitMask) {
389 this.bitMask = bitMask;
390 }
391 private static final Map<Integer, AdapterType> BY_BITMASK = new HashMap<>();
392 static {
393 for (AdapterType t : values()) {
394 BY_BITMASK.put(t.bitMask, t);
395 }
396 }
397
Yves Gerey29e07e52019-11-19 12:13:25 +0100398 @Nullable
Alex Drake68c2a562019-08-13 15:56:07 -0700399 @CalledByNative("AdapterType")
400 static AdapterType fromNativeIndex(int nativeIndex) {
401 return BY_BITMASK.get(nativeIndex);
402 }
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800403 }
404
glaznev97579a42015-09-01 11:31:27 -0700405 /** Java version of rtc::KeyType */
sakalb6760f92016-09-29 04:12:44 -0700406 public enum KeyType { RSA, ECDSA }
glaznev97579a42015-09-01 11:31:27 -0700407
honghaiz1f429e32015-09-28 07:57:34 -0700408 /** Java version of PeerConnectionInterface.ContinualGatheringPolicy */
sakalb6760f92016-09-29 04:12:44 -0700409 public enum ContinualGatheringPolicy { GATHER_ONCE, GATHER_CONTINUALLY }
honghaiz1f429e32015-09-28 07:57:34 -0700410
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700411 /** Java version of webrtc::PortPrunePolicy */
412 public enum PortPrunePolicy {
413 NO_PRUNE, // Do not prune turn port.
414 PRUNE_BASED_ON_PRIORITY, // Prune turn port based the priority on the same network
415 KEEP_FIRST_READY // Keep the first ready port and prune the rest on the same network.
416 }
417
Steve Antond960a0c2017-07-17 12:33:07 -0700418 /** Java version of rtc::IntervalRange */
419 public static class IntervalRange {
420 private final int min;
421 private final int max;
422
423 public IntervalRange(int min, int max) {
424 this.min = min;
425 this.max = max;
426 }
427
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100428 @CalledByNative("IntervalRange")
Steve Antond960a0c2017-07-17 12:33:07 -0700429 public int getMin() {
430 return min;
431 }
432
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100433 @CalledByNative("IntervalRange")
Steve Antond960a0c2017-07-17 12:33:07 -0700434 public int getMax() {
435 return max;
436 }
437 }
438
Seth Hampsonc384e142018-03-06 15:47:10 -0800439 /**
440 * Java version of webrtc::SdpSemantics.
441 *
442 * Configure the SDP semantics used by this PeerConnection. Note that the
443 * WebRTC 1.0 specification requires UNIFIED_PLAN semantics. The
444 * RtpTransceiver API is only available with UNIFIED_PLAN semantics.
445 *
446 * <p>PLAN_B will cause PeerConnection to create offers and answers with at
447 * most one audio and one video m= section with multiple RtpSenders and
448 * RtpReceivers specified as multiple a=ssrc lines within the section. This
449 * will also cause PeerConnection to ignore all but the first m= section of
450 * the same media type.
451 *
452 * <p>UNIFIED_PLAN will cause PeerConnection to create offers and answers with
453 * multiple m= sections where each m= section maps to one RtpSender and one
454 * RtpReceiver (an RtpTransceiver), either both audio or both video. This
455 * will also cause PeerConnection to ignore all but the first a=ssrc lines
456 * that form a Plan B stream.
457 *
458 * <p>For users who wish to send multiple audio/video streams and need to stay
459 * interoperable with legacy WebRTC implementations, specify PLAN_B.
460 *
461 * <p>For users who wish to send multiple audio/video streams and/or wish to
462 * use the new RtpTransceiver API, specify UNIFIED_PLAN.
463 */
464 public enum SdpSemantics { PLAN_B, UNIFIED_PLAN }
465
Jiayang Liucac1b382015-04-30 12:35:24 -0700466 /** Java version of PeerConnectionInterface.RTCConfiguration */
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800467 // TODO(qingsi): Resolve the naming inconsistency of fields with/without units.
Jiayang Liucac1b382015-04-30 12:35:24 -0700468 public static class RTCConfiguration {
469 public IceTransportsType iceTransportsType;
470 public List<IceServer> iceServers;
471 public BundlePolicy bundlePolicy;
Michael Iedema02137862018-10-09 15:30:01 +0200472 @Nullable public RtcCertificatePem certificate;
Peter Thatcheraf55ccc2015-05-21 07:48:41 -0700473 public RtcpMuxPolicy rtcpMuxPolicy;
Jiayang Liucac1b382015-04-30 12:35:24 -0700474 public TcpCandidatePolicy tcpCandidatePolicy;
honghaiz60347052016-05-31 18:29:12 -0700475 public CandidateNetworkPolicy candidateNetworkPolicy;
Henrik Lundin64dad832015-05-11 12:44:23 +0200476 public int audioJitterBufferMaxPackets;
Henrik Lundin5263b3c2015-06-01 10:29:41 +0200477 public boolean audioJitterBufferFastAccelerate;
honghaiz4edc39c2015-09-01 09:53:56 -0700478 public int iceConnectionReceivingTimeout;
Honghai Zhang381b4212015-12-04 12:24:03 -0800479 public int iceBackupCandidatePairPingInterval;
glaznev97579a42015-09-01 11:31:27 -0700480 public KeyType keyType;
honghaiz1f429e32015-09-28 07:57:34 -0700481 public ContinualGatheringPolicy continualGatheringPolicy;
deadbeefbe0c96f2016-05-18 16:20:14 -0700482 public int iceCandidatePoolSize;
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700483 @Deprecated // by the turnPortPrunePolicy. See bugs.webrtc.org/11026
Honghai Zhangd78ecf72016-07-01 14:40:40 -0700484 public boolean pruneTurnPorts;
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700485 public PortPrunePolicy turnPortPrunePolicy;
Taylor Brandstettere9851112016-07-01 11:11:13 -0700486 public boolean presumeWritableWhenFullyRelayed;
Qingsi Wang1fe119f2019-05-31 16:55:33 -0700487 public boolean surfaceIceCandidatesOnIceTransportTypeChanged;
Qingsi Wange6826d22018-03-08 14:55:14 -0800488 // The following fields define intervals in milliseconds at which ICE
489 // connectivity checks are sent.
490 //
491 // We consider ICE is "strongly connected" for an agent when there is at
492 // least one candidate pair that currently succeeds in connectivity check
493 // from its direction i.e. sending a ping and receives a ping response, AND
494 // all candidate pairs have sent a minimum number of pings for connectivity
495 // (this number is implementation-specific). Otherwise, ICE is considered in
496 // "weak connectivity".
497 //
498 // Note that the above notion of strong and weak connectivity is not defined
499 // in RFC 5245, and they apply to our current ICE implementation only.
500 //
501 // 1) iceCheckIntervalStrongConnectivityMs defines the interval applied to
502 // ALL candidate pairs when ICE is strongly connected,
503 // 2) iceCheckIntervalWeakConnectivityMs defines the counterpart for ALL
504 // pairs when ICE is weakly connected, and
505 // 3) iceCheckMinInterval defines the minimal interval (equivalently the
506 // maximum rate) that overrides the above two intervals when either of them
507 // is less.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100508 @Nullable public Integer iceCheckIntervalStrongConnectivityMs;
509 @Nullable public Integer iceCheckIntervalWeakConnectivityMs;
510 @Nullable public Integer iceCheckMinInterval;
Qingsi Wang22e623a2018-03-13 10:53:57 -0700511 // The time period in milliseconds for which a candidate pair must wait for response to
512 // connectivitiy checks before it becomes unwritable.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100513 @Nullable public Integer iceUnwritableTimeMs;
Qingsi Wang22e623a2018-03-13 10:53:57 -0700514 // The minimum number of connectivity checks that a candidate pair must sent without receiving
515 // response before it becomes unwritable.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100516 @Nullable public Integer iceUnwritableMinChecks;
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800517 // The interval in milliseconds at which STUN candidates will resend STUN binding requests
518 // to keep NAT bindings open.
519 // The default value in the implementation is used if this field is null.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100520 @Nullable public Integer stunCandidateKeepaliveIntervalMs;
zhihuangb09b3f92017-03-07 14:40:51 -0800521 public boolean disableIPv6OnWifi;
deadbeef28e29192017-07-27 09:14:38 -0700522 // By default, PeerConnection will use a limited number of IPv6 network
523 // interfaces, in order to avoid too many ICE candidate pairs being created
524 // and delaying ICE completion.
525 //
526 // Can be set to Integer.MAX_VALUE to effectively disable the limit.
527 public int maxIPv6Networks;
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100528 @Nullable public IntervalRange iceRegatherIntervalRange;
Jiayang Liucac1b382015-04-30 12:35:24 -0700529
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100530 // These values will be overridden by MediaStream constraints if deprecated constraints-based
531 // create peerconnection interface is used.
532 public boolean disableIpv6;
533 public boolean enableDscp;
534 public boolean enableCpuOveruseDetection;
535 public boolean enableRtpDataChannel;
536 public boolean suspendBelowMinBitrate;
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100537 @Nullable public Integer screencastMinBitrate;
538 @Nullable public Boolean combinedAudioVideoBwe;
539 @Nullable public Boolean enableDtlsSrtp;
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800540 // Use "Unknown" to represent no preference of adapter types, not the
541 // preference of adapters of unknown types.
542 public AdapterType networkPreference;
Seth Hampsonc384e142018-03-06 15:47:10 -0800543 public SdpSemantics sdpSemantics;
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100544
Jonas Orelandbdcee282017-10-10 14:01:40 +0200545 // This is an optional wrapper for the C++ webrtc::TurnCustomizer.
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100546 @Nullable public TurnCustomizer turnCustomizer;
Jonas Orelandbdcee282017-10-10 14:01:40 +0200547
Zhi Huangb57e1692018-06-12 11:41:11 -0700548 // Actively reset the SRTP parameters whenever the DTLS transports underneath are reset for
549 // every offer/answer negotiation.This is only intended to be a workaround for crbug.com/835958
550 public boolean activeResetSrtpParams;
551
philipel16cec3b2019-10-25 12:23:02 +0200552 // Whether this client is allowed to switch encoding codec mid-stream. This is a workaround for
553 // a WebRTC bug where the receiver could get confussed if a codec switch happened mid-call.
554 // Null indicates no change to currently configured value.
555 @Nullable public Boolean allowCodecSwitching;
556
Piotr (Peter) Slatala09beff22018-10-17 07:22:40 -0700557 /*
558 * Experimental flag that enables a use of media transport. If this is true, the media transport
559 * factory MUST be provided to the PeerConnectionFactory.
560 */
561 public boolean useMediaTransport;
562
Bjorn Mellema9bbd862018-11-02 09:07:48 -0700563 /*
564 * Experimental flag that enables a use of media transport for data channels. If this is true,
565 * the media transport factory MUST be provided to the PeerConnectionFactory.
566 */
567 public boolean useMediaTransportForDataChannels;
568
Benjamin Wright8c27cca2018-10-25 10:16:44 -0700569 /**
570 * Defines advanced optional cryptographic settings related to SRTP and
571 * frame encryption for native WebRTC. Setting this will overwrite any
572 * options set through the PeerConnectionFactory (which is deprecated).
573 */
574 @Nullable public CryptoOptions cryptoOptions;
575
Jonas Oreland228900f2019-08-28 09:08:58 +0200576 /**
577 * An optional string that if set will be attached to the
578 * TURN_ALLOCATE_REQUEST which can be used to correlate client
579 * logs with backend logs
580 */
581 @Nullable public String turnLoggingId;
582
deadbeef28e29192017-07-27 09:14:38 -0700583 // TODO(deadbeef): Instead of duplicating the defaults here, we should do
584 // something to pick up the defaults from C++. The Objective-C equivalent
585 // of RTCConfiguration does that.
Jiayang Liucac1b382015-04-30 12:35:24 -0700586 public RTCConfiguration(List<IceServer> iceServers) {
587 iceTransportsType = IceTransportsType.ALL;
588 bundlePolicy = BundlePolicy.BALANCED;
zhihuang4dfb8ce2016-11-23 10:30:12 -0800589 rtcpMuxPolicy = RtcpMuxPolicy.REQUIRE;
Jiayang Liucac1b382015-04-30 12:35:24 -0700590 tcpCandidatePolicy = TcpCandidatePolicy.ENABLED;
Sami Kalliomäki9828beb2017-10-26 16:21:22 +0200591 candidateNetworkPolicy = CandidateNetworkPolicy.ALL;
Jiayang Liucac1b382015-04-30 12:35:24 -0700592 this.iceServers = iceServers;
Henrik Lundin64dad832015-05-11 12:44:23 +0200593 audioJitterBufferMaxPackets = 50;
Henrik Lundin5263b3c2015-06-01 10:29:41 +0200594 audioJitterBufferFastAccelerate = false;
honghaiz4edc39c2015-09-01 09:53:56 -0700595 iceConnectionReceivingTimeout = -1;
Honghai Zhang381b4212015-12-04 12:24:03 -0800596 iceBackupCandidatePairPingInterval = -1;
glaznev97579a42015-09-01 11:31:27 -0700597 keyType = KeyType.ECDSA;
honghaiz1f429e32015-09-28 07:57:34 -0700598 continualGatheringPolicy = ContinualGatheringPolicy.GATHER_ONCE;
deadbeefbe0c96f2016-05-18 16:20:14 -0700599 iceCandidatePoolSize = 0;
Honghai Zhangd78ecf72016-07-01 14:40:40 -0700600 pruneTurnPorts = false;
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700601 turnPortPrunePolicy = PortPrunePolicy.NO_PRUNE;
Taylor Brandstettere9851112016-07-01 11:11:13 -0700602 presumeWritableWhenFullyRelayed = false;
Qingsi Wang1fe119f2019-05-31 16:55:33 -0700603 surfaceIceCandidatesOnIceTransportTypeChanged = false;
Qingsi Wange6826d22018-03-08 14:55:14 -0800604 iceCheckIntervalStrongConnectivityMs = null;
605 iceCheckIntervalWeakConnectivityMs = null;
skvlad51072462017-02-02 11:50:14 -0800606 iceCheckMinInterval = null;
Qingsi Wang22e623a2018-03-13 10:53:57 -0700607 iceUnwritableTimeMs = null;
608 iceUnwritableMinChecks = null;
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800609 stunCandidateKeepaliveIntervalMs = null;
zhihuangb09b3f92017-03-07 14:40:51 -0800610 disableIPv6OnWifi = false;
deadbeef28e29192017-07-27 09:14:38 -0700611 maxIPv6Networks = 5;
Steve Antond960a0c2017-07-17 12:33:07 -0700612 iceRegatherIntervalRange = null;
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100613 disableIpv6 = false;
614 enableDscp = false;
615 enableCpuOveruseDetection = true;
616 enableRtpDataChannel = false;
617 suspendBelowMinBitrate = false;
618 screencastMinBitrate = null;
619 combinedAudioVideoBwe = null;
620 enableDtlsSrtp = null;
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800621 networkPreference = AdapterType.UNKNOWN;
Seth Hampsonc384e142018-03-06 15:47:10 -0800622 sdpSemantics = SdpSemantics.PLAN_B;
Zhi Huangb57e1692018-06-12 11:41:11 -0700623 activeResetSrtpParams = false;
Piotr (Peter) Slatala09beff22018-10-17 07:22:40 -0700624 useMediaTransport = false;
Bjorn Mellema9bbd862018-11-02 09:07:48 -0700625 useMediaTransportForDataChannels = false;
Benjamin Wright8c27cca2018-10-25 10:16:44 -0700626 cryptoOptions = null;
Jonas Oreland228900f2019-08-28 09:08:58 +0200627 turnLoggingId = null;
philipel16cec3b2019-10-25 12:23:02 +0200628 allowCodecSwitching = null;
Jiayang Liucac1b382015-04-30 12:35:24 -0700629 }
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100630
631 @CalledByNative("RTCConfiguration")
632 IceTransportsType getIceTransportsType() {
633 return iceTransportsType;
634 }
635
636 @CalledByNative("RTCConfiguration")
637 List<IceServer> getIceServers() {
638 return iceServers;
639 }
640
641 @CalledByNative("RTCConfiguration")
642 BundlePolicy getBundlePolicy() {
643 return bundlePolicy;
644 }
645
Honghai Zhangf8998cf2019-10-14 11:27:50 -0700646 @CalledByNative("RTCConfiguration")
647 PortPrunePolicy getTurnPortPrunePolicy() {
648 return turnPortPrunePolicy;
649 }
650
Michael Iedema02137862018-10-09 15:30:01 +0200651 @Nullable
652 @CalledByNative("RTCConfiguration")
653 RtcCertificatePem getCertificate() {
654 return certificate;
655 }
656
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100657 @CalledByNative("RTCConfiguration")
658 RtcpMuxPolicy getRtcpMuxPolicy() {
659 return rtcpMuxPolicy;
660 }
661
662 @CalledByNative("RTCConfiguration")
663 TcpCandidatePolicy getTcpCandidatePolicy() {
664 return tcpCandidatePolicy;
665 }
666
667 @CalledByNative("RTCConfiguration")
668 CandidateNetworkPolicy getCandidateNetworkPolicy() {
669 return candidateNetworkPolicy;
670 }
671
672 @CalledByNative("RTCConfiguration")
673 int getAudioJitterBufferMaxPackets() {
674 return audioJitterBufferMaxPackets;
675 }
676
677 @CalledByNative("RTCConfiguration")
678 boolean getAudioJitterBufferFastAccelerate() {
679 return audioJitterBufferFastAccelerate;
680 }
681
682 @CalledByNative("RTCConfiguration")
683 int getIceConnectionReceivingTimeout() {
684 return iceConnectionReceivingTimeout;
685 }
686
687 @CalledByNative("RTCConfiguration")
688 int getIceBackupCandidatePairPingInterval() {
689 return iceBackupCandidatePairPingInterval;
690 }
691
692 @CalledByNative("RTCConfiguration")
693 KeyType getKeyType() {
694 return keyType;
695 }
696
697 @CalledByNative("RTCConfiguration")
698 ContinualGatheringPolicy getContinualGatheringPolicy() {
699 return continualGatheringPolicy;
700 }
701
702 @CalledByNative("RTCConfiguration")
703 int getIceCandidatePoolSize() {
704 return iceCandidatePoolSize;
705 }
706
707 @CalledByNative("RTCConfiguration")
708 boolean getPruneTurnPorts() {
709 return pruneTurnPorts;
710 }
711
712 @CalledByNative("RTCConfiguration")
713 boolean getPresumeWritableWhenFullyRelayed() {
714 return presumeWritableWhenFullyRelayed;
715 }
716
Qingsi Wang1fe119f2019-05-31 16:55:33 -0700717 @CalledByNative("RTCConfiguration")
718 boolean getSurfaceIceCandidatesOnIceTransportTypeChanged() {
719 return surfaceIceCandidatesOnIceTransportTypeChanged;
720 }
721
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100722 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100723 @CalledByNative("RTCConfiguration")
Qingsi Wange6826d22018-03-08 14:55:14 -0800724 Integer getIceCheckIntervalStrongConnectivity() {
725 return iceCheckIntervalStrongConnectivityMs;
726 }
727
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100728 @Nullable
Qingsi Wange6826d22018-03-08 14:55:14 -0800729 @CalledByNative("RTCConfiguration")
730 Integer getIceCheckIntervalWeakConnectivity() {
731 return iceCheckIntervalWeakConnectivityMs;
732 }
733
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100734 @Nullable
Qingsi Wange6826d22018-03-08 14:55:14 -0800735 @CalledByNative("RTCConfiguration")
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100736 Integer getIceCheckMinInterval() {
737 return iceCheckMinInterval;
738 }
739
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100740 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100741 @CalledByNative("RTCConfiguration")
Qingsi Wang22e623a2018-03-13 10:53:57 -0700742 Integer getIceUnwritableTimeout() {
743 return iceUnwritableTimeMs;
744 }
745
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100746 @Nullable
Qingsi Wang22e623a2018-03-13 10:53:57 -0700747 @CalledByNative("RTCConfiguration")
748 Integer getIceUnwritableMinChecks() {
749 return iceUnwritableMinChecks;
750 }
751
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100752 @Nullable
Qingsi Wang22e623a2018-03-13 10:53:57 -0700753 @CalledByNative("RTCConfiguration")
Qingsi Wangdb53f8e2018-02-20 14:45:49 -0800754 Integer getStunCandidateKeepaliveInterval() {
755 return stunCandidateKeepaliveIntervalMs;
756 }
757
758 @CalledByNative("RTCConfiguration")
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100759 boolean getDisableIPv6OnWifi() {
760 return disableIPv6OnWifi;
761 }
762
763 @CalledByNative("RTCConfiguration")
764 int getMaxIPv6Networks() {
765 return maxIPv6Networks;
766 }
767
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100768 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100769 @CalledByNative("RTCConfiguration")
770 IntervalRange getIceRegatherIntervalRange() {
771 return iceRegatherIntervalRange;
772 }
773
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100774 @Nullable
Magnus Jedvert9060eb12017-12-12 12:52:54 +0100775 @CalledByNative("RTCConfiguration")
776 TurnCustomizer getTurnCustomizer() {
777 return turnCustomizer;
778 }
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100779
780 @CalledByNative("RTCConfiguration")
781 boolean getDisableIpv6() {
782 return disableIpv6;
783 }
784
785 @CalledByNative("RTCConfiguration")
786 boolean getEnableDscp() {
787 return enableDscp;
788 }
789
790 @CalledByNative("RTCConfiguration")
791 boolean getEnableCpuOveruseDetection() {
792 return enableCpuOveruseDetection;
793 }
794
795 @CalledByNative("RTCConfiguration")
796 boolean getEnableRtpDataChannel() {
797 return enableRtpDataChannel;
798 }
799
800 @CalledByNative("RTCConfiguration")
801 boolean getSuspendBelowMinBitrate() {
802 return suspendBelowMinBitrate;
803 }
804
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100805 @Nullable
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100806 @CalledByNative("RTCConfiguration")
807 Integer getScreencastMinBitrate() {
808 return screencastMinBitrate;
809 }
810
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100811 @Nullable
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100812 @CalledByNative("RTCConfiguration")
813 Boolean getCombinedAudioVideoBwe() {
814 return combinedAudioVideoBwe;
815 }
816
Sami Kalliomäkie7592d82018-03-22 13:32:44 +0100817 @Nullable
Sami Kalliomäkie8b26cd2017-12-19 12:51:53 +0100818 @CalledByNative("RTCConfiguration")
819 Boolean getEnableDtlsSrtp() {
820 return enableDtlsSrtp;
821 }
Qingsi Wang9a5c6f82018-02-01 10:38:40 -0800822
823 @CalledByNative("RTCConfiguration")
824 AdapterType getNetworkPreference() {
825 return networkPreference;
826 }
Seth Hampsonc384e142018-03-06 15:47:10 -0800827
828 @CalledByNative("RTCConfiguration")
829 SdpSemantics getSdpSemantics() {
830 return sdpSemantics;
831 }
Zhi Huangb57e1692018-06-12 11:41:11 -0700832
833 @CalledByNative("RTCConfiguration")
834 boolean getActiveResetSrtpParams() {
835 return activeResetSrtpParams;
836 }
Piotr (Peter) Slatala09beff22018-10-17 07:22:40 -0700837
philipel16cec3b2019-10-25 12:23:02 +0200838 @Nullable
839 @CalledByNative("RTCConfiguration")
840 Boolean getAllowCodecSwitching() {
841 return allowCodecSwitching;
842 }
843
Piotr (Peter) Slatala09beff22018-10-17 07:22:40 -0700844 @CalledByNative("RTCConfiguration")
845 boolean getUseMediaTransport() {
846 return useMediaTransport;
847 }
Benjamin Wright8c27cca2018-10-25 10:16:44 -0700848
Bjorn Mellema9bbd862018-11-02 09:07:48 -0700849 @CalledByNative("RTCConfiguration")
850 boolean getUseMediaTransportForDataChannels() {
851 return useMediaTransportForDataChannels;
852 }
853
Benjamin Wright8c27cca2018-10-25 10:16:44 -0700854 @Nullable
855 @CalledByNative("RTCConfiguration")
856 CryptoOptions getCryptoOptions() {
857 return cryptoOptions;
858 }
Jonas Oreland228900f2019-08-28 09:08:58 +0200859
860 @Nullable
861 @CalledByNative("RTCConfiguration")
862 String getTurnLoggingId() {
863 return turnLoggingId;
864 }
Jiayang Liucac1b382015-04-30 12:35:24 -0700865 };
866
Magnus Jedvert6062f372017-11-16 16:53:12 +0100867 private final List<MediaStream> localStreams = new ArrayList<>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868 private final long nativePeerConnection;
Magnus Jedvert6062f372017-11-16 16:53:12 +0100869 private List<RtpSender> senders = new ArrayList<>();
870 private List<RtpReceiver> receivers = new ArrayList<>();
Seth Hampsonc384e142018-03-06 15:47:10 -0800871 private List<RtpTransceiver> transceivers = new ArrayList<>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872
Sami Kalliomäki1ece1ed2017-12-20 11:59:22 +0100873 /**
874 * Wraps a PeerConnection created by the factory. Can be used by clients that want to implement
875 * their PeerConnection creation in JNI.
876 */
877 public PeerConnection(NativePeerConnectionFactory factory) {
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +0100878 this(factory.createNativePeerConnection());
Sami Kalliomäki1ece1ed2017-12-20 11:59:22 +0100879 }
880
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +0100881 PeerConnection(long nativePeerConnection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882 this.nativePeerConnection = nativePeerConnection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000883 }
884
885 // JsepInterface.
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100886 public SessionDescription getLocalDescription() {
887 return nativeGetLocalDescription();
888 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000889
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100890 public SessionDescription getRemoteDescription() {
891 return nativeGetRemoteDescription();
892 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893
Michael Iedema02137862018-10-09 15:30:01 +0200894 public RtcCertificatePem getCertificate() {
895 return nativeGetCertificate();
896 }
897
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100898 public DataChannel createDataChannel(String label, DataChannel.Init init) {
899 return nativeCreateDataChannel(label, init);
900 }
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000901
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100902 public void createOffer(SdpObserver observer, MediaConstraints constraints) {
903 nativeCreateOffer(observer, constraints);
904 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100906 public void createAnswer(SdpObserver observer, MediaConstraints constraints) {
907 nativeCreateAnswer(observer, constraints);
908 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909
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 /**
919 * Enables/disables playout of received audio streams. Enabled by default.
920 *
921 * Note that even if playout is enabled, streams will only be played out if
922 * the appropriate SDP is also applied. The main purpose of this API is to
923 * be able to control the exact time when audio playout starts.
924 */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100925 public void setAudioPlayout(boolean playout) {
926 nativeSetAudioPlayout(playout);
927 }
henrika5f6bf242017-11-01 11:06:56 +0100928
Seth Hampsonc384e142018-03-06 15:47:10 -0800929 /**
930 * Enables/disables recording of transmitted audio streams. Enabled by default.
931 *
932 * Note that even if recording is enabled, streams will only be recorded if
933 * the appropriate SDP is also applied. The main purpose of this API is to
934 * be able to control the exact time when audio recording starts.
935 */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100936 public void setAudioRecording(boolean recording) {
937 nativeSetAudioRecording(recording);
938 }
henrika5f6bf242017-11-01 11:06:56 +0100939
deadbeef5d0b6d82017-01-09 16:05:28 -0800940 public boolean setConfiguration(RTCConfiguration config) {
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +0100941 return nativeSetConfiguration(config);
deadbeef5d0b6d82017-01-09 16:05:28 -0800942 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943
944 public boolean addIceCandidate(IceCandidate candidate) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100945 return nativeAddIceCandidate(candidate.sdpMid, candidate.sdpMLineIndex, candidate.sdp);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 }
947
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700948 public boolean removeIceCandidates(final IceCandidate[] candidates) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +0100949 return nativeRemoveIceCandidates(candidates);
Honghai Zhang7fb69db2016-03-14 11:59:18 -0700950 }
951
Seth Hampsonc384e142018-03-06 15:47:10 -0800952 /**
953 * Adds a new MediaStream to be sent on this peer connection.
954 * Note: This method is not supported with SdpSemantics.UNIFIED_PLAN. Please
955 * use addTrack instead.
956 */
perkj@webrtc.orgc2dd5ee2014-11-04 11:31:29 +0000957 public boolean addStream(MediaStream stream) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200958 boolean ret = nativeAddLocalStream(stream.getNativeMediaStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 if (!ret) {
960 return false;
961 }
962 localStreams.add(stream);
963 return true;
964 }
965
Seth Hampsonc384e142018-03-06 15:47:10 -0800966 /**
967 * Removes the given media stream from this peer connection.
968 * This method is not supported with SdpSemantics.UNIFIED_PLAN. Please use
969 * removeTrack instead.
970 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 public void removeStream(MediaStream stream) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +0200972 nativeRemoveLocalStream(stream.getNativeMediaStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000973 localStreams.remove(stream);
974 }
975
deadbeef7a246882017-08-09 08:40:10 -0700976 /**
977 * Creates an RtpSender without a track.
Seth Hampsonc384e142018-03-06 15:47:10 -0800978 *
979 * <p>This method allows an application to cause the PeerConnection to negotiate
deadbeef7a246882017-08-09 08:40:10 -0700980 * sending/receiving a specific media type, but without having a track to
981 * send yet.
Seth Hampsonc384e142018-03-06 15:47:10 -0800982 *
983 * <p>When the application does want to begin sending a track, it can call
deadbeef7a246882017-08-09 08:40:10 -0700984 * RtpSender.setTrack, which doesn't require any additional SDP negotiation.
Seth Hampsonc384e142018-03-06 15:47:10 -0800985 *
986 * <p>Example use:
deadbeef7a246882017-08-09 08:40:10 -0700987 * <pre>
988 * {@code
989 * audioSender = pc.createSender("audio", "stream1");
990 * videoSender = pc.createSender("video", "stream1");
991 * // Do normal SDP offer/answer, which will kick off ICE/DTLS and negotiate
992 * // media parameters....
993 * // Later, when the endpoint is ready to actually begin sending:
994 * audioSender.setTrack(audioTrack, false);
995 * videoSender.setTrack(videoTrack, false);
996 * }
997 * </pre>
Seth Hampsonc384e142018-03-06 15:47:10 -0800998 * <p>Note: This corresponds most closely to "addTransceiver" in the official
deadbeef7a246882017-08-09 08:40:10 -0700999 * WebRTC API, in that it creates a sender without a track. It was
1000 * implemented before addTransceiver because it provides useful
1001 * functionality, and properly implementing transceivers would have required
1002 * a great deal more work.
1003 *
Seth Hampsonc384e142018-03-06 15:47:10 -08001004 * <p>Note: This is only available with SdpSemantics.PLAN_B specified. Please use
1005 * addTransceiver instead.
1006 *
deadbeef7a246882017-08-09 08:40:10 -07001007 * @param kind Corresponds to MediaStreamTrack kinds (must be "audio" or
1008 * "video").
1009 * @param stream_id The ID of the MediaStream that this sender's track will
1010 * be associated with when SDP is applied to the remote
1011 * PeerConnection. If createSender is used to create an
1012 * audio and video sender that should be synchronized, they
1013 * should use the same stream ID.
1014 * @return A new RtpSender object if successful, or null otherwise.
1015 */
deadbeefbd7d8f72015-12-18 16:58:44 -08001016 public RtpSender createSender(String kind, String stream_id) {
Seth Hampsonc384e142018-03-06 15:47:10 -08001017 RtpSender newSender = nativeCreateSender(kind, stream_id);
1018 if (newSender != null) {
1019 senders.add(newSender);
deadbeefee524f72015-12-02 11:27:40 -08001020 }
Seth Hampsonc384e142018-03-06 15:47:10 -08001021 return newSender;
deadbeefee524f72015-12-02 11:27:40 -08001022 }
1023
Seth Hampsonc384e142018-03-06 15:47:10 -08001024 /**
1025 * Gets all RtpSenders associated with this peer connection.
1026 * Note that calling getSenders will dispose of the senders previously
1027 * returned.
1028 */
deadbeef4139c0f2015-10-06 12:29:25 -07001029 public List<RtpSender> getSenders() {
1030 for (RtpSender sender : senders) {
1031 sender.dispose();
1032 }
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001033 senders = nativeGetSenders();
deadbeef4139c0f2015-10-06 12:29:25 -07001034 return Collections.unmodifiableList(senders);
1035 }
1036
Seth Hampsonc384e142018-03-06 15:47:10 -08001037 /**
1038 * Gets all RtpReceivers associated with this peer connection.
1039 * Note that calling getReceivers will dispose of the receivers previously
1040 * returned.
1041 */
deadbeef4139c0f2015-10-06 12:29:25 -07001042 public List<RtpReceiver> getReceivers() {
1043 for (RtpReceiver receiver : receivers) {
1044 receiver.dispose();
1045 }
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001046 receivers = nativeGetReceivers();
deadbeef4139c0f2015-10-06 12:29:25 -07001047 return Collections.unmodifiableList(receivers);
1048 }
1049
Seth Hampsonc384e142018-03-06 15:47:10 -08001050 /**
1051 * Gets all RtpTransceivers associated with this peer connection.
1052 * Note that calling getTransceivers will dispose of the transceivers previously
1053 * returned.
1054 * Note: This is only available with SdpSemantics.UNIFIED_PLAN specified.
1055 */
1056 public List<RtpTransceiver> getTransceivers() {
1057 for (RtpTransceiver transceiver : transceivers) {
1058 transceiver.dispose();
1059 }
1060 transceivers = nativeGetTransceivers();
1061 return Collections.unmodifiableList(transceivers);
1062 }
1063
1064 /**
1065 * Adds a new media stream track to be sent on this peer connection, and returns
1066 * the newly created RtpSender. If streamIds are specified, the RtpSender will
1067 * be associated with the streams specified in the streamIds list.
1068 *
1069 * @throws IllegalStateException if an error accors in C++ addTrack.
1070 * An error can occur if:
1071 * - A sender already exists for the track.
1072 * - The peer connection is closed.
1073 */
1074 public RtpSender addTrack(MediaStreamTrack track) {
1075 return addTrack(track, Collections.emptyList());
1076 }
1077
1078 public RtpSender addTrack(MediaStreamTrack track, List<String> streamIds) {
1079 if (track == null || streamIds == null) {
1080 throw new NullPointerException("No MediaStreamTrack specified in addTrack.");
1081 }
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001082 RtpSender newSender = nativeAddTrack(track.getNativeMediaStreamTrack(), streamIds);
Seth Hampsonc384e142018-03-06 15:47:10 -08001083 if (newSender == null) {
1084 throw new IllegalStateException("C++ addTrack failed.");
1085 }
1086 senders.add(newSender);
1087 return newSender;
1088 }
1089
1090 /**
1091 * Stops sending media from sender. The sender will still appear in getSenders. Future
1092 * calls to createOffer will mark the m section for the corresponding transceiver as
1093 * receive only or inactive, as defined in JSEP. Returns true on success.
1094 */
1095 public boolean removeTrack(RtpSender sender) {
1096 if (sender == null) {
1097 throw new NullPointerException("No RtpSender specified for removeTrack.");
1098 }
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001099 return nativeRemoveTrack(sender.getNativeRtpSender());
Seth Hampsonc384e142018-03-06 15:47:10 -08001100 }
1101
1102 /**
1103 * Creates a new RtpTransceiver and adds it to the set of transceivers. Adding a
1104 * transceiver will cause future calls to CreateOffer to add a media description
1105 * for the corresponding transceiver.
1106 *
1107 * <p>The initial value of |mid| in the returned transceiver is null. Setting a
1108 * new session description may change it to a non-null value.
1109 *
1110 * <p>https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtransceiver
1111 *
1112 * <p>If a MediaStreamTrack is specified then a transceiver will be added with a
1113 * sender set to transmit the given track. The kind
1114 * of the transceiver (and sender/receiver) will be derived from the kind of
1115 * the track.
1116 *
1117 * <p>If MediaType is specified then a transceiver will be added based upon that type.
1118 * This can be either MEDIA_TYPE_AUDIO or MEDIA_TYPE_VIDEO.
1119 *
1120 * <p>Optionally, an RtpTransceiverInit structure can be specified to configure
1121 * the transceiver from construction. If not specified, the transceiver will
1122 * default to having a direction of kSendRecv and not be part of any streams.
1123 *
1124 * <p>Note: These methods are only available with SdpSemantics.UNIFIED_PLAN specified.
1125 * @throws IllegalStateException if an error accors in C++ addTransceiver
1126 */
1127 public RtpTransceiver addTransceiver(MediaStreamTrack track) {
1128 return addTransceiver(track, new RtpTransceiver.RtpTransceiverInit());
1129 }
1130
1131 public RtpTransceiver addTransceiver(
Sami Kalliomäkie7592d82018-03-22 13:32:44 +01001132 MediaStreamTrack track, @Nullable RtpTransceiver.RtpTransceiverInit init) {
Seth Hampsonc384e142018-03-06 15:47:10 -08001133 if (track == null) {
1134 throw new NullPointerException("No MediaStreamTrack specified for addTransceiver.");
1135 }
1136 if (init == null) {
1137 init = new RtpTransceiver.RtpTransceiverInit();
1138 }
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001139 RtpTransceiver newTransceiver =
1140 nativeAddTransceiverWithTrack(track.getNativeMediaStreamTrack(), init);
Seth Hampsonc384e142018-03-06 15:47:10 -08001141 if (newTransceiver == null) {
1142 throw new IllegalStateException("C++ addTransceiver failed.");
1143 }
1144 transceivers.add(newTransceiver);
1145 return newTransceiver;
1146 }
1147
1148 public RtpTransceiver addTransceiver(MediaStreamTrack.MediaType mediaType) {
1149 return addTransceiver(mediaType, new RtpTransceiver.RtpTransceiverInit());
1150 }
1151
1152 public RtpTransceiver addTransceiver(
Sami Kalliomäkie7592d82018-03-22 13:32:44 +01001153 MediaStreamTrack.MediaType mediaType, @Nullable RtpTransceiver.RtpTransceiverInit init) {
Seth Hampsonc384e142018-03-06 15:47:10 -08001154 if (mediaType == null) {
1155 throw new NullPointerException("No MediaType specified for addTransceiver.");
1156 }
1157 if (init == null) {
1158 init = new RtpTransceiver.RtpTransceiverInit();
1159 }
1160 RtpTransceiver newTransceiver = nativeAddTransceiverOfType(mediaType, init);
1161 if (newTransceiver == null) {
1162 throw new IllegalStateException("C++ addTransceiver failed.");
1163 }
1164 transceivers.add(newTransceiver);
1165 return newTransceiver;
1166 }
1167
deadbeef82215872017-04-18 10:27:51 -07001168 // Older, non-standard implementation of getStats.
1169 @Deprecated
Sami Kalliomäkie7592d82018-03-22 13:32:44 +01001170 public boolean getStats(StatsObserver observer, @Nullable MediaStreamTrack track) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001171 return nativeOldGetStats(observer, (track == null) ? 0 : track.getNativeMediaStreamTrack());
deadbeef82215872017-04-18 10:27:51 -07001172 }
1173
Seth Hampsonc384e142018-03-06 15:47:10 -08001174 /**
1175 * Gets stats using the new stats collection API, see webrtc/api/stats/. These
1176 * will replace old stats collection API when the new API has matured enough.
1177 */
deadbeef82215872017-04-18 10:27:51 -07001178 public void getStats(RTCStatsCollectorCallback callback) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001179 nativeNewGetStats(callback);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 }
1181
Seth Hampsonc384e142018-03-06 15:47:10 -08001182 /**
1183 * Limits the bandwidth allocated for all RTP streams sent by this
1184 * PeerConnection. Pass null to leave a value unchanged.
1185 */
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001186 public boolean setBitrate(Integer min, Integer current, Integer max) {
1187 return nativeSetBitrate(min, current, max);
1188 }
zsteind89b0bc2017-08-03 11:11:40 -07001189
Seth Hampsonc384e142018-03-06 15:47:10 -08001190 /**
1191 * Starts recording an RTC event log.
1192 *
1193 * Ownership of the file is transfered to the native code. If an RTC event
1194 * log is already being recorded, it will be stopped and a new one will start
1195 * using the provided file. Logging will continue until the stopRtcEventLog
1196 * function is called. The max_size_bytes argument is ignored, it is added
1197 * for future use.
1198 */
ivoc0c6f0f62016-07-06 04:34:23 -07001199 public boolean startRtcEventLog(int file_descriptor, int max_size_bytes) {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001200 return nativeStartRtcEventLog(file_descriptor, max_size_bytes);
ivoc14d5dbe2016-07-04 07:06:55 -07001201 }
1202
Seth Hampsonc384e142018-03-06 15:47:10 -08001203 /**
1204 * Stops recording an RTC event log. If no RTC event log is currently being
1205 * recorded, this call will have no effect.
1206 */
ivoc14d5dbe2016-07-04 07:06:55 -07001207 public void stopRtcEventLog() {
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001208 nativeStopRtcEventLog();
ivoc14d5dbe2016-07-04 07:06:55 -07001209 }
1210
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 // TODO(fischman): add support for DTMF-related methods once that API
1212 // stabilizes.
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001213 public SignalingState signalingState() {
1214 return nativeSignalingState();
1215 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001217 public IceConnectionState iceConnectionState() {
1218 return nativeIceConnectionState();
1219 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220
Jonas Olssonf01d8c82018-11-08 15:19:04 +01001221 public PeerConnectionState connectionState() {
1222 return nativeConnectionState();
1223 }
1224
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001225 public IceGatheringState iceGatheringState() {
1226 return nativeIceGatheringState();
1227 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001229 public void close() {
1230 nativeClose();
1231 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232
deadbeef43697f62017-09-12 10:52:14 -07001233 /**
1234 * Free native resources associated with this PeerConnection instance.
Seth Hampsonc384e142018-03-06 15:47:10 -08001235 *
deadbeef43697f62017-09-12 10:52:14 -07001236 * This method removes a reference count from the C++ PeerConnection object,
1237 * which should result in it being destroyed. It also calls equivalent
1238 * "dispose" methods on the Java objects attached to this PeerConnection
1239 * (streams, senders, receivers), such that their associated C++ objects
1240 * will also be destroyed.
Seth Hampsonc384e142018-03-06 15:47:10 -08001241 *
1242 * <p>Note that this method cannot be safely called from an observer callback
deadbeef43697f62017-09-12 10:52:14 -07001243 * (PeerConnection.Observer, DataChannel.Observer, etc.). If you want to, for
1244 * example, destroy the PeerConnection after an "ICE failed" callback, you
1245 * must do this asynchronously (in other words, unwind the stack first). See
1246 * <a href="https://bugs.chromium.org/p/webrtc/issues/detail?id=3721">bug
1247 * 3721</a> for more details.
1248 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001249 public void dispose() {
1250 close();
1251 for (MediaStream stream : localStreams) {
Sami Kalliomäkiee05e902018-09-28 14:38:21 +02001252 nativeRemoveLocalStream(stream.getNativeMediaStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001253 stream.dispose();
1254 }
1255 localStreams.clear();
deadbeef4139c0f2015-10-06 12:29:25 -07001256 for (RtpSender sender : senders) {
1257 sender.dispose();
1258 }
1259 senders.clear();
1260 for (RtpReceiver receiver : receivers) {
1261 receiver.dispose();
1262 }
Seth Hampsonc384e142018-03-06 15:47:10 -08001263 for (RtpTransceiver transceiver : transceivers) {
1264 transceiver.dispose();
1265 }
1266 transceivers.clear();
deadbeef4139c0f2015-10-06 12:29:25 -07001267 receivers.clear();
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001268 nativeFreeOwnedPeerConnection(nativePeerConnection);
1269 }
1270
1271 /** Returns a pointer to the native webrtc::PeerConnectionInterface. */
1272 public long getNativePeerConnection() {
1273 return nativeGetNativePeerConnection();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001274 }
1275
Magnus Jedvert9060eb12017-12-12 12:52:54 +01001276 @CalledByNative
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001277 long getNativeOwnedPeerConnection() {
Magnus Jedvert9060eb12017-12-12 12:52:54 +01001278 return nativePeerConnection;
1279 }
1280
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001281 public static long createNativePeerConnectionObserver(Observer observer) {
1282 return nativeCreatePeerConnectionObserver(observer);
1283 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001284
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001285 private native long nativeGetNativePeerConnection();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001286 private native SessionDescription nativeGetLocalDescription();
1287 private native SessionDescription nativeGetRemoteDescription();
Michael Iedema02137862018-10-09 15:30:01 +02001288 private native RtcCertificatePem nativeGetCertificate();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001289 private native DataChannel nativeCreateDataChannel(String label, DataChannel.Init init);
1290 private native void nativeCreateOffer(SdpObserver observer, MediaConstraints constraints);
1291 private native void nativeCreateAnswer(SdpObserver observer, MediaConstraints constraints);
1292 private native void nativeSetLocalDescription(SdpObserver observer, SessionDescription sdp);
1293 private native void nativeSetRemoteDescription(SdpObserver observer, SessionDescription sdp);
1294 private native void nativeSetAudioPlayout(boolean playout);
1295 private native void nativeSetAudioRecording(boolean recording);
1296 private native boolean nativeSetBitrate(Integer min, Integer current, Integer max);
1297 private native SignalingState nativeSignalingState();
1298 private native IceConnectionState nativeIceConnectionState();
Jonas Olssonf01d8c82018-11-08 15:19:04 +01001299 private native PeerConnectionState nativeConnectionState();
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001300 private native IceGatheringState nativeIceGatheringState();
1301 private native void nativeClose();
1302 private static native long nativeCreatePeerConnectionObserver(Observer observer);
Sami Kalliomäkice5c19a2018-01-15 09:28:34 +01001303 private static native void nativeFreeOwnedPeerConnection(long ownedPeerConnection);
1304 private native boolean nativeSetConfiguration(RTCConfiguration config);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001305 private native boolean nativeAddIceCandidate(
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001306 String sdpMid, int sdpMLineIndex, String iceCandidateSdp);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001307 private native boolean nativeRemoveIceCandidates(final IceCandidate[] candidates);
1308 private native boolean nativeAddLocalStream(long stream);
1309 private native void nativeRemoveLocalStream(long stream);
1310 private native boolean nativeOldGetStats(StatsObserver observer, long nativeTrack);
1311 private native void nativeNewGetStats(RTCStatsCollectorCallback callback);
1312 private native RtpSender nativeCreateSender(String kind, String stream_id);
1313 private native List<RtpSender> nativeGetSenders();
1314 private native List<RtpReceiver> nativeGetReceivers();
Seth Hampsonc384e142018-03-06 15:47:10 -08001315 private native List<RtpTransceiver> nativeGetTransceivers();
1316 private native RtpSender nativeAddTrack(long track, List<String> streamIds);
1317 private native boolean nativeRemoveTrack(long sender);
1318 private native RtpTransceiver nativeAddTransceiverWithTrack(
1319 long track, RtpTransceiver.RtpTransceiverInit init);
1320 private native RtpTransceiver nativeAddTransceiverOfType(
1321 MediaStreamTrack.MediaType mediaType, RtpTransceiver.RtpTransceiverInit init);
Magnus Jedvert84d8ae52017-12-20 15:12:10 +01001322 private native boolean nativeStartRtcEventLog(int file_descriptor, int max_size_bytes);
1323 private native void nativeStopRtcEventLog();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324}