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 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
832 } | 832 } |
833 | 833 |
834 const ScopedGlobalRef<jobject> j_observer_global_; | 834 const ScopedGlobalRef<jobject> j_observer_global_; |
835 const ScopedGlobalRef<jclass> j_observer_class_; | 835 const ScopedGlobalRef<jclass> j_observer_class_; |
836 const ScopedGlobalRef<jclass> j_stats_report_class_; | 836 const ScopedGlobalRef<jclass> j_stats_report_class_; |
837 const jmethodID j_stats_report_ctor_; | 837 const jmethodID j_stats_report_ctor_; |
838 const ScopedGlobalRef<jclass> j_value_class_; | 838 const ScopedGlobalRef<jclass> j_value_class_; |
839 const jmethodID j_value_ctor_; | 839 const jmethodID j_value_ctor_; |
840 }; | 840 }; |
841 | 841 |
842 // Adapter for a Java RTCStatsCollectorCallback presenting a C++ | |
843 // RTCStatsCollectorCallback and dispatching the callback from C++ back to | |
844 // Java. | |
845 class RTCStatsCollectorCallbackWrapper | |
846 : public webrtc::RTCStatsCollectorCallback { | |
847 public: | |
848 RTCStatsCollectorCallbackWrapper(JNIEnv* jni, jobject j_callback) | |
849 : j_callback_global_(jni, j_callback), | |
850 j_callback_class_(jni, GetObjectClass(jni, j_callback)), | |
851 j_stats_report_class_(jni, FindClass(jni, "org/webrtc/RTCStatsReport")), | |
852 j_stats_report_ctor_(GetMethodID(jni, | |
853 *j_stats_report_class_, | |
854 "<init>", | |
855 "(JLjava/util/SortedMap;)V")), | |
856 j_stats_class_(jni, FindClass(jni, "org/webrtc/RTCStats")), | |
857 j_stats_ctor_(GetMethodID( | |
858 jni, | |
859 *j_stats_class_, | |
860 "<init>", | |
861 "(JLjava/lang/String;Ljava/lang/String;Ljava/util/SortedMap;)V")), | |
862 j_tree_map_class_(jni, FindClass(jni, "java/util/TreeMap")), | |
863 j_tree_map_ctor_(GetMethodID(jni, *j_tree_map_class_, "<init>", "()V")), | |
864 j_tree_map_put_(GetMethodID( | |
865 jni, | |
866 *j_tree_map_class_, | |
867 "put", | |
868 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")), | |
869 j_boolean_class_(jni, FindClass(jni, "java/lang/Boolean")), | |
870 j_boolean_ctor_(GetMethodID(jni, *j_boolean_class_, "<init>", "(Z)V")), | |
871 j_integer_class_(jni, FindClass(jni, "java/lang/Integer")), | |
872 j_integer_ctor_(GetMethodID(jni, *j_integer_class_, "<init>", "(I)V")), | |
873 j_long_class_(jni, FindClass(jni, "java/lang/Long")), | |
874 j_long_ctor_(GetMethodID(jni, *j_long_class_, "<init>", "(J)V")), | |
875 j_big_integer_class_(jni, FindClass(jni, "java/math/BigInteger")), | |
876 j_big_integer_ctor_(GetMethodID(jni, | |
877 *j_big_integer_class_, | |
878 "<init>", | |
879 "(Ljava/lang/String;)V")), | |
880 j_double_class_(jni, FindClass(jni, "java/lang/Double")), | |
881 j_double_ctor_(GetMethodID(jni, *j_double_class_, "<init>", "(D)V")), | |
882 j_string_class_(jni, FindClass(jni, "java/lang/String")) {} | |
883 | |
884 void OnStatsDelivered( | |
885 const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report) override { | |
886 JNIEnv* jni = AttachCurrentThreadIfNeeded(); | |
887 ScopedLocalRefFrame local_ref_frame(jni); | |
888 jobject j_report = ReportToJava(jni, report); | |
889 jmethodID m = GetMethodID(jni, *j_callback_class_, "onStatsDelivered", | |
890 "(Lorg/webrtc/RTCStatsReport;)V"); | |
891 jni->CallVoidMethod(*j_callback_global_, m, j_report); | |
892 CHECK_EXCEPTION(jni) << "error during CallVoidMethod"; | |
893 } | |
894 | |
895 private: | |
896 jobject ReportToJava( | |
897 JNIEnv* jni, | |
898 const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report) { | |
899 jobject j_stats_map = jni->NewObject(*j_tree_map_class_, j_tree_map_ctor_); | |
900 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
901 for (const webrtc::RTCStats& stats : *report) { | |
902 ScopedLocalRefFrame local_ref_frame(jni); | |
hbos
2017/04/10 10:19:42
If we should use ScopedLocalRefFrame for each scop
Taylor Brandstetter
2017/04/10 23:59:33
Confession: I was just copying the pattern of the
hbos
2017/04/11 09:36:13
Confession: I was just guessing how this JNI stuff
| |
903 jstring j_id = JavaStringFromStdString(jni, stats.id()); | |
904 jobject j_stats = StatsToJava(jni, stats); | |
905 jni->CallObjectMethod(j_stats_map, j_tree_map_put_, j_id, j_stats); | |
906 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
907 } | |
908 jobject j_report = | |
909 jni->NewObject(*j_stats_report_class_, j_stats_report_ctor_, | |
910 report->timestamp_us(), j_stats_map); | |
911 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
912 return j_report; | |
913 } | |
914 | |
915 jobject StatsToJava(JNIEnv* jni, const webrtc::RTCStats& stats) { | |
916 jstring j_type = JavaStringFromStdString(jni, stats.type()); | |
917 jstring j_id = JavaStringFromStdString(jni, stats.id()); | |
918 jobject j_members = jni->NewObject(*j_tree_map_class_, j_tree_map_ctor_); | |
919 for (const webrtc::RTCStatsMemberInterface* member : stats.Members()) { | |
920 if (!member->is_defined()) { | |
921 continue; | |
922 } | |
923 ScopedLocalRefFrame local_ref_frame(jni); | |
924 jstring j_name = JavaStringFromStdString(jni, member->name()); | |
925 jobject j_member = MemberToJava(jni, member); | |
926 jni->CallObjectMethod(j_members, j_tree_map_put_, j_name, j_member); | |
927 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
928 } | |
929 jobject j_stats = | |
930 jni->NewObject(*j_stats_class_, j_stats_ctor_, stats.timestamp_us(), | |
931 j_type, j_id, j_members); | |
932 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
933 return j_stats; | |
934 } | |
935 | |
936 jobject MemberToJava(JNIEnv* jni, | |
937 const webrtc::RTCStatsMemberInterface* member) { | |
938 switch (member->type()) { | |
939 case webrtc::RTCStatsMemberInterface::kBool: { | |
940 jobject value = | |
941 jni->NewObject(*j_boolean_class_, j_boolean_ctor_, | |
942 *member->cast_to<webrtc::RTCStatsMember<bool>>()); | |
943 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
944 return value; | |
945 } | |
946 case webrtc::RTCStatsMemberInterface::kInt32: { | |
947 jobject value = | |
948 jni->NewObject(*j_integer_class_, j_integer_ctor_, | |
949 *member->cast_to<webrtc::RTCStatsMember<int32_t>>()); | |
950 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
951 return value; | |
952 } | |
953 case webrtc::RTCStatsMemberInterface::kUint32: { | |
954 jobject value = jni->NewObject( | |
955 *j_long_class_, j_long_ctor_, | |
956 (jlong)*member->cast_to<webrtc::RTCStatsMember<uint32_t>>()); | |
957 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
958 return value; | |
959 } | |
960 case webrtc::RTCStatsMemberInterface::kInt64: { | |
961 jobject value = | |
962 jni->NewObject(*j_long_class_, j_long_ctor_, | |
963 *member->cast_to<webrtc::RTCStatsMember<int64_t>>()); | |
964 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
965 return value; | |
966 } | |
967 case webrtc::RTCStatsMemberInterface::kUint64: { | |
968 jobject value = jni->NewObject( | |
969 *j_big_integer_class_, j_big_integer_ctor_, | |
970 JavaStringFromStdString(jni, member->ValueToString())); | |
971 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
972 return value; | |
973 } | |
974 case webrtc::RTCStatsMemberInterface::kDouble: { | |
975 jobject value = | |
976 jni->NewObject(*j_double_class_, j_double_ctor_, | |
977 *member->cast_to<webrtc::RTCStatsMember<double>>()); | |
978 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
979 return value; | |
980 } | |
981 case webrtc::RTCStatsMemberInterface::kString: { | |
982 return JavaStringFromStdString( | |
983 jni, *member->cast_to<webrtc::RTCStatsMember<std::string>>()); | |
984 } | |
985 case webrtc::RTCStatsMemberInterface::kSequenceBool: { | |
986 const std::vector<bool>& values = | |
987 *member->cast_to<webrtc::RTCStatsMember<std::vector<bool>>>(); | |
988 jobjectArray j_values = | |
989 jni->NewObjectArray(values.size(), *j_boolean_class_, nullptr); | |
990 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
991 for (size_t i = 0; i < values.size(); ++i) { | |
992 jobject value = | |
993 jni->NewObject(*j_boolean_class_, j_boolean_ctor_, values[i]); | |
994 jni->SetObjectArrayElement(j_values, i, value); | |
995 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
996 } | |
997 return j_values; | |
998 } | |
999 case webrtc::RTCStatsMemberInterface::kSequenceInt32: { | |
1000 const std::vector<int32_t>& values = | |
1001 *member->cast_to<webrtc::RTCStatsMember<std::vector<int32_t>>>(); | |
1002 jobjectArray j_values = | |
1003 jni->NewObjectArray(values.size(), *j_integer_class_, nullptr); | |
1004 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1005 for (size_t i = 0; i < values.size(); ++i) { | |
1006 jobject value = | |
1007 jni->NewObject(*j_integer_class_, j_integer_ctor_, values[i]); | |
1008 jni->SetObjectArrayElement(j_values, i, value); | |
1009 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1010 } | |
1011 return j_values; | |
1012 } | |
1013 case webrtc::RTCStatsMemberInterface::kSequenceUint32: { | |
1014 const std::vector<uint32_t>& values = | |
1015 *member->cast_to<webrtc::RTCStatsMember<std::vector<uint32_t>>>(); | |
1016 jobjectArray j_values = | |
1017 jni->NewObjectArray(values.size(), *j_long_class_, nullptr); | |
1018 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1019 for (size_t i = 0; i < values.size(); ++i) { | |
1020 jobject value = | |
1021 jni->NewObject(*j_long_class_, j_long_ctor_, values[i]); | |
1022 jni->SetObjectArrayElement(j_values, i, value); | |
1023 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1024 } | |
1025 return j_values; | |
1026 } | |
1027 case webrtc::RTCStatsMemberInterface::kSequenceInt64: { | |
1028 const std::vector<int64_t>& values = | |
1029 *member->cast_to<webrtc::RTCStatsMember<std::vector<int64_t>>>(); | |
1030 jobjectArray j_values = | |
1031 jni->NewObjectArray(values.size(), *j_long_class_, nullptr); | |
1032 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1033 for (size_t i = 0; i < values.size(); ++i) { | |
1034 jobject value = | |
1035 jni->NewObject(*j_long_class_, j_long_ctor_, values[i]); | |
1036 jni->SetObjectArrayElement(j_values, i, value); | |
1037 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1038 } | |
1039 return j_values; | |
1040 } | |
1041 case webrtc::RTCStatsMemberInterface::kSequenceUint64: { | |
1042 const std::vector<uint64_t>& values = | |
1043 *member->cast_to<webrtc::RTCStatsMember<std::vector<uint64_t>>>(); | |
1044 jobjectArray j_values = | |
1045 jni->NewObjectArray(values.size(), *j_big_integer_class_, nullptr); | |
1046 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1047 for (size_t i = 0; i < values.size(); ++i) { | |
1048 jobject value = jni->NewObject( | |
1049 *j_big_integer_class_, j_big_integer_ctor_, | |
1050 JavaStringFromStdString(jni, rtc::ToString(values[i]))); | |
1051 jni->SetObjectArrayElement(j_values, i, value); | |
1052 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1053 } | |
1054 return j_values; | |
1055 } | |
1056 case webrtc::RTCStatsMemberInterface::kSequenceDouble: { | |
1057 const std::vector<double>& values = | |
1058 *member->cast_to<webrtc::RTCStatsMember<std::vector<double>>>(); | |
1059 jobjectArray j_values = | |
1060 jni->NewObjectArray(values.size(), *j_double_class_, nullptr); | |
1061 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1062 for (size_t i = 0; i < values.size(); ++i) { | |
1063 jobject value = | |
1064 jni->NewObject(*j_double_class_, j_double_ctor_, values[i]); | |
1065 jni->SetObjectArrayElement(j_values, i, value); | |
1066 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1067 } | |
1068 return j_values; | |
1069 } | |
1070 case webrtc::RTCStatsMemberInterface::kSequenceString: { | |
1071 const std::vector<std::string>& values = | |
1072 *member | |
1073 ->cast_to<webrtc::RTCStatsMember<std::vector<std::string>>>(); | |
1074 jobjectArray j_values = | |
1075 jni->NewObjectArray(values.size(), *j_string_class_, nullptr); | |
1076 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1077 for (size_t i = 0; i < values.size(); ++i) { | |
1078 jni->SetObjectArrayElement(j_values, i, | |
1079 JavaStringFromStdString(jni, values[i])); | |
1080 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1081 } | |
1082 return j_values; | |
1083 } | |
1084 } | |
1085 RTC_NOTREACHED(); | |
1086 return nullptr; | |
1087 } | |
1088 | |
1089 const ScopedGlobalRef<jobject> j_callback_global_; | |
1090 const ScopedGlobalRef<jclass> j_callback_class_; | |
1091 const ScopedGlobalRef<jclass> j_stats_report_class_; | |
1092 const jmethodID j_stats_report_ctor_; | |
1093 const ScopedGlobalRef<jclass> j_stats_class_; | |
1094 const jmethodID j_stats_ctor_; | |
1095 const ScopedGlobalRef<jclass> j_tree_map_class_; | |
1096 const jmethodID j_tree_map_ctor_; | |
1097 const jmethodID j_tree_map_put_; | |
1098 const ScopedGlobalRef<jclass> j_boolean_class_; | |
1099 const jmethodID j_boolean_ctor_; | |
1100 const ScopedGlobalRef<jclass> j_integer_class_; | |
1101 const jmethodID j_integer_ctor_; | |
1102 const ScopedGlobalRef<jclass> j_long_class_; | |
1103 const jmethodID j_long_ctor_; | |
1104 const ScopedGlobalRef<jclass> j_big_integer_class_; | |
1105 const jmethodID j_big_integer_ctor_; | |
1106 const ScopedGlobalRef<jclass> j_double_class_; | |
1107 const jmethodID j_double_ctor_; | |
1108 const ScopedGlobalRef<jclass> j_string_class_; | |
1109 }; | |
1110 | |
842 // Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer | 1111 // Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer |
843 // instance. | 1112 // instance. |
844 class JavaVideoRendererWrapper | 1113 class JavaVideoRendererWrapper |
845 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { | 1114 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { |
846 public: | 1115 public: |
847 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) | 1116 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) |
848 : j_callbacks_(jni, j_callbacks), | 1117 : j_callbacks_(jni, j_callbacks), |
849 j_render_frame_id_(GetMethodID( | 1118 j_render_frame_id_(GetMethodID( |
850 jni, GetObjectClass(jni, j_callbacks), "renderFrame", | 1119 jni, GetObjectClass(jni, j_callbacks), "renderFrame", |
851 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), | 1120 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), |
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2114 j_rtp_receiver_ctor, nativeReceiverPtr); | 2383 j_rtp_receiver_ctor, nativeReceiverPtr); |
2115 CHECK_EXCEPTION(jni) << "error during NewObject"; | 2384 CHECK_EXCEPTION(jni) << "error during NewObject"; |
2116 // Receiver is now owned by Java object, and will be freed from there. | 2385 // Receiver is now owned by Java object, and will be freed from there. |
2117 receiver->AddRef(); | 2386 receiver->AddRef(); |
2118 jni->CallBooleanMethod(j_receivers, j_array_list_add, j_receiver); | 2387 jni->CallBooleanMethod(j_receivers, j_array_list_add, j_receiver); |
2119 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | 2388 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; |
2120 } | 2389 } |
2121 return j_receivers; | 2390 return j_receivers; |
2122 } | 2391 } |
2123 | 2392 |
2124 JOW(bool, PeerConnection_nativeGetStats)( | 2393 JOW(bool, PeerConnection_nativeOldGetStats) |
2125 JNIEnv* jni, jobject j_pc, jobject j_observer, jlong native_track) { | 2394 (JNIEnv* jni, jobject j_pc, jobject j_observer, jlong native_track) { |
2126 rtc::scoped_refptr<StatsObserverWrapper> observer( | 2395 rtc::scoped_refptr<StatsObserverWrapper> observer( |
2127 new rtc::RefCountedObject<StatsObserverWrapper>(jni, j_observer)); | 2396 new rtc::RefCountedObject<StatsObserverWrapper>(jni, j_observer)); |
2128 return ExtractNativePC(jni, j_pc)->GetStats( | 2397 return ExtractNativePC(jni, j_pc)->GetStats( |
2129 observer, | 2398 observer, |
2130 reinterpret_cast<MediaStreamTrackInterface*>(native_track), | 2399 reinterpret_cast<MediaStreamTrackInterface*>(native_track), |
2131 PeerConnectionInterface::kStatsOutputLevelStandard); | 2400 PeerConnectionInterface::kStatsOutputLevelStandard); |
2132 } | 2401 } |
2133 | 2402 |
2403 JOW(void, PeerConnection_nativeNewGetStats) | |
2404 (JNIEnv* jni, jobject j_pc, jobject j_callback) { | |
2405 rtc::scoped_refptr<RTCStatsCollectorCallbackWrapper> callback( | |
2406 new rtc::RefCountedObject<RTCStatsCollectorCallbackWrapper>(jni, | |
2407 j_callback)); | |
2408 ExtractNativePC(jni, j_pc)->GetStats(callback); | |
2409 } | |
2410 | |
2134 JOW(bool, PeerConnection_nativeStartRtcEventLog)( | 2411 JOW(bool, PeerConnection_nativeStartRtcEventLog)( |
2135 JNIEnv* jni, jobject j_pc, int file_descriptor, int max_size_bytes) { | 2412 JNIEnv* jni, jobject j_pc, int file_descriptor, int max_size_bytes) { |
2136 return ExtractNativePC(jni, j_pc)->StartRtcEventLog(file_descriptor, | 2413 return ExtractNativePC(jni, j_pc)->StartRtcEventLog(file_descriptor, |
2137 max_size_bytes); | 2414 max_size_bytes); |
2138 } | 2415 } |
2139 | 2416 |
2140 JOW(void, PeerConnection_nativeStopRtcEventLog)(JNIEnv* jni, jobject j_pc) { | 2417 JOW(void, PeerConnection_nativeStopRtcEventLog)(JNIEnv* jni, jobject j_pc) { |
2141 ExtractNativePC(jni, j_pc)->StopRtcEventLog(); | 2418 ExtractNativePC(jni, j_pc)->StopRtcEventLog(); |
2142 } | 2419 } |
2143 | 2420 |
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2727 return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer) | 3004 return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer) |
2728 ->inter_tone_gap(); | 3005 ->inter_tone_gap(); |
2729 } | 3006 } |
2730 | 3007 |
2731 JOW(void, DtmfSender_free) | 3008 JOW(void, DtmfSender_free) |
2732 (JNIEnv* jni, jclass, jlong j_dtmf_sender_pointer) { | 3009 (JNIEnv* jni, jclass, jlong j_dtmf_sender_pointer) { |
2733 reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->Release(); | 3010 reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->Release(); |
2734 } | 3011 } |
2735 | 3012 |
2736 } // namespace webrtc_jni | 3013 } // namespace webrtc_jni |
OLD | NEW |