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

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

Issue 2807933003: Add Java binding for new getStats implementation. (Closed)
Patch Set: Addressing hbos's comments. 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++
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698