blob: d4ba51d46e7796ef4fd89cacc9fc8876ca09fba8 [file] [log] [blame]
hbos74e1a4f2016-09-15 23:33:01 -07001/*
2 * Copyright 2016 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
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef API_STATS_RTC_STATS_H_
12#define API_STATS_RTC_STATS_H_
hbos74e1a4f2016-09-15 23:33:01 -070013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include <stddef.h>
15#include <stdint.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020016
Byoungchan Lee0a52ede2021-05-22 08:41:02 +090017#include <map>
hbos74e1a4f2016-09-15 23:33:01 -070018#include <memory>
19#include <string>
20#include <utility>
21#include <vector>
22
Philipp Hancke8e7a1052022-10-13 13:14:01 +020023#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "rtc_base/checks.h"
Mirko Bonadei276827c2018-10-16 14:13:50 +020025#include "rtc_base/system/rtc_export.h"
Mirko Bonadei054f1852019-11-04 16:31:08 +010026#include "rtc_base/system/rtc_export_template.h"
hbos74e1a4f2016-09-15 23:33:01 -070027
28namespace webrtc {
29
30class RTCStatsMemberInterface;
31
32// Abstract base class for RTCStats-derived dictionaries, see
33// https://w3c.github.io/webrtc-stats/.
34//
35// All derived classes must have the following static variable defined:
36// static const char kType[];
37// It is used as a unique class identifier and a string representation of the
38// class type, see https://w3c.github.io/webrtc-stats/#rtcstatstype-str*.
Artem Titov0e61fdd2021-07-25 21:50:14 +020039// Use the `WEBRTC_RTCSTATS_IMPL` macro when implementing subclasses, see macro
hbos74e1a4f2016-09-15 23:33:01 -070040// for details.
41//
42// Derived classes list their dictionary members, RTCStatsMember<T>, as public
43// fields, allowing the following:
44//
45// RTCFooStats foo("fooId", GetCurrentTime());
46// foo.bar = 42;
47// foo.baz = std::vector<std::string>();
48// foo.baz->push_back("hello world");
49// uint32_t x = *foo.bar;
50//
Artem Titov0e61fdd2021-07-25 21:50:14 +020051// Pointers to all the members are available with `Members`, allowing iteration:
hbos74e1a4f2016-09-15 23:33:01 -070052//
53// for (const RTCStatsMemberInterface* member : foo.Members()) {
54// printf("%s = %s\n", member->name(), member->ValueToString().c_str());
55// }
Mirko Bonadei276827c2018-10-16 14:13:50 +020056class RTC_EXPORT RTCStats {
hbos74e1a4f2016-09-15 23:33:01 -070057 public:
Philipp Hancke7a5de442023-01-02 13:20:45 +010058 RTCStats(std::string id, int64_t timestamp_us)
hbos74e1a4f2016-09-15 23:33:01 -070059 : id_(std::move(id)), timestamp_us_(timestamp_us) {}
60 virtual ~RTCStats() {}
61
62 virtual std::unique_ptr<RTCStats> copy() const = 0;
63
64 const std::string& id() const { return id_; }
65 // Time relative to the UNIX epoch (Jan 1, 1970, UTC), in microseconds.
66 int64_t timestamp_us() const { return timestamp_us_; }
Artem Titov0e61fdd2021-07-25 21:50:14 +020067 // Returns the static member variable `kType` of the implementing class.
hbos74e1a4f2016-09-15 23:33:01 -070068 virtual const char* type() const = 0;
Artem Titov0e61fdd2021-07-25 21:50:14 +020069 // Returns a vector of pointers to all the `RTCStatsMemberInterface` members
hbos67c8bc42016-10-25 04:31:23 -070070 // of this class. This allows for iteration of members. For a given class,
Artem Titov0e61fdd2021-07-25 21:50:14 +020071 // `Members` always returns the same members in the same order.
hbos74e1a4f2016-09-15 23:33:01 -070072 std::vector<const RTCStatsMemberInterface*> Members() const;
hbos67c8bc42016-10-25 04:31:23 -070073 // Checks if the two stats objects are of the same type and have the same
hbos0583b282016-11-30 01:50:14 -080074 // member values. Timestamps are not compared. These operators are exposed for
75 // testing.
hbos67c8bc42016-10-25 04:31:23 -070076 bool operator==(const RTCStats& other) const;
77 bool operator!=(const RTCStats& other) const;
hbos74e1a4f2016-09-15 23:33:01 -070078
ehmaldonado35a872c2017-07-28 07:29:12 -070079 // Creates a JSON readable string representation of the stats
80 // object, listing all of its members (names and values).
81 std::string ToJson() const;
hbos74e1a4f2016-09-15 23:33:01 -070082
Artem Titov0e61fdd2021-07-25 21:50:14 +020083 // Downcasts the stats object to an `RTCStats` subclass `T`. DCHECKs that the
84 // object is of type `T`.
Yves Gerey665174f2018-06-19 15:03:05 +020085 template <typename T>
hbos74e1a4f2016-09-15 23:33:01 -070086 const T& cast_to() const {
87 RTC_DCHECK_EQ(type(), T::kType);
88 return static_cast<const T&>(*this);
89 }
90
91 protected:
Artem Titov0e61fdd2021-07-25 21:50:14 +020092 // Gets a vector of all members of this `RTCStats` object, including members
93 // derived from parent classes. `additional_capacity` is how many more members
hbos74e1a4f2016-09-15 23:33:01 -070094 // shall be reserved in the vector (so that subclasses can allocate a vector
95 // with room for both parent and child members without it having to resize).
96 virtual std::vector<const RTCStatsMemberInterface*>
Yves Gerey665174f2018-06-19 15:03:05 +020097 MembersOfThisObjectAndAncestors(size_t additional_capacity) const;
hbos74e1a4f2016-09-15 23:33:01 -070098
99 std::string const id_;
100 int64_t timestamp_us_;
101};
102
Artem Titov0e61fdd2021-07-25 21:50:14 +0200103// All `RTCStats` classes should use these macros.
104// `WEBRTC_RTCSTATS_DECL` is placed in a public section of the class definition.
105// `WEBRTC_RTCSTATS_IMPL` is placed outside the class definition (in a .cc).
hbos74e1a4f2016-09-15 23:33:01 -0700106//
Artem Titov0e61fdd2021-07-25 21:50:14 +0200107// These macros declare (in _DECL) and define (in _IMPL) the static `kType` and
108// overrides methods as required by subclasses of `RTCStats`: `copy`, `type` and
109// `MembersOfThisObjectAndAncestors`. The |...| argument is a list of addresses
hbosfc5e0502016-10-06 02:06:10 -0700110// to each member defined in the implementing class. The list must have at least
111// one member.
hbos74e1a4f2016-09-15 23:33:01 -0700112//
113// (Since class names need to be known to implement these methods this cannot be
Artem Titov0e61fdd2021-07-25 21:50:14 +0200114// part of the base `RTCStats`. While these methods could be implemented using
hbos74e1a4f2016-09-15 23:33:01 -0700115// templates, that would only work for immediate subclasses. Subclasses of
116// subclasses also have to override these methods, resulting in boilerplate
Artem Titov0e61fdd2021-07-25 21:50:14 +0200117// code. Using a macro avoids this and works for any `RTCStats` class, including
hbos74e1a4f2016-09-15 23:33:01 -0700118// grandchildren.)
119//
120// Sample usage:
121//
122// rtcfoostats.h:
123// class RTCFooStats : public RTCStats {
124// public:
hbosfc5e0502016-10-06 02:06:10 -0700125// WEBRTC_RTCSTATS_DECL();
hbos74e1a4f2016-09-15 23:33:01 -0700126//
hbosfc5e0502016-10-06 02:06:10 -0700127// RTCFooStats(const std::string& id, int64_t timestamp_us);
hbos74e1a4f2016-09-15 23:33:01 -0700128//
129// RTCStatsMember<int32_t> foo;
130// RTCStatsMember<int32_t> bar;
131// };
132//
133// rtcfoostats.cc:
hbosfc5e0502016-10-06 02:06:10 -0700134// WEBRTC_RTCSTATS_IMPL(RTCFooStats, RTCStats, "foo-stats"
135// &foo,
136// &bar);
hbos74e1a4f2016-09-15 23:33:01 -0700137//
hbosfc5e0502016-10-06 02:06:10 -0700138// RTCFooStats::RTCFooStats(const std::string& id, int64_t timestamp_us)
139// : RTCStats(id, timestamp_us),
140// foo("foo"),
141// bar("bar") {
142// }
143//
Yves Gerey665174f2018-06-19 15:03:05 +0200144#define WEBRTC_RTCSTATS_DECL() \
Yves Gerey665174f2018-06-19 15:03:05 +0200145 protected: \
146 std::vector<const webrtc::RTCStatsMemberInterface*> \
147 MembersOfThisObjectAndAncestors(size_t local_var_additional_capacity) \
148 const override; \
149 \
Nico Weber22f99252019-02-20 10:13:16 -0500150 public: \
151 static const char kType[]; \
152 \
153 std::unique_ptr<webrtc::RTCStats> copy() const override; \
154 const char* type() const override
hbosfc5e0502016-10-06 02:06:10 -0700155
156#define WEBRTC_RTCSTATS_IMPL(this_class, parent_class, type_str, ...) \
157 const char this_class::kType[] = type_str; \
158 \
159 std::unique_ptr<webrtc::RTCStats> this_class::copy() const { \
Philipp Hanckeb5cf12d2022-09-06 11:55:31 +0200160 return std::make_unique<this_class>(*this); \
hbosfc5e0502016-10-06 02:06:10 -0700161 } \
162 \
Yves Gerey665174f2018-06-19 15:03:05 +0200163 const char* this_class::type() const { return this_class::kType; } \
hbosfc5e0502016-10-06 02:06:10 -0700164 \
165 std::vector<const webrtc::RTCStatsMemberInterface*> \
166 this_class::MembersOfThisObjectAndAncestors( \
167 size_t local_var_additional_capacity) const { \
hbos74e1a4f2016-09-15 23:33:01 -0700168 const webrtc::RTCStatsMemberInterface* local_var_members[] = { \
Yves Gerey665174f2018-06-19 15:03:05 +0200169 __VA_ARGS__}; \
hbos74e1a4f2016-09-15 23:33:01 -0700170 size_t local_var_members_count = \
171 sizeof(local_var_members) / sizeof(local_var_members[0]); \
Yves Gerey665174f2018-06-19 15:03:05 +0200172 std::vector<const webrtc::RTCStatsMemberInterface*> \
173 local_var_members_vec = parent_class::MembersOfThisObjectAndAncestors( \
hbos74e1a4f2016-09-15 23:33:01 -0700174 local_var_members_count + local_var_additional_capacity); \
175 RTC_DCHECK_GE( \
176 local_var_members_vec.capacity() - local_var_members_vec.size(), \
177 local_var_members_count + local_var_additional_capacity); \
178 local_var_members_vec.insert(local_var_members_vec.end(), \
179 &local_var_members[0], \
180 &local_var_members[local_var_members_count]); \
181 return local_var_members_vec; \
hbosfc5e0502016-10-06 02:06:10 -0700182 }
hbos74e1a4f2016-09-15 23:33:01 -0700183
Henrik Boström646fda02019-05-22 15:49:42 +0200184// A version of WEBRTC_RTCSTATS_IMPL() where "..." is omitted, used to avoid a
185// compile error on windows. This is used if the stats dictionary does not
186// declare any members of its own (but perhaps its parent dictionary does).
187#define WEBRTC_RTCSTATS_IMPL_NO_MEMBERS(this_class, parent_class, type_str) \
188 const char this_class::kType[] = type_str; \
189 \
190 std::unique_ptr<webrtc::RTCStats> this_class::copy() const { \
Philipp Hanckeb5cf12d2022-09-06 11:55:31 +0200191 return std::make_unique<this_class>(*this); \
Henrik Boström646fda02019-05-22 15:49:42 +0200192 } \
193 \
194 const char* this_class::type() const { return this_class::kType; } \
195 \
196 std::vector<const webrtc::RTCStatsMemberInterface*> \
197 this_class::MembersOfThisObjectAndAncestors( \
198 size_t local_var_additional_capacity) const { \
199 return parent_class::MembersOfThisObjectAndAncestors(0); \
200 }
201
Jakob Ivarsson22936222019-03-22 11:29:49 +0100202// Non-standard stats members can be exposed to the JavaScript API in Chrome
203// e.g. through origin trials. The group ID can be used by the blink layer to
204// determine if a stats member should be exposed or not. Multiple non-standard
205// stats members can share the same group ID so that they are exposed together.
206enum class NonStandardGroupId {
Jakob Ivarssonaa023e22019-03-27 10:17:31 +0100207 // Group ID used for testing purposes only.
208 kGroupIdForTesting,
Jakob Ivarsson22936222019-03-22 11:29:49 +0100209 // I2E:
210 // https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/hE2B1iItPDk
211 kRtcAudioJitterBufferMaxPackets,
212 // I2E:
213 // https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/YbhMyqLXXXo
214 kRtcStatsRelativePacketArrivalDelay,
215};
216
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000217// Certain stat members should only be exposed to the JavaScript API in
218// certain circumstances as to avoid passive fingerprinting.
219enum class StatExposureCriteria : uint8_t {
220 // The stat should always be exposed. This is the default.
221 kAlways,
222 // The stat exposes hardware capabilities and thus should has limited exposure
223 // to JavaScript. The requirements for exposure are written in the spec at
224 // https://w3c.github.io/webrtc-stats/#limiting-exposure-of-hardware-capabilities.
225 kHardwareCapability,
226};
227
Artem Titov0e61fdd2021-07-25 21:50:14 +0200228// Interface for `RTCStats` members, which have a name and a value of a type
229// defined in a subclass. Only the types listed in `Type` are supported, these
Artem Titovcfea2182021-08-10 01:22:31 +0200230// are implemented by `RTCStatsMember<T>`. The value of a member may be
Artem Titov0e61fdd2021-07-25 21:50:14 +0200231// undefined, the value can only be read if `is_defined`.
hbos74e1a4f2016-09-15 23:33:01 -0700232class RTCStatsMemberInterface {
233 public:
234 // Member value types.
235 enum Type {
Yves Gerey665174f2018-06-19 15:03:05 +0200236 kBool, // bool
237 kInt32, // int32_t
238 kUint32, // uint32_t
239 kInt64, // int64_t
240 kUint64, // uint64_t
241 kDouble, // double
242 kString, // std::string
hbos74e1a4f2016-09-15 23:33:01 -0700243
Yves Gerey665174f2018-06-19 15:03:05 +0200244 kSequenceBool, // std::vector<bool>
245 kSequenceInt32, // std::vector<int32_t>
246 kSequenceUint32, // std::vector<uint32_t>
247 kSequenceInt64, // std::vector<int64_t>
248 kSequenceUint64, // std::vector<uint64_t>
249 kSequenceDouble, // std::vector<double>
250 kSequenceString, // std::vector<std::string>
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900251
252 kMapStringUint64, // std::map<std::string, uint64_t>
253 kMapStringDouble, // std::map<std::string, double>
hbos74e1a4f2016-09-15 23:33:01 -0700254 };
255
256 virtual ~RTCStatsMemberInterface() {}
257
258 const char* name() const { return name_; }
259 virtual Type type() const = 0;
260 virtual bool is_sequence() const = 0;
261 virtual bool is_string() const = 0;
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200262 virtual bool is_defined() const = 0;
Taylor Brandstettere2751742018-06-25 13:42:44 -0700263 // Is this part of the stats spec? Used so that chromium can easily filter
264 // out anything unstandardized.
265 virtual bool is_standardized() const = 0;
Jakob Ivarsson22936222019-03-22 11:29:49 +0100266 // Non-standard stats members can have group IDs in order to be exposed in
267 // JavaScript through experiments. Standardized stats have no group IDs.
268 virtual std::vector<NonStandardGroupId> group_ids() const { return {}; }
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000269 // The conditions for exposing the statistic to JavaScript. Stats with
270 // criteria that is not kAlways has some restriction and should be filtered
271 // in accordance to the spec.
272 virtual StatExposureCriteria exposure_criteria() const {
273 return StatExposureCriteria::kAlways;
274 }
hbos67c8bc42016-10-25 04:31:23 -0700275 // Type and value comparator. The names are not compared. These operators are
276 // exposed for testing.
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900277 bool operator==(const RTCStatsMemberInterface& other) const {
278 return IsEqual(other);
279 }
hbos67c8bc42016-10-25 04:31:23 -0700280 bool operator!=(const RTCStatsMemberInterface& other) const {
281 return !(*this == other);
282 }
hbos74e1a4f2016-09-15 23:33:01 -0700283 virtual std::string ValueToString() const = 0;
ehmaldonado35a872c2017-07-28 07:29:12 -0700284 // This is the same as ValueToString except for kInt64 and kUint64 types,
285 // where the value is represented as a double instead of as an integer.
286 // Since JSON stores numbers as floating point numbers, very large integers
287 // cannot be accurately represented, so we prefer to display them as doubles
288 // instead.
289 virtual std::string ValueToJson() const = 0;
hbos74e1a4f2016-09-15 23:33:01 -0700290
Yves Gerey665174f2018-06-19 15:03:05 +0200291 template <typename T>
hbos74e1a4f2016-09-15 23:33:01 -0700292 const T& cast_to() const {
Mirko Bonadei054f1852019-11-04 16:31:08 +0100293 RTC_DCHECK_EQ(type(), T::StaticType());
hbos74e1a4f2016-09-15 23:33:01 -0700294 return static_cast<const T&>(*this);
295 }
296
297 protected:
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200298 explicit RTCStatsMemberInterface(const char* name) : name_(name) {}
hbos74e1a4f2016-09-15 23:33:01 -0700299
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900300 virtual bool IsEqual(const RTCStatsMemberInterface& other) const = 0;
301
hbos74e1a4f2016-09-15 23:33:01 -0700302 const char* const name_;
hbos74e1a4f2016-09-15 23:33:01 -0700303};
304
Artem Titov0e61fdd2021-07-25 21:50:14 +0200305// Template implementation of `RTCStatsMemberInterface`.
Mirko Bonadei054f1852019-11-04 16:31:08 +0100306// The supported types are the ones described by
Artem Titovcfea2182021-08-10 01:22:31 +0200307// `RTCStatsMemberInterface::Type`.
Yves Gerey665174f2018-06-19 15:03:05 +0200308template <typename T>
Mirko Bonadei1e6aa1f2019-11-05 17:20:58 +0100309class RTCStatsMember : public RTCStatsMemberInterface {
hbos74e1a4f2016-09-15 23:33:01 -0700310 public:
hbos74e1a4f2016-09-15 23:33:01 -0700311 explicit RTCStatsMember(const char* name)
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200312 : RTCStatsMemberInterface(name), value_() {}
hbos74e1a4f2016-09-15 23:33:01 -0700313 RTCStatsMember(const char* name, const T& value)
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200314 : RTCStatsMemberInterface(name), value_(value) {}
hbos74e1a4f2016-09-15 23:33:01 -0700315 RTCStatsMember(const char* name, T&& value)
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200316 : RTCStatsMemberInterface(name), value_(std::move(value)) {}
317 explicit RTCStatsMember(const RTCStatsMember<T>& other)
318 : RTCStatsMemberInterface(other.name_), value_(other.value_) {}
319 explicit RTCStatsMember(RTCStatsMember<T>&& other)
320 : RTCStatsMemberInterface(other.name_), value_(std::move(other.value_)) {}
hbos74e1a4f2016-09-15 23:33:01 -0700321
Mirko Bonadei054f1852019-11-04 16:31:08 +0100322 static Type StaticType();
323 Type type() const override { return StaticType(); }
hbos74e1a4f2016-09-15 23:33:01 -0700324 bool is_sequence() const override;
325 bool is_string() const override;
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200326 bool is_defined() const override { return value_.has_value(); }
Taylor Brandstettere2751742018-06-25 13:42:44 -0700327 bool is_standardized() const override { return true; }
hbos74e1a4f2016-09-15 23:33:01 -0700328 std::string ValueToString() const override;
ehmaldonado35a872c2017-07-28 07:29:12 -0700329 std::string ValueToJson() const override;
hbos74e1a4f2016-09-15 23:33:01 -0700330
Andrey Logvin1f0f59f2020-06-15 12:49:25 +0000331 template <typename U>
332 inline T ValueOrDefault(U default_value) const {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200333 return value_.value_or(default_value);
Andrey Logvin1f0f59f2020-06-15 12:49:25 +0000334 }
335
hbos74e1a4f2016-09-15 23:33:01 -0700336 // Assignment operators.
337 T& operator=(const T& value) {
338 value_ = value;
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200339 return value_.value();
hbos74e1a4f2016-09-15 23:33:01 -0700340 }
341 T& operator=(const T&& value) {
342 value_ = std::move(value);
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200343 return value_.value();
hbos74e1a4f2016-09-15 23:33:01 -0700344 }
hbos74e1a4f2016-09-15 23:33:01 -0700345
346 // Value getters.
347 T& operator*() {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200348 RTC_DCHECK(value_);
349 return *value_;
hbos74e1a4f2016-09-15 23:33:01 -0700350 }
351 const T& operator*() const {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200352 RTC_DCHECK(value_);
353 return *value_;
hbos74e1a4f2016-09-15 23:33:01 -0700354 }
355
356 // Value getters, arrow operator.
357 T* operator->() {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200358 RTC_DCHECK(value_);
359 return &(*value_);
hbos74e1a4f2016-09-15 23:33:01 -0700360 }
361 const T* operator->() const {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200362 RTC_DCHECK(value_);
363 return &(*value_);
hbos74e1a4f2016-09-15 23:33:01 -0700364 }
365
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900366 protected:
367 bool IsEqual(const RTCStatsMemberInterface& other) const override {
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000368 if (type() != other.type() ||
369 is_standardized() != other.is_standardized() ||
370 exposure_criteria() != other.exposure_criteria())
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900371 return false;
372 const RTCStatsMember<T>& other_t =
373 static_cast<const RTCStatsMember<T>&>(other);
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900374 return value_ == other_t.value_;
375 }
376
hbos74e1a4f2016-09-15 23:33:01 -0700377 private:
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200378 absl::optional<T> value_;
hbos74e1a4f2016-09-15 23:33:01 -0700379};
380
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900381namespace rtc_stats_internal {
382
383typedef std::map<std::string, uint64_t> MapStringUint64;
384typedef std::map<std::string, double> MapStringDouble;
385
386} // namespace rtc_stats_internal
387
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100388#define WEBRTC_DECLARE_RTCSTATSMEMBER(T) \
389 template <> \
390 RTC_EXPORT RTCStatsMemberInterface::Type RTCStatsMember<T>::StaticType(); \
391 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100392 RTC_EXPORT bool RTCStatsMember<T>::is_sequence() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100393 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100394 RTC_EXPORT bool RTCStatsMember<T>::is_string() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100395 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100396 RTC_EXPORT std::string RTCStatsMember<T>::ValueToString() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100397 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100398 RTC_EXPORT std::string RTCStatsMember<T>::ValueToJson() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100399 extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT) \
Mirko Bonadei054f1852019-11-04 16:31:08 +0100400 RTCStatsMember<T>
401
402WEBRTC_DECLARE_RTCSTATSMEMBER(bool);
403WEBRTC_DECLARE_RTCSTATSMEMBER(int32_t);
404WEBRTC_DECLARE_RTCSTATSMEMBER(uint32_t);
405WEBRTC_DECLARE_RTCSTATSMEMBER(int64_t);
406WEBRTC_DECLARE_RTCSTATSMEMBER(uint64_t);
407WEBRTC_DECLARE_RTCSTATSMEMBER(double);
408WEBRTC_DECLARE_RTCSTATSMEMBER(std::string);
409WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<bool>);
410WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<int32_t>);
411WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<uint32_t>);
412WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<int64_t>);
413WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<uint64_t>);
414WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<double>);
415WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<std::string>);
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900416WEBRTC_DECLARE_RTCSTATSMEMBER(rtc_stats_internal::MapStringUint64);
417WEBRTC_DECLARE_RTCSTATSMEMBER(rtc_stats_internal::MapStringDouble);
Mirko Bonadei054f1852019-11-04 16:31:08 +0100418
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000419// For stats with restricted exposure.
420template <typename T, StatExposureCriteria E>
421class RTCRestrictedStatsMember : public RTCStatsMember<T> {
422 public:
423 explicit RTCRestrictedStatsMember(const char* name)
424 : RTCStatsMember<T>(name) {}
425 RTCRestrictedStatsMember(const char* name, const T& value)
426 : RTCStatsMember<T>(name, value) {}
427 RTCRestrictedStatsMember(const char* name, T&& value)
428 : RTCStatsMember<T>(name, std::move(value)) {}
429 RTCRestrictedStatsMember(const RTCRestrictedStatsMember<T, E>& other)
430 : RTCStatsMember<T>(other) {}
431 RTCRestrictedStatsMember(RTCRestrictedStatsMember<T, E>&& other)
432 : RTCStatsMember<T>(std::move(other)) {}
433
434 StatExposureCriteria exposure_criteria() const override { return E; }
435
436 T& operator=(const T& value) { return RTCStatsMember<T>::operator=(value); }
437 T& operator=(const T&& value) {
438 return RTCStatsMember<T>::operator=(std::move(value));
439 }
440
441 private:
442 static_assert(E != StatExposureCriteria::kAlways,
443 "kAlways is the default exposure criteria. Use "
444 "RTCStatMember<T> instead.");
445};
446
447extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
448 RTCRestrictedStatsMember<bool, StatExposureCriteria::kHardwareCapability>;
449extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
450 RTCRestrictedStatsMember<int32_t,
451 StatExposureCriteria::kHardwareCapability>;
452extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
453 RTCRestrictedStatsMember<uint32_t,
454 StatExposureCriteria::kHardwareCapability>;
455extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
456 RTCRestrictedStatsMember<int64_t,
457 StatExposureCriteria::kHardwareCapability>;
458extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
459 RTCRestrictedStatsMember<uint64_t,
460 StatExposureCriteria::kHardwareCapability>;
461extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
462 RTCRestrictedStatsMember<double, StatExposureCriteria::kHardwareCapability>;
463extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
464 RTCRestrictedStatsMember<std::string,
465 StatExposureCriteria::kHardwareCapability>;
466extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
467 RTCRestrictedStatsMember<std::vector<bool>,
468 StatExposureCriteria::kHardwareCapability>;
469extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
470 RTCRestrictedStatsMember<std::vector<int32_t>,
471 StatExposureCriteria::kHardwareCapability>;
472extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
473 RTCRestrictedStatsMember<std::vector<uint32_t>,
474 StatExposureCriteria::kHardwareCapability>;
475extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
476 RTCRestrictedStatsMember<std::vector<int64_t>,
477 StatExposureCriteria::kHardwareCapability>;
478extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
479 RTCRestrictedStatsMember<std::vector<uint64_t>,
480 StatExposureCriteria::kHardwareCapability>;
481extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
482 RTCRestrictedStatsMember<std::vector<double>,
483 StatExposureCriteria::kHardwareCapability>;
484extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
485 RTCRestrictedStatsMember<std::vector<std::string>,
486 StatExposureCriteria::kHardwareCapability>;
487extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
488 RTCRestrictedStatsMember<std::map<std::string, uint64_t>,
489 StatExposureCriteria::kHardwareCapability>;
490extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
491 RTCRestrictedStatsMember<std::map<std::string, double>,
492 StatExposureCriteria::kHardwareCapability>;
493
Taylor Brandstettere2751742018-06-25 13:42:44 -0700494// Using inheritance just so that it's obvious from the member's declaration
495// whether it's standardized or not.
496template <typename T>
Mirko Bonadei759f1612019-11-13 11:18:31 +0100497class RTCNonStandardStatsMember : public RTCStatsMember<T> {
Taylor Brandstettere2751742018-06-25 13:42:44 -0700498 public:
499 explicit RTCNonStandardStatsMember(const char* name)
500 : RTCStatsMember<T>(name) {}
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100501 RTCNonStandardStatsMember(const char* name,
502 std::initializer_list<NonStandardGroupId> group_ids)
503 : RTCStatsMember<T>(name), group_ids_(group_ids) {}
Taylor Brandstettere2751742018-06-25 13:42:44 -0700504 RTCNonStandardStatsMember(const char* name, const T& value)
505 : RTCStatsMember<T>(name, value) {}
506 RTCNonStandardStatsMember(const char* name, T&& value)
507 : RTCStatsMember<T>(name, std::move(value)) {}
508 explicit RTCNonStandardStatsMember(const RTCNonStandardStatsMember<T>& other)
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100509 : RTCStatsMember<T>(other), group_ids_(other.group_ids_) {}
Taylor Brandstettere2751742018-06-25 13:42:44 -0700510 explicit RTCNonStandardStatsMember(RTCNonStandardStatsMember<T>&& other)
Mirko Bonadei759f1612019-11-13 11:18:31 +0100511 : RTCStatsMember<T>(std::move(other)),
512 group_ids_(std::move(other.group_ids_)) {}
Taylor Brandstettere2751742018-06-25 13:42:44 -0700513
514 bool is_standardized() const override { return false; }
Ruslan Burakov8af88962018-11-22 17:21:10 +0100515
Jakob Ivarsson22936222019-03-22 11:29:49 +0100516 std::vector<NonStandardGroupId> group_ids() const override {
517 return group_ids_;
518 }
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100519
Ruslan Burakov8af88962018-11-22 17:21:10 +0100520 T& operator=(const T& value) { return RTCStatsMember<T>::operator=(value); }
521 T& operator=(const T&& value) {
522 return RTCStatsMember<T>::operator=(std::move(value));
523 }
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100524
525 private:
526 std::vector<NonStandardGroupId> group_ids_;
Taylor Brandstettere2751742018-06-25 13:42:44 -0700527};
Mirko Bonadei759f1612019-11-13 11:18:31 +0100528
529extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
530 RTCNonStandardStatsMember<bool>;
531extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
532 RTCNonStandardStatsMember<int32_t>;
533extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
534 RTCNonStandardStatsMember<uint32_t>;
535extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
536 RTCNonStandardStatsMember<int64_t>;
537extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
538 RTCNonStandardStatsMember<uint64_t>;
539extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
540 RTCNonStandardStatsMember<double>;
541extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
542 RTCNonStandardStatsMember<std::string>;
543extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
544 RTCNonStandardStatsMember<std::vector<bool>>;
545extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
546 RTCNonStandardStatsMember<std::vector<int32_t>>;
547extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
548 RTCNonStandardStatsMember<std::vector<uint32_t>>;
549extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
550 RTCNonStandardStatsMember<std::vector<int64_t>>;
551extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
552 RTCNonStandardStatsMember<std::vector<uint64_t>>;
553extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
554 RTCNonStandardStatsMember<std::vector<double>>;
555extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
556 RTCNonStandardStatsMember<std::vector<std::string>>;
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900557extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
558 RTCNonStandardStatsMember<std::map<std::string, uint64_t>>;
559extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
560 RTCNonStandardStatsMember<std::map<std::string, double>>;
Mirko Bonadei759f1612019-11-13 11:18:31 +0100561
hbos74e1a4f2016-09-15 23:33:01 -0700562} // namespace webrtc
563
Steve Anton10542f22019-01-11 09:11:00 -0800564#endif // API_STATS_RTC_STATS_H_