xref: /aosp_15_r20/external/webrtc/stats/rtc_stats.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2016 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "api/stats/rtc_stats.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <cstdio>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/arraysize.h"
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/string_encode.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/strings/string_builder.h"
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker // Produces "[a,b,c]". Works for non-vector `RTCStatsMemberInterface::Type`
24*d9f75844SAndroid Build Coastguard Worker // types.
25*d9f75844SAndroid Build Coastguard Worker template <typename T>
VectorToString(const std::vector<T> & vector)26*d9f75844SAndroid Build Coastguard Worker std::string VectorToString(const std::vector<T>& vector) {
27*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder sb;
28*d9f75844SAndroid Build Coastguard Worker   sb << "[";
29*d9f75844SAndroid Build Coastguard Worker   const char* separator = "";
30*d9f75844SAndroid Build Coastguard Worker   for (const T& element : vector) {
31*d9f75844SAndroid Build Coastguard Worker     sb << separator << rtc::ToString(element);
32*d9f75844SAndroid Build Coastguard Worker     separator = ",";
33*d9f75844SAndroid Build Coastguard Worker   }
34*d9f75844SAndroid Build Coastguard Worker   sb << "]";
35*d9f75844SAndroid Build Coastguard Worker   return sb.Release();
36*d9f75844SAndroid Build Coastguard Worker }
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker // This overload is required because std::vector<bool> range loops don't
39*d9f75844SAndroid Build Coastguard Worker // return references but objects, causing -Wrange-loop-analysis diagnostics.
VectorToString(const std::vector<bool> & vector)40*d9f75844SAndroid Build Coastguard Worker std::string VectorToString(const std::vector<bool>& vector) {
41*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder sb;
42*d9f75844SAndroid Build Coastguard Worker   sb << "[";
43*d9f75844SAndroid Build Coastguard Worker   const char* separator = "";
44*d9f75844SAndroid Build Coastguard Worker   for (bool element : vector) {
45*d9f75844SAndroid Build Coastguard Worker     sb << separator << rtc::ToString(element);
46*d9f75844SAndroid Build Coastguard Worker     separator = ",";
47*d9f75844SAndroid Build Coastguard Worker   }
48*d9f75844SAndroid Build Coastguard Worker   sb << "]";
49*d9f75844SAndroid Build Coastguard Worker   return sb.Release();
50*d9f75844SAndroid Build Coastguard Worker }
51*d9f75844SAndroid Build Coastguard Worker 
52*d9f75844SAndroid Build Coastguard Worker // Produces "[\"a\",\"b\",\"c\"]". Works for vectors of both const char* and
53*d9f75844SAndroid Build Coastguard Worker // std::string element types.
54*d9f75844SAndroid Build Coastguard Worker template <typename T>
VectorOfStringsToString(const std::vector<T> & strings)55*d9f75844SAndroid Build Coastguard Worker std::string VectorOfStringsToString(const std::vector<T>& strings) {
56*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder sb;
57*d9f75844SAndroid Build Coastguard Worker   sb << "[";
58*d9f75844SAndroid Build Coastguard Worker   const char* separator = "";
59*d9f75844SAndroid Build Coastguard Worker   for (const T& element : strings) {
60*d9f75844SAndroid Build Coastguard Worker     sb << separator << "\"" << rtc::ToString(element) << "\"";
61*d9f75844SAndroid Build Coastguard Worker     separator = ",";
62*d9f75844SAndroid Build Coastguard Worker   }
63*d9f75844SAndroid Build Coastguard Worker   sb << "]";
64*d9f75844SAndroid Build Coastguard Worker   return sb.Release();
65*d9f75844SAndroid Build Coastguard Worker }
66*d9f75844SAndroid Build Coastguard Worker 
67*d9f75844SAndroid Build Coastguard Worker template <typename T>
MapToString(const std::map<std::string,T> & map)68*d9f75844SAndroid Build Coastguard Worker std::string MapToString(const std::map<std::string, T>& map) {
69*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder sb;
70*d9f75844SAndroid Build Coastguard Worker   sb << "{";
71*d9f75844SAndroid Build Coastguard Worker   const char* separator = "";
72*d9f75844SAndroid Build Coastguard Worker   for (const auto& element : map) {
73*d9f75844SAndroid Build Coastguard Worker     sb << separator << rtc::ToString(element.first) << ":"
74*d9f75844SAndroid Build Coastguard Worker        << rtc::ToString(element.second);
75*d9f75844SAndroid Build Coastguard Worker     separator = ",";
76*d9f75844SAndroid Build Coastguard Worker   }
77*d9f75844SAndroid Build Coastguard Worker   sb << "}";
78*d9f75844SAndroid Build Coastguard Worker   return sb.Release();
79*d9f75844SAndroid Build Coastguard Worker }
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker template <typename T>
ToStringAsDouble(const T value)82*d9f75844SAndroid Build Coastguard Worker std::string ToStringAsDouble(const T value) {
83*d9f75844SAndroid Build Coastguard Worker   // JSON represents numbers as floating point numbers with about 15 decimal
84*d9f75844SAndroid Build Coastguard Worker   // digits of precision.
85*d9f75844SAndroid Build Coastguard Worker   char buf[32];
86*d9f75844SAndroid Build Coastguard Worker   const int len = std::snprintf(&buf[0], arraysize(buf), "%.16g",
87*d9f75844SAndroid Build Coastguard Worker                                 static_cast<double>(value));
88*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK_LE(len, arraysize(buf));
89*d9f75844SAndroid Build Coastguard Worker   return std::string(&buf[0], len);
90*d9f75844SAndroid Build Coastguard Worker }
91*d9f75844SAndroid Build Coastguard Worker 
92*d9f75844SAndroid Build Coastguard Worker template <typename T>
VectorToStringAsDouble(const std::vector<T> & vector)93*d9f75844SAndroid Build Coastguard Worker std::string VectorToStringAsDouble(const std::vector<T>& vector) {
94*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder sb;
95*d9f75844SAndroid Build Coastguard Worker   sb << "[";
96*d9f75844SAndroid Build Coastguard Worker   const char* separator = "";
97*d9f75844SAndroid Build Coastguard Worker   for (const T& element : vector) {
98*d9f75844SAndroid Build Coastguard Worker     sb << separator << ToStringAsDouble<T>(element);
99*d9f75844SAndroid Build Coastguard Worker     separator = ",";
100*d9f75844SAndroid Build Coastguard Worker   }
101*d9f75844SAndroid Build Coastguard Worker   sb << "]";
102*d9f75844SAndroid Build Coastguard Worker   return sb.Release();
103*d9f75844SAndroid Build Coastguard Worker }
104*d9f75844SAndroid Build Coastguard Worker 
105*d9f75844SAndroid Build Coastguard Worker template <typename T>
MapToStringAsDouble(const std::map<std::string,T> & map)106*d9f75844SAndroid Build Coastguard Worker std::string MapToStringAsDouble(const std::map<std::string, T>& map) {
107*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder sb;
108*d9f75844SAndroid Build Coastguard Worker   sb << "{";
109*d9f75844SAndroid Build Coastguard Worker   const char* separator = "";
110*d9f75844SAndroid Build Coastguard Worker   for (const auto& element : map) {
111*d9f75844SAndroid Build Coastguard Worker     sb << separator << "\"" << rtc::ToString(element.first)
112*d9f75844SAndroid Build Coastguard Worker        << "\":" << ToStringAsDouble(element.second);
113*d9f75844SAndroid Build Coastguard Worker     separator = ",";
114*d9f75844SAndroid Build Coastguard Worker   }
115*d9f75844SAndroid Build Coastguard Worker   sb << "}";
116*d9f75844SAndroid Build Coastguard Worker   return sb.Release();
117*d9f75844SAndroid Build Coastguard Worker }
118*d9f75844SAndroid Build Coastguard Worker 
119*d9f75844SAndroid Build Coastguard Worker }  // namespace
120*d9f75844SAndroid Build Coastguard Worker 
operator ==(const RTCStats & other) const121*d9f75844SAndroid Build Coastguard Worker bool RTCStats::operator==(const RTCStats& other) const {
122*d9f75844SAndroid Build Coastguard Worker   if (type() != other.type() || id() != other.id())
123*d9f75844SAndroid Build Coastguard Worker     return false;
124*d9f75844SAndroid Build Coastguard Worker   std::vector<const RTCStatsMemberInterface*> members = Members();
125*d9f75844SAndroid Build Coastguard Worker   std::vector<const RTCStatsMemberInterface*> other_members = other.Members();
126*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK_EQ(members.size(), other_members.size());
127*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < members.size(); ++i) {
128*d9f75844SAndroid Build Coastguard Worker     const RTCStatsMemberInterface* member = members[i];
129*d9f75844SAndroid Build Coastguard Worker     const RTCStatsMemberInterface* other_member = other_members[i];
130*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_EQ(member->type(), other_member->type());
131*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_EQ(member->name(), other_member->name());
132*d9f75844SAndroid Build Coastguard Worker     if (*member != *other_member)
133*d9f75844SAndroid Build Coastguard Worker       return false;
134*d9f75844SAndroid Build Coastguard Worker   }
135*d9f75844SAndroid Build Coastguard Worker   return true;
136*d9f75844SAndroid Build Coastguard Worker }
137*d9f75844SAndroid Build Coastguard Worker 
operator !=(const RTCStats & other) const138*d9f75844SAndroid Build Coastguard Worker bool RTCStats::operator!=(const RTCStats& other) const {
139*d9f75844SAndroid Build Coastguard Worker   return !(*this == other);
140*d9f75844SAndroid Build Coastguard Worker }
141*d9f75844SAndroid Build Coastguard Worker 
ToJson() const142*d9f75844SAndroid Build Coastguard Worker std::string RTCStats::ToJson() const {
143*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder sb;
144*d9f75844SAndroid Build Coastguard Worker   sb << "{\"type\":\"" << type()
145*d9f75844SAndroid Build Coastguard Worker      << "\","
146*d9f75844SAndroid Build Coastguard Worker         "\"id\":\""
147*d9f75844SAndroid Build Coastguard Worker      << id_
148*d9f75844SAndroid Build Coastguard Worker      << "\","
149*d9f75844SAndroid Build Coastguard Worker         "\"timestamp\":"
150*d9f75844SAndroid Build Coastguard Worker      << timestamp_us_;
151*d9f75844SAndroid Build Coastguard Worker   for (const RTCStatsMemberInterface* member : Members()) {
152*d9f75844SAndroid Build Coastguard Worker     if (member->is_defined()) {
153*d9f75844SAndroid Build Coastguard Worker       sb << ",\"" << member->name() << "\":";
154*d9f75844SAndroid Build Coastguard Worker       if (member->is_string())
155*d9f75844SAndroid Build Coastguard Worker         sb << "\"" << member->ValueToJson() << "\"";
156*d9f75844SAndroid Build Coastguard Worker       else
157*d9f75844SAndroid Build Coastguard Worker         sb << member->ValueToJson();
158*d9f75844SAndroid Build Coastguard Worker     }
159*d9f75844SAndroid Build Coastguard Worker   }
160*d9f75844SAndroid Build Coastguard Worker   sb << "}";
161*d9f75844SAndroid Build Coastguard Worker   return sb.Release();
162*d9f75844SAndroid Build Coastguard Worker }
163*d9f75844SAndroid Build Coastguard Worker 
Members() const164*d9f75844SAndroid Build Coastguard Worker std::vector<const RTCStatsMemberInterface*> RTCStats::Members() const {
165*d9f75844SAndroid Build Coastguard Worker   return MembersOfThisObjectAndAncestors(0);
166*d9f75844SAndroid Build Coastguard Worker }
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker std::vector<const RTCStatsMemberInterface*>
MembersOfThisObjectAndAncestors(size_t additional_capacity) const169*d9f75844SAndroid Build Coastguard Worker RTCStats::MembersOfThisObjectAndAncestors(size_t additional_capacity) const {
170*d9f75844SAndroid Build Coastguard Worker   std::vector<const RTCStatsMemberInterface*> members;
171*d9f75844SAndroid Build Coastguard Worker   members.reserve(additional_capacity);
172*d9f75844SAndroid Build Coastguard Worker   return members;
173*d9f75844SAndroid Build Coastguard Worker }
174*d9f75844SAndroid Build Coastguard Worker 
175*d9f75844SAndroid Build Coastguard Worker #define WEBRTC_DEFINE_RTCSTATSMEMBER(T, type, is_seq, is_str, to_str, to_json) \
176*d9f75844SAndroid Build Coastguard Worker   template <>                                                                  \
177*d9f75844SAndroid Build Coastguard Worker   RTCStatsMemberInterface::Type RTCStatsMember<T>::StaticType() {              \
178*d9f75844SAndroid Build Coastguard Worker     return type;                                                               \
179*d9f75844SAndroid Build Coastguard Worker   }                                                                            \
180*d9f75844SAndroid Build Coastguard Worker   template <>                                                                  \
181*d9f75844SAndroid Build Coastguard Worker   bool RTCStatsMember<T>::is_sequence() const {                                \
182*d9f75844SAndroid Build Coastguard Worker     return is_seq;                                                             \
183*d9f75844SAndroid Build Coastguard Worker   }                                                                            \
184*d9f75844SAndroid Build Coastguard Worker   template <>                                                                  \
185*d9f75844SAndroid Build Coastguard Worker   bool RTCStatsMember<T>::is_string() const {                                  \
186*d9f75844SAndroid Build Coastguard Worker     return is_str;                                                             \
187*d9f75844SAndroid Build Coastguard Worker   }                                                                            \
188*d9f75844SAndroid Build Coastguard Worker   template <>                                                                  \
189*d9f75844SAndroid Build Coastguard Worker   std::string RTCStatsMember<T>::ValueToString() const {                       \
190*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK(value_.has_value());                                            \
191*d9f75844SAndroid Build Coastguard Worker     return to_str;                                                             \
192*d9f75844SAndroid Build Coastguard Worker   }                                                                            \
193*d9f75844SAndroid Build Coastguard Worker   template <>                                                                  \
194*d9f75844SAndroid Build Coastguard Worker   std::string RTCStatsMember<T>::ValueToJson() const {                         \
195*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK(value_.has_value());                                            \
196*d9f75844SAndroid Build Coastguard Worker     return to_json;                                                            \
197*d9f75844SAndroid Build Coastguard Worker   }                                                                            \
198*d9f75844SAndroid Build Coastguard Worker   template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT) RTCStatsMember<T>
199*d9f75844SAndroid Build Coastguard Worker 
200*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(bool,
201*d9f75844SAndroid Build Coastguard Worker                              kBool,
202*d9f75844SAndroid Build Coastguard Worker                              false,
203*d9f75844SAndroid Build Coastguard Worker                              false,
204*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_),
205*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_));
206*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(int32_t,
207*d9f75844SAndroid Build Coastguard Worker                              kInt32,
208*d9f75844SAndroid Build Coastguard Worker                              false,
209*d9f75844SAndroid Build Coastguard Worker                              false,
210*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_),
211*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_));
212*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(uint32_t,
213*d9f75844SAndroid Build Coastguard Worker                              kUint32,
214*d9f75844SAndroid Build Coastguard Worker                              false,
215*d9f75844SAndroid Build Coastguard Worker                              false,
216*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_),
217*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_));
218*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(int64_t,
219*d9f75844SAndroid Build Coastguard Worker                              kInt64,
220*d9f75844SAndroid Build Coastguard Worker                              false,
221*d9f75844SAndroid Build Coastguard Worker                              false,
222*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_),
223*d9f75844SAndroid Build Coastguard Worker                              ToStringAsDouble(*value_));
224*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(uint64_t,
225*d9f75844SAndroid Build Coastguard Worker                              kUint64,
226*d9f75844SAndroid Build Coastguard Worker                              false,
227*d9f75844SAndroid Build Coastguard Worker                              false,
228*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_),
229*d9f75844SAndroid Build Coastguard Worker                              ToStringAsDouble(*value_));
230*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(double,
231*d9f75844SAndroid Build Coastguard Worker                              kDouble,
232*d9f75844SAndroid Build Coastguard Worker                              false,
233*d9f75844SAndroid Build Coastguard Worker                              false,
234*d9f75844SAndroid Build Coastguard Worker                              rtc::ToString(*value_),
235*d9f75844SAndroid Build Coastguard Worker                              ToStringAsDouble(*value_));
236*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::string,
237*d9f75844SAndroid Build Coastguard Worker                              kString,
238*d9f75844SAndroid Build Coastguard Worker                              false,
239*d9f75844SAndroid Build Coastguard Worker                              true,
240*d9f75844SAndroid Build Coastguard Worker                              *value_,
241*d9f75844SAndroid Build Coastguard Worker                              *value_);
242*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<bool>,
243*d9f75844SAndroid Build Coastguard Worker                              kSequenceBool,
244*d9f75844SAndroid Build Coastguard Worker                              true,
245*d9f75844SAndroid Build Coastguard Worker                              false,
246*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_),
247*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_));
248*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int32_t>,
249*d9f75844SAndroid Build Coastguard Worker                              kSequenceInt32,
250*d9f75844SAndroid Build Coastguard Worker                              true,
251*d9f75844SAndroid Build Coastguard Worker                              false,
252*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_),
253*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_));
254*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint32_t>,
255*d9f75844SAndroid Build Coastguard Worker                              kSequenceUint32,
256*d9f75844SAndroid Build Coastguard Worker                              true,
257*d9f75844SAndroid Build Coastguard Worker                              false,
258*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_),
259*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_));
260*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int64_t>,
261*d9f75844SAndroid Build Coastguard Worker                              kSequenceInt64,
262*d9f75844SAndroid Build Coastguard Worker                              true,
263*d9f75844SAndroid Build Coastguard Worker                              false,
264*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_),
265*d9f75844SAndroid Build Coastguard Worker                              VectorToStringAsDouble(*value_));
266*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint64_t>,
267*d9f75844SAndroid Build Coastguard Worker                              kSequenceUint64,
268*d9f75844SAndroid Build Coastguard Worker                              true,
269*d9f75844SAndroid Build Coastguard Worker                              false,
270*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_),
271*d9f75844SAndroid Build Coastguard Worker                              VectorToStringAsDouble(*value_));
272*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<double>,
273*d9f75844SAndroid Build Coastguard Worker                              kSequenceDouble,
274*d9f75844SAndroid Build Coastguard Worker                              true,
275*d9f75844SAndroid Build Coastguard Worker                              false,
276*d9f75844SAndroid Build Coastguard Worker                              VectorToString(*value_),
277*d9f75844SAndroid Build Coastguard Worker                              VectorToStringAsDouble(*value_));
278*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<std::string>,
279*d9f75844SAndroid Build Coastguard Worker                              kSequenceString,
280*d9f75844SAndroid Build Coastguard Worker                              true,
281*d9f75844SAndroid Build Coastguard Worker                              false,
282*d9f75844SAndroid Build Coastguard Worker                              VectorOfStringsToString(*value_),
283*d9f75844SAndroid Build Coastguard Worker                              VectorOfStringsToString(*value_));
284*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(rtc_stats_internal::MapStringUint64,
285*d9f75844SAndroid Build Coastguard Worker                              kMapStringUint64,
286*d9f75844SAndroid Build Coastguard Worker                              false,
287*d9f75844SAndroid Build Coastguard Worker                              false,
288*d9f75844SAndroid Build Coastguard Worker                              MapToString(*value_),
289*d9f75844SAndroid Build Coastguard Worker                              MapToStringAsDouble(*value_));
290*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(rtc_stats_internal::MapStringDouble,
291*d9f75844SAndroid Build Coastguard Worker                              kMapStringDouble,
292*d9f75844SAndroid Build Coastguard Worker                              false,
293*d9f75844SAndroid Build Coastguard Worker                              false,
294*d9f75844SAndroid Build Coastguard Worker                              MapToString(*value_),
295*d9f75844SAndroid Build Coastguard Worker                              MapToStringAsDouble(*value_));
296*d9f75844SAndroid Build Coastguard Worker 
297*d9f75844SAndroid Build Coastguard Worker // Restricted members that expose hardware capabilites.
298*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
299*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<bool, StatExposureCriteria::kHardwareCapability>;
300*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
301*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<int32_t,
302*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
303*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
304*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<uint32_t,
305*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
306*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
307*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<int64_t,
308*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
309*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
310*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<uint64_t,
311*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
312*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
313*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<double, StatExposureCriteria::kHardwareCapability>;
314*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
315*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::string,
316*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
317*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
318*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::vector<bool>,
319*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
320*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
321*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::vector<int32_t>,
322*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
323*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
324*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::vector<uint32_t>,
325*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
326*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
327*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::vector<int64_t>,
328*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
329*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
330*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::vector<uint64_t>,
331*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
332*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
333*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::vector<double>,
334*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
335*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
336*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::vector<std::string>,
337*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
338*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
339*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::map<std::string, uint64_t>,
340*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
341*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
342*d9f75844SAndroid Build Coastguard Worker     RTCRestrictedStatsMember<std::map<std::string, double>,
343*d9f75844SAndroid Build Coastguard Worker                              StatExposureCriteria::kHardwareCapability>;
344*d9f75844SAndroid Build Coastguard Worker 
345*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
346*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<bool>;
347*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
348*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<int32_t>;
349*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
350*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<uint32_t>;
351*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
352*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<int64_t>;
353*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
354*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<uint64_t>;
355*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
356*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<double>;
357*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
358*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::string>;
359*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
360*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::vector<bool>>;
361*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
362*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::vector<int32_t>>;
363*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
364*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::vector<uint32_t>>;
365*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
366*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::vector<int64_t>>;
367*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
368*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::vector<uint64_t>>;
369*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
370*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::vector<double>>;
371*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
372*d9f75844SAndroid Build Coastguard Worker     RTCNonStandardStatsMember<std::vector<std::string>>;
373*d9f75844SAndroid Build Coastguard Worker 
374*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
375