OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * 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. | |
9 */ | |
10 | |
11 #include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h" | |
12 | |
13 #include <string> | |
14 | |
15 #include "webrtc/pc/webrtcsdp.h" | |
16 #include "webrtc/sdk/android/src/jni/classreferenceholder.h" | |
17 | |
18 namespace webrtc_jni { | |
19 | |
20 webrtc::DataChannelInit JavaToNativeDataChannelInit(JNIEnv* jni, | |
21 jobject j_init) { | |
22 webrtc::DataChannelInit init; | |
23 | |
24 jclass j_init_class = FindClass(jni, "org/webrtc/DataChannel$Init"); | |
25 jfieldID ordered_id = GetFieldID(jni, j_init_class, "ordered", "Z"); | |
26 jfieldID max_retransmit_time_id = | |
27 GetFieldID(jni, j_init_class, "maxRetransmitTimeMs", "I"); | |
28 jfieldID max_retransmits_id = | |
29 GetFieldID(jni, j_init_class, "maxRetransmits", "I"); | |
30 jfieldID protocol_id = | |
31 GetFieldID(jni, j_init_class, "protocol", "Ljava/lang/String;"); | |
32 jfieldID negotiated_id = GetFieldID(jni, j_init_class, "negotiated", "Z"); | |
33 jfieldID id_id = GetFieldID(jni, j_init_class, "id", "I"); | |
34 | |
35 init.ordered = GetBooleanField(jni, j_init, ordered_id); | |
36 init.maxRetransmitTime = GetIntField(jni, j_init, max_retransmit_time_id); | |
37 init.maxRetransmits = GetIntField(jni, j_init, max_retransmits_id); | |
38 init.protocol = | |
39 JavaToStdString(jni, GetStringField(jni, j_init, protocol_id)); | |
40 init.negotiated = GetBooleanField(jni, j_init, negotiated_id); | |
41 init.id = GetIntField(jni, j_init, id_id); | |
42 | |
43 return init; | |
44 } | |
45 | |
46 jobject NativeToJavaMediaType(JNIEnv* jni, cricket::MediaType media_type) { | |
47 jclass j_media_type_class = | |
48 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); | |
49 | |
50 const char* media_type_str = nullptr; | |
51 switch (media_type) { | |
52 case cricket::MEDIA_TYPE_AUDIO: | |
53 media_type_str = "MEDIA_TYPE_AUDIO"; | |
54 break; | |
55 case cricket::MEDIA_TYPE_VIDEO: | |
56 media_type_str = "MEDIA_TYPE_VIDEO"; | |
57 break; | |
58 case cricket::MEDIA_TYPE_DATA: | |
59 RTC_NOTREACHED(); | |
60 break; | |
61 } | |
62 jfieldID j_media_type_fid = | |
63 GetStaticFieldID(jni, j_media_type_class, media_type_str, | |
64 "Lorg/webrtc/MediaStreamTrack$MediaType;"); | |
65 return GetStaticObjectField(jni, j_media_type_class, j_media_type_fid); | |
66 } | |
67 | |
68 cricket::MediaType JavaToNativeMediaType(JNIEnv* jni, jobject j_media_type) { | |
69 jclass j_media_type_class = | |
70 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); | |
71 jmethodID j_name_id = | |
72 GetMethodID(jni, j_media_type_class, "name", "()Ljava/lang/String;"); | |
73 jstring j_type_string = | |
74 (jstring)jni->CallObjectMethod(j_media_type, j_name_id); | |
75 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
76 std::string type_string = JavaToStdString(jni, j_type_string); | |
77 | |
78 RTC_DCHECK(type_string == "MEDIA_TYPE_AUDIO" || | |
79 type_string == "MEDIA_TYPE_VIDEO") | |
80 << "Media type: " << type_string; | |
81 return type_string == "MEDIA_TYPE_AUDIO" ? cricket::MEDIA_TYPE_AUDIO | |
82 : cricket::MEDIA_TYPE_VIDEO; | |
83 } | |
84 | |
85 cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate) { | |
86 jclass j_candidate_class = GetObjectClass(jni, j_candidate); | |
87 jfieldID j_sdp_mid_id = | |
88 GetFieldID(jni, j_candidate_class, "sdpMid", "Ljava/lang/String;"); | |
89 std::string sdp_mid = | |
90 JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_mid_id)); | |
91 jfieldID j_sdp_id = | |
92 GetFieldID(jni, j_candidate_class, "sdp", "Ljava/lang/String;"); | |
93 std::string sdp = | |
94 JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_id)); | |
95 cricket::Candidate candidate; | |
96 if (!webrtc::SdpDeserializeCandidate(sdp_mid, sdp, &candidate, NULL)) { | |
97 LOG(LS_ERROR) << "SdpDescrializeCandidate failed with sdp " << sdp; | |
98 } | |
99 return candidate; | |
100 } | |
101 | |
102 jobject NativeToJavaCandidate(JNIEnv* jni, | |
103 jclass* candidate_class, | |
104 const cricket::Candidate& candidate) { | |
105 std::string sdp = webrtc::SdpSerializeCandidate(candidate); | |
106 RTC_CHECK(!sdp.empty()) << "got an empty ICE candidate"; | |
107 jmethodID ctor = GetMethodID(jni, *candidate_class, "<init>", | |
108 "(Ljava/lang/String;ILjava/lang/String;)V"); | |
109 jstring j_mid = JavaStringFromStdString(jni, candidate.transport_name()); | |
110 jstring j_sdp = JavaStringFromStdString(jni, sdp); | |
111 // sdp_mline_index is not used, pass an invalid value -1. | |
112 jobject j_candidate = | |
113 jni->NewObject(*candidate_class, ctor, j_mid, -1, j_sdp); | |
114 CHECK_EXCEPTION(jni) << "error during Java Candidate NewObject"; | |
115 return j_candidate; | |
116 } | |
117 | |
118 jobjectArray NativeToJavaCandidateArray( | |
119 JNIEnv* jni, | |
120 const std::vector<cricket::Candidate>& candidates) { | |
121 jclass candidate_class = FindClass(jni, "org/webrtc/IceCandidate"); | |
122 jobjectArray java_candidates = | |
123 jni->NewObjectArray(candidates.size(), candidate_class, NULL); | |
124 int i = 0; | |
125 for (const cricket::Candidate& candidate : candidates) { | |
126 jobject j_candidate = | |
127 NativeToJavaCandidate(jni, &candidate_class, candidate); | |
128 jni->SetObjectArrayElement(java_candidates, i++, j_candidate); | |
129 } | |
130 return java_candidates; | |
131 } | |
132 | |
133 webrtc::SessionDescriptionInterface* JavaToNativeSessionDescription( | |
134 JNIEnv* jni, | |
135 jobject j_sdp) { | |
136 jfieldID j_type_id = GetFieldID(jni, GetObjectClass(jni, j_sdp), "type", | |
137 "Lorg/webrtc/SessionDescription$Type;"); | |
138 jobject j_type = GetObjectField(jni, j_sdp, j_type_id); | |
139 jmethodID j_canonical_form_id = | |
140 GetMethodID(jni, GetObjectClass(jni, j_type), "canonicalForm", | |
141 "()Ljava/lang/String;"); | |
142 jstring j_type_string = | |
143 (jstring)jni->CallObjectMethod(j_type, j_canonical_form_id); | |
144 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
145 std::string std_type = JavaToStdString(jni, j_type_string); | |
146 | |
147 jfieldID j_description_id = GetFieldID(jni, GetObjectClass(jni, j_sdp), | |
148 "description", "Ljava/lang/String;"); | |
149 jstring j_description = (jstring)GetObjectField(jni, j_sdp, j_description_id); | |
150 std::string std_description = JavaToStdString(jni, j_description); | |
151 | |
152 return webrtc::CreateSessionDescription(std_type, std_description, NULL); | |
153 } | |
154 | |
155 jobject NativeToJavaSessionDescription( | |
156 JNIEnv* jni, | |
157 const webrtc::SessionDescriptionInterface* desc) { | |
158 std::string sdp; | |
159 RTC_CHECK(desc->ToString(&sdp)) << "got so far: " << sdp; | |
160 jstring j_description = JavaStringFromStdString(jni, sdp); | |
161 | |
162 jclass j_type_class = FindClass(jni, "org/webrtc/SessionDescription$Type"); | |
163 jmethodID j_type_from_canonical = GetStaticMethodID( | |
164 jni, j_type_class, "fromCanonicalForm", | |
165 "(Ljava/lang/String;)Lorg/webrtc/SessionDescription$Type;"); | |
166 jstring j_type_string = JavaStringFromStdString(jni, desc->type()); | |
167 jobject j_type = jni->CallStaticObjectMethod( | |
168 j_type_class, j_type_from_canonical, j_type_string); | |
169 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
170 | |
171 jclass j_sdp_class = FindClass(jni, "org/webrtc/SessionDescription"); | |
172 jmethodID j_sdp_ctor = | |
173 GetMethodID(jni, j_sdp_class, "<init>", | |
174 "(Lorg/webrtc/SessionDescription$Type;Ljava/lang/String;)V"); | |
175 jobject j_sdp = | |
176 jni->NewObject(j_sdp_class, j_sdp_ctor, j_type, j_description); | |
177 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
178 return j_sdp; | |
179 } | |
180 | |
181 webrtc::PeerConnectionFactoryInterface::Options | |
182 JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, jobject options) { | |
183 jclass options_class = jni->GetObjectClass(options); | |
184 jfieldID network_ignore_mask_field = | |
185 jni->GetFieldID(options_class, "networkIgnoreMask", "I"); | |
186 int network_ignore_mask = | |
187 jni->GetIntField(options, network_ignore_mask_field); | |
188 | |
189 jfieldID disable_encryption_field = | |
190 jni->GetFieldID(options_class, "disableEncryption", "Z"); | |
191 bool disable_encryption = | |
192 jni->GetBooleanField(options, disable_encryption_field); | |
193 | |
194 jfieldID disable_network_monitor_field = | |
195 jni->GetFieldID(options_class, "disableNetworkMonitor", "Z"); | |
196 bool disable_network_monitor = | |
197 jni->GetBooleanField(options, disable_network_monitor_field); | |
198 | |
199 webrtc::PeerConnectionFactoryInterface::Options native_options; | |
200 | |
201 // This doesn't necessarily match the c++ version of this struct; feel free | |
202 // to add more parameters as necessary. | |
203 native_options.network_ignore_mask = network_ignore_mask; | |
204 native_options.disable_encryption = disable_encryption; | |
205 native_options.disable_network_monitor = disable_network_monitor; | |
206 return native_options; | |
207 } | |
208 | |
209 webrtc::PeerConnectionInterface::IceTransportsType | |
210 JavaToNativeIceTransportsType(JNIEnv* jni, jobject j_ice_transports_type) { | |
211 std::string enum_name = | |
212 GetJavaEnumName(jni, "org/webrtc/PeerConnection$IceTransportsType", | |
213 j_ice_transports_type); | |
214 | |
215 if (enum_name == "ALL") | |
216 return webrtc::PeerConnectionInterface::kAll; | |
217 | |
218 if (enum_name == "RELAY") | |
219 return webrtc::PeerConnectionInterface::kRelay; | |
220 | |
221 if (enum_name == "NOHOST") | |
222 return webrtc::PeerConnectionInterface::kNoHost; | |
223 | |
224 if (enum_name == "NONE") | |
225 return webrtc::PeerConnectionInterface::kNone; | |
226 | |
227 RTC_CHECK(false) << "Unexpected IceTransportsType enum_name " << enum_name; | |
228 return webrtc::PeerConnectionInterface::kAll; | |
229 } | |
230 | |
231 webrtc::PeerConnectionInterface::BundlePolicy JavaToNativeBundlePolicy( | |
232 JNIEnv* jni, | |
233 jobject j_bundle_policy) { | |
234 std::string enum_name = GetJavaEnumName( | |
235 jni, "org/webrtc/PeerConnection$BundlePolicy", j_bundle_policy); | |
236 | |
237 if (enum_name == "BALANCED") | |
238 return webrtc::PeerConnectionInterface::kBundlePolicyBalanced; | |
239 | |
240 if (enum_name == "MAXBUNDLE") | |
241 return webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle; | |
242 | |
243 if (enum_name == "MAXCOMPAT") | |
244 return webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat; | |
245 | |
246 RTC_CHECK(false) << "Unexpected BundlePolicy enum_name " << enum_name; | |
247 return webrtc::PeerConnectionInterface::kBundlePolicyBalanced; | |
248 } | |
249 | |
250 webrtc::PeerConnectionInterface::RtcpMuxPolicy JavaToNativeRtcpMuxPolicy( | |
251 JNIEnv* jni, | |
252 jobject j_rtcp_mux_policy) { | |
253 std::string enum_name = GetJavaEnumName( | |
254 jni, "org/webrtc/PeerConnection$RtcpMuxPolicy", j_rtcp_mux_policy); | |
255 | |
256 if (enum_name == "NEGOTIATE") | |
257 return webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate; | |
258 | |
259 if (enum_name == "REQUIRE") | |
260 return webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire; | |
261 | |
262 RTC_CHECK(false) << "Unexpected RtcpMuxPolicy enum_name " << enum_name; | |
263 return webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate; | |
264 } | |
265 | |
266 webrtc::PeerConnectionInterface::TcpCandidatePolicy | |
267 JavaToNativeTcpCandidatePolicy(JNIEnv* jni, jobject j_tcp_candidate_policy) { | |
268 std::string enum_name = | |
269 GetJavaEnumName(jni, "org/webrtc/PeerConnection$TcpCandidatePolicy", | |
270 j_tcp_candidate_policy); | |
271 | |
272 if (enum_name == "ENABLED") | |
273 return webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled; | |
274 | |
275 if (enum_name == "DISABLED") | |
276 return webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled; | |
277 | |
278 RTC_CHECK(false) << "Unexpected TcpCandidatePolicy enum_name " << enum_name; | |
279 return webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled; | |
280 } | |
281 | |
282 webrtc::PeerConnectionInterface::CandidateNetworkPolicy | |
283 JavaToNativeCandidateNetworkPolicy(JNIEnv* jni, | |
284 jobject j_candidate_network_policy) { | |
285 std::string enum_name = | |
286 GetJavaEnumName(jni, "org/webrtc/PeerConnection$CandidateNetworkPolicy", | |
287 j_candidate_network_policy); | |
288 | |
289 if (enum_name == "ALL") | |
290 return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll; | |
291 | |
292 if (enum_name == "LOW_COST") | |
293 return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyLowCost; | |
294 | |
295 RTC_CHECK(false) << "Unexpected CandidateNetworkPolicy enum_name " | |
296 << enum_name; | |
297 return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll; | |
298 } | |
299 | |
300 rtc::KeyType JavaToNativeKeyType(JNIEnv* jni, jobject j_key_type) { | |
301 std::string enum_name = | |
302 GetJavaEnumName(jni, "org/webrtc/PeerConnection$KeyType", j_key_type); | |
303 | |
304 if (enum_name == "RSA") | |
305 return rtc::KT_RSA; | |
306 if (enum_name == "ECDSA") | |
307 return rtc::KT_ECDSA; | |
308 | |
309 RTC_CHECK(false) << "Unexpected KeyType enum_name " << enum_name; | |
310 return rtc::KT_ECDSA; | |
311 } | |
312 | |
313 webrtc::PeerConnectionInterface::ContinualGatheringPolicy | |
314 JavaToNativeContinualGatheringPolicy(JNIEnv* jni, jobject j_gathering_policy) { | |
315 std::string enum_name = | |
316 GetJavaEnumName(jni, "org/webrtc/PeerConnection$ContinualGatheringPolicy", | |
317 j_gathering_policy); | |
318 if (enum_name == "GATHER_ONCE") | |
319 return webrtc::PeerConnectionInterface::GATHER_ONCE; | |
320 | |
321 if (enum_name == "GATHER_CONTINUALLY") | |
322 return webrtc::PeerConnectionInterface::GATHER_CONTINUALLY; | |
323 | |
324 RTC_CHECK(false) << "Unexpected ContinualGatheringPolicy enum name " | |
325 << enum_name; | |
326 return webrtc::PeerConnectionInterface::GATHER_ONCE; | |
327 } | |
328 | |
329 webrtc::PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy( | |
330 JNIEnv* jni, | |
331 jobject j_ice_server_tls_cert_policy) { | |
332 std::string enum_name = | |
333 GetJavaEnumName(jni, "org/webrtc/PeerConnection$TlsCertPolicy", | |
334 j_ice_server_tls_cert_policy); | |
335 | |
336 if (enum_name == "TLS_CERT_POLICY_SECURE") | |
337 return webrtc::PeerConnectionInterface::kTlsCertPolicySecure; | |
338 | |
339 if (enum_name == "TLS_CERT_POLICY_INSECURE_NO_CHECK") | |
340 return webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck; | |
341 | |
342 RTC_CHECK(false) << "Unexpected TlsCertPolicy enum_name " << enum_name; | |
343 return webrtc::PeerConnectionInterface::kTlsCertPolicySecure; | |
344 } | |
345 | |
346 void JavaToNativeIceServers( | |
347 JNIEnv* jni, | |
348 jobject j_ice_servers, | |
349 webrtc::PeerConnectionInterface::IceServers* ice_servers) { | |
350 for (jobject j_ice_server : Iterable(jni, j_ice_servers)) { | |
351 jclass j_ice_server_class = GetObjectClass(jni, j_ice_server); | |
352 jfieldID j_ice_server_uri_id = | |
353 GetFieldID(jni, j_ice_server_class, "uri", "Ljava/lang/String;"); | |
354 jfieldID j_ice_server_username_id = | |
355 GetFieldID(jni, j_ice_server_class, "username", "Ljava/lang/String;"); | |
356 jfieldID j_ice_server_password_id = | |
357 GetFieldID(jni, j_ice_server_class, "password", "Ljava/lang/String;"); | |
358 jfieldID j_ice_server_tls_cert_policy_id = | |
359 GetFieldID(jni, j_ice_server_class, "tlsCertPolicy", | |
360 "Lorg/webrtc/PeerConnection$TlsCertPolicy;"); | |
361 jobject j_ice_server_tls_cert_policy = | |
362 GetObjectField(jni, j_ice_server, j_ice_server_tls_cert_policy_id); | |
363 jfieldID j_ice_server_hostname_id = | |
364 GetFieldID(jni, j_ice_server_class, "hostname", "Ljava/lang/String;"); | |
365 jstring uri = reinterpret_cast<jstring>( | |
366 GetObjectField(jni, j_ice_server, j_ice_server_uri_id)); | |
367 jstring username = reinterpret_cast<jstring>( | |
368 GetObjectField(jni, j_ice_server, j_ice_server_username_id)); | |
369 jstring password = reinterpret_cast<jstring>( | |
370 GetObjectField(jni, j_ice_server, j_ice_server_password_id)); | |
371 webrtc::PeerConnectionInterface::TlsCertPolicy tls_cert_policy = | |
372 JavaToNativeTlsCertPolicy(jni, j_ice_server_tls_cert_policy); | |
373 jstring hostname = reinterpret_cast<jstring>( | |
374 GetObjectField(jni, j_ice_server, j_ice_server_hostname_id)); | |
375 webrtc::PeerConnectionInterface::IceServer server; | |
376 server.uri = JavaToStdString(jni, uri); | |
377 server.username = JavaToStdString(jni, username); | |
378 server.password = JavaToStdString(jni, password); | |
379 server.tls_cert_policy = tls_cert_policy; | |
380 server.hostname = JavaToStdString(jni, hostname); | |
381 ice_servers->push_back(server); | |
382 } | |
383 } | |
384 | |
385 void JavaToNativeRTCConfiguration( | |
386 JNIEnv* jni, | |
387 jobject j_rtc_config, | |
388 webrtc::PeerConnectionInterface::RTCConfiguration* rtc_config) { | |
389 jclass j_rtc_config_class = GetObjectClass(jni, j_rtc_config); | |
390 | |
391 jfieldID j_ice_transports_type_id = | |
392 GetFieldID(jni, j_rtc_config_class, "iceTransportsType", | |
393 "Lorg/webrtc/PeerConnection$IceTransportsType;"); | |
394 jobject j_ice_transports_type = | |
395 GetObjectField(jni, j_rtc_config, j_ice_transports_type_id); | |
396 | |
397 jfieldID j_bundle_policy_id = | |
398 GetFieldID(jni, j_rtc_config_class, "bundlePolicy", | |
399 "Lorg/webrtc/PeerConnection$BundlePolicy;"); | |
400 jobject j_bundle_policy = | |
401 GetObjectField(jni, j_rtc_config, j_bundle_policy_id); | |
402 | |
403 jfieldID j_rtcp_mux_policy_id = | |
404 GetFieldID(jni, j_rtc_config_class, "rtcpMuxPolicy", | |
405 "Lorg/webrtc/PeerConnection$RtcpMuxPolicy;"); | |
406 jobject j_rtcp_mux_policy = | |
407 GetObjectField(jni, j_rtc_config, j_rtcp_mux_policy_id); | |
408 | |
409 jfieldID j_tcp_candidate_policy_id = | |
410 GetFieldID(jni, j_rtc_config_class, "tcpCandidatePolicy", | |
411 "Lorg/webrtc/PeerConnection$TcpCandidatePolicy;"); | |
412 jobject j_tcp_candidate_policy = | |
413 GetObjectField(jni, j_rtc_config, j_tcp_candidate_policy_id); | |
414 | |
415 jfieldID j_candidate_network_policy_id = | |
416 GetFieldID(jni, j_rtc_config_class, "candidateNetworkPolicy", | |
417 "Lorg/webrtc/PeerConnection$CandidateNetworkPolicy;"); | |
418 jobject j_candidate_network_policy = | |
419 GetObjectField(jni, j_rtc_config, j_candidate_network_policy_id); | |
420 | |
421 jfieldID j_ice_servers_id = | |
422 GetFieldID(jni, j_rtc_config_class, "iceServers", "Ljava/util/List;"); | |
423 jobject j_ice_servers = GetObjectField(jni, j_rtc_config, j_ice_servers_id); | |
424 | |
425 jfieldID j_audio_jitter_buffer_max_packets_id = | |
426 GetFieldID(jni, j_rtc_config_class, "audioJitterBufferMaxPackets", "I"); | |
427 jfieldID j_audio_jitter_buffer_fast_accelerate_id = GetFieldID( | |
428 jni, j_rtc_config_class, "audioJitterBufferFastAccelerate", "Z"); | |
429 | |
430 jfieldID j_ice_connection_receiving_timeout_id = | |
431 GetFieldID(jni, j_rtc_config_class, "iceConnectionReceivingTimeout", "I"); | |
432 | |
433 jfieldID j_ice_backup_candidate_pair_ping_interval_id = GetFieldID( | |
434 jni, j_rtc_config_class, "iceBackupCandidatePairPingInterval", "I"); | |
435 | |
436 jfieldID j_continual_gathering_policy_id = | |
437 GetFieldID(jni, j_rtc_config_class, "continualGatheringPolicy", | |
438 "Lorg/webrtc/PeerConnection$ContinualGatheringPolicy;"); | |
439 jobject j_continual_gathering_policy = | |
440 GetObjectField(jni, j_rtc_config, j_continual_gathering_policy_id); | |
441 | |
442 jfieldID j_ice_candidate_pool_size_id = | |
443 GetFieldID(jni, j_rtc_config_class, "iceCandidatePoolSize", "I"); | |
444 jfieldID j_presume_writable_when_fully_relayed_id = GetFieldID( | |
445 jni, j_rtc_config_class, "presumeWritableWhenFullyRelayed", "Z"); | |
446 | |
447 jfieldID j_prune_turn_ports_id = | |
448 GetFieldID(jni, j_rtc_config_class, "pruneTurnPorts", "Z"); | |
449 | |
450 jfieldID j_ice_check_min_interval_id = GetFieldID( | |
451 jni, j_rtc_config_class, "iceCheckMinInterval", "Ljava/lang/Integer;"); | |
452 jclass j_integer_class = jni->FindClass("java/lang/Integer"); | |
453 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I"); | |
454 | |
455 jfieldID j_disable_ipv6_on_wifi_id = | |
456 GetFieldID(jni, j_rtc_config_class, "disableIPv6OnWifi", "Z"); | |
457 | |
458 jfieldID j_max_ipv6_networks_id = | |
459 GetFieldID(jni, j_rtc_config_class, "maxIPv6Networks", "I"); | |
460 | |
461 jfieldID j_ice_regather_interval_range_id = | |
462 GetFieldID(jni, j_rtc_config_class, "iceRegatherIntervalRange", | |
463 "Lorg/webrtc/PeerConnection$IntervalRange;"); | |
464 jclass j_interval_range_class = | |
465 jni->FindClass("org/webrtc/PeerConnection$IntervalRange"); | |
466 jmethodID get_min_id = | |
467 GetMethodID(jni, j_interval_range_class, "getMin", "()I"); | |
468 jmethodID get_max_id = | |
469 GetMethodID(jni, j_interval_range_class, "getMax", "()I"); | |
470 | |
471 rtc_config->type = JavaToNativeIceTransportsType(jni, j_ice_transports_type); | |
472 rtc_config->bundle_policy = JavaToNativeBundlePolicy(jni, j_bundle_policy); | |
473 rtc_config->rtcp_mux_policy = | |
474 JavaToNativeRtcpMuxPolicy(jni, j_rtcp_mux_policy); | |
475 rtc_config->tcp_candidate_policy = | |
476 JavaToNativeTcpCandidatePolicy(jni, j_tcp_candidate_policy); | |
477 rtc_config->candidate_network_policy = | |
478 JavaToNativeCandidateNetworkPolicy(jni, j_candidate_network_policy); | |
479 JavaToNativeIceServers(jni, j_ice_servers, &rtc_config->servers); | |
480 rtc_config->audio_jitter_buffer_max_packets = | |
481 GetIntField(jni, j_rtc_config, j_audio_jitter_buffer_max_packets_id); | |
482 rtc_config->audio_jitter_buffer_fast_accelerate = GetBooleanField( | |
483 jni, j_rtc_config, j_audio_jitter_buffer_fast_accelerate_id); | |
484 rtc_config->ice_connection_receiving_timeout = | |
485 GetIntField(jni, j_rtc_config, j_ice_connection_receiving_timeout_id); | |
486 rtc_config->ice_backup_candidate_pair_ping_interval = GetIntField( | |
487 jni, j_rtc_config, j_ice_backup_candidate_pair_ping_interval_id); | |
488 rtc_config->continual_gathering_policy = | |
489 JavaToNativeContinualGatheringPolicy(jni, j_continual_gathering_policy); | |
490 rtc_config->ice_candidate_pool_size = | |
491 GetIntField(jni, j_rtc_config, j_ice_candidate_pool_size_id); | |
492 rtc_config->prune_turn_ports = | |
493 GetBooleanField(jni, j_rtc_config, j_prune_turn_ports_id); | |
494 rtc_config->presume_writable_when_fully_relayed = GetBooleanField( | |
495 jni, j_rtc_config, j_presume_writable_when_fully_relayed_id); | |
496 jobject j_ice_check_min_interval = | |
497 GetNullableObjectField(jni, j_rtc_config, j_ice_check_min_interval_id); | |
498 if (!IsNull(jni, j_ice_check_min_interval)) { | |
499 int ice_check_min_interval_value = | |
500 jni->CallIntMethod(j_ice_check_min_interval, int_value_id); | |
501 rtc_config->ice_check_min_interval = | |
502 rtc::Optional<int>(ice_check_min_interval_value); | |
503 } | |
504 rtc_config->disable_ipv6_on_wifi = | |
505 GetBooleanField(jni, j_rtc_config, j_disable_ipv6_on_wifi_id); | |
506 rtc_config->max_ipv6_networks = | |
507 GetIntField(jni, j_rtc_config, j_max_ipv6_networks_id); | |
508 jobject j_ice_regather_interval_range = GetNullableObjectField( | |
509 jni, j_rtc_config, j_ice_regather_interval_range_id); | |
510 if (!IsNull(jni, j_ice_regather_interval_range)) { | |
511 int min = jni->CallIntMethod(j_ice_regather_interval_range, get_min_id); | |
512 int max = jni->CallIntMethod(j_ice_regather_interval_range, get_max_id); | |
513 rtc_config->ice_regather_interval_range.emplace(min, max); | |
514 } | |
515 } | |
516 | |
517 void JavaToNativeRtpParameters(JNIEnv* jni, | |
518 jobject j_parameters, | |
519 webrtc::RtpParameters* parameters) { | |
520 RTC_CHECK(parameters != nullptr); | |
521 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | |
522 jfieldID encodings_id = | |
523 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | |
524 jfieldID codecs_id = | |
525 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | |
526 | |
527 // Convert encodings. | |
528 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | |
529 jclass j_encoding_parameters_class = | |
530 jni->FindClass("org/webrtc/RtpParameters$Encoding"); | |
531 jfieldID active_id = | |
532 GetFieldID(jni, j_encoding_parameters_class, "active", "Z"); | |
533 jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class, | |
534 "maxBitrateBps", "Ljava/lang/Integer;"); | |
535 jfieldID ssrc_id = | |
536 GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;"); | |
537 jclass j_integer_class = jni->FindClass("java/lang/Integer"); | |
538 jclass j_long_class = jni->FindClass("java/lang/Long"); | |
539 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I"); | |
540 jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J"); | |
541 | |
542 for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) { | |
543 webrtc::RtpEncodingParameters encoding; | |
544 encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id); | |
545 jobject j_bitrate = | |
546 GetNullableObjectField(jni, j_encoding_parameters, bitrate_id); | |
547 if (!IsNull(jni, j_bitrate)) { | |
548 int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id); | |
549 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | |
550 encoding.max_bitrate_bps = rtc::Optional<int>(bitrate_value); | |
551 } | |
552 jobject j_ssrc = | |
553 GetNullableObjectField(jni, j_encoding_parameters, ssrc_id); | |
554 if (!IsNull(jni, j_ssrc)) { | |
555 jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id); | |
556 CHECK_EXCEPTION(jni) << "error during CallLongMethod"; | |
557 encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value); | |
558 } | |
559 parameters->encodings.push_back(encoding); | |
560 } | |
561 | |
562 // Convert codecs. | |
563 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | |
564 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | |
565 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | |
566 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); | |
567 jfieldID kind_id = GetFieldID(jni, codec_class, "kind", | |
568 "Lorg/webrtc/MediaStreamTrack$MediaType;"); | |
569 jfieldID clock_rate_id = | |
570 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); | |
571 jfieldID num_channels_id = | |
572 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); | |
573 | |
574 for (jobject j_codec : Iterable(jni, j_codecs)) { | |
575 webrtc::RtpCodecParameters codec; | |
576 codec.payload_type = GetIntField(jni, j_codec, payload_type_id); | |
577 codec.name = JavaToStdString(jni, GetStringField(jni, j_codec, name_id)); | |
578 codec.kind = | |
579 JavaToNativeMediaType(jni, GetObjectField(jni, j_codec, kind_id)); | |
580 jobject j_clock_rate = GetNullableObjectField(jni, j_codec, clock_rate_id); | |
581 if (!IsNull(jni, j_clock_rate)) { | |
582 int clock_rate_value = jni->CallIntMethod(j_clock_rate, int_value_id); | |
583 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | |
584 codec.clock_rate = rtc::Optional<int>(clock_rate_value); | |
585 } | |
586 jobject j_num_channels = | |
587 GetNullableObjectField(jni, j_codec, num_channels_id); | |
588 if (!IsNull(jni, j_num_channels)) { | |
589 int num_channels_value = jni->CallIntMethod(j_num_channels, int_value_id); | |
590 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | |
591 codec.num_channels = rtc::Optional<int>(num_channels_value); | |
592 } | |
593 parameters->codecs.push_back(codec); | |
594 } | |
595 } | |
596 | |
597 jobject NativeToJavaRtpParameters(JNIEnv* jni, | |
598 const webrtc::RtpParameters& parameters) { | |
599 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | |
600 jmethodID parameters_ctor = | |
601 GetMethodID(jni, parameters_class, "<init>", "()V"); | |
602 jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor); | |
603 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
604 | |
605 // Add encodings. | |
606 jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding"); | |
607 jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V"); | |
608 jfieldID encodings_id = | |
609 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | |
610 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | |
611 jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings), | |
612 "add", "(Ljava/lang/Object;)Z"); | |
613 jfieldID active_id = GetFieldID(jni, encoding_class, "active", "Z"); | |
614 jfieldID bitrate_id = | |
615 GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;"); | |
616 jfieldID ssrc_id = | |
617 GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;"); | |
618 | |
619 jclass integer_class = jni->FindClass("java/lang/Integer"); | |
620 jclass long_class = jni->FindClass("java/lang/Long"); | |
621 jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V"); | |
622 jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V"); | |
623 | |
624 for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) { | |
625 jobject j_encoding_parameters = | |
626 jni->NewObject(encoding_class, encoding_ctor); | |
627 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
628 jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active); | |
629 CHECK_EXCEPTION(jni) << "error during SetBooleanField"; | |
630 if (encoding.max_bitrate_bps) { | |
631 jobject j_bitrate_value = jni->NewObject(integer_class, integer_ctor, | |
632 *(encoding.max_bitrate_bps)); | |
633 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
634 jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value); | |
635 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
636 } | |
637 if (encoding.ssrc) { | |
638 jobject j_ssrc_value = jni->NewObject(long_class, long_ctor, | |
639 static_cast<jlong>(*encoding.ssrc)); | |
640 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
641 jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value); | |
642 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
643 } | |
644 jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add, | |
645 j_encoding_parameters); | |
646 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | |
647 RTC_CHECK(added); | |
648 } | |
649 | |
650 // Add codecs. | |
651 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | |
652 jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V"); | |
653 jfieldID codecs_id = | |
654 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | |
655 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | |
656 jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), "add", | |
657 "(Ljava/lang/Object;)Z"); | |
658 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | |
659 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); | |
660 jfieldID kind_id = GetFieldID(jni, codec_class, "kind", | |
661 "Lorg/webrtc/MediaStreamTrack$MediaType;"); | |
662 jfieldID clock_rate_id = | |
663 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); | |
664 jfieldID num_channels_id = | |
665 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); | |
666 | |
667 for (const webrtc::RtpCodecParameters& codec : parameters.codecs) { | |
668 jobject j_codec = jni->NewObject(codec_class, codec_ctor); | |
669 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
670 jni->SetIntField(j_codec, payload_type_id, codec.payload_type); | |
671 CHECK_EXCEPTION(jni) << "error during SetIntField"; | |
672 jni->SetObjectField(j_codec, name_id, | |
673 JavaStringFromStdString(jni, codec.name)); | |
674 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
675 jni->SetObjectField(j_codec, kind_id, | |
676 NativeToJavaMediaType(jni, codec.kind)); | |
677 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
678 if (codec.clock_rate) { | |
679 jobject j_clock_rate_value = | |
680 jni->NewObject(integer_class, integer_ctor, *(codec.clock_rate)); | |
681 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
682 jni->SetObjectField(j_codec, clock_rate_id, j_clock_rate_value); | |
683 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
684 } | |
685 if (codec.num_channels) { | |
686 jobject j_num_channels_value = | |
687 jni->NewObject(integer_class, integer_ctor, *(codec.num_channels)); | |
688 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
689 jni->SetObjectField(j_codec, num_channels_id, j_num_channels_value); | |
690 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
691 } | |
692 jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec); | |
693 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | |
694 RTC_CHECK(added); | |
695 } | |
696 | |
697 return j_parameters; | |
698 } | |
699 | |
700 } // namespace webrtc_jni | |
OLD | NEW |