Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: webrtc/sdk/android/src/jni/peerconnection_jni.cc

Issue 2807933003: Add Java binding for new getStats implementation. (Closed)
Patch Set: Fixing copyright year. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698