OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
150 init.maxRetransmitTime = GetIntField(jni, j_init, max_retransmit_time_id); | 150 init.maxRetransmitTime = GetIntField(jni, j_init, max_retransmit_time_id); |
151 init.maxRetransmits = GetIntField(jni, j_init, max_retransmits_id); | 151 init.maxRetransmits = GetIntField(jni, j_init, max_retransmits_id); |
152 init.protocol = JavaToStdString( | 152 init.protocol = JavaToStdString( |
153 jni, GetStringField(jni, j_init, protocol_id)); | 153 jni, GetStringField(jni, j_init, protocol_id)); |
154 init.negotiated = GetBooleanField(jni, j_init, negotiated_id); | 154 init.negotiated = GetBooleanField(jni, j_init, negotiated_id); |
155 init.id = GetIntField(jni, j_init, id_id); | 155 init.id = GetIntField(jni, j_init, id_id); |
156 | 156 |
157 return init; | 157 return init; |
158 } | 158 } |
159 | 159 |
160 static cricket::MediaType JavaMediaTypeToJsepMediaType(JNIEnv* jni, | |
magjed_webrtc
2017/01/26 09:48:06
Can you keep this code in the existing position du
Taylor Brandstetter
2017/01/26 19:08:20
Done; sorry about that.
| |
161 jobject j_media_type) { | |
162 jclass j_media_type_class = | |
163 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); | |
164 jmethodID j_name_id = | |
165 GetMethodID(jni, j_media_type_class, "name", "()Ljava/lang/String;"); | |
166 jstring j_type_string = | |
167 (jstring)jni->CallObjectMethod(j_media_type, j_name_id); | |
168 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
169 std::string type_string = JavaToStdString(jni, j_type_string); | |
170 | |
171 RTC_DCHECK(type_string == "MEDIA_TYPE_AUDIO" || | |
172 type_string == "MEDIA_TYPE_VIDEO") | |
173 << "Media type: " << type_string; | |
174 return type_string == "MEDIA_TYPE_AUDIO" ? cricket::MEDIA_TYPE_AUDIO | |
175 : cricket::MEDIA_TYPE_VIDEO; | |
176 } | |
177 | |
178 static jobject JsepMediaTypeToJavaMediaType(JNIEnv* jni, | |
179 cricket::MediaType media_type) { | |
180 jclass j_media_type_class = | |
181 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); | |
182 | |
183 RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO || | |
184 media_type == cricket::MEDIA_TYPE_VIDEO) | |
185 << "Media type: " << media_type; | |
186 const char* media_type_str = media_type == cricket::MEDIA_TYPE_AUDIO | |
187 ? "MEDIA_TYPE_AUDIO" | |
188 : "MEDIA_TYPE_VIDEO"; | |
189 jfieldID j_media_type_fid = | |
190 GetStaticFieldID(jni, j_media_type_class, media_type_str, | |
191 "Lorg/webrtc/MediaStreamTrack$MediaType;"); | |
192 return GetStaticObjectField(jni, j_media_type_class, j_media_type_fid); | |
193 } | |
194 | |
195 static void JavaRtpParametersToJsepRtpParameters( | |
196 JNIEnv* jni, | |
197 jobject j_parameters, | |
198 webrtc::RtpParameters* parameters) { | |
199 RTC_CHECK(parameters != nullptr); | |
200 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | |
201 jfieldID encodings_id = | |
202 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | |
203 jfieldID codecs_id = | |
204 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | |
205 | |
206 // Convert encodings. | |
207 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | |
208 jclass j_encoding_parameters_class = | |
209 jni->FindClass("org/webrtc/RtpParameters$Encoding"); | |
210 jfieldID active_id = | |
211 GetFieldID(jni, j_encoding_parameters_class, "active", "Z"); | |
212 jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class, | |
213 "maxBitrateBps", "Ljava/lang/Integer;"); | |
214 jfieldID ssrc_id = | |
215 GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;"); | |
216 jclass j_integer_class = jni->FindClass("java/lang/Integer"); | |
217 jclass j_long_class = jni->FindClass("java/lang/Long"); | |
218 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I"); | |
219 jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J"); | |
220 | |
221 for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) { | |
222 webrtc::RtpEncodingParameters encoding; | |
223 encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id); | |
224 jobject j_bitrate = | |
225 GetNullableObjectField(jni, j_encoding_parameters, bitrate_id); | |
226 if (!IsNull(jni, j_bitrate)) { | |
227 int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id); | |
228 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | |
229 encoding.max_bitrate_bps = rtc::Optional<int>(bitrate_value); | |
230 } | |
231 jobject j_ssrc = | |
232 GetNullableObjectField(jni, j_encoding_parameters, ssrc_id); | |
233 if (!IsNull(jni, j_ssrc)) { | |
234 jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id); | |
235 CHECK_EXCEPTION(jni) << "error during CallLongMethod"; | |
236 encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value); | |
237 } | |
238 parameters->encodings.push_back(encoding); | |
239 } | |
240 | |
241 // Convert codecs. | |
242 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | |
243 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | |
244 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | |
245 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); | |
246 jfieldID kind_id = GetFieldID(jni, codec_class, "kind", | |
247 "Lorg/webrtc/MediaStreamTrack$MediaType;"); | |
248 jfieldID clock_rate_id = | |
249 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); | |
250 jfieldID num_channels_id = | |
251 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); | |
252 | |
253 for (jobject j_codec : Iterable(jni, j_codecs)) { | |
254 webrtc::RtpCodecParameters codec; | |
255 codec.payload_type = GetIntField(jni, j_codec, payload_type_id); | |
256 codec.name = JavaToStdString(jni, GetStringField(jni, j_codec, name_id)); | |
257 codec.kind = JavaMediaTypeToJsepMediaType( | |
258 jni, GetObjectField(jni, j_codec, kind_id)); | |
259 jobject j_clock_rate = GetNullableObjectField(jni, j_codec, clock_rate_id); | |
260 if (!IsNull(jni, j_clock_rate)) { | |
261 int clock_rate_value = jni->CallIntMethod(j_clock_rate, int_value_id); | |
262 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | |
263 codec.clock_rate = rtc::Optional<int>(clock_rate_value); | |
264 } | |
265 jobject j_num_channels = | |
266 GetNullableObjectField(jni, j_codec, num_channels_id); | |
267 if (!IsNull(jni, j_num_channels)) { | |
268 int num_channels_value = jni->CallIntMethod(j_num_channels, int_value_id); | |
269 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | |
270 codec.num_channels = rtc::Optional<int>(num_channels_value); | |
271 } | |
272 parameters->codecs.push_back(codec); | |
273 } | |
274 } | |
275 | |
276 static jobject JsepRtpParametersToJavaRtpParameters( | |
277 JNIEnv* jni, | |
278 const webrtc::RtpParameters& parameters) { | |
279 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | |
280 jmethodID parameters_ctor = | |
281 GetMethodID(jni, parameters_class, "<init>", "()V"); | |
282 jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor); | |
283 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
284 | |
285 // Add encodings. | |
286 jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding"); | |
287 jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V"); | |
288 jfieldID encodings_id = | |
289 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | |
290 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | |
291 jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings), | |
292 "add", "(Ljava/lang/Object;)Z"); | |
293 jfieldID active_id = GetFieldID(jni, encoding_class, "active", "Z"); | |
294 jfieldID bitrate_id = | |
295 GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;"); | |
296 jfieldID ssrc_id = | |
297 GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;"); | |
298 | |
299 jclass integer_class = jni->FindClass("java/lang/Integer"); | |
300 jclass long_class = jni->FindClass("java/lang/Long"); | |
301 jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V"); | |
302 jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V"); | |
303 | |
304 for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) { | |
305 jobject j_encoding_parameters = | |
306 jni->NewObject(encoding_class, encoding_ctor); | |
307 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
308 jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active); | |
309 CHECK_EXCEPTION(jni) << "error during SetBooleanField"; | |
310 if (encoding.max_bitrate_bps) { | |
311 jobject j_bitrate_value = jni->NewObject(integer_class, integer_ctor, | |
312 *(encoding.max_bitrate_bps)); | |
313 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
314 jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value); | |
315 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
316 } | |
317 if (encoding.ssrc) { | |
318 jobject j_ssrc_value = jni->NewObject(long_class, long_ctor, | |
319 static_cast<jlong>(*encoding.ssrc)); | |
320 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
321 jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value); | |
322 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
323 } | |
324 jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add, | |
325 j_encoding_parameters); | |
326 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | |
327 RTC_CHECK(added); | |
328 } | |
329 | |
330 // Add codecs. | |
331 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | |
332 jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V"); | |
333 jfieldID codecs_id = | |
334 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | |
335 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | |
336 jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), "add", | |
337 "(Ljava/lang/Object;)Z"); | |
338 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | |
339 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); | |
340 jfieldID kind_id = GetFieldID(jni, codec_class, "kind", | |
341 "Lorg/webrtc/MediaStreamTrack$MediaType;"); | |
342 jfieldID clock_rate_id = | |
343 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); | |
344 jfieldID num_channels_id = | |
345 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); | |
346 | |
347 for (const webrtc::RtpCodecParameters& codec : parameters.codecs) { | |
348 jobject j_codec = jni->NewObject(codec_class, codec_ctor); | |
349 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
350 jni->SetIntField(j_codec, payload_type_id, codec.payload_type); | |
351 CHECK_EXCEPTION(jni) << "error during SetIntField"; | |
352 jni->SetObjectField(j_codec, name_id, | |
353 JavaStringFromStdString(jni, codec.name)); | |
354 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
355 jni->SetObjectField(j_codec, kind_id, | |
356 JsepMediaTypeToJavaMediaType(jni, codec.kind)); | |
357 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
358 if (codec.clock_rate) { | |
359 jobject j_clock_rate_value = | |
360 jni->NewObject(integer_class, integer_ctor, *(codec.clock_rate)); | |
361 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
362 jni->SetObjectField(j_codec, clock_rate_id, j_clock_rate_value); | |
363 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
364 } | |
365 if (codec.num_channels) { | |
366 jobject j_num_channels_value = | |
367 jni->NewObject(integer_class, integer_ctor, *(codec.num_channels)); | |
368 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
369 jni->SetObjectField(j_codec, num_channels_id, j_num_channels_value); | |
370 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
371 } | |
372 jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec); | |
373 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | |
374 RTC_CHECK(added); | |
375 } | |
376 | |
377 return j_parameters; | |
378 } | |
379 | |
160 class ConstraintsWrapper; | 380 class ConstraintsWrapper; |
161 | 381 |
162 // Adapter between the C++ PeerConnectionObserver interface and the Java | 382 // Adapter between the C++ PeerConnectionObserver interface and the Java |
163 // PeerConnection.Observer interface. Wraps an instance of the Java interface | 383 // PeerConnection.Observer interface. Wraps an instance of the Java interface |
164 // and dispatches C++ callbacks to Java. | 384 // and dispatches C++ callbacks to Java. |
165 class PCOJava : public PeerConnectionObserver { | 385 class PCOJava : public PeerConnectionObserver { |
166 public: | 386 public: |
167 // We need these using declarations because there are two versions of each of | 387 // We need these using declarations because there are two versions of each of |
168 // the below methods and we only override one of them. | 388 // the below methods and we only override one of them. |
169 // TODO(deadbeef): Remove once there's only one version of the methods. | 389 // TODO(deadbeef): Remove once there's only one version of the methods. |
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
909 | 1129 |
910 ~RtpReceiverObserver() override {} | 1130 ~RtpReceiverObserver() override {} |
911 | 1131 |
912 void OnFirstPacketReceived(cricket::MediaType media_type) override { | 1132 void OnFirstPacketReceived(cricket::MediaType media_type) override { |
913 JNIEnv* const jni = AttachCurrentThreadIfNeeded(); | 1133 JNIEnv* const jni = AttachCurrentThreadIfNeeded(); |
914 | 1134 |
915 jmethodID j_on_first_packet_received_mid = GetMethodID( | 1135 jmethodID j_on_first_packet_received_mid = GetMethodID( |
916 jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived", | 1136 jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived", |
917 "(Lorg/webrtc/MediaStreamTrack$MediaType;)V"); | 1137 "(Lorg/webrtc/MediaStreamTrack$MediaType;)V"); |
918 // Get the Java version of media type. | 1138 // Get the Java version of media type. |
919 jclass j_media_type_class = | 1139 jobject JavaMediaType = JsepMediaTypeToJavaMediaType(jni, media_type); |
920 FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType"); | |
921 | |
922 RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO || | |
923 media_type == cricket::MEDIA_TYPE_VIDEO) | |
924 << "Media type: " << media_type; | |
925 const char* media_type_str = media_type == cricket::MEDIA_TYPE_AUDIO | |
926 ? "MEDIA_TYPE_AUDIO" | |
927 : "MEDIA_TYPE_VIDEO"; | |
928 jfieldID j_media_type_fid = | |
929 GetStaticFieldID(jni, j_media_type_class, media_type_str, | |
930 "Lorg/webrtc/MediaStreamTrack$MediaType;"); | |
931 jobject JavaMediaType = | |
932 GetStaticObjectField(jni, j_media_type_class, j_media_type_fid); | |
933 // Trigger the callback function. | 1140 // Trigger the callback function. |
934 jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid, | 1141 jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid, |
935 JavaMediaType); | 1142 JavaMediaType); |
936 CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; | 1143 CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; |
937 } | 1144 } |
938 | 1145 |
939 private: | 1146 private: |
940 const ScopedGlobalRef<jobject> j_observer_global_; | 1147 const ScopedGlobalRef<jobject> j_observer_global_; |
941 }; | 1148 }; |
942 | 1149 |
(...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2360 JOW(jlong, RtpSender_nativeGetTrack)(JNIEnv* jni, | 2567 JOW(jlong, RtpSender_nativeGetTrack)(JNIEnv* jni, |
2361 jclass, | 2568 jclass, |
2362 jlong j_rtp_sender_pointer, | 2569 jlong j_rtp_sender_pointer, |
2363 jlong j_track_pointer) { | 2570 jlong j_track_pointer) { |
2364 return jlongFromPointer( | 2571 return jlongFromPointer( |
2365 reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer) | 2572 reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer) |
2366 ->track() | 2573 ->track() |
2367 .release()); | 2574 .release()); |
2368 } | 2575 } |
2369 | 2576 |
2370 static void JavaRtpParametersToJsepRtpParameters( | |
2371 JNIEnv* jni, | |
2372 jobject j_parameters, | |
2373 webrtc::RtpParameters* parameters) { | |
2374 RTC_CHECK(parameters != nullptr); | |
2375 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | |
2376 jfieldID encodings_id = | |
2377 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | |
2378 jfieldID codecs_id = | |
2379 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | |
2380 | |
2381 // Convert encodings. | |
2382 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | |
2383 const int kBitrateUnlimited = -1; | |
2384 jclass j_encoding_parameters_class = | |
2385 jni->FindClass("org/webrtc/RtpParameters$Encoding"); | |
2386 jfieldID active_id = | |
2387 GetFieldID(jni, j_encoding_parameters_class, "active", "Z"); | |
2388 jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class, | |
2389 "maxBitrateBps", "Ljava/lang/Integer;"); | |
2390 jfieldID ssrc_id = | |
2391 GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;"); | |
2392 jclass j_integer_class = jni->FindClass("java/lang/Integer"); | |
2393 jclass j_long_class = jni->FindClass("java/lang/Long"); | |
2394 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I"); | |
2395 jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J"); | |
2396 | |
2397 for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) { | |
2398 webrtc::RtpEncodingParameters encoding; | |
2399 encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id); | |
2400 jobject j_bitrate = | |
2401 GetNullableObjectField(jni, j_encoding_parameters, bitrate_id); | |
2402 if (!IsNull(jni, j_bitrate)) { | |
2403 int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id); | |
2404 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | |
2405 encoding.max_bitrate_bps = bitrate_value; | |
2406 } else { | |
2407 encoding.max_bitrate_bps = kBitrateUnlimited; | |
2408 } | |
2409 jobject j_ssrc = | |
2410 GetNullableObjectField(jni, j_encoding_parameters, ssrc_id); | |
2411 if (!IsNull(jni, j_ssrc)) { | |
2412 jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id); | |
2413 CHECK_EXCEPTION(jni) << "error during CallLongMethod"; | |
2414 encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value); | |
2415 } | |
2416 parameters->encodings.push_back(encoding); | |
2417 } | |
2418 | |
2419 // Convert codecs. | |
2420 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | |
2421 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | |
2422 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | |
2423 jfieldID mime_type_id = | |
2424 GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;"); | |
2425 jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I"); | |
2426 jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I"); | |
2427 | |
2428 for (jobject j_codec : Iterable(jni, j_codecs)) { | |
2429 webrtc::RtpCodecParameters codec; | |
2430 codec.payload_type = GetIntField(jni, j_codec, payload_type_id); | |
2431 codec.mime_type = | |
2432 JavaToStdString(jni, GetStringField(jni, j_codec, mime_type_id)); | |
2433 codec.clock_rate = GetIntField(jni, j_codec, clock_rate_id); | |
2434 codec.channels = GetIntField(jni, j_codec, channels_id); | |
2435 parameters->codecs.push_back(codec); | |
2436 } | |
2437 } | |
2438 | |
2439 static jobject JsepRtpParametersToJavaRtpParameters( | |
2440 JNIEnv* jni, | |
2441 const webrtc::RtpParameters& parameters) { | |
2442 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | |
2443 jmethodID parameters_ctor = | |
2444 GetMethodID(jni, parameters_class, "<init>", "()V"); | |
2445 jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor); | |
2446 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
2447 | |
2448 // Add encodings. | |
2449 jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding"); | |
2450 jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V"); | |
2451 jfieldID encodings_id = | |
2452 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | |
2453 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | |
2454 jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings), | |
2455 "add", "(Ljava/lang/Object;)Z"); | |
2456 jfieldID active_id = | |
2457 GetFieldID(jni, encoding_class, "active", "Z"); | |
2458 jfieldID bitrate_id = | |
2459 GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;"); | |
2460 jfieldID ssrc_id = | |
2461 GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;"); | |
2462 | |
2463 jclass integer_class = jni->FindClass("java/lang/Integer"); | |
2464 jclass long_class = jni->FindClass("java/lang/Long"); | |
2465 jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V"); | |
2466 jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V"); | |
2467 | |
2468 for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) { | |
2469 jobject j_encoding_parameters = | |
2470 jni->NewObject(encoding_class, encoding_ctor); | |
2471 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
2472 jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active); | |
2473 CHECK_EXCEPTION(jni) << "error during SetBooleanField"; | |
2474 if (encoding.max_bitrate_bps > 0) { | |
2475 jobject j_bitrate_value = | |
2476 jni->NewObject(integer_class, integer_ctor, encoding.max_bitrate_bps); | |
2477 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
2478 jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value); | |
2479 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
2480 } | |
2481 if (encoding.ssrc) { | |
2482 jobject j_ssrc_value = jni->NewObject(long_class, long_ctor, | |
2483 static_cast<jlong>(*encoding.ssrc)); | |
2484 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
2485 jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value); | |
2486 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
2487 } | |
2488 jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add, | |
2489 j_encoding_parameters); | |
2490 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | |
2491 RTC_CHECK(added); | |
2492 } | |
2493 | |
2494 // Add codecs. | |
2495 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | |
2496 jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V"); | |
2497 jfieldID codecs_id = | |
2498 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | |
2499 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | |
2500 jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), | |
2501 "add", "(Ljava/lang/Object;)Z"); | |
2502 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | |
2503 jfieldID mime_type_id = | |
2504 GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;"); | |
2505 jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I"); | |
2506 jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I"); | |
2507 | |
2508 for (const webrtc::RtpCodecParameters& codec : parameters.codecs) { | |
2509 jobject j_codec = jni->NewObject(codec_class, codec_ctor); | |
2510 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
2511 jni->SetIntField(j_codec, payload_type_id, codec.payload_type); | |
2512 CHECK_EXCEPTION(jni) << "error during SetIntField"; | |
2513 jni->SetObjectField(j_codec, mime_type_id, | |
2514 JavaStringFromStdString(jni, codec.mime_type)); | |
2515 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | |
2516 jni->SetIntField(j_codec, clock_rate_id, codec.clock_rate); | |
2517 CHECK_EXCEPTION(jni) << "error during SetIntField"; | |
2518 jni->SetIntField(j_codec, channels_id, codec.channels); | |
2519 CHECK_EXCEPTION(jni) << "error during SetIntField"; | |
2520 jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec); | |
2521 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | |
2522 RTC_CHECK(added); | |
2523 } | |
2524 | |
2525 return j_parameters; | |
2526 } | |
2527 | |
2528 JOW(jboolean, RtpSender_nativeSetParameters) | 2577 JOW(jboolean, RtpSender_nativeSetParameters) |
2529 (JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) { | 2578 (JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) { |
2530 if (IsNull(jni, j_parameters)) { | 2579 if (IsNull(jni, j_parameters)) { |
2531 return false; | 2580 return false; |
2532 } | 2581 } |
2533 webrtc::RtpParameters parameters; | 2582 webrtc::RtpParameters parameters; |
2534 JavaRtpParametersToJsepRtpParameters(jni, j_parameters, ¶meters); | 2583 JavaRtpParametersToJsepRtpParameters(jni, j_parameters, ¶meters); |
2535 return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer) | 2584 return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer) |
2536 ->SetParameters(parameters); | 2585 ->SetParameters(parameters); |
2537 } | 2586 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2609 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) | 2658 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) |
2610 ->SetObserver(nullptr); | 2659 ->SetObserver(nullptr); |
2611 RtpReceiverObserver* observer = | 2660 RtpReceiverObserver* observer = |
2612 reinterpret_cast<RtpReceiverObserver*>(j_observer_pointer); | 2661 reinterpret_cast<RtpReceiverObserver*>(j_observer_pointer); |
2613 if (observer) { | 2662 if (observer) { |
2614 delete observer; | 2663 delete observer; |
2615 } | 2664 } |
2616 } | 2665 } |
2617 | 2666 |
2618 } // namespace webrtc_jni | 2667 } // namespace webrtc_jni |
OLD | NEW |