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, |
| 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 const char* media_type_str = nullptr; |
| 184 switch (media_type) { |
| 185 case cricket::MEDIA_TYPE_AUDIO: |
| 186 media_type_str = "MEDIA_TYPE_AUDIO"; |
| 187 break; |
| 188 case cricket::MEDIA_TYPE_VIDEO: |
| 189 media_type_str = "MEDIA_TYPE_VIDEO"; |
| 190 break; |
| 191 case cricket::MEDIA_TYPE_DATA: |
| 192 RTC_NOTREACHED(); |
| 193 break; |
| 194 } |
| 195 jfieldID j_media_type_fid = |
| 196 GetStaticFieldID(jni, j_media_type_class, media_type_str, |
| 197 "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
| 198 return GetStaticObjectField(jni, j_media_type_class, j_media_type_fid); |
| 199 } |
| 200 |
160 class ConstraintsWrapper; | 201 class ConstraintsWrapper; |
161 | 202 |
162 // Adapter between the C++ PeerConnectionObserver interface and the Java | 203 // Adapter between the C++ PeerConnectionObserver interface and the Java |
163 // PeerConnection.Observer interface. Wraps an instance of the Java interface | 204 // PeerConnection.Observer interface. Wraps an instance of the Java interface |
164 // and dispatches C++ callbacks to Java. | 205 // and dispatches C++ callbacks to Java. |
165 class PCOJava : public PeerConnectionObserver { | 206 class PCOJava : public PeerConnectionObserver { |
166 public: | 207 public: |
167 // We need these using declarations because there are two versions of each of | 208 // We need these using declarations because there are two versions of each of |
168 // the below methods and we only override one of them. | 209 // the below methods and we only override one of them. |
169 // TODO(deadbeef): Remove once there's only one version of the methods. | 210 // 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 | 950 |
910 ~RtpReceiverObserver() override {} | 951 ~RtpReceiverObserver() override {} |
911 | 952 |
912 void OnFirstPacketReceived(cricket::MediaType media_type) override { | 953 void OnFirstPacketReceived(cricket::MediaType media_type) override { |
913 JNIEnv* const jni = AttachCurrentThreadIfNeeded(); | 954 JNIEnv* const jni = AttachCurrentThreadIfNeeded(); |
914 | 955 |
915 jmethodID j_on_first_packet_received_mid = GetMethodID( | 956 jmethodID j_on_first_packet_received_mid = GetMethodID( |
916 jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived", | 957 jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived", |
917 "(Lorg/webrtc/MediaStreamTrack$MediaType;)V"); | 958 "(Lorg/webrtc/MediaStreamTrack$MediaType;)V"); |
918 // Get the Java version of media type. | 959 // Get the Java version of media type. |
919 jclass j_media_type_class = | 960 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. | 961 // Trigger the callback function. |
934 jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid, | 962 jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid, |
935 JavaMediaType); | 963 JavaMediaType); |
936 CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; | 964 CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; |
937 } | 965 } |
938 | 966 |
939 private: | 967 private: |
940 const ScopedGlobalRef<jobject> j_observer_global_; | 968 const ScopedGlobalRef<jobject> j_observer_global_; |
941 }; | 969 }; |
942 | 970 |
(...skipping 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2373 webrtc::RtpParameters* parameters) { | 2401 webrtc::RtpParameters* parameters) { |
2374 RTC_CHECK(parameters != nullptr); | 2402 RTC_CHECK(parameters != nullptr); |
2375 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | 2403 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); |
2376 jfieldID encodings_id = | 2404 jfieldID encodings_id = |
2377 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | 2405 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); |
2378 jfieldID codecs_id = | 2406 jfieldID codecs_id = |
2379 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | 2407 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); |
2380 | 2408 |
2381 // Convert encodings. | 2409 // Convert encodings. |
2382 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | 2410 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); |
2383 const int kBitrateUnlimited = -1; | |
2384 jclass j_encoding_parameters_class = | 2411 jclass j_encoding_parameters_class = |
2385 jni->FindClass("org/webrtc/RtpParameters$Encoding"); | 2412 jni->FindClass("org/webrtc/RtpParameters$Encoding"); |
2386 jfieldID active_id = | 2413 jfieldID active_id = |
2387 GetFieldID(jni, j_encoding_parameters_class, "active", "Z"); | 2414 GetFieldID(jni, j_encoding_parameters_class, "active", "Z"); |
2388 jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class, | 2415 jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class, |
2389 "maxBitrateBps", "Ljava/lang/Integer;"); | 2416 "maxBitrateBps", "Ljava/lang/Integer;"); |
2390 jfieldID ssrc_id = | 2417 jfieldID ssrc_id = |
2391 GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;"); | 2418 GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;"); |
2392 jclass j_integer_class = jni->FindClass("java/lang/Integer"); | 2419 jclass j_integer_class = jni->FindClass("java/lang/Integer"); |
2393 jclass j_long_class = jni->FindClass("java/lang/Long"); | 2420 jclass j_long_class = jni->FindClass("java/lang/Long"); |
2394 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I"); | 2421 jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I"); |
2395 jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J"); | 2422 jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J"); |
2396 | 2423 |
2397 for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) { | 2424 for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) { |
2398 webrtc::RtpEncodingParameters encoding; | 2425 webrtc::RtpEncodingParameters encoding; |
2399 encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id); | 2426 encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id); |
2400 jobject j_bitrate = | 2427 jobject j_bitrate = |
2401 GetNullableObjectField(jni, j_encoding_parameters, bitrate_id); | 2428 GetNullableObjectField(jni, j_encoding_parameters, bitrate_id); |
2402 if (!IsNull(jni, j_bitrate)) { | 2429 if (!IsNull(jni, j_bitrate)) { |
2403 int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id); | 2430 int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id); |
2404 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; | 2431 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; |
2405 encoding.max_bitrate_bps = bitrate_value; | 2432 encoding.max_bitrate_bps = rtc::Optional<int>(bitrate_value); |
2406 } else { | |
2407 encoding.max_bitrate_bps = kBitrateUnlimited; | |
2408 } | 2433 } |
2409 jobject j_ssrc = | 2434 jobject j_ssrc = |
2410 GetNullableObjectField(jni, j_encoding_parameters, ssrc_id); | 2435 GetNullableObjectField(jni, j_encoding_parameters, ssrc_id); |
2411 if (!IsNull(jni, j_ssrc)) { | 2436 if (!IsNull(jni, j_ssrc)) { |
2412 jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id); | 2437 jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id); |
2413 CHECK_EXCEPTION(jni) << "error during CallLongMethod"; | 2438 CHECK_EXCEPTION(jni) << "error during CallLongMethod"; |
2414 encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value); | 2439 encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value); |
2415 } | 2440 } |
2416 parameters->encodings.push_back(encoding); | 2441 parameters->encodings.push_back(encoding); |
2417 } | 2442 } |
2418 | 2443 |
2419 // Convert codecs. | 2444 // Convert codecs. |
2420 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | 2445 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); |
2421 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | 2446 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); |
2422 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | 2447 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); |
2423 jfieldID mime_type_id = | 2448 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); |
2424 GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;"); | 2449 jfieldID kind_id = GetFieldID(jni, codec_class, "kind", |
2425 jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I"); | 2450 "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
2426 jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I"); | 2451 jfieldID clock_rate_id = |
| 2452 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); |
| 2453 jfieldID num_channels_id = |
| 2454 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); |
2427 | 2455 |
2428 for (jobject j_codec : Iterable(jni, j_codecs)) { | 2456 for (jobject j_codec : Iterable(jni, j_codecs)) { |
2429 webrtc::RtpCodecParameters codec; | 2457 webrtc::RtpCodecParameters codec; |
2430 codec.payload_type = GetIntField(jni, j_codec, payload_type_id); | 2458 codec.payload_type = GetIntField(jni, j_codec, payload_type_id); |
2431 codec.mime_type = | 2459 codec.name = JavaToStdString(jni, GetStringField(jni, j_codec, name_id)); |
2432 JavaToStdString(jni, GetStringField(jni, j_codec, mime_type_id)); | 2460 codec.kind = JavaMediaTypeToJsepMediaType( |
2433 codec.clock_rate = GetIntField(jni, j_codec, clock_rate_id); | 2461 jni, GetObjectField(jni, j_codec, kind_id)); |
2434 codec.channels = GetIntField(jni, j_codec, channels_id); | 2462 jobject j_clock_rate = GetNullableObjectField(jni, j_codec, clock_rate_id); |
| 2463 if (!IsNull(jni, j_clock_rate)) { |
| 2464 int clock_rate_value = jni->CallIntMethod(j_clock_rate, int_value_id); |
| 2465 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; |
| 2466 codec.clock_rate = rtc::Optional<int>(clock_rate_value); |
| 2467 } |
| 2468 jobject j_num_channels = |
| 2469 GetNullableObjectField(jni, j_codec, num_channels_id); |
| 2470 if (!IsNull(jni, j_num_channels)) { |
| 2471 int num_channels_value = jni->CallIntMethod(j_num_channels, int_value_id); |
| 2472 CHECK_EXCEPTION(jni) << "error during CallIntMethod"; |
| 2473 codec.num_channels = rtc::Optional<int>(num_channels_value); |
| 2474 } |
2435 parameters->codecs.push_back(codec); | 2475 parameters->codecs.push_back(codec); |
2436 } | 2476 } |
2437 } | 2477 } |
2438 | 2478 |
2439 static jobject JsepRtpParametersToJavaRtpParameters( | 2479 static jobject JsepRtpParametersToJavaRtpParameters( |
2440 JNIEnv* jni, | 2480 JNIEnv* jni, |
2441 const webrtc::RtpParameters& parameters) { | 2481 const webrtc::RtpParameters& parameters) { |
2442 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); | 2482 jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters"); |
2443 jmethodID parameters_ctor = | 2483 jmethodID parameters_ctor = |
2444 GetMethodID(jni, parameters_class, "<init>", "()V"); | 2484 GetMethodID(jni, parameters_class, "<init>", "()V"); |
2445 jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor); | 2485 jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor); |
2446 CHECK_EXCEPTION(jni) << "error during NewObject"; | 2486 CHECK_EXCEPTION(jni) << "error during NewObject"; |
2447 | 2487 |
2448 // Add encodings. | 2488 // Add encodings. |
2449 jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding"); | 2489 jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding"); |
2450 jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V"); | 2490 jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V"); |
2451 jfieldID encodings_id = | 2491 jfieldID encodings_id = |
2452 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); | 2492 GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;"); |
2453 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); | 2493 jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id); |
2454 jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings), | 2494 jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings), |
2455 "add", "(Ljava/lang/Object;)Z"); | 2495 "add", "(Ljava/lang/Object;)Z"); |
2456 jfieldID active_id = | 2496 jfieldID active_id = GetFieldID(jni, encoding_class, "active", "Z"); |
2457 GetFieldID(jni, encoding_class, "active", "Z"); | |
2458 jfieldID bitrate_id = | 2497 jfieldID bitrate_id = |
2459 GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;"); | 2498 GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;"); |
2460 jfieldID ssrc_id = | 2499 jfieldID ssrc_id = |
2461 GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;"); | 2500 GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;"); |
2462 | 2501 |
2463 jclass integer_class = jni->FindClass("java/lang/Integer"); | 2502 jclass integer_class = jni->FindClass("java/lang/Integer"); |
2464 jclass long_class = jni->FindClass("java/lang/Long"); | 2503 jclass long_class = jni->FindClass("java/lang/Long"); |
2465 jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V"); | 2504 jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V"); |
2466 jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V"); | 2505 jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V"); |
2467 | 2506 |
2468 for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) { | 2507 for (const webrtc::RtpEncodingParameters& encoding : parameters.encodings) { |
2469 jobject j_encoding_parameters = | 2508 jobject j_encoding_parameters = |
2470 jni->NewObject(encoding_class, encoding_ctor); | 2509 jni->NewObject(encoding_class, encoding_ctor); |
2471 CHECK_EXCEPTION(jni) << "error during NewObject"; | 2510 CHECK_EXCEPTION(jni) << "error during NewObject"; |
2472 jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active); | 2511 jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active); |
2473 CHECK_EXCEPTION(jni) << "error during SetBooleanField"; | 2512 CHECK_EXCEPTION(jni) << "error during SetBooleanField"; |
2474 if (encoding.max_bitrate_bps > 0) { | 2513 if (encoding.max_bitrate_bps) { |
2475 jobject j_bitrate_value = | 2514 jobject j_bitrate_value = jni->NewObject(integer_class, integer_ctor, |
2476 jni->NewObject(integer_class, integer_ctor, encoding.max_bitrate_bps); | 2515 *(encoding.max_bitrate_bps)); |
2477 CHECK_EXCEPTION(jni) << "error during NewObject"; | 2516 CHECK_EXCEPTION(jni) << "error during NewObject"; |
2478 jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value); | 2517 jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value); |
2479 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | 2518 CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
2480 } | 2519 } |
2481 if (encoding.ssrc) { | 2520 if (encoding.ssrc) { |
2482 jobject j_ssrc_value = jni->NewObject(long_class, long_ctor, | 2521 jobject j_ssrc_value = jni->NewObject(long_class, long_ctor, |
2483 static_cast<jlong>(*encoding.ssrc)); | 2522 static_cast<jlong>(*encoding.ssrc)); |
2484 CHECK_EXCEPTION(jni) << "error during NewObject"; | 2523 CHECK_EXCEPTION(jni) << "error during NewObject"; |
2485 jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value); | 2524 jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value); |
2486 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | 2525 CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
2487 } | 2526 } |
2488 jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add, | 2527 jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add, |
2489 j_encoding_parameters); | 2528 j_encoding_parameters); |
2490 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | 2529 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; |
2491 RTC_CHECK(added); | 2530 RTC_CHECK(added); |
2492 } | 2531 } |
2493 | 2532 |
2494 // Add codecs. | 2533 // Add codecs. |
2495 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); | 2534 jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec"); |
2496 jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V"); | 2535 jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V"); |
2497 jfieldID codecs_id = | 2536 jfieldID codecs_id = |
2498 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); | 2537 GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;"); |
2499 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); | 2538 jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id); |
2500 jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), | 2539 jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), "add", |
2501 "add", "(Ljava/lang/Object;)Z"); | 2540 "(Ljava/lang/Object;)Z"); |
2502 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); | 2541 jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I"); |
2503 jfieldID mime_type_id = | 2542 jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;"); |
2504 GetFieldID(jni, codec_class, "mimeType", "Ljava/lang/String;"); | 2543 jfieldID kind_id = GetFieldID(jni, codec_class, "kind", |
2505 jfieldID clock_rate_id = GetFieldID(jni, codec_class, "clockRate", "I"); | 2544 "Lorg/webrtc/MediaStreamTrack$MediaType;"); |
2506 jfieldID channels_id = GetFieldID(jni, codec_class, "channels", "I"); | 2545 jfieldID clock_rate_id = |
| 2546 GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;"); |
| 2547 jfieldID num_channels_id = |
| 2548 GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;"); |
2507 | 2549 |
2508 for (const webrtc::RtpCodecParameters& codec : parameters.codecs) { | 2550 for (const webrtc::RtpCodecParameters& codec : parameters.codecs) { |
2509 jobject j_codec = jni->NewObject(codec_class, codec_ctor); | 2551 jobject j_codec = jni->NewObject(codec_class, codec_ctor); |
2510 CHECK_EXCEPTION(jni) << "error during NewObject"; | 2552 CHECK_EXCEPTION(jni) << "error during NewObject"; |
2511 jni->SetIntField(j_codec, payload_type_id, codec.payload_type); | 2553 jni->SetIntField(j_codec, payload_type_id, codec.payload_type); |
2512 CHECK_EXCEPTION(jni) << "error during SetIntField"; | 2554 CHECK_EXCEPTION(jni) << "error during SetIntField"; |
2513 jni->SetObjectField(j_codec, mime_type_id, | 2555 jni->SetObjectField(j_codec, name_id, |
2514 JavaStringFromStdString(jni, codec.mime_type)); | 2556 JavaStringFromStdString(jni, codec.name)); |
2515 CHECK_EXCEPTION(jni) << "error during SetObjectField"; | 2557 CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
2516 jni->SetIntField(j_codec, clock_rate_id, codec.clock_rate); | 2558 jni->SetObjectField(j_codec, kind_id, |
2517 CHECK_EXCEPTION(jni) << "error during SetIntField"; | 2559 JsepMediaTypeToJavaMediaType(jni, codec.kind)); |
2518 jni->SetIntField(j_codec, channels_id, codec.channels); | 2560 CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
2519 CHECK_EXCEPTION(jni) << "error during SetIntField"; | 2561 if (codec.clock_rate) { |
| 2562 jobject j_clock_rate_value = |
| 2563 jni->NewObject(integer_class, integer_ctor, *(codec.clock_rate)); |
| 2564 CHECK_EXCEPTION(jni) << "error during NewObject"; |
| 2565 jni->SetObjectField(j_codec, clock_rate_id, j_clock_rate_value); |
| 2566 CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
| 2567 } |
| 2568 if (codec.num_channels) { |
| 2569 jobject j_num_channels_value = |
| 2570 jni->NewObject(integer_class, integer_ctor, *(codec.num_channels)); |
| 2571 CHECK_EXCEPTION(jni) << "error during NewObject"; |
| 2572 jni->SetObjectField(j_codec, num_channels_id, j_num_channels_value); |
| 2573 CHECK_EXCEPTION(jni) << "error during SetObjectField"; |
| 2574 } |
2520 jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec); | 2575 jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec); |
2521 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | 2576 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; |
2522 RTC_CHECK(added); | 2577 RTC_CHECK(added); |
2523 } | 2578 } |
2524 | 2579 |
2525 return j_parameters; | 2580 return j_parameters; |
2526 } | 2581 } |
2527 | 2582 |
2528 JOW(jboolean, RtpSender_nativeSetParameters) | 2583 JOW(jboolean, RtpSender_nativeSetParameters) |
2529 (JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) { | 2584 (JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2609 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) | 2664 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer) |
2610 ->SetObserver(nullptr); | 2665 ->SetObserver(nullptr); |
2611 RtpReceiverObserver* observer = | 2666 RtpReceiverObserver* observer = |
2612 reinterpret_cast<RtpReceiverObserver*>(j_observer_pointer); | 2667 reinterpret_cast<RtpReceiverObserver*>(j_observer_pointer); |
2613 if (observer) { | 2668 if (observer) { |
2614 delete observer; | 2669 delete observer; |
2615 } | 2670 } |
2616 } | 2671 } |
2617 | 2672 |
2618 } // namespace webrtc_jni | 2673 } // namespace webrtc_jni |
OLD | NEW |