statstypes.cc revision 4b89aa03bb9c817cf2274f2035d613a70c5298eb
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
35d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org// and use this to 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  }
77d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  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
232d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Value::Value(StatsValueName name, int64 value, Type int_type)
233d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    : name(name), type_(int_type) {
234d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  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.
286d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  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_) {
298d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org        DCHECK(strcmp(value_.static_string_, other.value_.static_string_) != 0)
299d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org            << "Duplicate global?";
300d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      }
301d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#endif
302d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.static_string_ == other.value_.static_string_;
303d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    }
304d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kString:
305d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return *value_.string_ == *other.value_.string_;
306d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kBool:
307d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.bool_ == other.value_.bool_;
308d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kId:
309d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return (*value_.id_)->Equals(*other.value_.id_);
310d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  }
311d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  RTC_NOTREACHED();
312d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return false;
313d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
314d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
315d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(const std::string& value) const {
316d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return (type_ == kString && value_.string_->compare(value) == 0) ||
317d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org         (type_ == kStaticString && value.compare(value_.static_string_) == 0);
318d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
319d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
320d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(const char* value) const {
321d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (type_ == kString)
322d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return value_.string_->compare(value) == 0;
323d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (type_ != kStaticString)
324d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    return false;
325d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
326d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (value_.static_string_ != value)
327d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    DCHECK(strcmp(value_.static_string_, value) != 0) << "Duplicate global?";
328d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#endif
329d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value == value_.static_string_;
330d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
331d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
332d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(int64 value) const {
333d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kInt ? value_.int_ == static_cast<int>(value) :
334d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      (type_ == kInt64 ? value_.int64_ == value : false);
335d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
336d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
337d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(bool value) const {
338d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kBool && value_.bool_ == value;
339d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
340d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
341d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(float value) const {
342d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kFloat && value_.float_ == value;
343d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
344d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
345d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::operator==(const Id& value) const {
346d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return type_ == kId && (*value_.id_)->Equals(value);
347d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
348d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
349d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgint StatsReport::Value::int_val() const {
350d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(type_ == kInt);
351d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.int_;
352d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
353d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
354d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgint64 StatsReport::Value::int64_val() const {
355d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(type_ == kInt64);
356d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.int64_;
357d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
358d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
359d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgfloat StatsReport::Value::float_val() const {
360d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(type_ == kFloat);
361d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.float_;
362d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
363d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
364d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgconst char* StatsReport::Value::static_string_val() const {
365d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(type_ == kStaticString);
366d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.static_string_;
367d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
368d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
369d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgconst std::string& StatsReport::Value::string_val() const {
370d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(type_ == kString);
371d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return *value_.string_;
372d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
373d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
374d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgbool StatsReport::Value::bool_val() const {
375d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(type_ == kBool);
376d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return value_.bool_;
377c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
378c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
379c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.orgconst char* StatsReport::Value::display_name() const {
380c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  switch (name) {
381c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAudioOutputLevel:
382c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "audioOutputLevel";
383c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAudioInputLevel:
384c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "audioInputLevel";
385c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBytesSent:
386c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "bytesSent";
387c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePacketsSent:
388c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsSent";
389c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBytesReceived:
390c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "bytesReceived";
391487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameLabel:
392487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "label";
393c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePacketsReceived:
394c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsReceived";
395c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePacketsLost:
396c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsLost";
397487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameProtocol:
398487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "protocol";
399c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTransportId:
400c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "transportId";
4017bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    case kStatsValueNameSelectedCandidatePairId:
4027bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "selectedCandidatePairId";
403c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameSsrc:
404c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "ssrc";
405487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameState:
406487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "state";
407487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    case kStatsValueNameDataChannelId:
408487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org      return "datachannelid";
409c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org
410c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    // 'goog' prefixed constants.
411c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameActiveConnection:
412c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googActiveConnection";
413c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameActualEncBitrate:
414c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googActualEncBitrate";
415c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAvailableReceiveBandwidth:
416c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAvailableReceiveBandwidth";
417c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAvailableSendBandwidth:
418c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAvailableSendBandwidth";
419c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAvgEncodeMs:
420c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAvgEncodeMs";
421c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBucketDelay:
422c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googBucketDelay";
423c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameBandwidthLimitedResolution:
424c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googBandwidthLimitedResolution";
425c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCaptureJitterMs:
426c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCaptureJitterMs";
427c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCaptureQueueDelayMsPerS:
428c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCaptureQueueDelayMsPerS";
429950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org
430950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    // Candidate related attributes. Values are taken from
431950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
432950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateIPAddress:
433950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "ipAddress";
434950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateNetworkType:
435950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "networkType";
436950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidatePortNumber:
437950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "portNumber";
438950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidatePriority:
439950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "priority";
440950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateTransportType:
441950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "transport";
442950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameCandidateType:
443950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "candidateType";
444950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org
445c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameChannelId:
446c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googChannelId";
447c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCodecName:
448c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCodecName";
449c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameComponent:
450c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googComponent";
451c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameContentName:
452c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googContentName";
453c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCpuLimitedResolution:
454c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCpuLimitedResolution";
455c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingCTSG:
456c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingCTSG";
457c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingCTN:
458c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingCTN";
459c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingNormal:
460c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingNormal";
461c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingPLC:
462c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingPLC";
463c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingCNG:
464c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingCNG";
465c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodingPLCCNG:
466c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodingPLCCNG";
467c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDer:
468c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDerBase64";
4697bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    case kStatsValueNameDtlsCipher:
4707bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "dtlsCipher";
471c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoCancellationQualityMin:
472c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationQualityMin";
473c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoDelayMedian:
474c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationEchoDelayMedian";
475c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoDelayStdDev:
476c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationEchoDelayStdDev";
477c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoReturnLoss:
478c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationReturnLoss";
479c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEchoReturnLossEnhancement:
480c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEchoCancellationReturnLossEnhancement";
481c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameEncodeUsagePercent:
482c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googEncodeUsagePercent";
483c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameExpandRate:
484c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googExpandRate";
485c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFingerprint:
486c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFingerprint";
487c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFingerprintAlgorithm:
488c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFingerprintAlgorithm";
489c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFirsReceived:
490c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFirsReceived";
491c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFirsSent:
492c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFirsSent";
493c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameHeightInput:
494c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameHeightInput";
495c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameHeightReceived:
496c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameHeightReceived";
497c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameHeightSent:
498c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameHeightSent";
499c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateReceived:
500c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateReceived";
501c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateDecoded:
502c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateDecoded";
503c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateOutput:
504c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateOutput";
505c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameDecodeMs:
506c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googDecodeMs";
507c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameMaxDecodeMs:
508c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googMaxDecodeMs";
509c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCurrentDelayMs:
510c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCurrentDelayMs";
511c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTargetDelayMs:
512c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTargetDelayMs";
513c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameJitterBufferMs:
514c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googJitterBufferMs";
515c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameMinPlayoutDelayMs:
516c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googMinPlayoutDelayMs";
517c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRenderDelayMs:
518c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRenderDelayMs";
519c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameCaptureStartNtpTimeMs:
520c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googCaptureStartNtpTimeMs";
521c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateInput:
522c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateInput";
523c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameRateSent:
524c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameRateSent";
525c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameWidthInput:
526c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameWidthInput";
527c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameWidthReceived:
528c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameWidthReceived";
529c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameFrameWidthSent:
530c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googFrameWidthSent";
531c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameInitiator:
532c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googInitiator";
533c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameIssuerId:
534c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googIssuerId";
535c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameJitterReceived:
536c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googJitterReceived";
537c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameLocalAddress:
538c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googLocalAddress";
539950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameLocalCandidateId:
540950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "localCandidateId";
541c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameLocalCandidateType:
542c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googLocalCandidateType";
543c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameLocalCertificateId:
5447bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "localCertificateId";
545c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameAdaptationChanges:
546c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googAdaptationChanges";
547c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameNacksReceived:
548c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googNacksReceived";
549c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameNacksSent:
550c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googNacksSent";
551c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePlisReceived:
552c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googPlisReceived";
553c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePlisSent:
554c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googPlisSent";
555c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNamePreferredJitterBufferMs:
556c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googPreferredJitterBufferMs";
557c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameReadable:
558c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googReadable";
559c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRemoteAddress:
560c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRemoteAddress";
561950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    case kStatsValueNameRemoteCandidateId:
562950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org      return "remoteCandidateId";
563c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRemoteCandidateType:
564c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRemoteCandidateType";
565c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRemoteCertificateId:
5667bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "remoteCertificateId";
567c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRetransmitBitrate:
568c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRetransmitBitrate";
569c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameRtt:
570c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googRtt";
571652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org    case kStatsValueNameSecondaryDecodedRate:
572652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org      return "googSecondaryDecodedRate";
573c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameSendPacketsDiscarded:
574c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "packetsDiscardedOnSend";
575652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org    case kStatsValueNameSpeechExpandRate:
576652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org      return "googSpeechExpandRate";
5777bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    case kStatsValueNameSrtpCipher:
5787bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org      return "srtpCipher";
579c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTargetEncBitrate:
580c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTargetEncBitrate";
581c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTransmitBitrate:
582c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTransmitBitrate";
583c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTransportType:
584c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTransportType";
585c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTrackId:
586c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTrackId";
587c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameTypingNoiseState:
588c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googTypingNoiseState";
589c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameViewLimitedResolution:
590c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googViewLimitedResolution";
591c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    case kStatsValueNameWritable:
592c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      return "googWritable";
593c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    default:
594d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      DCHECK(false);
595c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org      break;
596c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  }
597c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org
598c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  return nullptr;
599c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
600c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
601d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgstd::string StatsReport::Value::ToString() const {
602d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  switch (type_) {
603d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt:
604d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return rtc::ToString(value_.int_);
605d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kInt64:
606d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return rtc::ToString(value_.int64_);
607d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kFloat:
608d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return rtc::ToString(value_.float_);
609d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kStaticString:
610d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return std::string(value_.static_string_);
611d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kString:
612d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return *value_.string_;
613d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kBool:
614d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return value_.bool_ ? "true" : "false";
615d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    case kId:
616d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return (*value_.id_)->ToString();
617d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  }
618d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  RTC_NOTREACHED();
619d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return std::string();
620afa6d16a05301c462ff65aa4f1537a1aa12a0a7atommi@webrtc.org}
621afa6d16a05301c462ff65aa4f1537a1aa12a0a7atommi@webrtc.org
622d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::StatsReport(const Id& id) : id_(id), timestamp_(0.0) {
623d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(id_.get());
6244fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6254fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6264fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
627d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewBandwidthEstimationId() {
628d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<BandwidthEstimationId>());
6294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6304fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6314fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
632d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewTypedId(StatsType type, const std::string& id) {
633d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<TypedId>(type, id));
6344fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6364fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
637d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewTypedIntId(StatsType type, int id) {
638d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<TypedIntId>(type, id));
639322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org}
640322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org
641322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org// static
642d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewIdWithDirection(
6434fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    StatsType type, const std::string& id, StatsReport::Direction direction) {
644d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<IdWithDirection>(type, id, direction));
6454fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6464fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6474fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
648d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewCandidateId(bool local, const std::string& id) {
649d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<CandidateId>(local, id));
6504fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6524fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
653d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewComponentId(
6544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    const std::string& content_name, int component) {
655d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<ComponentId>(content_name, component));
6564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// static
659d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id StatsReport::NewCandidatePairId(
6604fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    const std::string& content_name, int component, int index) {
661d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return Id(new RefCountedObject<CandidatePairId>(
662d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      content_name, component, index));
6634fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6644fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
6654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgconst char* StatsReport::TypeToString() const {
6664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return InternalTypeToString(id_->type());
6674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
6684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
66992f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.orgvoid StatsReport::AddString(StatsReport::StatsValueName name,
67092f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org                            const std::string& value) {
671d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
672d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
673d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
674d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org}
675d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
676d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgvoid StatsReport::AddString(StatsReport::StatsValueName name,
677d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org                            const char* value) {
678d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
679d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
680d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
681c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
682c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
68392f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.orgvoid StatsReport::AddInt64(StatsReport::StatsValueName name, int64 value) {
684d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
685d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
686d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value, Value::kInt64));
687c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
688c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
68992f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.orgvoid StatsReport::AddInt(StatsReport::StatsValueName name, int value) {
690d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
691d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == static_cast<int64>(value)))
692d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value, Value::kInt));
693c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
694c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
69592f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.orgvoid StatsReport::AddFloat(StatsReport::StatsValueName name, float value) {
696d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
697d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
698d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
69992f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org}
700c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
701c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.orgvoid StatsReport::AddBoolean(StatsReport::StatsValueName name, bool value) {
702d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
703d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
704d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
7058e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org}
7068e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
707d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgvoid StatsReport::AddId(StatsReport::StatsValueName name,
708d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org                        const Id& value) {
709d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Value* found = FindValue(name);
710d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  if (!found || !(*found == value))
711d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    values_[name] = ValuePtr(new Value(name, value));
712c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
713c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7144fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgconst StatsReport::Value* StatsReport::FindValue(StatsValueName name) const {
71592f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  Values::const_iterator it = values_.find(name);
71692f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  return it == values_.end() ? nullptr : it->second.get();
7174fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
7184fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
7194fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::StatsCollection() {
720c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
721c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7224fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::~StatsCollection() {
7234fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  for (auto* r : list_)
7244fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    delete r;
725c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
726c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7274fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::const_iterator StatsCollection::begin() const {
728c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org  return list_.begin();
729c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
730c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7314fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsCollection::const_iterator StatsCollection::end() const {
732c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org  return list_.end();
733c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
734c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
7354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgsize_t StatsCollection::size() const {
7364fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return list_.size();
7374fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
7384fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
739d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport* StatsCollection::InsertNew(const StatsReport::Id& id) {
740d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(Find(id) == nullptr);
741d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  StatsReport* report = new StatsReport(id);
7424fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  list_.push_back(report);
7434fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return report;
744c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
745c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
746d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport* StatsCollection::FindOrAddNew(const StatsReport::Id& id) {
747d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  StatsReport* ret = Find(id);
748d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return ret ? ret : InsertNew(id);
749c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
750c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
751d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport* StatsCollection::ReplaceOrAddNew(const StatsReport::Id& id) {
752d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  DCHECK(id.get());
7534fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  Container::iterator it = std::find_if(list_.begin(), list_.end(),
754d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
7554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  if (it != end()) {
756d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    StatsReport* report = new StatsReport((*it)->id());
7574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    delete *it;
7584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    *it = report;
7594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    return report;
7604fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  }
761d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  return InsertNew(id);
762c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org}
763c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org
764c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org// Looks for a report with the given |id|.  If one is not found, NULL
765c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org// will be returned.
7664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgStatsReport* StatsCollection::Find(const StatsReport::Id& id) {
7674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  Container::iterator it = std::find_if(list_.begin(), list_.end(),
768d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
7694fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  return it == list_.end() ? nullptr : *it;
7704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org}
7714fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
7725c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org}  // namespace webrtc
773