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++ | |
sakal
2017/04/11 12:50:51
nit: I'd prefer this be in a new file.
Taylor Brandstetter
2017/04/13 02:33:15
Done.
| |
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 // Create a local reference frame for each RTCStats, since there is a | |
903 // maximum number of references that can be created in one frame. | |
904 ScopedLocalRefFrame local_ref_frame(jni); | |
905 jstring j_id = JavaStringFromStdString(jni, stats.id()); | |
906 jobject j_stats = StatsToJava(jni, stats); | |
907 jni->CallObjectMethod(j_stats_map, j_tree_map_put_, j_id, j_stats); | |
908 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
909 } | |
910 jobject j_report = | |
911 jni->NewObject(*j_stats_report_class_, j_stats_report_ctor_, | |
912 report->timestamp_us(), j_stats_map); | |
913 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
914 return j_report; | |
915 } | |
916 | |
917 jobject StatsToJava(JNIEnv* jni, const webrtc::RTCStats& stats) { | |
918 jstring j_type = JavaStringFromStdString(jni, stats.type()); | |
919 jstring j_id = JavaStringFromStdString(jni, stats.id()); | |
920 jobject j_members = jni->NewObject(*j_tree_map_class_, j_tree_map_ctor_); | |
921 for (const webrtc::RTCStatsMemberInterface* member : stats.Members()) { | |
922 if (!member->is_defined()) { | |
923 continue; | |
924 } | |
925 // Create a local reference frame for each member as well. | |
926 ScopedLocalRefFrame local_ref_frame(jni); | |
927 jstring j_name = JavaStringFromStdString(jni, member->name()); | |
928 jobject j_member = MemberToJava(jni, member); | |
929 jni->CallObjectMethod(j_members, j_tree_map_put_, j_name, j_member); | |
930 CHECK_EXCEPTION(jni) << "error during CallObjectMethod"; | |
931 } | |
932 jobject j_stats = | |
933 jni->NewObject(*j_stats_class_, j_stats_ctor_, stats.timestamp_us(), | |
934 j_type, j_id, j_members); | |
935 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
936 return j_stats; | |
937 } | |
938 | |
939 jobject MemberToJava(JNIEnv* jni, | |
940 const webrtc::RTCStatsMemberInterface* member) { | |
941 switch (member->type()) { | |
942 case webrtc::RTCStatsMemberInterface::kBool: { | |
943 jobject value = | |
944 jni->NewObject(*j_boolean_class_, j_boolean_ctor_, | |
945 *member->cast_to<webrtc::RTCStatsMember<bool>>()); | |
946 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
947 return value; | |
948 } | |
949 case webrtc::RTCStatsMemberInterface::kInt32: { | |
950 jobject value = | |
951 jni->NewObject(*j_integer_class_, j_integer_ctor_, | |
952 *member->cast_to<webrtc::RTCStatsMember<int32_t>>()); | |
953 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
954 return value; | |
955 } | |
956 case webrtc::RTCStatsMemberInterface::kUint32: { | |
957 jobject value = jni->NewObject( | |
958 *j_long_class_, j_long_ctor_, | |
959 (jlong)*member->cast_to<webrtc::RTCStatsMember<uint32_t>>()); | |
960 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
961 return value; | |
962 } | |
963 case webrtc::RTCStatsMemberInterface::kInt64: { | |
964 jobject value = | |
965 jni->NewObject(*j_long_class_, j_long_ctor_, | |
966 *member->cast_to<webrtc::RTCStatsMember<int64_t>>()); | |
967 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
968 return value; | |
969 } | |
970 case webrtc::RTCStatsMemberInterface::kUint64: { | |
971 jobject value = jni->NewObject( | |
972 *j_big_integer_class_, j_big_integer_ctor_, | |
973 JavaStringFromStdString(jni, member->ValueToString())); | |
974 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
975 return value; | |
976 } | |
977 case webrtc::RTCStatsMemberInterface::kDouble: { | |
978 jobject value = | |
979 jni->NewObject(*j_double_class_, j_double_ctor_, | |
980 *member->cast_to<webrtc::RTCStatsMember<double>>()); | |
981 CHECK_EXCEPTION(jni) << "error during NewObject"; | |
982 return value; | |
983 } | |
984 case webrtc::RTCStatsMemberInterface::kString: { | |
985 return JavaStringFromStdString( | |
986 jni, *member->cast_to<webrtc::RTCStatsMember<std::string>>()); | |
987 } | |
988 case webrtc::RTCStatsMemberInterface::kSequenceBool: { | |
989 const std::vector<bool>& values = | |
990 *member->cast_to<webrtc::RTCStatsMember<std::vector<bool>>>(); | |
991 jobjectArray j_values = | |
992 jni->NewObjectArray(values.size(), *j_boolean_class_, nullptr); | |
993 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
994 for (size_t i = 0; i < values.size(); ++i) { | |
995 jobject value = | |
996 jni->NewObject(*j_boolean_class_, j_boolean_ctor_, values[i]); | |
997 jni->SetObjectArrayElement(j_values, i, value); | |
998 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
999 } | |
1000 return j_values; | |
1001 } | |
1002 case webrtc::RTCStatsMemberInterface::kSequenceInt32: { | |
1003 const std::vector<int32_t>& values = | |
1004 *member->cast_to<webrtc::RTCStatsMember<std::vector<int32_t>>>(); | |
1005 jobjectArray j_values = | |
1006 jni->NewObjectArray(values.size(), *j_integer_class_, nullptr); | |
1007 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1008 for (size_t i = 0; i < values.size(); ++i) { | |
1009 jobject value = | |
1010 jni->NewObject(*j_integer_class_, j_integer_ctor_, values[i]); | |
1011 jni->SetObjectArrayElement(j_values, i, value); | |
1012 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1013 } | |
1014 return j_values; | |
1015 } | |
1016 case webrtc::RTCStatsMemberInterface::kSequenceUint32: { | |
1017 const std::vector<uint32_t>& values = | |
1018 *member->cast_to<webrtc::RTCStatsMember<std::vector<uint32_t>>>(); | |
1019 jobjectArray j_values = | |
1020 jni->NewObjectArray(values.size(), *j_long_class_, nullptr); | |
1021 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1022 for (size_t i = 0; i < values.size(); ++i) { | |
1023 jobject value = | |
1024 jni->NewObject(*j_long_class_, j_long_ctor_, values[i]); | |
1025 jni->SetObjectArrayElement(j_values, i, value); | |
1026 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1027 } | |
1028 return j_values; | |
1029 } | |
1030 case webrtc::RTCStatsMemberInterface::kSequenceInt64: { | |
1031 const std::vector<int64_t>& values = | |
1032 *member->cast_to<webrtc::RTCStatsMember<std::vector<int64_t>>>(); | |
1033 jobjectArray j_values = | |
1034 jni->NewObjectArray(values.size(), *j_long_class_, nullptr); | |
1035 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1036 for (size_t i = 0; i < values.size(); ++i) { | |
1037 jobject value = | |
1038 jni->NewObject(*j_long_class_, j_long_ctor_, values[i]); | |
1039 jni->SetObjectArrayElement(j_values, i, value); | |
1040 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1041 } | |
1042 return j_values; | |
1043 } | |
1044 case webrtc::RTCStatsMemberInterface::kSequenceUint64: { | |
1045 const std::vector<uint64_t>& values = | |
1046 *member->cast_to<webrtc::RTCStatsMember<std::vector<uint64_t>>>(); | |
1047 jobjectArray j_values = | |
1048 jni->NewObjectArray(values.size(), *j_big_integer_class_, nullptr); | |
1049 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1050 for (size_t i = 0; i < values.size(); ++i) { | |
1051 jobject value = jni->NewObject( | |
1052 *j_big_integer_class_, j_big_integer_ctor_, | |
1053 JavaStringFromStdString(jni, rtc::ToString(values[i]))); | |
1054 jni->SetObjectArrayElement(j_values, i, value); | |
1055 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1056 } | |
1057 return j_values; | |
1058 } | |
1059 case webrtc::RTCStatsMemberInterface::kSequenceDouble: { | |
1060 const std::vector<double>& values = | |
1061 *member->cast_to<webrtc::RTCStatsMember<std::vector<double>>>(); | |
1062 jobjectArray j_values = | |
1063 jni->NewObjectArray(values.size(), *j_double_class_, nullptr); | |
1064 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1065 for (size_t i = 0; i < values.size(); ++i) { | |
1066 jobject value = | |
1067 jni->NewObject(*j_double_class_, j_double_ctor_, values[i]); | |
1068 jni->SetObjectArrayElement(j_values, i, value); | |
1069 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1070 } | |
1071 return j_values; | |
1072 } | |
1073 case webrtc::RTCStatsMemberInterface::kSequenceString: { | |
1074 const std::vector<std::string>& values = | |
1075 *member | |
1076 ->cast_to<webrtc::RTCStatsMember<std::vector<std::string>>>(); | |
1077 jobjectArray j_values = | |
1078 jni->NewObjectArray(values.size(), *j_string_class_, nullptr); | |
1079 CHECK_EXCEPTION(jni) << "error during NewObjectArray"; | |
1080 for (size_t i = 0; i < values.size(); ++i) { | |
1081 jni->SetObjectArrayElement(j_values, i, | |
1082 JavaStringFromStdString(jni, values[i])); | |
1083 CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement"; | |
1084 } | |
1085 return j_values; | |
1086 } | |
1087 } | |
1088 RTC_NOTREACHED(); | |
1089 return nullptr; | |
1090 } | |
1091 | |
1092 const ScopedGlobalRef<jobject> j_callback_global_; | |
1093 const ScopedGlobalRef<jclass> j_callback_class_; | |
1094 const ScopedGlobalRef<jclass> j_stats_report_class_; | |
1095 const jmethodID j_stats_report_ctor_; | |
1096 const ScopedGlobalRef<jclass> j_stats_class_; | |
1097 const jmethodID j_stats_ctor_; | |
1098 const ScopedGlobalRef<jclass> j_tree_map_class_; | |
1099 const jmethodID j_tree_map_ctor_; | |
1100 const jmethodID j_tree_map_put_; | |
1101 const ScopedGlobalRef<jclass> j_boolean_class_; | |
1102 const jmethodID j_boolean_ctor_; | |
1103 const ScopedGlobalRef<jclass> j_integer_class_; | |
1104 const jmethodID j_integer_ctor_; | |
1105 const ScopedGlobalRef<jclass> j_long_class_; | |
1106 const jmethodID j_long_ctor_; | |
1107 const ScopedGlobalRef<jclass> j_big_integer_class_; | |
1108 const jmethodID j_big_integer_ctor_; | |
1109 const ScopedGlobalRef<jclass> j_double_class_; | |
1110 const jmethodID j_double_ctor_; | |
1111 const ScopedGlobalRef<jclass> j_string_class_; | |
1112 }; | |
1113 | |
842 // Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer | 1114 // Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer |
843 // instance. | 1115 // instance. |
844 class JavaVideoRendererWrapper | 1116 class JavaVideoRendererWrapper |
845 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { | 1117 : public rtc::VideoSinkInterface<webrtc::VideoFrame> { |
846 public: | 1118 public: |
847 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) | 1119 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) |
848 : j_callbacks_(jni, j_callbacks), | 1120 : j_callbacks_(jni, j_callbacks), |
849 j_render_frame_id_(GetMethodID( | 1121 j_render_frame_id_(GetMethodID( |
850 jni, GetObjectClass(jni, j_callbacks), "renderFrame", | 1122 jni, GetObjectClass(jni, j_callbacks), "renderFrame", |
851 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), | 1123 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), |
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2114 j_rtp_receiver_ctor, nativeReceiverPtr); | 2386 j_rtp_receiver_ctor, nativeReceiverPtr); |
2115 CHECK_EXCEPTION(jni) << "error during NewObject"; | 2387 CHECK_EXCEPTION(jni) << "error during NewObject"; |
2116 // Receiver is now owned by Java object, and will be freed from there. | 2388 // Receiver is now owned by Java object, and will be freed from there. |
2117 receiver->AddRef(); | 2389 receiver->AddRef(); |
2118 jni->CallBooleanMethod(j_receivers, j_array_list_add, j_receiver); | 2390 jni->CallBooleanMethod(j_receivers, j_array_list_add, j_receiver); |
2119 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; | 2391 CHECK_EXCEPTION(jni) << "error during CallBooleanMethod"; |
2120 } | 2392 } |
2121 return j_receivers; | 2393 return j_receivers; |
2122 } | 2394 } |
2123 | 2395 |
2124 JOW(bool, PeerConnection_nativeGetStats)( | 2396 JOW(bool, PeerConnection_nativeOldGetStats) |
2125 JNIEnv* jni, jobject j_pc, jobject j_observer, jlong native_track) { | 2397 (JNIEnv* jni, jobject j_pc, jobject j_observer, jlong native_track) { |
2126 rtc::scoped_refptr<StatsObserverWrapper> observer( | 2398 rtc::scoped_refptr<StatsObserverWrapper> observer( |
2127 new rtc::RefCountedObject<StatsObserverWrapper>(jni, j_observer)); | 2399 new rtc::RefCountedObject<StatsObserverWrapper>(jni, j_observer)); |
2128 return ExtractNativePC(jni, j_pc)->GetStats( | 2400 return ExtractNativePC(jni, j_pc)->GetStats( |
2129 observer, | 2401 observer, |
2130 reinterpret_cast<MediaStreamTrackInterface*>(native_track), | 2402 reinterpret_cast<MediaStreamTrackInterface*>(native_track), |
2131 PeerConnectionInterface::kStatsOutputLevelStandard); | 2403 PeerConnectionInterface::kStatsOutputLevelStandard); |
2132 } | 2404 } |
2133 | 2405 |
2406 JOW(void, PeerConnection_nativeNewGetStats) | |
2407 (JNIEnv* jni, jobject j_pc, jobject j_callback) { | |
2408 rtc::scoped_refptr<RTCStatsCollectorCallbackWrapper> callback( | |
2409 new rtc::RefCountedObject<RTCStatsCollectorCallbackWrapper>(jni, | |
2410 j_callback)); | |
2411 ExtractNativePC(jni, j_pc)->GetStats(callback); | |
2412 } | |
2413 | |
2134 JOW(bool, PeerConnection_nativeStartRtcEventLog)( | 2414 JOW(bool, PeerConnection_nativeStartRtcEventLog)( |
2135 JNIEnv* jni, jobject j_pc, int file_descriptor, int max_size_bytes) { | 2415 JNIEnv* jni, jobject j_pc, int file_descriptor, int max_size_bytes) { |
2136 return ExtractNativePC(jni, j_pc)->StartRtcEventLog(file_descriptor, | 2416 return ExtractNativePC(jni, j_pc)->StartRtcEventLog(file_descriptor, |
2137 max_size_bytes); | 2417 max_size_bytes); |
2138 } | 2418 } |
2139 | 2419 |
2140 JOW(void, PeerConnection_nativeStopRtcEventLog)(JNIEnv* jni, jobject j_pc) { | 2420 JOW(void, PeerConnection_nativeStopRtcEventLog)(JNIEnv* jni, jobject j_pc) { |
2141 ExtractNativePC(jni, j_pc)->StopRtcEventLog(); | 2421 ExtractNativePC(jni, j_pc)->StopRtcEventLog(); |
2142 } | 2422 } |
2143 | 2423 |
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2727 return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer) | 3007 return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer) |
2728 ->inter_tone_gap(); | 3008 ->inter_tone_gap(); |
2729 } | 3009 } |
2730 | 3010 |
2731 JOW(void, DtmfSender_free) | 3011 JOW(void, DtmfSender_free) |
2732 (JNIEnv* jni, jclass, jlong j_dtmf_sender_pointer) { | 3012 (JNIEnv* jni, jclass, jlong j_dtmf_sender_pointer) { |
2733 reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->Release(); | 3013 reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->Release(); |
2734 } | 3014 } |
2735 | 3015 |
2736 } // namespace webrtc_jni | 3016 } // namespace webrtc_jni |
OLD | NEW |