15c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org/*
25c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * libjingle
35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2014 Google Inc.
45c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *
55c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * Redistribution and use in source and binary forms, with or without
65c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * modification, are permitted provided that the following conditions are met:
75c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *
85c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *     this list of conditions and the following disclaimer.
105c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *     and/or other materials provided with the distribution.
135c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *     derived from this software without specific prior written permission.
155c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org *
165c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org */
275c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org
285c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org#include "talk/app/webrtc/statstypes.h"
295c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org
30d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#include <string.h>
31d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
32d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#include "webrtc/base/checks.h"
33d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
34d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org// TODO(tommi): Could we have a static map of value name -> expected type
3591d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg// and use this to RTC_DCHECK on correct usage (somewhat strongly typed values)?
36d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org// Alternatively, we could define the names+type in a separate document and
37d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org// generate strongly typed inline C++ code that forces the correct type to be
38d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org// used for a given name at compile time.
39d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
404b89aa03bb9c817cf2274f2035d613a70c5298ebtommi@webrtc.orgusing rtc::RefCountedObject;
418e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
425c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.orgnamespace webrtc {
434fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgnamespace {
444fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
454fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// The id of StatsReport of type kStatsReportTypeBwe.
464fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgconst char kStatsReportVideoBweId[] = "bweforvideo";
474fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
484fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// NOTE: These names need to be consistent with an external
494fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// specification (W3C Stats Identifiers).
504fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgconst char* InternalTypeToString(StatsReport::StatsType type) {
514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  switch (type) {
524fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeSession:
534fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "googLibjingleSession";
544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeBwe:
554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "VideoBwe";
564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeRemoteSsrc:
574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "remoteSsrc";
584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeSsrc:
594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "ssrc";
604fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeTrack:
614fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "googTrack";
624fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeIceLocalCandidate:
634fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "localcandidate";
644fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeIceRemoteCandidate:
654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "remotecandidate";
664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeTransport:
677bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "transport";
684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeComponent:
694fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "googComponent";
704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeCandidatePair:
714fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "googCandidatePair";
724fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeCertificate:
734fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "googCertificate";
744fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    case StatsReport::kStatsReportTypeDataChannel:
754fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      return "datachannel";
764fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
7791d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(false);
784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return nullptr;
79c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
80c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
81d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgclass BandwidthEstimationId : public StatsReport::IdBase {
824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org public:
83d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  BandwidthEstimationId()
84d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      : StatsReport::IdBase(StatsReport::kStatsReportTypeBwe) {}
854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  std::string ToString() const override { return kStatsReportVideoBweId; }
864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org};
874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
88d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgclass TypedId : public StatsReport::IdBase {
894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org public:
904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  TypedId(StatsReport::StatsType type, const std::string& id)
91d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      : StatsReport::IdBase(type), id_(id) {}
924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
93d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  bool Equals(const IdBase& other) const override {
94d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return IdBase::Equals(other) &&
954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org           static_cast<const TypedId&>(other).id_ == id_;
964fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
978e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
984fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  std::string ToString() const override {
994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return std::string(InternalTypeToString(type_)) + kSeparator + id_;
1004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
1018e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
1024fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org protected:
1034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const std::string id_;
1044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org};
105c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
106d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgclass TypedIntId : public StatsReport::IdBase {
107322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org public:
108322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org  TypedIntId(StatsReport::StatsType type, int id)
109d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      : StatsReport::IdBase(type), id_(id) {}
110322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org
111d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  bool Equals(const IdBase& other) const override {
112d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return IdBase::Equals(other) &&
113322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org           static_cast<const TypedIntId&>(other).id_ == id_;
114322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org  }
115322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org
116322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org  std::string ToString() const override {
117322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org    return std::string(InternalTypeToString(type_)) +
118322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org           kSeparator +
119322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org           rtc::ToString<int>(id_);
120322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org  }
121322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org
122322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org protected:
123322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org  const int id_;
124322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org};
125322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org
1264fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgclass IdWithDirection : public TypedId {
1274fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org public:
1284fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  IdWithDirection(StatsReport::StatsType type, const std::string& id,
1294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org                  StatsReport::Direction direction)
1304fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      : TypedId(type, id), direction_(direction) {}
131c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
132d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  bool Equals(const IdBase& other) const override {
1334fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return TypedId::Equals(other) &&
1344fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org           static_cast<const IdWithDirection&>(other).direction_ == direction_;
1354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
136c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
1374fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  std::string ToString() const override {
1384fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    std::string ret(TypedId::ToString());
139322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org    ret += kSeparator;
1404fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    ret += direction_ == StatsReport::kSend ? "send" : "recv";
1414fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return ret;
1424fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
143c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
1444fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org private:
1454fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const StatsReport::Direction direction_;
1464fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org};
1474fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1484fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgclass CandidateId : public TypedId {
1494fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org public:
1504fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  CandidateId(bool local, const std::string& id)
1514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      : TypedId(local ?
1524fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org                    StatsReport::kStatsReportTypeIceLocalCandidate :
1534fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org                    StatsReport::kStatsReportTypeIceRemoteCandidate,
1544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org                id) {
1554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
156c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
1574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  std::string ToString() const override {
1584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return "Cand-" + id_;
1594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
1604fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org};
1614fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
162d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgclass ComponentId : public StatsReport::IdBase {
1634fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org public:
1644fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  ComponentId(const std::string& content_name, int component)
1654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      : ComponentId(StatsReport::kStatsReportTypeComponent, content_name,
1664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org            component) {}
1674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
168d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  bool Equals(const IdBase& other) const override {
169d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return IdBase::Equals(other) &&
1704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org        static_cast<const ComponentId&>(other).component_ == component_ &&
1714fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org        static_cast<const ComponentId&>(other).content_name_ == content_name_;
1724fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
1734fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1744fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  std::string ToString() const override {
1754fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return ToString("Channel-");
1764fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
1774fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org protected:
1794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  ComponentId(StatsReport::StatsType type, const std::string& content_name,
1804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org              int component)
181d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      : IdBase(type),
1824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org        content_name_(content_name),
1834fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org        component_(component) {}
1844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  std::string ToString(const char* prefix) const {
1864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    std::string ret(prefix);
1874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    ret += content_name_;
1884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    ret += '-';
1894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    ret += rtc::ToString<>(component_);
1904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return ret;
1914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
1924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org private:
1944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const std::string content_name_;
1954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const int component_;
1964fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org};
1974fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1984fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgclass CandidatePairId : public ComponentId {
1994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org public:
2004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  CandidatePairId(const std::string& content_name, int component, int index)
2014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      : ComponentId(StatsReport::kStatsReportTypeCandidatePair, content_name,
2024fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org            component),
2034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org        index_(index) {}
2044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
205d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  bool Equals(const IdBase& other) const override {
2064fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return ComponentId::Equals(other) &&
2074fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org        static_cast<const CandidatePairId&>(other).index_ == index_;
2084fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
2094fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
2104fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  std::string ToString() const override {
2114fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    std::string ret(ComponentId::ToString("Conn-"));
2124fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    ret += '-';
2134fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    ret += rtc::ToString<>(index_);
2144fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return ret;
2154fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
2164fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
2174fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org private:
2184fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const int index_;
2194fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org};
2204fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
2214fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}  // namespace
2224fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
223d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::IdBase::IdBase(StatsType type) : type_(type) {}
224d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::IdBase::~IdBase() {}
2254fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
226d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::StatsType StatsReport::IdBase::type() const { return type_; }
227c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
228d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::IdBase::Equals(const IdBase& other) const {
2294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return other.type_ == type_;
230c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
231c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
2320c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter BoströmStatsReport::Value::Value(StatsValueName name, int64_t value, Type int_type)
233d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    : name(name), type_(int_type) {
23491d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(type_ == kInt || type_ == kInt64);
235d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  type_ == kInt ? value_.int_ = static_cast<int>(value) : value_.int64_ = value;
236d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
237d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
238d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Value::Value(StatsValueName name, float f)
239d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    : name(name), type_(kFloat) {
240d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  value_.float_ = f;
241d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
242d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
243c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.orgStatsReport::Value::Value(StatsValueName name, const std::string& value)
244d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    : name(name), type_(kString) {
245d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  value_.string_ = new std::string(value);
246d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
247d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
248d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Value::Value(StatsValueName name, const char* value)
249d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    : name(name), type_(kStaticString) {
250d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  value_.static_string_ = value;
251d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
252d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
253d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Value::Value(StatsValueName name, bool b)
254d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    : name(name), type_(kBool) {
255d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  value_.bool_ = b;
256d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
257d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
258d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Value::Value(StatsValueName name, const Id& value)
259d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    : name(name), type_(kId) {
260d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  value_.id_ = new Id(value);
261d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
262d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
263d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Value::~Value() {
264d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  switch (type_) {
265d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt:
266d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt64:
267d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kFloat:
268d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kBool:
269d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kStaticString:
270d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      break;
271d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kString:
272d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      delete value_.string_;
273d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      break;
274d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kId:
275d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      delete value_.id_;
276d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      break;
277d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  }
278d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
279d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
280d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::Equals(const Value& other) const {
281d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (name != other.name)
282d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return false;
283d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
284d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  // There's a 1:1 relation between a name and a type, so we don't have to
285d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  // check that.
28691d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK_EQ(type_, other.type_);
287d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
288d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  switch (type_) {
289d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt:
290d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.int_ == other.value_.int_;
291d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt64:
292d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.int64_ == other.value_.int64_;
293d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kFloat:
294d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.float_ == other.value_.float_;
295d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kStaticString: {
296d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
297d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      if (value_.static_string_ != other.value_.static_string_) {
29891d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg        RTC_DCHECK(strcmp(value_.static_string_, other.value_.static_string_) !=
29991d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg                   0)
300d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org            << "Duplicate global?";
301d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      }
302d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#endif
303d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.static_string_ == other.value_.static_string_;
304d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    }
305d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kString:
306d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return *value_.string_ == *other.value_.string_;
307d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kBool:
308d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.bool_ == other.value_.bool_;
309d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kId:
310d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return (*value_.id_)->Equals(*other.value_.id_);
311d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  }
312d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  RTC_NOTREACHED();
313d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return false;
314d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
315d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
316d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(const std::string& value) const {
317d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return (type_ == kString && value_.string_->compare(value) == 0) ||
318d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org         (type_ == kStaticString && value.compare(value_.static_string_) == 0);
319d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
320d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
321d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(const char* value) const {
322d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (type_ == kString)
323d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return value_.string_->compare(value) == 0;
324d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (type_ != kStaticString)
325d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return false;
326d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
327d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (value_.static_string_ != value)
32891d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg    RTC_DCHECK(strcmp(value_.static_string_, value) != 0)
32991d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg        << "Duplicate global?";
330d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#endif
331d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value == value_.static_string_;
332d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
333d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
3340c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool StatsReport::Value::operator==(int64_t value) const {
335d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kInt ? value_.int_ == static_cast<int>(value) :
336d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      (type_ == kInt64 ? value_.int64_ == value : false);
337d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
338d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
339d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(bool value) const {
340d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kBool && value_.bool_ == value;
341d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
342d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
343d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(float value) const {
344d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kFloat && value_.float_ == value;
345d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
346d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
347d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(const Id& value) const {
348d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kId && (*value_.id_)->Equals(value);
349d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
350d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
351d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgint StatsReport::Value::int_val() const {
35291d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(type_ == kInt);
353d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.int_;
354d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
355d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
3560c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmint64_t StatsReport::Value::int64_val() const {
35791d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(type_ == kInt64);
358d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.int64_;
359d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
360d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
361d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgfloat StatsReport::Value::float_val() const {
36291d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(type_ == kFloat);
363d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.float_;
364d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
365d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
366d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgconst char* StatsReport::Value::static_string_val() const {
36791d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(type_ == kStaticString);
368d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.static_string_;
369d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
370d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
371d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgconst std::string& StatsReport::Value::string_val() const {
37291d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(type_ == kString);
373d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return *value_.string_;
374d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
375d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
376d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::bool_val() const {
37791d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(type_ == kBool);
378d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.bool_;
379c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
380c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
381c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.orgconst char* StatsReport::Value::display_name() const {
382c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  switch (name) {
383c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAudioOutputLevel:
384c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "audioOutputLevel";
385c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAudioInputLevel:
386c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "audioInputLevel";
387c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBytesSent:
388c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "bytesSent";
389c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePacketsSent:
390c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsSent";
391c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBytesReceived:
392c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "bytesReceived";
393487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameLabel:
394487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "label";
395c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePacketsReceived:
396c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsReceived";
397c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePacketsLost:
398c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsLost";
399487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameProtocol:
400487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "protocol";
401c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTransportId:
402c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "transportId";
4037bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    case kStatsValueNameSelectedCandidatePairId:
4047bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "selectedCandidatePairId";
405c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameSsrc:
406c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "ssrc";
407487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameState:
408487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "state";
409487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameDataChannelId:
410487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "datachannelid";
411b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström    case kStatsValueNameCodecImplementationName:
412b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström      return "codecImplementationName";
413c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org
414c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    // 'goog' prefixed constants.
4158e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin    case kStatsValueNameAccelerateRate:
4168e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin      return "googAccelerateRate";
417c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameActiveConnection:
418c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googActiveConnection";
419c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameActualEncBitrate:
420c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googActualEncBitrate";
421c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAvailableReceiveBandwidth:
422c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAvailableReceiveBandwidth";
423c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAvailableSendBandwidth:
424c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAvailableSendBandwidth";
425c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAvgEncodeMs:
426c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAvgEncodeMs";
427c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBucketDelay:
428c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googBucketDelay";
429c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBandwidthLimitedResolution:
430c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googBandwidthLimitedResolution";
431950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org
432950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    // Candidate related attributes. Values are taken from
433950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
434950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateIPAddress:
435950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "ipAddress";
436950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateNetworkType:
437950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "networkType";
438950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidatePortNumber:
439950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "portNumber";
440950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidatePriority:
441950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "priority";
442950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateTransportType:
443950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "transport";
444950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateType:
445950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "candidateType";
446950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org
447c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameChannelId:
448c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googChannelId";
449c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCodecName:
450c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCodecName";
451c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameComponent:
452c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googComponent";
453c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameContentName:
454c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googContentName";
455c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCpuLimitedResolution:
456c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCpuLimitedResolution";
457c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingCTSG:
458c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingCTSG";
459c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingCTN:
460c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingCTN";
461c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingNormal:
462c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingNormal";
463c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingPLC:
464c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingPLC";
465c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingCNG:
466c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingCNG";
467c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingPLCCNG:
468c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingPLCCNG";
469c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDer:
470c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDerBase64";
4717bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    case kStatsValueNameDtlsCipher:
4727bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "dtlsCipher";
473c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoCancellationQualityMin:
474c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationQualityMin";
475c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoDelayMedian:
476c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationEchoDelayMedian";
477c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoDelayStdDev:
478c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationEchoDelayStdDev";
479c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoReturnLoss:
480c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationReturnLoss";
481c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoReturnLossEnhancement:
482c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationReturnLossEnhancement";
483c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEncodeUsagePercent:
484c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEncodeUsagePercent";
485c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameExpandRate:
486c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googExpandRate";
487c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFingerprint:
488c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFingerprint";
489c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFingerprintAlgorithm:
490c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFingerprintAlgorithm";
491c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFirsReceived:
492c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFirsReceived";
493c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFirsSent:
494c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFirsSent";
495c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameHeightInput:
496c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameHeightInput";
497c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameHeightReceived:
498c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameHeightReceived";
499c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameHeightSent:
500c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameHeightSent";
501c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateReceived:
502c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateReceived";
503c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateDecoded:
504c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateDecoded";
505c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateOutput:
506c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateOutput";
507c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodeMs:
508c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodeMs";
509c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameMaxDecodeMs:
510c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googMaxDecodeMs";
511c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCurrentDelayMs:
512c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCurrentDelayMs";
513c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTargetDelayMs:
514c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTargetDelayMs";
515c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameJitterBufferMs:
516c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googJitterBufferMs";
517c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameMinPlayoutDelayMs:
518c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googMinPlayoutDelayMs";
519c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRenderDelayMs:
520c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRenderDelayMs";
521c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCaptureStartNtpTimeMs:
522c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCaptureStartNtpTimeMs";
523c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateInput:
524c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateInput";
525c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateSent:
526c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateSent";
527c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameWidthInput:
528c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameWidthInput";
529c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameWidthReceived:
530c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameWidthReceived";
531c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameWidthSent:
532c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameWidthSent";
533c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameInitiator:
534c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googInitiator";
535c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameIssuerId:
536c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googIssuerId";
537c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameJitterReceived:
538c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googJitterReceived";
539c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameLocalAddress:
540c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googLocalAddress";
541950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameLocalCandidateId:
542950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "localCandidateId";
543c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameLocalCandidateType:
544c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googLocalCandidateType";
545c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameLocalCertificateId:
5467bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "localCertificateId";
547c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAdaptationChanges:
548c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAdaptationChanges";
549c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameNacksReceived:
550c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googNacksReceived";
551c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameNacksSent:
552c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googNacksSent";
5538e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin    case kStatsValueNamePreemptiveExpandRate:
5548e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin      return "googPreemptiveExpandRate";
555c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePlisReceived:
556c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googPlisReceived";
557c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePlisSent:
558c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googPlisSent";
559c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePreferredJitterBufferMs:
560c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googPreferredJitterBufferMs";
56104ac81f2fd8ef6680522438fac1894db5415a0ecPeter Thatcher    case kStatsValueNameReceiving:
562c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googReadable";
563c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRemoteAddress:
564c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRemoteAddress";
565950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameRemoteCandidateId:
566950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "remoteCandidateId";
567c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRemoteCandidateType:
568c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRemoteCandidateType";
569c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRemoteCertificateId:
5707bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "remoteCertificateId";
571c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRetransmitBitrate:
572c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRetransmitBitrate";
573c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRtt:
574c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRtt";
575652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org    case kStatsValueNameSecondaryDecodedRate:
576652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org      return "googSecondaryDecodedRate";
577c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameSendPacketsDiscarded:
578c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsDiscardedOnSend";
579652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org    case kStatsValueNameSpeechExpandRate:
580652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org      return "googSpeechExpandRate";
5817bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    case kStatsValueNameSrtpCipher:
5827bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "srtpCipher";
583c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTargetEncBitrate:
584c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTargetEncBitrate";
585c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTransmitBitrate:
586c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTransmitBitrate";
587c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTransportType:
588c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTransportType";
589c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTrackId:
590c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTrackId";
591c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTypingNoiseState:
592c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTypingNoiseState";
593c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameViewLimitedResolution:
594c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googViewLimitedResolution";
595c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameWritable:
596c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googWritable";
597c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  }
598c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org
599c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  return nullptr;
600c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
601c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
602d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgstd::string StatsReport::Value::ToString() const {
603d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  switch (type_) {
604d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt:
605d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return rtc::ToString(value_.int_);
606d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt64:
607d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return rtc::ToString(value_.int64_);
608d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kFloat:
609d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return rtc::ToString(value_.float_);
610d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kStaticString:
611d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return std::string(value_.static_string_);
612d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kString:
613d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return *value_.string_;
614d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kBool:
615d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.bool_ ? "true" : "false";
616d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kId:
617d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return (*value_.id_)->ToString();
618d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  }
619d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  RTC_NOTREACHED();
620d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return std::string();
621afa6d16a05301c462ff65aa4f1537a1aa12a0a7atommi@webrtc.org}
622afa6d16a05301c462ff65aa4f1537a1aa12a0a7atommi@webrtc.org
623d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::StatsReport(const Id& id) : id_(id), timestamp_(0.0) {
62491d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(id_.get());
6254fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6264fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6274fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
628d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewBandwidthEstimationId() {
629d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<BandwidthEstimationId>());
6304fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6314fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6324fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
633d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewTypedId(StatsType type, const std::string& id) {
634d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<TypedId>(type, id));
6354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6364fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6374fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
638d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewTypedIntId(StatsType type, int id) {
639d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<TypedIntId>(type, id));
640322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org}
641322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org
642322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org// static
643d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewIdWithDirection(
6444fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    StatsType type, const std::string& id, StatsReport::Direction direction) {
645d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<IdWithDirection>(type, id, direction));
6464fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6474fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6484fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
649d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewCandidateId(bool local, const std::string& id) {
650d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<CandidateId>(local, id));
6514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6524fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6534fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
654d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewComponentId(
6554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    const std::string& content_name, int component) {
656d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<ComponentId>(content_name, component));
6574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
660d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewCandidatePairId(
6614fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    const std::string& content_name, int component, int index) {
662d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<CandidatePairId>(
663d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      content_name, component, index));
6644fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgconst char* StatsReport::TypeToString() const {
6674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return InternalTypeToString(id_->type());
6684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6694fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
67092f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.orgvoid StatsReport::AddString(StatsReport::StatsValueName name,
67192f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org                            const std::string& value) {
672d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
673d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
674d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
675d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
676d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
677d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgvoid StatsReport::AddString(StatsReport::StatsValueName name,
678d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org                            const char* value) {
679d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
680d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
681d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
682c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
683c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
6840c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid StatsReport::AddInt64(StatsReport::StatsValueName name, int64_t value) {
685d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
686d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
687d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value, Value::kInt64));
688c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
689c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
69092f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.orgvoid StatsReport::AddInt(StatsReport::StatsValueName name, int value) {
691d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
6920c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  if (!found || !(*found == static_cast<int64_t>(value)))
693d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value, Value::kInt));
694c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
695c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
69692f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.orgvoid StatsReport::AddFloat(StatsReport::StatsValueName name, float value) {
697d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
698d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
699d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
70092f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org}
701c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
702c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.orgvoid StatsReport::AddBoolean(StatsReport::StatsValueName name, bool value) {
703d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
704d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
705d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
7068e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org}
7078e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
708d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgvoid StatsReport::AddId(StatsReport::StatsValueName name,
709d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org                        const Id& value) {
710d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
711d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
712d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
713c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
714c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7154fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgconst StatsReport::Value* StatsReport::FindValue(StatsValueName name) const {
71692f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  Values::const_iterator it = values_.find(name);
71792f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  return it == values_.end() ? nullptr : it->second.get();
7184fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
7194fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
7204fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::StatsCollection() {
721c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
722c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7234fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::~StatsCollection() {
72491d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
7254fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  for (auto* r : list_)
7264fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    delete r;
727c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
728c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::const_iterator StatsCollection::begin() const {
73091d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
731c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org  return list_.begin();
732c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
733c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7344fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::const_iterator StatsCollection::end() const {
73591d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
736c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org  return list_.end();
737c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
738c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7394fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgsize_t StatsCollection::size() const {
74091d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
7414fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return list_.size();
7424fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
7434fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
744d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport* StatsCollection::InsertNew(const StatsReport::Id& id) {
74591d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
74691d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(Find(id) == nullptr);
747d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  StatsReport* report = new StatsReport(id);
7484fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  list_.push_back(report);
7494fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return report;
750c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
751c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
752d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport* StatsCollection::FindOrAddNew(const StatsReport::Id& id) {
75391d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
754d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  StatsReport* ret = Find(id);
755d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return ret ? ret : InsertNew(id);
756c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
757c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
758d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport* StatsCollection::ReplaceOrAddNew(const StatsReport::Id& id) {
75991d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
76091d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(id.get());
7614fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  Container::iterator it = std::find_if(list_.begin(), list_.end(),
762d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
7634fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  if (it != end()) {
764d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    StatsReport* report = new StatsReport((*it)->id());
7654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    delete *it;
7664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    *it = report;
7674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return report;
7684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
769d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return InsertNew(id);
770c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
771c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
772c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org// Looks for a report with the given |id|.  If one is not found, NULL
773c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org// will be returned.
7744fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsReport* StatsCollection::Find(const StatsReport::Id& id) {
77591d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(thread_checker_.CalledOnValidThread());
7764fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  Container::iterator it = std::find_if(list_.begin(), list_.end(),
777d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
7784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return it == list_.end() ? nullptr : *it;
7794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
7804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
7815c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org}  // namespace webrtc
782