xref: /aosp_15_r20/external/webrtc/sdk/android/src/jni/pc/rtc_stats_collector_callback_wrapper.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
3  *
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
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "sdk/android/src/jni/pc/rtc_stats_collector_callback_wrapper.h"
12 
13 #include <string>
14 #include <vector>
15 
16 #include "rtc_base/string_encode.h"
17 #include "sdk/android/generated_external_classes_jni/BigInteger_jni.h"
18 #include "sdk/android/generated_peerconnection_jni/RTCStatsCollectorCallback_jni.h"
19 #include "sdk/android/generated_peerconnection_jni/RTCStatsReport_jni.h"
20 #include "sdk/android/generated_peerconnection_jni/RTCStats_jni.h"
21 #include "sdk/android/native_api/jni/java_types.h"
22 
23 namespace webrtc {
24 namespace jni {
25 
26 namespace {
27 
NativeToJavaBigInteger(JNIEnv * env,uint64_t u)28 ScopedJavaLocalRef<jobject> NativeToJavaBigInteger(JNIEnv* env, uint64_t u) {
29   return JNI_BigInteger::Java_BigInteger_ConstructorJMBI_JLS(
30       env, NativeToJavaString(env, rtc::ToString(u)));
31 }
32 
NativeToJavaBigIntegerArray(JNIEnv * env,const std::vector<uint64_t> & container)33 ScopedJavaLocalRef<jobjectArray> NativeToJavaBigIntegerArray(
34     JNIEnv* env,
35     const std::vector<uint64_t>& container) {
36   return NativeToJavaObjectArray(
37       env, container, java_math_BigInteger_clazz(env), &NativeToJavaBigInteger);
38 }
39 
MemberToJava(JNIEnv * env,const RTCStatsMemberInterface & member)40 ScopedJavaLocalRef<jobject> MemberToJava(
41     JNIEnv* env,
42     const RTCStatsMemberInterface& member) {
43   switch (member.type()) {
44     case RTCStatsMemberInterface::kBool:
45       return NativeToJavaBoolean(env, *member.cast_to<RTCStatsMember<bool>>());
46 
47     case RTCStatsMemberInterface::kInt32:
48       return NativeToJavaInteger(env,
49                                  *member.cast_to<RTCStatsMember<int32_t>>());
50 
51     case RTCStatsMemberInterface::kUint32:
52       return NativeToJavaLong(env, *member.cast_to<RTCStatsMember<uint32_t>>());
53 
54     case RTCStatsMemberInterface::kInt64:
55       return NativeToJavaLong(env, *member.cast_to<RTCStatsMember<int64_t>>());
56 
57     case RTCStatsMemberInterface::kUint64:
58       return NativeToJavaBigInteger(
59           env, *member.cast_to<RTCStatsMember<uint64_t>>());
60 
61     case RTCStatsMemberInterface::kDouble:
62       return NativeToJavaDouble(env, *member.cast_to<RTCStatsMember<double>>());
63 
64     case RTCStatsMemberInterface::kString:
65       return NativeToJavaString(env,
66                                 *member.cast_to<RTCStatsMember<std::string>>());
67 
68     case RTCStatsMemberInterface::kSequenceBool:
69       return NativeToJavaBooleanArray(
70           env, *member.cast_to<RTCStatsMember<std::vector<bool>>>());
71 
72     case RTCStatsMemberInterface::kSequenceInt32:
73       return NativeToJavaIntegerArray(
74           env, *member.cast_to<RTCStatsMember<std::vector<int32_t>>>());
75 
76     case RTCStatsMemberInterface::kSequenceUint32: {
77       const std::vector<uint32_t>& v =
78           *member.cast_to<RTCStatsMember<std::vector<uint32_t>>>();
79       return NativeToJavaLongArray(env,
80                                    std::vector<int64_t>(v.begin(), v.end()));
81     }
82     case RTCStatsMemberInterface::kSequenceInt64:
83       return NativeToJavaLongArray(
84           env, *member.cast_to<RTCStatsMember<std::vector<int64_t>>>());
85 
86     case RTCStatsMemberInterface::kSequenceUint64:
87       return NativeToJavaBigIntegerArray(
88           env, *member.cast_to<RTCStatsMember<std::vector<uint64_t>>>());
89 
90     case RTCStatsMemberInterface::kSequenceDouble:
91       return NativeToJavaDoubleArray(
92           env, *member.cast_to<RTCStatsMember<std::vector<double>>>());
93 
94     case RTCStatsMemberInterface::kSequenceString:
95       return NativeToJavaStringArray(
96           env, *member.cast_to<RTCStatsMember<std::vector<std::string>>>());
97 
98     case RTCStatsMemberInterface::kMapStringUint64:
99       return NativeToJavaMap(
100           env,
101           *member.cast_to<RTCStatsMember<std::map<std::string, uint64_t>>>(),
102           [](JNIEnv* env, const auto& entry) {
103             return std::make_pair(NativeToJavaString(env, entry.first),
104                                   NativeToJavaBigInteger(env, entry.second));
105           });
106 
107     case RTCStatsMemberInterface::kMapStringDouble:
108       return NativeToJavaMap(
109           env, *member.cast_to<RTCStatsMember<std::map<std::string, double>>>(),
110           [](JNIEnv* env, const auto& entry) {
111             return std::make_pair(NativeToJavaString(env, entry.first),
112                                   NativeToJavaDouble(env, entry.second));
113           });
114   }
115   RTC_DCHECK_NOTREACHED();
116   return nullptr;
117 }
118 
NativeToJavaRtcStats(JNIEnv * env,const RTCStats & stats)119 ScopedJavaLocalRef<jobject> NativeToJavaRtcStats(JNIEnv* env,
120                                                  const RTCStats& stats) {
121   JavaMapBuilder builder(env);
122   for (auto* const member : stats.Members()) {
123     if (!member->is_defined())
124       continue;
125     builder.put(NativeToJavaString(env, member->name()),
126                 MemberToJava(env, *member));
127   }
128   return Java_RTCStats_create(
129       env, stats.timestamp_us(), NativeToJavaString(env, stats.type()),
130       NativeToJavaString(env, stats.id()), builder.GetJavaMap());
131 }
132 
NativeToJavaRtcStatsReport(JNIEnv * env,const rtc::scoped_refptr<const RTCStatsReport> & report)133 ScopedJavaLocalRef<jobject> NativeToJavaRtcStatsReport(
134     JNIEnv* env,
135     const rtc::scoped_refptr<const RTCStatsReport>& report) {
136   ScopedJavaLocalRef<jobject> j_stats_map =
137       NativeToJavaMap(env, *report, [](JNIEnv* env, const RTCStats& stats) {
138         return std::make_pair(NativeToJavaString(env, stats.id()),
139                               NativeToJavaRtcStats(env, stats));
140       });
141   return Java_RTCStatsReport_create(env, report->timestamp_us(), j_stats_map);
142 }
143 
144 }  // namespace
145 
RTCStatsCollectorCallbackWrapper(JNIEnv * jni,const JavaRef<jobject> & j_callback)146 RTCStatsCollectorCallbackWrapper::RTCStatsCollectorCallbackWrapper(
147     JNIEnv* jni,
148     const JavaRef<jobject>& j_callback)
149     : j_callback_global_(jni, j_callback) {}
150 
151 RTCStatsCollectorCallbackWrapper::~RTCStatsCollectorCallbackWrapper() = default;
152 
OnStatsDelivered(const rtc::scoped_refptr<const RTCStatsReport> & report)153 void RTCStatsCollectorCallbackWrapper::OnStatsDelivered(
154     const rtc::scoped_refptr<const RTCStatsReport>& report) {
155   JNIEnv* jni = AttachCurrentThreadIfNeeded();
156   Java_RTCStatsCollectorCallback_onStatsDelivered(
157       jni, j_callback_global_, NativeToJavaRtcStatsReport(jni, report));
158 }
159 
160 }  // namespace jni
161 }  // namespace webrtc
162