summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/api/stats
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/api/stats')
-rw-r--r--third_party/libwebrtc/api/stats/OWNERS3
-rw-r--r--third_party/libwebrtc/api/stats/rtc_stats.h390
-rw-r--r--third_party/libwebrtc/api/stats/rtc_stats_collector_callback.h30
-rw-r--r--third_party/libwebrtc/api/stats/rtc_stats_report.h137
-rw-r--r--third_party/libwebrtc/api/stats/rtcstats_objects.h519
5 files changed, 1079 insertions, 0 deletions
diff --git a/third_party/libwebrtc/api/stats/OWNERS b/third_party/libwebrtc/api/stats/OWNERS
new file mode 100644
index 0000000000..1556231b31
--- /dev/null
+++ b/third_party/libwebrtc/api/stats/OWNERS
@@ -0,0 +1,3 @@
+set noparent
+hbos@webrtc.org
+hta@webrtc.org
diff --git a/third_party/libwebrtc/api/stats/rtc_stats.h b/third_party/libwebrtc/api/stats/rtc_stats.h
new file mode 100644
index 0000000000..6cc39a309f
--- /dev/null
+++ b/third_party/libwebrtc/api/stats/rtc_stats.h
@@ -0,0 +1,390 @@
+/*
+ * Copyright 2016 The WebRTC Project Authors. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_STATS_RTC_STATS_H_
+#define API_STATS_RTC_STATS_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/units/timestamp.h"
+#include "rtc_base/checks.h"
+#include "rtc_base/system/rtc_export.h"
+#include "rtc_base/system/rtc_export_template.h"
+
+namespace webrtc {
+
+class RTCStatsMemberInterface;
+
+// Abstract base class for RTCStats-derived dictionaries, see
+// https://w3c.github.io/webrtc-stats/.
+//
+// All derived classes must have the following static variable defined:
+// static const char kType[];
+// It is used as a unique class identifier and a string representation of the
+// class type, see https://w3c.github.io/webrtc-stats/#rtcstatstype-str*.
+// Use the `WEBRTC_RTCSTATS_IMPL` macro when implementing subclasses, see macro
+// for details.
+//
+// Derived classes list their dictionary members, RTCStatsMember<T>, as public
+// fields, allowing the following:
+//
+// RTCFooStats foo("fooId", Timestamp::Micros(GetCurrentTime()));
+// foo.bar = 42;
+// foo.baz = std::vector<std::string>();
+// foo.baz->push_back("hello world");
+// uint32_t x = *foo.bar;
+//
+// Pointers to all the members are available with `Members`, allowing iteration:
+//
+// for (const RTCStatsMemberInterface* member : foo.Members()) {
+// printf("%s = %s\n", member->name(), member->ValueToString().c_str());
+// }
+class RTC_EXPORT RTCStats {
+ public:
+ RTCStats(const std::string& id, Timestamp timestamp)
+ : id_(id), timestamp_(timestamp) {}
+
+ virtual ~RTCStats() {}
+
+ virtual std::unique_ptr<RTCStats> copy() const = 0;
+
+ const std::string& id() const { return id_; }
+ // Time relative to the UNIX epoch (Jan 1, 1970, UTC), in microseconds.
+ Timestamp timestamp() const { return timestamp_; }
+
+ // Returns the static member variable `kType` of the implementing class.
+ virtual const char* type() const = 0;
+ // Returns a vector of pointers to all the `RTCStatsMemberInterface` members
+ // of this class. This allows for iteration of members. For a given class,
+ // `Members` always returns the same members in the same order.
+ std::vector<const RTCStatsMemberInterface*> Members() const;
+ // Checks if the two stats objects are of the same type and have the same
+ // member values. Timestamps are not compared. These operators are exposed for
+ // testing.
+ bool operator==(const RTCStats& other) const;
+ bool operator!=(const RTCStats& other) const;
+
+ // Creates a JSON readable string representation of the stats
+ // object, listing all of its members (names and values).
+ std::string ToJson() const;
+
+ // Downcasts the stats object to an `RTCStats` subclass `T`. DCHECKs that the
+ // object is of type `T`.
+ template <typename T>
+ const T& cast_to() const {
+ RTC_DCHECK_EQ(type(), T::kType);
+ return static_cast<const T&>(*this);
+ }
+
+ protected:
+ // Gets a vector of all members of this `RTCStats` object, including members
+ // derived from parent classes. `additional_capacity` is how many more members
+ // shall be reserved in the vector (so that subclasses can allocate a vector
+ // with room for both parent and child members without it having to resize).
+ virtual std::vector<const RTCStatsMemberInterface*>
+ MembersOfThisObjectAndAncestors(size_t additional_capacity) const;
+
+ std::string const id_;
+ Timestamp timestamp_;
+};
+
+// All `RTCStats` classes should use these macros.
+// `WEBRTC_RTCSTATS_DECL` is placed in a public section of the class definition.
+// `WEBRTC_RTCSTATS_IMPL` is placed outside the class definition (in a .cc).
+//
+// These macros declare (in _DECL) and define (in _IMPL) the static `kType` and
+// overrides methods as required by subclasses of `RTCStats`: `copy`, `type` and
+// `MembersOfThisObjectAndAncestors`. The |...| argument is a list of addresses
+// to each member defined in the implementing class. The list must have at least
+// one member.
+//
+// (Since class names need to be known to implement these methods this cannot be
+// part of the base `RTCStats`. While these methods could be implemented using
+// templates, that would only work for immediate subclasses. Subclasses of
+// subclasses also have to override these methods, resulting in boilerplate
+// code. Using a macro avoids this and works for any `RTCStats` class, including
+// grandchildren.)
+//
+// Sample usage:
+//
+// rtcfoostats.h:
+// class RTCFooStats : public RTCStats {
+// public:
+// WEBRTC_RTCSTATS_DECL();
+//
+// RTCFooStats(const std::string& id, Timestamp timestamp);
+//
+// RTCStatsMember<int32_t> foo;
+// RTCStatsMember<int32_t> bar;
+// };
+//
+// rtcfoostats.cc:
+// WEBRTC_RTCSTATS_IMPL(RTCFooStats, RTCStats, "foo-stats"
+// &foo,
+// &bar);
+//
+// RTCFooStats::RTCFooStats(const std::string& id, Timestamp timestamp)
+// : RTCStats(id, timestamp),
+// foo("foo"),
+// bar("bar") {
+// }
+//
+#define WEBRTC_RTCSTATS_DECL() \
+ protected: \
+ std::vector<const webrtc::RTCStatsMemberInterface*> \
+ MembersOfThisObjectAndAncestors(size_t local_var_additional_capacity) \
+ const override; \
+ \
+ public: \
+ static const char kType[]; \
+ \
+ std::unique_ptr<webrtc::RTCStats> copy() const override; \
+ const char* type() const override
+
+#define WEBRTC_RTCSTATS_IMPL(this_class, parent_class, type_str, ...) \
+ const char this_class::kType[] = type_str; \
+ \
+ std::unique_ptr<webrtc::RTCStats> this_class::copy() const { \
+ return std::make_unique<this_class>(*this); \
+ } \
+ \
+ const char* this_class::type() const { \
+ return this_class::kType; \
+ } \
+ \
+ std::vector<const webrtc::RTCStatsMemberInterface*> \
+ this_class::MembersOfThisObjectAndAncestors( \
+ size_t local_var_additional_capacity) const { \
+ const webrtc::RTCStatsMemberInterface* local_var_members[] = { \
+ __VA_ARGS__}; \
+ size_t local_var_members_count = \
+ sizeof(local_var_members) / sizeof(local_var_members[0]); \
+ std::vector<const webrtc::RTCStatsMemberInterface*> \
+ local_var_members_vec = parent_class::MembersOfThisObjectAndAncestors( \
+ local_var_members_count + local_var_additional_capacity); \
+ RTC_DCHECK_GE( \
+ local_var_members_vec.capacity() - local_var_members_vec.size(), \
+ local_var_members_count + local_var_additional_capacity); \
+ local_var_members_vec.insert(local_var_members_vec.end(), \
+ &local_var_members[0], \
+ &local_var_members[local_var_members_count]); \
+ return local_var_members_vec; \
+ }
+
+// A version of WEBRTC_RTCSTATS_IMPL() where "..." is omitted, used to avoid a
+// compile error on windows. This is used if the stats dictionary does not
+// declare any members of its own (but perhaps its parent dictionary does).
+#define WEBRTC_RTCSTATS_IMPL_NO_MEMBERS(this_class, parent_class, type_str) \
+ const char this_class::kType[] = type_str; \
+ \
+ std::unique_ptr<webrtc::RTCStats> this_class::copy() const { \
+ return std::make_unique<this_class>(*this); \
+ } \
+ \
+ const char* this_class::type() const { \
+ return this_class::kType; \
+ } \
+ \
+ std::vector<const webrtc::RTCStatsMemberInterface*> \
+ this_class::MembersOfThisObjectAndAncestors( \
+ size_t local_var_additional_capacity) const { \
+ return parent_class::MembersOfThisObjectAndAncestors(0); \
+ }
+
+// Interface for `RTCStats` members, which have a name and a value of a type
+// defined in a subclass. Only the types listed in `Type` are supported, these
+// are implemented by `RTCStatsMember<T>`. The value of a member may be
+// undefined, the value can only be read if `is_defined`.
+class RTCStatsMemberInterface {
+ public:
+ // Member value types.
+ enum Type {
+ kBool, // bool
+ kInt32, // int32_t
+ kUint32, // uint32_t
+ kInt64, // int64_t
+ kUint64, // uint64_t
+ kDouble, // double
+ kString, // std::string
+
+ kSequenceBool, // std::vector<bool>
+ kSequenceInt32, // std::vector<int32_t>
+ kSequenceUint32, // std::vector<uint32_t>
+ kSequenceInt64, // std::vector<int64_t>
+ kSequenceUint64, // std::vector<uint64_t>
+ kSequenceDouble, // std::vector<double>
+ kSequenceString, // std::vector<std::string>
+
+ kMapStringUint64, // std::map<std::string, uint64_t>
+ kMapStringDouble, // std::map<std::string, double>
+ };
+
+ virtual ~RTCStatsMemberInterface() {}
+
+ const char* name() const { return name_; }
+ virtual Type type() const = 0;
+ virtual bool is_sequence() const = 0;
+ virtual bool is_string() const = 0;
+ virtual bool is_defined() const = 0;
+ // Type and value comparator. The names are not compared. These operators are
+ // exposed for testing.
+ bool operator==(const RTCStatsMemberInterface& other) const {
+ return IsEqual(other);
+ }
+ bool operator!=(const RTCStatsMemberInterface& other) const {
+ return !(*this == other);
+ }
+ virtual std::string ValueToString() const = 0;
+ // This is the same as ValueToString except for kInt64 and kUint64 types,
+ // where the value is represented as a double instead of as an integer.
+ // Since JSON stores numbers as floating point numbers, very large integers
+ // cannot be accurately represented, so we prefer to display them as doubles
+ // instead.
+ virtual std::string ValueToJson() const = 0;
+
+ template <typename T>
+ const T& cast_to() const {
+ RTC_DCHECK_EQ(type(), T::StaticType());
+ return static_cast<const T&>(*this);
+ }
+
+ protected:
+ explicit RTCStatsMemberInterface(const char* name) : name_(name) {}
+
+ virtual bool IsEqual(const RTCStatsMemberInterface& other) const = 0;
+
+ const char* const name_;
+};
+
+// Template implementation of `RTCStatsMemberInterface`.
+// The supported types are the ones described by
+// `RTCStatsMemberInterface::Type`.
+template <typename T>
+class RTCStatsMember : public RTCStatsMemberInterface {
+ public:
+ explicit RTCStatsMember(const char* name)
+ : RTCStatsMemberInterface(name), value_() {}
+ RTCStatsMember(const char* name, const T& value)
+ : RTCStatsMemberInterface(name), value_(value) {}
+ RTCStatsMember(const char* name, T&& value)
+ : RTCStatsMemberInterface(name), value_(std::move(value)) {}
+ explicit RTCStatsMember(const RTCStatsMember<T>& other)
+ : RTCStatsMemberInterface(other.name_), value_(other.value_) {}
+ explicit RTCStatsMember(RTCStatsMember<T>&& other)
+ : RTCStatsMemberInterface(other.name_), value_(std::move(other.value_)) {}
+
+ static Type StaticType();
+ Type type() const override { return StaticType(); }
+ bool is_sequence() const override;
+ bool is_string() const override;
+ bool is_defined() const override { return value_.has_value(); }
+ std::string ValueToString() const override;
+ std::string ValueToJson() const override;
+
+ template <typename U>
+ inline T ValueOrDefault(U default_value) const {
+ return value_.value_or(default_value);
+ }
+
+ // Assignment operators.
+ T& operator=(const T& value) {
+ value_ = value;
+ return value_.value();
+ }
+ T& operator=(const T&& value) {
+ value_ = std::move(value);
+ return value_.value();
+ }
+
+ // Getter methods that look the same as absl::optional<T>. Please prefer these
+ // in order to unblock replacing RTCStatsMember<T> with absl::optional<T> in
+ // the future (https://crbug.com/webrtc/15164).
+ bool has_value() const { return value_.has_value(); }
+ const T& value() const { return value_.value(); }
+ T& value() { return value_.value(); }
+ T& operator*() {
+ RTC_DCHECK(value_);
+ return *value_;
+ }
+ const T& operator*() const {
+ RTC_DCHECK(value_);
+ return *value_;
+ }
+ T* operator->() {
+ RTC_DCHECK(value_);
+ return &(*value_);
+ }
+ const T* operator->() const {
+ RTC_DCHECK(value_);
+ return &(*value_);
+ }
+
+ protected:
+ bool IsEqual(const RTCStatsMemberInterface& other) const override {
+ if (type() != other.type())
+ return false;
+ const RTCStatsMember<T>& other_t =
+ static_cast<const RTCStatsMember<T>&>(other);
+ return value_ == other_t.value_;
+ }
+
+ private:
+ absl::optional<T> value_;
+};
+
+namespace rtc_stats_internal {
+
+typedef std::map<std::string, uint64_t> MapStringUint64;
+typedef std::map<std::string, double> MapStringDouble;
+
+} // namespace rtc_stats_internal
+
+#define WEBRTC_DECLARE_RTCSTATSMEMBER(T) \
+ template <> \
+ RTC_EXPORT RTCStatsMemberInterface::Type RTCStatsMember<T>::StaticType(); \
+ template <> \
+ RTC_EXPORT bool RTCStatsMember<T>::is_sequence() const; \
+ template <> \
+ RTC_EXPORT bool RTCStatsMember<T>::is_string() const; \
+ template <> \
+ RTC_EXPORT std::string RTCStatsMember<T>::ValueToString() const; \
+ template <> \
+ RTC_EXPORT std::string RTCStatsMember<T>::ValueToJson() const; \
+ extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT) \
+ RTCStatsMember<T>
+
+WEBRTC_DECLARE_RTCSTATSMEMBER(bool);
+WEBRTC_DECLARE_RTCSTATSMEMBER(int32_t);
+WEBRTC_DECLARE_RTCSTATSMEMBER(uint32_t);
+WEBRTC_DECLARE_RTCSTATSMEMBER(int64_t);
+WEBRTC_DECLARE_RTCSTATSMEMBER(uint64_t);
+WEBRTC_DECLARE_RTCSTATSMEMBER(double);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::string);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<bool>);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<int32_t>);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<uint32_t>);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<int64_t>);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<uint64_t>);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<double>);
+WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<std::string>);
+WEBRTC_DECLARE_RTCSTATSMEMBER(rtc_stats_internal::MapStringUint64);
+WEBRTC_DECLARE_RTCSTATSMEMBER(rtc_stats_internal::MapStringDouble);
+
+} // namespace webrtc
+
+#endif // API_STATS_RTC_STATS_H_
diff --git a/third_party/libwebrtc/api/stats/rtc_stats_collector_callback.h b/third_party/libwebrtc/api/stats/rtc_stats_collector_callback.h
new file mode 100644
index 0000000000..506cc63e6f
--- /dev/null
+++ b/third_party/libwebrtc/api/stats/rtc_stats_collector_callback.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016 The WebRTC Project Authors. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_STATS_RTC_STATS_COLLECTOR_CALLBACK_H_
+#define API_STATS_RTC_STATS_COLLECTOR_CALLBACK_H_
+
+#include "api/scoped_refptr.h"
+#include "api/stats/rtc_stats_report.h"
+#include "rtc_base/ref_count.h"
+
+namespace webrtc {
+
+class RTCStatsCollectorCallback : public rtc::RefCountInterface {
+ public:
+ ~RTCStatsCollectorCallback() override = default;
+
+ virtual void OnStatsDelivered(
+ const rtc::scoped_refptr<const RTCStatsReport>& report) = 0;
+};
+
+} // namespace webrtc
+
+#endif // API_STATS_RTC_STATS_COLLECTOR_CALLBACK_H_
diff --git a/third_party/libwebrtc/api/stats/rtc_stats_report.h b/third_party/libwebrtc/api/stats/rtc_stats_report.h
new file mode 100644
index 0000000000..1dce4d89b2
--- /dev/null
+++ b/third_party/libwebrtc/api/stats/rtc_stats_report.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2016 The WebRTC Project Authors. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_STATS_RTC_STATS_REPORT_H_
+#define API_STATS_RTC_STATS_REPORT_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "api/ref_counted_base.h"
+#include "api/scoped_refptr.h"
+#include "api/stats/rtc_stats.h"
+#include "api/units/timestamp.h"
+// TODO(tommi): Remove this include after fixing iwyu issue in chromium.
+// See: third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
+#include "rtc_base/ref_counted_object.h"
+#include "rtc_base/system/rtc_export.h"
+
+namespace webrtc {
+
+// A collection of stats.
+// This is accessible as a map from `RTCStats::id` to `RTCStats`.
+class RTC_EXPORT RTCStatsReport final
+ : public rtc::RefCountedNonVirtual<RTCStatsReport> {
+ public:
+ typedef std::map<std::string, std::unique_ptr<const RTCStats>> StatsMap;
+
+ class RTC_EXPORT ConstIterator {
+ public:
+ ConstIterator(ConstIterator&& other);
+ ~ConstIterator();
+
+ ConstIterator& operator++();
+ ConstIterator& operator++(int);
+ const RTCStats& operator*() const;
+ const RTCStats* operator->() const;
+ bool operator==(const ConstIterator& other) const;
+ bool operator!=(const ConstIterator& other) const;
+
+ private:
+ friend class RTCStatsReport;
+ ConstIterator(const rtc::scoped_refptr<const RTCStatsReport>& report,
+ StatsMap::const_iterator it);
+
+ // Reference report to make sure it is kept alive.
+ rtc::scoped_refptr<const RTCStatsReport> report_;
+ StatsMap::const_iterator it_;
+ };
+
+ static rtc::scoped_refptr<RTCStatsReport> Create(Timestamp timestamp);
+
+ explicit RTCStatsReport(Timestamp timestamp);
+
+ RTCStatsReport(const RTCStatsReport& other) = delete;
+ rtc::scoped_refptr<RTCStatsReport> Copy() const;
+
+ Timestamp timestamp() const { return timestamp_; }
+ void AddStats(std::unique_ptr<const RTCStats> stats);
+ // On success, returns a non-owning pointer to `stats`. If the stats ID is not
+ // unique, `stats` is not inserted and nullptr is returned.
+ template <typename T>
+ T* TryAddStats(std::unique_ptr<T> stats) {
+ T* stats_ptr = stats.get();
+ if (!stats_
+ .insert(std::make_pair(std::string(stats->id()), std::move(stats)))
+ .second) {
+ return nullptr;
+ }
+ return stats_ptr;
+ }
+ const RTCStats* Get(const std::string& id) const;
+ size_t size() const { return stats_.size(); }
+
+ // Gets the stat object of type `T` by ID, where `T` is any class descending
+ // from `RTCStats`.
+ // Returns null if there is no stats object for the given ID or it is the
+ // wrong type.
+ template <typename T>
+ const T* GetAs(const std::string& id) const {
+ const RTCStats* stats = Get(id);
+ if (!stats || stats->type() != T::kType) {
+ return nullptr;
+ }
+ return &stats->cast_to<const T>();
+ }
+
+ // Removes the stats object from the report, returning ownership of it or null
+ // if there is no object with `id`.
+ std::unique_ptr<const RTCStats> Take(const std::string& id);
+ // Takes ownership of all the stats in `other`, leaving it empty.
+ void TakeMembersFrom(rtc::scoped_refptr<RTCStatsReport> other);
+
+ // Stats iterators. Stats are ordered lexicographically on `RTCStats::id`.
+ ConstIterator begin() const;
+ ConstIterator end() const;
+
+ // Gets the subset of stats that are of type `T`, where `T` is any class
+ // descending from `RTCStats`.
+ template <typename T>
+ std::vector<const T*> GetStatsOfType() const {
+ std::vector<const T*> stats_of_type;
+ for (const RTCStats& stats : *this) {
+ if (stats.type() == T::kType)
+ stats_of_type.push_back(&stats.cast_to<const T>());
+ }
+ return stats_of_type;
+ }
+
+ // Creates a JSON readable string representation of the report,
+ // listing all of its stats objects.
+ std::string ToJson() const;
+
+ protected:
+ friend class rtc::RefCountedNonVirtual<RTCStatsReport>;
+ ~RTCStatsReport() = default;
+
+ private:
+ Timestamp timestamp_;
+ StatsMap stats_;
+};
+
+} // namespace webrtc
+
+#endif // API_STATS_RTC_STATS_REPORT_H_
diff --git a/third_party/libwebrtc/api/stats/rtcstats_objects.h b/third_party/libwebrtc/api/stats/rtcstats_objects.h
new file mode 100644
index 0000000000..c28b635660
--- /dev/null
+++ b/third_party/libwebrtc/api/stats/rtcstats_objects.h
@@ -0,0 +1,519 @@
+/*
+ * Copyright 2016 The WebRTC Project Authors. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_STATS_RTCSTATS_OBJECTS_H_
+#define API_STATS_RTCSTATS_OBJECTS_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "api/stats/rtc_stats.h"
+#include "rtc_base/system/rtc_export.h"
+
+namespace webrtc {
+
+// https://w3c.github.io/webrtc-stats/#certificatestats-dict*
+class RTC_EXPORT RTCCertificateStats final : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCCertificateStats(std::string id, Timestamp timestamp);
+ RTCCertificateStats(const RTCCertificateStats& other);
+ ~RTCCertificateStats() override;
+
+ RTCStatsMember<std::string> fingerprint;
+ RTCStatsMember<std::string> fingerprint_algorithm;
+ RTCStatsMember<std::string> base64_certificate;
+ RTCStatsMember<std::string> issuer_certificate_id;
+};
+
+// https://w3c.github.io/webrtc-stats/#codec-dict*
+class RTC_EXPORT RTCCodecStats final : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCCodecStats(std::string id, Timestamp timestamp);
+ RTCCodecStats(const RTCCodecStats& other);
+ ~RTCCodecStats() override;
+
+ RTCStatsMember<std::string> transport_id;
+ RTCStatsMember<uint32_t> payload_type;
+ RTCStatsMember<std::string> mime_type;
+ RTCStatsMember<uint32_t> clock_rate;
+ RTCStatsMember<uint32_t> channels;
+ RTCStatsMember<std::string> sdp_fmtp_line;
+};
+
+// https://w3c.github.io/webrtc-stats/#dcstats-dict*
+class RTC_EXPORT RTCDataChannelStats final : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCDataChannelStats(std::string id, Timestamp timestamp);
+ RTCDataChannelStats(const RTCDataChannelStats& other);
+ ~RTCDataChannelStats() override;
+
+ RTCStatsMember<std::string> label;
+ RTCStatsMember<std::string> protocol;
+ RTCStatsMember<int32_t> data_channel_identifier;
+ RTCStatsMember<std::string> state;
+ RTCStatsMember<uint32_t> messages_sent;
+ RTCStatsMember<uint64_t> bytes_sent;
+ RTCStatsMember<uint32_t> messages_received;
+ RTCStatsMember<uint64_t> bytes_received;
+};
+
+// https://w3c.github.io/webrtc-stats/#candidatepair-dict*
+class RTC_EXPORT RTCIceCandidatePairStats final : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCIceCandidatePairStats(std::string id, Timestamp timestamp);
+ RTCIceCandidatePairStats(const RTCIceCandidatePairStats& other);
+ ~RTCIceCandidatePairStats() override;
+
+ RTCStatsMember<std::string> transport_id;
+ RTCStatsMember<std::string> local_candidate_id;
+ RTCStatsMember<std::string> remote_candidate_id;
+ RTCStatsMember<std::string> state;
+ // Obsolete: priority
+ RTCStatsMember<uint64_t> priority;
+ RTCStatsMember<bool> nominated;
+ // `writable` does not exist in the spec and old comments suggest it used to
+ // exist but was incorrectly implemented.
+ // TODO(https://crbug.com/webrtc/14171): Standardize and/or modify
+ // implementation.
+ RTCStatsMember<bool> writable;
+ RTCStatsMember<uint64_t> packets_sent;
+ RTCStatsMember<uint64_t> packets_received;
+ RTCStatsMember<uint64_t> bytes_sent;
+ RTCStatsMember<uint64_t> bytes_received;
+ RTCStatsMember<double> total_round_trip_time;
+ RTCStatsMember<double> current_round_trip_time;
+ RTCStatsMember<double> available_outgoing_bitrate;
+ RTCStatsMember<double> available_incoming_bitrate;
+ RTCStatsMember<uint64_t> requests_received;
+ RTCStatsMember<uint64_t> requests_sent;
+ RTCStatsMember<uint64_t> responses_received;
+ RTCStatsMember<uint64_t> responses_sent;
+ RTCStatsMember<uint64_t> consent_requests_sent;
+ RTCStatsMember<uint64_t> packets_discarded_on_send;
+ RTCStatsMember<uint64_t> bytes_discarded_on_send;
+ RTCStatsMember<double> last_packet_received_timestamp;
+ RTCStatsMember<double> last_packet_sent_timestamp;
+};
+
+// https://w3c.github.io/webrtc-stats/#icecandidate-dict*
+class RTC_EXPORT RTCIceCandidateStats : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCIceCandidateStats(const RTCIceCandidateStats& other);
+ ~RTCIceCandidateStats() override;
+
+ RTCStatsMember<std::string> transport_id;
+ // Obsolete: is_remote
+ RTCStatsMember<bool> is_remote;
+ RTCStatsMember<std::string> network_type;
+ RTCStatsMember<std::string> ip;
+ RTCStatsMember<std::string> address;
+ RTCStatsMember<int32_t> port;
+ RTCStatsMember<std::string> protocol;
+ RTCStatsMember<std::string> relay_protocol;
+ RTCStatsMember<std::string> candidate_type;
+ RTCStatsMember<int32_t> priority;
+ RTCStatsMember<std::string> url;
+ RTCStatsMember<std::string> foundation;
+ RTCStatsMember<std::string> related_address;
+ RTCStatsMember<int32_t> related_port;
+ RTCStatsMember<std::string> username_fragment;
+ RTCStatsMember<std::string> tcp_type;
+
+ // The following metrics are NOT exposed to JavaScript. We should consider
+ // standardizing or removing them.
+ RTCStatsMember<bool> vpn;
+ RTCStatsMember<std::string> network_adapter_type;
+
+ protected:
+ RTCIceCandidateStats(std::string id, Timestamp timestamp, bool is_remote);
+};
+
+// In the spec both local and remote varieties are of type RTCIceCandidateStats.
+// But here we define them as subclasses of `RTCIceCandidateStats` because the
+// `kType` need to be different ("RTCStatsType type") in the local/remote case.
+// https://w3c.github.io/webrtc-stats/#rtcstatstype-str*
+// This forces us to have to override copy() and type().
+class RTC_EXPORT RTCLocalIceCandidateStats final : public RTCIceCandidateStats {
+ public:
+ static const char kType[];
+ RTCLocalIceCandidateStats(std::string id, Timestamp timestamp);
+ std::unique_ptr<RTCStats> copy() const override;
+ const char* type() const override;
+};
+
+class RTC_EXPORT RTCRemoteIceCandidateStats final
+ : public RTCIceCandidateStats {
+ public:
+ static const char kType[];
+ RTCRemoteIceCandidateStats(std::string id, Timestamp timestamp);
+ std::unique_ptr<RTCStats> copy() const override;
+ const char* type() const override;
+};
+
+// https://w3c.github.io/webrtc-stats/#pcstats-dict*
+class RTC_EXPORT RTCPeerConnectionStats final : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCPeerConnectionStats(std::string id, Timestamp timestamp);
+ RTCPeerConnectionStats(const RTCPeerConnectionStats& other);
+ ~RTCPeerConnectionStats() override;
+
+ RTCStatsMember<uint32_t> data_channels_opened;
+ RTCStatsMember<uint32_t> data_channels_closed;
+};
+
+// https://w3c.github.io/webrtc-stats/#streamstats-dict*
+class RTC_EXPORT RTCRtpStreamStats : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCRtpStreamStats(const RTCRtpStreamStats& other);
+ ~RTCRtpStreamStats() override;
+
+ RTCStatsMember<uint32_t> ssrc;
+ RTCStatsMember<std::string> kind;
+ RTCStatsMember<std::string> transport_id;
+ RTCStatsMember<std::string> codec_id;
+
+ protected:
+ RTCRtpStreamStats(std::string id, Timestamp timestamp);
+};
+
+// https://www.w3.org/TR/webrtc-stats/#receivedrtpstats-dict*
+class RTC_EXPORT RTCReceivedRtpStreamStats : public RTCRtpStreamStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCReceivedRtpStreamStats(const RTCReceivedRtpStreamStats& other);
+ ~RTCReceivedRtpStreamStats() override;
+
+ RTCStatsMember<double> jitter;
+ RTCStatsMember<int32_t> packets_lost; // Signed per RFC 3550
+
+ protected:
+ RTCReceivedRtpStreamStats(std::string id, Timestamp timestamp);
+};
+
+// https://www.w3.org/TR/webrtc-stats/#sentrtpstats-dict*
+class RTC_EXPORT RTCSentRtpStreamStats : public RTCRtpStreamStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCSentRtpStreamStats(const RTCSentRtpStreamStats& other);
+ ~RTCSentRtpStreamStats() override;
+
+ RTCStatsMember<uint64_t> packets_sent;
+ RTCStatsMember<uint64_t> bytes_sent;
+
+ protected:
+ RTCSentRtpStreamStats(std::string id, Timestamp timestamp);
+};
+
+// https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict*
+class RTC_EXPORT RTCInboundRtpStreamStats final
+ : public RTCReceivedRtpStreamStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCInboundRtpStreamStats(std::string id, Timestamp timestamp);
+ RTCInboundRtpStreamStats(const RTCInboundRtpStreamStats& other);
+ ~RTCInboundRtpStreamStats() override;
+
+ RTCStatsMember<std::string> playout_id;
+ RTCStatsMember<std::string> track_identifier;
+ RTCStatsMember<std::string> mid;
+ RTCStatsMember<std::string> remote_id;
+ RTCStatsMember<uint32_t> packets_received;
+ RTCStatsMember<uint64_t> packets_discarded;
+ RTCStatsMember<uint64_t> fec_packets_received;
+ RTCStatsMember<uint64_t> fec_bytes_received;
+ RTCStatsMember<uint64_t> fec_packets_discarded;
+ // Inbound FEC SSRC. Only present if a mechanism like FlexFEC is negotiated.
+ RTCStatsMember<uint32_t> fec_ssrc;
+ RTCStatsMember<uint64_t> bytes_received;
+ RTCStatsMember<uint64_t> header_bytes_received;
+ // Inbound RTX stats. Only defined when RTX is used and it is therefore
+ // possible to distinguish retransmissions.
+ RTCStatsMember<uint64_t> retransmitted_packets_received;
+ RTCStatsMember<uint64_t> retransmitted_bytes_received;
+ RTCStatsMember<uint32_t> rtx_ssrc;
+
+ RTCStatsMember<double> last_packet_received_timestamp;
+ RTCStatsMember<double> jitter_buffer_delay;
+ RTCStatsMember<double> jitter_buffer_target_delay;
+ RTCStatsMember<double> jitter_buffer_minimum_delay;
+ RTCStatsMember<uint64_t> jitter_buffer_emitted_count;
+ RTCStatsMember<uint64_t> total_samples_received;
+ RTCStatsMember<uint64_t> concealed_samples;
+ RTCStatsMember<uint64_t> silent_concealed_samples;
+ RTCStatsMember<uint64_t> concealment_events;
+ RTCStatsMember<uint64_t> inserted_samples_for_deceleration;
+ RTCStatsMember<uint64_t> removed_samples_for_acceleration;
+ RTCStatsMember<double> audio_level;
+ RTCStatsMember<double> total_audio_energy;
+ RTCStatsMember<double> total_samples_duration;
+ // Stats below are only implemented or defined for video.
+ RTCStatsMember<uint32_t> frames_received;
+ RTCStatsMember<uint32_t> frame_width;
+ RTCStatsMember<uint32_t> frame_height;
+ RTCStatsMember<double> frames_per_second;
+ RTCStatsMember<uint32_t> frames_decoded;
+ RTCStatsMember<uint32_t> key_frames_decoded;
+ RTCStatsMember<uint32_t> frames_dropped;
+ RTCStatsMember<double> total_decode_time;
+ RTCStatsMember<double> total_processing_delay;
+ RTCStatsMember<double> total_assembly_time;
+ RTCStatsMember<uint32_t> frames_assembled_from_multiple_packets;
+ // TODO(https://crbug.com/webrtc/15600): Implement framesRendered, which is
+ // incremented at the same time that totalInterFrameDelay and
+ // totalSquaredInterFrameDelay is incremented. (Dividing inter-frame delay by
+ // framesDecoded is slightly wrong.)
+ // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-framesrendered
+ //
+ // TODO(https://crbug.com/webrtc/15601): Inter-frame, pause and freeze metrics
+ // all related to when the frame is rendered, but our implementation measures
+ // at delivery to sink, not at actual render time. When we have an actual
+ // frame rendered callback, move the calculating of these metrics to there in
+ // order to make them more accurate.
+ RTCStatsMember<double> total_inter_frame_delay;
+ RTCStatsMember<double> total_squared_inter_frame_delay;
+ RTCStatsMember<uint32_t> pause_count;
+ RTCStatsMember<double> total_pauses_duration;
+ RTCStatsMember<uint32_t> freeze_count;
+ RTCStatsMember<double> total_freezes_duration;
+ // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype
+ RTCStatsMember<std::string> content_type;
+ // Only populated if audio/video sync is enabled.
+ // TODO(https://crbug.com/webrtc/14177): Expose even if A/V sync is off?
+ RTCStatsMember<double> estimated_playout_timestamp;
+ // Only defined for video.
+ // In JavaScript, this is only exposed if HW exposure is allowed.
+ RTCStatsMember<std::string> decoder_implementation;
+ // FIR and PLI counts are only defined for |kind == "video"|.
+ RTCStatsMember<uint32_t> fir_count;
+ RTCStatsMember<uint32_t> pli_count;
+ RTCStatsMember<uint32_t> nack_count;
+ RTCStatsMember<uint64_t> qp_sum;
+ // This is a remnant of the legacy getStats() API. When the "video-timing"
+ // header extension is used,
+ // https://webrtc.github.io/webrtc-org/experiments/rtp-hdrext/video-timing/,
+ // `googTimingFrameInfo` is exposed with the value of
+ // TimingFrameInfo::ToString().
+ // TODO(https://crbug.com/webrtc/14586): Unship or standardize this metric.
+ RTCStatsMember<std::string> goog_timing_frame_info;
+ // In JavaScript, this is only exposed if HW exposure is allowed.
+ RTCStatsMember<bool> power_efficient_decoder;
+
+ // The following metrics are NOT exposed to JavaScript. We should consider
+ // standardizing or removing them.
+ RTCStatsMember<uint64_t> jitter_buffer_flushes;
+ RTCStatsMember<uint64_t> delayed_packet_outage_samples;
+ RTCStatsMember<double> relative_packet_arrival_delay;
+ RTCStatsMember<uint32_t> interruption_count;
+ RTCStatsMember<double> total_interruption_duration;
+ RTCStatsMember<double> min_playout_delay;
+};
+
+// https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict*
+class RTC_EXPORT RTCOutboundRtpStreamStats final
+ : public RTCSentRtpStreamStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCOutboundRtpStreamStats(std::string id, Timestamp timestamp);
+ RTCOutboundRtpStreamStats(const RTCOutboundRtpStreamStats& other);
+ ~RTCOutboundRtpStreamStats() override;
+
+ RTCStatsMember<std::string> media_source_id;
+ RTCStatsMember<std::string> remote_id;
+ RTCStatsMember<std::string> mid;
+ RTCStatsMember<std::string> rid;
+ RTCStatsMember<uint64_t> retransmitted_packets_sent;
+ RTCStatsMember<uint64_t> header_bytes_sent;
+ RTCStatsMember<uint64_t> retransmitted_bytes_sent;
+ RTCStatsMember<double> target_bitrate;
+ RTCStatsMember<uint32_t> frames_encoded;
+ RTCStatsMember<uint32_t> key_frames_encoded;
+ RTCStatsMember<double> total_encode_time;
+ RTCStatsMember<uint64_t> total_encoded_bytes_target;
+ RTCStatsMember<uint32_t> frame_width;
+ RTCStatsMember<uint32_t> frame_height;
+ RTCStatsMember<double> frames_per_second;
+ RTCStatsMember<uint32_t> frames_sent;
+ RTCStatsMember<uint32_t> huge_frames_sent;
+ RTCStatsMember<double> total_packet_send_delay;
+ RTCStatsMember<std::string> quality_limitation_reason;
+ RTCStatsMember<std::map<std::string, double>> quality_limitation_durations;
+ // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges
+ RTCStatsMember<uint32_t> quality_limitation_resolution_changes;
+ // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype
+ RTCStatsMember<std::string> content_type;
+ // In JavaScript, this is only exposed if HW exposure is allowed.
+ // Only implemented for video.
+ // TODO(https://crbug.com/webrtc/14178): Implement for audio as well.
+ RTCStatsMember<std::string> encoder_implementation;
+ // FIR and PLI counts are only defined for |kind == "video"|.
+ RTCStatsMember<uint32_t> fir_count;
+ RTCStatsMember<uint32_t> pli_count;
+ RTCStatsMember<uint32_t> nack_count;
+ RTCStatsMember<uint64_t> qp_sum;
+ RTCStatsMember<bool> active;
+ // In JavaScript, this is only exposed if HW exposure is allowed.
+ RTCStatsMember<bool> power_efficient_encoder;
+ RTCStatsMember<std::string> scalability_mode;
+
+ // RTX ssrc. Only present if RTX is negotiated.
+ RTCStatsMember<uint32_t> rtx_ssrc;
+};
+
+// https://w3c.github.io/webrtc-stats/#remoteinboundrtpstats-dict*
+class RTC_EXPORT RTCRemoteInboundRtpStreamStats final
+ : public RTCReceivedRtpStreamStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCRemoteInboundRtpStreamStats(std::string id, Timestamp timestamp);
+ RTCRemoteInboundRtpStreamStats(const RTCRemoteInboundRtpStreamStats& other);
+ ~RTCRemoteInboundRtpStreamStats() override;
+
+ RTCStatsMember<std::string> local_id;
+ RTCStatsMember<double> round_trip_time;
+ RTCStatsMember<double> fraction_lost;
+ RTCStatsMember<double> total_round_trip_time;
+ RTCStatsMember<int32_t> round_trip_time_measurements;
+};
+
+// https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict*
+class RTC_EXPORT RTCRemoteOutboundRtpStreamStats final
+ : public RTCSentRtpStreamStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCRemoteOutboundRtpStreamStats(std::string id, Timestamp timestamp);
+ RTCRemoteOutboundRtpStreamStats(const RTCRemoteOutboundRtpStreamStats& other);
+ ~RTCRemoteOutboundRtpStreamStats() override;
+
+ RTCStatsMember<std::string> local_id;
+ RTCStatsMember<double> remote_timestamp;
+ RTCStatsMember<uint64_t> reports_sent;
+ RTCStatsMember<double> round_trip_time;
+ RTCStatsMember<uint64_t> round_trip_time_measurements;
+ RTCStatsMember<double> total_round_trip_time;
+};
+
+// https://w3c.github.io/webrtc-stats/#dom-rtcmediasourcestats
+class RTC_EXPORT RTCMediaSourceStats : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCMediaSourceStats(const RTCMediaSourceStats& other);
+ ~RTCMediaSourceStats() override;
+
+ RTCStatsMember<std::string> track_identifier;
+ RTCStatsMember<std::string> kind;
+
+ protected:
+ RTCMediaSourceStats(std::string id, Timestamp timestamp);
+};
+
+// https://w3c.github.io/webrtc-stats/#dom-rtcaudiosourcestats
+class RTC_EXPORT RTCAudioSourceStats final : public RTCMediaSourceStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCAudioSourceStats(std::string id, Timestamp timestamp);
+ RTCAudioSourceStats(const RTCAudioSourceStats& other);
+ ~RTCAudioSourceStats() override;
+
+ RTCStatsMember<double> audio_level;
+ RTCStatsMember<double> total_audio_energy;
+ RTCStatsMember<double> total_samples_duration;
+ RTCStatsMember<double> echo_return_loss;
+ RTCStatsMember<double> echo_return_loss_enhancement;
+};
+
+// https://w3c.github.io/webrtc-stats/#dom-rtcvideosourcestats
+class RTC_EXPORT RTCVideoSourceStats final : public RTCMediaSourceStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCVideoSourceStats(std::string id, Timestamp timestamp);
+ RTCVideoSourceStats(const RTCVideoSourceStats& other);
+ ~RTCVideoSourceStats() override;
+
+ RTCStatsMember<uint32_t> width;
+ RTCStatsMember<uint32_t> height;
+ RTCStatsMember<uint32_t> frames;
+ RTCStatsMember<double> frames_per_second;
+};
+
+// https://w3c.github.io/webrtc-stats/#transportstats-dict*
+class RTC_EXPORT RTCTransportStats final : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCTransportStats(std::string id, Timestamp timestamp);
+ RTCTransportStats(const RTCTransportStats& other);
+ ~RTCTransportStats() override;
+
+ RTCStatsMember<uint64_t> bytes_sent;
+ RTCStatsMember<uint64_t> packets_sent;
+ RTCStatsMember<uint64_t> bytes_received;
+ RTCStatsMember<uint64_t> packets_received;
+ RTCStatsMember<std::string> rtcp_transport_stats_id;
+ RTCStatsMember<std::string> dtls_state;
+ RTCStatsMember<std::string> selected_candidate_pair_id;
+ RTCStatsMember<std::string> local_certificate_id;
+ RTCStatsMember<std::string> remote_certificate_id;
+ RTCStatsMember<std::string> tls_version;
+ RTCStatsMember<std::string> dtls_cipher;
+ RTCStatsMember<std::string> dtls_role;
+ RTCStatsMember<std::string> srtp_cipher;
+ RTCStatsMember<uint32_t> selected_candidate_pair_changes;
+ RTCStatsMember<std::string> ice_role;
+ RTCStatsMember<std::string> ice_local_username_fragment;
+ RTCStatsMember<std::string> ice_state;
+};
+
+// https://w3c.github.io/webrtc-stats/#playoutstats-dict*
+class RTC_EXPORT RTCAudioPlayoutStats final : public RTCStats {
+ public:
+ WEBRTC_RTCSTATS_DECL();
+
+ RTCAudioPlayoutStats(const std::string& id, Timestamp timestamp);
+ RTCAudioPlayoutStats(const RTCAudioPlayoutStats& other);
+ ~RTCAudioPlayoutStats() override;
+
+ RTCStatsMember<std::string> kind;
+ RTCStatsMember<double> synthesized_samples_duration;
+ RTCStatsMember<uint64_t> synthesized_samples_events;
+ RTCStatsMember<double> total_samples_duration;
+ RTCStatsMember<double> total_playout_delay;
+ RTCStatsMember<uint64_t> total_samples_count;
+};
+
+} // namespace webrtc
+
+#endif // API_STATS_RTCSTATS_OBJECTS_H_