statstypes.cc revision 8e6fd46cc324f8946e68396edcb252ffaf2d4579
15ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson/*
25ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson * libjingle
35ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson * Copyright 2014 Google Inc.
45ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *
55ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson * Redistribution and use in source and binary forms, with or without
65ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson * modification, are permitted provided that the following conditions are met:
75ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *
85ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *  1. Redistributions of source code must retain the above copyright notice,
95ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *     this list of conditions and the following disclaimer.
105ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *  2. Redistributions in binary form must reproduce the above copyright notice,
115ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *     this list of conditions and the following disclaimer in the documentation
125ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *     and/or other materials provided with the distribution.
135ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *  3. The name of the author may not be used to endorse or promote products
145ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson *     derived from this software without specific prior written permission.
154c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall *
1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1806057cef0bcd7804e80f3ce2bbe352178396c715Chandler Carruth * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
194179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
203b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2286a3a03667bdb0dcab7e6a2877dfd234b07a6d43Douglas Gregor * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson */
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson#include "talk/app/webrtc/statstypes.h"
29fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson
30fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson#include <string.h>
31fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson
32a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCall#include "webrtc/base/checks.h"
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
34a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCall// TODO(tommi): Could we have a static map of value name -> expected type
35a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCall// and use this to DCHECK on correct usage (somewhat strongly typed values)?
369d232c884ea9872d6555df0fd7359699819bc1f1John McCall// Alternatively, we could define the names+type in a separate document and
379d232c884ea9872d6555df0fd7359699819bc1f1John McCall// generate strongly typed inline C++ code that forces the correct type to be
38ec8051276e5ba5eb3f8dcb0ebb96e17495cbc2bfFariborz Jahanian// used for a given name at compile time.
39a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCall
40f85e193739c953358c865005855253af4f68a497John McCallusing rtc::RefCountedObject;
4138afbc7361d861968232defaeaf8e302af75b5eeRichard Smith
42a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCallnamespace webrtc {
43a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCallnamespace {
44a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCall
45ec8051276e5ba5eb3f8dcb0ebb96e17495cbc2bfFariborz Jahanian// The id of StatsReport of type kStatsReportTypeBwe.
46a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCallconst char kStatsReportVideoBweId[] = "bweforvideo";
479d232c884ea9872d6555df0fd7359699819bc1f1John McCall
489d232c884ea9872d6555df0fd7359699819bc1f1John McCall// NOTE: These names need to be consistent with an external
499d232c884ea9872d6555df0fd7359699819bc1f1John McCall// specification (W3C Stats Identifiers).
509d232c884ea9872d6555df0fd7359699819bc1f1John McCallconst char* InternalTypeToString(StatsReport::StatsType type) {
519d232c884ea9872d6555df0fd7359699819bc1f1John McCall  switch (type) {
529d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case StatsReport::kStatsReportTypeSession:
53649b4a1a9b5e6f768ca0cb84bd97b00f51083e15Chad Rosier      return "googLibjingleSession";
54649b4a1a9b5e6f768ca0cb84bd97b00f51083e15Chad Rosier    case StatsReport::kStatsReportTypeBwe:
55649b4a1a9b5e6f768ca0cb84bd97b00f51083e15Chad Rosier      return "VideoBwe";
569d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case StatsReport::kStatsReportTypeRemoteSsrc:
575ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson      return "remoteSsrc";
589d232c884ea9872d6555df0fd7359699819bc1f1John McCall    case StatsReport::kStatsReportTypeSsrc:
595ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson      return "ssrc";
605ec2e7ccb08b2a1598f12b2c6f59c6f31d035b5bAnders Carlsson    case StatsReport::kStatsReportTypeTrack:
615cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall      return "googTrack";
625cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall    case StatsReport::kStatsReportTypeIceLocalCandidate:
63cc6a44b8bdecd9fc70211146e8ba3853b1fac784Douglas Gregor      return "localcandidate";
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case StatsReport::kStatsReportTypeIceRemoteCandidate:
65cc6a44b8bdecd9fc70211146e8ba3853b1fac784Douglas Gregor      return "remotecandidate";
66a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall    case StatsReport::kStatsReportTypeTransport:
67a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall      return "transport";
68cc6a44b8bdecd9fc70211146e8ba3853b1fac784Douglas Gregor    case StatsReport::kStatsReportTypeComponent:
69a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall      return "googComponent";
70a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall    case StatsReport::kStatsReportTypeCandidatePair:
71a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall      return "googCandidatePair";
72a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall    case StatsReport::kStatsReportTypeCertificate:
73a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall      return "googCertificate";
74cc6a44b8bdecd9fc70211146e8ba3853b1fac784Douglas Gregor    case StatsReport::kStatsReportTypeDataChannel:
75a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall      return "datachannel";
76a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  }
77a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  DCHECK(false);
78a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  return nullptr;
79a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall}
80a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall
81a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCallclass BandwidthEstimationId : public StatsReport::IdBase {
8204e517650569598e847c2ab609672e6df93effe5Richard Smith public:
83cc6a44b8bdecd9fc70211146e8ba3853b1fac784Douglas Gregor  BandwidthEstimationId()
84a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall      : StatsReport::IdBase(StatsReport::kStatsReportTypeBwe) {}
85a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  std::string ToString() const override { return kStatsReportVideoBweId; }
86a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall};
87a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall
88a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCallclass TypedId : public StatsReport::IdBase {
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar public:
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TypedId(StatsReport::StatsType type, const std::string& id)
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : StatsReport::IdBase(type), id_(id) {}
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool Equals(const IdBase& other) const override {
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return IdBase::Equals(other) &&
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           static_cast<const TypedId&>(other).id_ == id_;
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string ToString() const override {
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return std::string(InternalTypeToString(type_)) + kSeparator + id_;
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar protected:
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const std::string id_;
104a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall};
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1069a3be4cfdf7858b2467f57448ab99f72a2926b35Timur Iskhodzhanovclass TypedIntId : public StatsReport::IdBase {
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar public:
108a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  TypedIntId(StatsReport::StatsType type, int id)
109a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall      : StatsReport::IdBase(type), id_(id) {}
110a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall
111c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie  bool Equals(const IdBase& other) const override {
112c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie    return IdBase::Equals(other) &&
113c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie           static_cast<const TypedIntId&>(other).id_ == id_;
114a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  }
115a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall
116a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  std::string ToString() const override {
11704e517650569598e847c2ab609672e6df93effe5Richard Smith    return std::string(InternalTypeToString(type_)) +
118cc6a44b8bdecd9fc70211146e8ba3853b1fac784Douglas Gregor           kSeparator +
119cc6a44b8bdecd9fc70211146e8ba3853b1fac784Douglas Gregor           rtc::ToString<int>(id_);
120abb943284cabd9131586c2758a4f02baba668aceRichard Smith  }
121abb943284cabd9131586c2758a4f02baba668aceRichard Smith
122ef7844666b36226521e459d18f2834dacaa039e3Nick Lewycky protected:
123ef7844666b36226521e459d18f2834dacaa039e3Nick Lewycky  const int id_;
12400a8c3f6c979a11b15b2a4a4ce08c7888634d6cdRichard Smith};
12500a8c3f6c979a11b15b2a4a4ce08c7888634d6cdRichard Smith
12600a8c3f6c979a11b15b2a4a4ce08c7888634d6cdRichard Smithclass IdWithDirection : public TypedId {
12700a8c3f6c979a11b15b2a4a4ce08c7888634d6cdRichard Smith public:
128abb943284cabd9131586c2758a4f02baba668aceRichard Smith  IdWithDirection(StatsReport::StatsType type, const std::string& id,
129abb943284cabd9131586c2758a4f02baba668aceRichard Smith                  StatsReport::Direction direction)
130abb943284cabd9131586c2758a4f02baba668aceRichard Smith      : TypedId(type, id), direction_(direction) {}
131abb943284cabd9131586c2758a4f02baba668aceRichard Smith
132ef7844666b36226521e459d18f2834dacaa039e3Nick Lewycky  bool Equals(const IdBase& other) const override {
133ef7844666b36226521e459d18f2834dacaa039e3Nick Lewycky    return TypedId::Equals(other) &&
134ef7844666b36226521e459d18f2834dacaa039e3Nick Lewycky           static_cast<const IdWithDirection&>(other).direction_ == direction_;
135ef7844666b36226521e459d18f2834dacaa039e3Nick Lewycky  }
136abb943284cabd9131586c2758a4f02baba668aceRichard Smith
137abb943284cabd9131586c2758a4f02baba668aceRichard Smith  std::string ToString() const override {
138abb943284cabd9131586c2758a4f02baba668aceRichard Smith    std::string ret(TypedId::ToString());
139abb943284cabd9131586c2758a4f02baba668aceRichard Smith    ret += kSeparator;
140fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson    ret += direction_ == StatsReport::kSend ? "send" : "recv";
1417ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith    return ret;
1427ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith  }
143fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson
144fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson private:
145fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson  const StatsReport::Direction direction_;
146fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson};
1473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarclass CandidateId : public TypedId {
1493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar public:
1503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  CandidateId(bool local, const std::string& id)
1513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      : TypedId(local ?
1523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                    StatsReport::kStatsReportTypeIceLocalCandidate :
1533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                    StatsReport::kStatsReportTypeIceRemoteCandidate,
1543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                id) {
1553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
1563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  std::string ToString() const override {
1583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return "Cand-" + id_;
1593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
1603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar};
1613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarclass ComponentId : public StatsReport::IdBase {
1633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar public:
1643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ComponentId(const std::string& content_name, int component)
1653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      : ComponentId(StatsReport::kStatsReportTypeComponent, content_name,
1663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar            component) {}
1673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  bool Equals(const IdBase& other) const override {
1693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return IdBase::Equals(other) &&
17087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        static_cast<const ComponentId&>(other).component_ == component_ &&
17187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        static_cast<const ComponentId&>(other).content_name_ == content_name_;
172fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson  }
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  std::string ToString() const override {
17587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return ToString("Channel-");
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1777ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith
17887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar protected:
179abb943284cabd9131586c2758a4f02baba668aceRichard Smith  ComponentId(StatsReport::StatsType type, const std::string& content_name,
180ef7844666b36226521e459d18f2834dacaa039e3Nick Lewycky              int component)
181abb943284cabd9131586c2758a4f02baba668aceRichard Smith      : IdBase(type),
18287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        content_name_(content_name),
183fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson        component_(component) {}
184fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson
185045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  std::string ToString(const char* prefix) const {
1867ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith    std::string ret(prefix);
1877ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith    ret += content_name_;
188d4ec562b3aaf50ea9015f82c96ebfd05a35fc7efRichard Smith    ret += '-';
18987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ret += rtc::ToString<>(component_);
190fcbfdc1a93325471a262f0d94461273ae67ad3b6Anders Carlsson    return ret;
191eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson  }
19230fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall
19330fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall private:
194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const std::string content_name_;
195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const int component_;
196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
19730fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall
19830fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCallclass CandidatePairId : public ComponentId {
199942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner public:
200942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner  CandidatePairId(const std::string& content_name, int component, int index)
201942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner      : ComponentId(StatsReport::kStatsReportTypeCandidatePair, content_name,
202942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner            component),
203942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner        index_(index) {}
20487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool Equals(const IdBase& other) const override {
206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return ComponentId::Equals(other) &&
20787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        static_cast<const CandidatePairId&>(other).index_ == index_;
208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
20930fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall
21030fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall  std::string ToString() const override {
211efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    std::string ret(ComponentId::ToString("Conn-"));
21287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ret += '-';
213eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson    ret += rtc::ToString<>(index_);
21430fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall    return ret;
21530fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall  }
21630fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall
21730fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall private:
21830fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall  const int index_;
21930fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall};
220eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson
22130fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall}  // namespace
222eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson
22330fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCallStatsReport::IdBase::IdBase(StatsType type) : type_(type) {}
22430fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCallStatsReport::IdBase::~IdBase() {}
22530fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall
22620bb175cb8ae5844034828db094fb948c0e3454aJohn McCallStatsReport::StatsType StatsReport::IdBase::type() const { return type_; }
227c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie
228c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikiebool StatsReport::IdBase::Equals(const IdBase& other) const {
22920bb175cb8ae5844034828db094fb948c0e3454aJohn McCall  return other.type_ == type_;
23030fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall}
231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
23230fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCallStatsReport::Value::Value(StatsValueName name, int64 value, Type int_type)
23330fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall    : name(name), type_(int_type) {
23430fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall  DCHECK(type_ == kInt || type_ == kInt64);
23520bb175cb8ae5844034828db094fb948c0e3454aJohn McCall  type_ == kInt ? value_.int_ = static_cast<int>(value) : value_.int64_ = value;
23630fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall}
23730fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall
23820bb175cb8ae5844034828db094fb948c0e3454aJohn McCallStatsReport::Value::Value(StatsValueName name, float f)
23930fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall    : name(name), type_(kFloat) {
24030fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall  value_.float_ = f;
24130fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall}
242bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall
243eb4072ed06c884f1053047ad88846cbffd5ac62eAnders CarlssonStatsReport::Value::Value(StatsValueName name, const std::string& value)
244eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson    : name(name), type_(kString) {
2453030eb82593097502469a8b3fc26112c79c75605John McCall  value_.string_ = new std::string(value);
2460f30a12ce7b3d4d86c9ca9072f587da77c8eef34Chandler Carruth}
2477ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith
24832096695c76033a6b0b1747c439f7378a11e8312John McCallStatsReport::Value::Value(StatsValueName name, const char* value)
24932096695c76033a6b0b1747c439f7378a11e8312John McCall    : name(name), type_(kStaticString) {
25032096695c76033a6b0b1747c439f7378a11e8312John McCall  value_.static_string_ = value;
25132096695c76033a6b0b1747c439f7378a11e8312John McCall}
25232096695c76033a6b0b1747c439f7378a11e8312John McCall
25332096695c76033a6b0b1747c439f7378a11e8312John McCallStatsReport::Value::Value(StatsValueName name, bool b)
25432096695c76033a6b0b1747c439f7378a11e8312John McCall    : name(name), type_(kBool) {
25532096695c76033a6b0b1747c439f7378a11e8312John McCall  value_.bool_ = b;
2560f30a12ce7b3d4d86c9ca9072f587da77c8eef34Chandler Carruth}
2575cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall
2585cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCallStatsReport::Value::Value(StatsValueName name, const Id& value)
259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    : name(name), type_(kId) {
26087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  value_.id_ = new Id(value);
26187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
2629dc046e70d189457968e4c3b986da75b5d98ce8eAnders Carlsson
2639dc046e70d189457968e4c3b986da75b5d98ce8eAnders CarlssonStatsReport::Value::~Value() {
264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  switch (type_) {
265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kInt:
266d6c9a0f06ce7e164024d8e4dbf2423a5c5035084Fariborz Jahanian    case kInt64:
267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kFloat:
268d6c9a0f06ce7e164024d8e4dbf2423a5c5035084Fariborz Jahanian    case kBool:
269d6c9a0f06ce7e164024d8e4dbf2423a5c5035084Fariborz Jahanian    case kStaticString:
27018af368c080b9d60e34e670cd01f7d2d3ad2ba48Anders Carlsson      break;
27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kString:
272b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      delete value_.string_;
273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
274bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    case kId:
275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      delete value_.id_;
276044cc54a7d83c90857187c4cd4a0fd33664a7f7fJohn McCall      break;
277044cc54a7d83c90857187c4cd4a0fd33664a7f7fJohn McCall  }
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
27987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool StatsReport::Value::Equals(const Value& other) const {
281c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (name != other.name)
282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return false;
283c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // There's a 1:1 relation between a name and a type, so we don't have to
285c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // check that.
286b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  DCHECK_EQ(type_, other.type_);
287b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
288c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  switch (type_) {
289b9d2b3b8edf7a0dc56e55acb1cf87338d5648daaKostya Serebryany    case kInt:
2909dc046e70d189457968e4c3b986da75b5d98ce8eAnders Carlsson      return value_.int_ == other.value_.int_;
2919dc046e70d189457968e4c3b986da75b5d98ce8eAnders Carlsson    case kInt64:
2929dc046e70d189457968e4c3b986da75b5d98ce8eAnders Carlsson      return value_.int64_ == other.value_.int64_;
293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kFloat:
294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return value_.float_ == other.value_.float_;
295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStaticString: {
296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (value_.static_string_ != other.value_.static_string_) {
298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        DCHECK(strcmp(value_.static_string_, other.value_.static_string_) != 0)
299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            << "Duplicate global?";
300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return value_.static_string_ == other.value_.static_string_;
303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kString:
305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return *value_.string_ == *other.value_.string_;
306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kBool:
3070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return value_.bool_ == other.value_.bool_;
308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kId:
309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return (*value_.id_)->Equals(*other.value_.id_);
310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
311efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar  RTC_NOTREACHED();
3123030eb82593097502469a8b3fc26112c79c75605John McCall  return false;
3137ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith}
3147ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith
3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool StatsReport::Value::operator==(const std::string& value) const {
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return (type_ == kString && value_.string_->compare(value) == 0) ||
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         (type_ == kStaticString && value.compare(value_.static_string_) == 0);
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool StatsReport::Value::operator==(const char* value) const {
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (type_ == kString)
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return value_.string_->compare(value) == 0;
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (type_ != kStaticString)
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return false;
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
32658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  if (value_.static_string_ != value)
32758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    DCHECK(strcmp(value_.static_string_, value) != 0) << "Duplicate global?";
32858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#endif
32958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  return value == value_.static_string_;
33058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
3318b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner
332c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Klecknerbool StatsReport::Value::operator==(int64 value) const {
333c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner  return type_ == kInt ? value_.int_ == static_cast<int>(value) :
334c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner      (type_ == kInt64 ? value_.int64_ == value : false);
335c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner}
336c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner
3376c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedmanbool StatsReport::Value::operator==(bool value) const {
3386c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman  return type_ == kBool && value_.bool_ == value;
3396c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman}
34087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
34187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool StatsReport::Value::operator==(float value) const {
34287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return type_ == kFloat && value_.float_ == value;
3436c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman}
344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
3457ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smithbool StatsReport::Value::operator==(const Id& value) const {
3467ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith  return type_ == kId && (*value_.id_)->Equals(value);
3476c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman}
348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint StatsReport::Value::int_val() const {
350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  DCHECK(type_ == kInt);
351b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith  return value_.int_;
352b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith}
353b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith
354b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smithint64 StatsReport::Value::int64_val() const {
355b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith  DCHECK(type_ == kInt64);
356b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith  return value_.int64_;
357b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith}
358b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith
35987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarfloat StatsReport::Value::float_val() const {
360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  DCHECK(type_ == kFloat);
361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return value_.float_;
362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
364e0b691a25f801d8be552c9387863637b9526e639Fariborz Jahanianconst char* StatsReport::Value::static_string_val() const {
365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  DCHECK(type_ == kStaticString);
366b969e84ec398fde1bb6255a05babdc23e2841101Reid Kleckner  return value_.static_string_;
367c47063e1e647c3749b1851e42c78ac52938d2fbbReid Kleckner}
368c47063e1e647c3749b1851e42c78ac52938d2fbbReid Kleckner
369c47063e1e647c3749b1851e42c78ac52938d2fbbReid Klecknerconst std::string& StatsReport::Value::string_val() const {
370c47063e1e647c3749b1851e42c78ac52938d2fbbReid Kleckner  DCHECK(type_ == kString);
371b969e84ec398fde1bb6255a05babdc23e2841101Reid Kleckner  return *value_.string_;
372b969e84ec398fde1bb6255a05babdc23e2841101Reid Kleckner}
3736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool StatsReport::Value::bool_val() const {
375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  DCHECK(type_ == kBool);
376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return value_.bool_;
377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst char* StatsReport::Value::display_name() const {
3800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  switch (name) {
3810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case kStatsValueNameAudioOutputLevel:
3820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return "audioOutputLevel";
383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameAudioInputLevel:
384b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith      return "audioInputLevel";
38558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    case kStatsValueNameBytesSent:
386bf40cb518312dde1c07e44fcae59bc4eec65589cJohn McCall      return "bytesSent";
387bf40cb518312dde1c07e44fcae59bc4eec65589cJohn McCall    case kStatsValueNamePacketsSent:
38858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      return "packetsSent";
38958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    case kStatsValueNameBytesReceived:
39058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      return "bytesReceived";
391bf40cb518312dde1c07e44fcae59bc4eec65589cJohn McCall    case kStatsValueNameLabel:
392bf40cb518312dde1c07e44fcae59bc4eec65589cJohn McCall      return "label";
3939f967c5e4bbeb48caf6d0e62056b3d3fee20bf7cFariborz Jahanian    case kStatsValueNamePacketsReceived:
39458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      return "packetsReceived";
39558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    case kStatsValueNamePacketsLost:
39658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      return "packetsLost";
3976c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman    case kStatsValueNameProtocol:
3986c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman      return "protocol";
399b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith    case kStatsValueNameTransportId:
400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "transportId";
401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameSelectedCandidatePairId:
402b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith      return "selectedCandidatePairId";
403b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith    case kStatsValueNameSsrc:
404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "ssrc";
405b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith    case kStatsValueNameState:
406b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith      return "state";
407b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith    case kStatsValueNameDataChannelId:
408efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "datachannelid";
409efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar
410bf40cb518312dde1c07e44fcae59bc4eec65589cJohn McCall    // 'goog' prefixed constants.
411bf40cb518312dde1c07e44fcae59bc4eec65589cJohn McCall    case kStatsValueNameAccelerateRate:
412bf40cb518312dde1c07e44fcae59bc4eec65589cJohn McCall      return "googAccelerateRate";
4139f967c5e4bbeb48caf6d0e62056b3d3fee20bf7cFariborz Jahanian    case kStatsValueNameActiveConnection:
414eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson      return "googActiveConnection";
415eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson    case kStatsValueNameActualEncBitrate:
4168b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner      return "googActualEncBitrate";
41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kStatsValueNameAvailableReceiveBandwidth:
418efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googAvailableReceiveBandwidth";
4194179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameAvailableSendBandwidth:
4209f967c5e4bbeb48caf6d0e62056b3d3fee20bf7cFariborz Jahanian      return "googAvailableSendBandwidth";
421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameAvgEncodeMs:
422027d7ed9d616d93ae7f02de79d17863725b14866Fariborz Jahanian      return "googAvgEncodeMs";
4234179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameBucketDelay:
4244179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "googBucketDelay";
4254179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameBandwidthLimitedResolution:
4264179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "googBandwidthLimitedResolution";
4274179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov
4284179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    // Candidate related attributes. Values are taken from
4294179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
4304179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameCandidateIPAddress:
4314179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "ipAddress";
4324179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameCandidateNetworkType:
4334179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "networkType";
4344179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameCandidatePortNumber:
4354179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "portNumber";
4364179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameCandidatePriority:
4374179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "priority";
4386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameCandidateTransportType:
4394179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "transport";
440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameCandidateType:
44187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return "candidateType";
442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4434179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameChannelId:
4444179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "googChannelId";
4454179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameCodecName:
446c7b5f381ed41a238aa4c243f99170909f64a3414Benjamin Kramer      return "googCodecName";
4474179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameComponent:
4484179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "googComponent";
44987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kStatsValueNameContentName:
4509f967c5e4bbeb48caf6d0e62056b3d3fee20bf7cFariborz Jahanian      return "googContentName";
451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameCpuLimitedResolution:
452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "googCpuLimitedResolution";
4536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameDecodingCTSG:
454176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "googDecodingCTSG";
455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameDecodingCTN:
456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "googDecodingCTN";
457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameDecodingNormal:
458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "googDecodingNormal";
459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameDecodingPLC:
460b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      return "googDecodingPLC";
461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameDecodingCNG:
462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "googDecodingCNG";
4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameDecodingPLCCNG:
4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googDecodingPLCCNG";
4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameDer:
4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googDerBase64";
4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameDtlsCipher:
4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "dtlsCipher";
469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case kStatsValueNameEchoCancellationQualityMin:
4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googEchoCancellationQualityMin";
47187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kStatsValueNameEchoDelayMedian:
4724179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov      return "googEchoCancellationEchoDelayMedian";
473c7b5f381ed41a238aa4c243f99170909f64a3414Benjamin Kramer    case kStatsValueNameEchoDelayStdDev:
474efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googEchoCancellationEchoDelayStdDev";
4754179ddd5752ec5a252ca1e1eb77a5c34b5835d3bAnton Korobeynikov    case kStatsValueNameEchoReturnLoss:
47654ec6c59d8b2e529fc3f07ae97415721f394ad92Axel Naumann      return "googEchoCancellationReturnLoss";
477efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameEchoReturnLossEnhancement:
478efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googEchoCancellationReturnLossEnhancement";
479efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameEncodeUsagePercent:
480efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googEncodeUsagePercent";
481efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameExpandRate:
482efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googExpandRate";
4838b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner    case kStatsValueNameFingerprint:
484eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson      return "googFingerprint";
485efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameFingerprintAlgorithm:
48687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return "googFingerprintAlgorithm";
48787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kStatsValueNameFirsReceived:
48887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return "googFirsReceived";
489efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameFirsSent:
4903f88f686e32949ffe02ccb551f482f9cf810358bJohn McCall      return "googFirsSent";
491efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameFrameHeightInput:
492efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googFrameHeightInput";
493efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameFrameHeightReceived:
4943030eb82593097502469a8b3fc26112c79c75605John McCall      return "googFrameHeightReceived";
495efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameFrameHeightSent:
4963030eb82593097502469a8b3fc26112c79c75605John McCall      return "googFrameHeightSent";
4977ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith    case kStatsValueNameFrameRateReceived:
4987ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith      return "googFrameRateReceived";
499a240df2ec1b374b3e9e7f760875ffb17cd64506fAlexey Samsonov    case kStatsValueNameFrameRateDecoded:
500c3030bc285d90a139fb74629daadef5617283203David Blaikie      return "googFrameRateDecoded";
5016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameFrameRateOutput:
50278d1a10e13a1abfd4830bccf2a97b2993da1ed5cNick Lewycky      return "googFrameRateOutput";
5030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case kStatsValueNameDecodeMs:
5040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return "googDecodeMs";
50578d1a10e13a1abfd4830bccf2a97b2993da1ed5cNick Lewycky    case kStatsValueNameMaxDecodeMs:
506de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall      return "googMaxDecodeMs";
5076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameCurrentDelayMs:
5086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googCurrentDelayMs";
5096c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman    case kStatsValueNameTargetDelayMs:
510e67d1512f299e7f32182553f9941d61dae4f433eDouglas Gregor      return "googTargetDelayMs";
511e67d1512f299e7f32182553f9941d61dae4f433eDouglas Gregor    case kStatsValueNameJitterBufferMs:
512e67d1512f299e7f32182553f9941d61dae4f433eDouglas Gregor      return "googJitterBufferMs";
5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameMinPlayoutDelayMs:
5147ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith      return "googMinPlayoutDelayMs";
5153030eb82593097502469a8b3fc26112c79c75605John McCall    case kStatsValueNameRenderDelayMs:
5167ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith      return "googRenderDelayMs";
51792d835a86ac334768d0b75936201e4fea3941c1fFariborz Jahanian    case kStatsValueNameCaptureStartNtpTimeMs:
5186c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman      return "googCaptureStartNtpTimeMs";
5196c6bda3b0b1d8adaac2ba3f4da7056e9f1eef52eEli Friedman    case kStatsValueNameFrameRateInput:
520efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googFrameRateInput";
521eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson    case kStatsValueNameFrameRateSent:
522c7b5f381ed41a238aa4c243f99170909f64a3414Benjamin Kramer      return "googFrameRateSent";
523c7b5f381ed41a238aa4c243f99170909f64a3414Benjamin Kramer    case kStatsValueNameFrameWidthInput:
524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return "googFrameWidthInput";
52587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kStatsValueNameFrameWidthReceived:
5266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googFrameWidthReceived";
5270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case kStatsValueNameFrameWidthSent:
5286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googFrameWidthSent";
5296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameInitiator:
5306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googInitiator";
5310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case kStatsValueNameIssuerId:
5326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googIssuerId";
5336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameJitterReceived:
53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return "googJitterReceived";
5356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameLocalAddress:
5366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googLocalAddress";
5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameLocalCandidateId:
5386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "localCandidateId";
5396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameLocalCandidateType:
5406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googLocalCandidateType";
5416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameLocalCertificateId:
5426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "localCertificateId";
5436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameAdaptationChanges:
54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return "googAdaptationChanges";
54587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kStatsValueNameNacksReceived:
54687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return "googNacksReceived";
54787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kStatsValueNameNacksSent:
5486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googNacksSent";
549b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith    case kStatsValueNamePreemptiveExpandRate:
5506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googPreemptiveExpandRate";
551f85e193739c953358c865005855253af4f68a497John McCall    case kStatsValueNamePlisReceived:
5526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googPlisReceived";
5536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNamePlisSent:
5546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googPlisSent";
5556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNamePreferredJitterBufferMs:
5566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googPreferredJitterBufferMs";
5576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameReadable:
558c7b5f381ed41a238aa4c243f99170909f64a3414Benjamin Kramer      return "googReadable";
5596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameRemoteAddress:
5606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googRemoteAddress";
5616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameRemoteCandidateId:
562efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "remoteCandidateId";
5636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameRemoteCandidateType:
564b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith      return "googRemoteCandidateType";
5656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameRemoteCertificateId:
5666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "remoteCertificateId";
5676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameRetransmitBitrate:
5686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googRetransmitBitrate";
569b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith    case kStatsValueNameRtt:
570b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith      return "googRtt";
571efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameSecondaryDecodedRate:
572efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googSecondaryDecodedRate";
573efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    case kStatsValueNameSendPacketsDiscarded:
5743f88f686e32949ffe02ccb551f482f9cf810358bJohn McCall      return "packetsDiscardedOnSend";
575810112e28dc839715d17b0a786f23aaa19600ac0Chris Lattner    case kStatsValueNameSpeechExpandRate:
576efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      return "googSpeechExpandRate";
5776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameSrtpCipher:
5780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return "srtpCipher";
5796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameTargetEncBitrate:
5806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googTargetEncBitrate";
5816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameTransmitBitrate:
5820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return "googTransmitBitrate";
5836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameTransportType:
5846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googTransportType";
5856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameTrackId:
5866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googTrackId";
5876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameTypingNoiseState:
5886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googTypingNoiseState";
5896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameViewLimitedResolution:
5906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googViewLimitedResolution";
5916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kStatsValueNameWritable:
5926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return "googWritable";
593c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner    default:
594efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      DCHECK(false);
595efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar      break;
596eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson  }
597eb4072ed06c884f1053047ad88846cbffd5ac62eAnders Carlsson
598a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  return nullptr;
59987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
60087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
601c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikiestd::string StatsReport::Value::ToString() const {
60287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  switch (type_) {
603c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie    case kInt:
604d26bc76c98006609002d9930f8840490e88ac5b5John McCall      return rtc::ToString(value_.int_);
6056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case kInt64:
6066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return rtc::ToString(value_.int64_);
607d26bc76c98006609002d9930f8840490e88ac5b5John McCall    case kFloat:
608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return rtc::ToString(value_.float_);
6094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    case kStaticString:
6104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return std::string(value_.static_string_);
611de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall    case kString:
612176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return *value_.string_;
61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case kBool:
614772913659894551b02f342e3577e7219e4f9a701Anders Carlsson      return value_.bool_ ? "true" : "false";
6150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case kId:
6160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return (*value_.id_)->ToString();
6176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
618772913659894551b02f342e3577e7219e4f9a701Anders Carlsson  RTC_NOTREACHED();
619a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  return std::string();
620772913659894551b02f342e3577e7219e4f9a701Anders Carlsson}
621772913659894551b02f342e3577e7219e4f9a701Anders Carlsson
622772913659894551b02f342e3577e7219e4f9a701Anders CarlssonStatsReport::StatsReport(const Id& id) : id_(id), timestamp_(0.0) {
623a91f6661c4685fecee6dc09bdaef73254c1aaa06John McCall  DCHECK(id_.get());
624772913659894551b02f342e3577e7219e4f9a701Anders Carlsson}
625
626// static
627StatsReport::Id StatsReport::NewBandwidthEstimationId() {
628  return Id(new RefCountedObject<BandwidthEstimationId>());
629}
630
631// static
632StatsReport::Id StatsReport::NewTypedId(StatsType type, const std::string& id) {
633  return Id(new RefCountedObject<TypedId>(type, id));
634}
635
636// static
637StatsReport::Id StatsReport::NewTypedIntId(StatsType type, int id) {
638  return Id(new RefCountedObject<TypedIntId>(type, id));
639}
640
641// static
642StatsReport::Id StatsReport::NewIdWithDirection(
643    StatsType type, const std::string& id, StatsReport::Direction direction) {
644  return Id(new RefCountedObject<IdWithDirection>(type, id, direction));
645}
646
647// static
648StatsReport::Id StatsReport::NewCandidateId(bool local, const std::string& id) {
649  return Id(new RefCountedObject<CandidateId>(local, id));
650}
651
652// static
653StatsReport::Id StatsReport::NewComponentId(
654    const std::string& content_name, int component) {
655  return Id(new RefCountedObject<ComponentId>(content_name, component));
656}
657
658// static
659StatsReport::Id StatsReport::NewCandidatePairId(
660    const std::string& content_name, int component, int index) {
661  return Id(new RefCountedObject<CandidatePairId>(
662      content_name, component, index));
663}
664
665const char* StatsReport::TypeToString() const {
666  return InternalTypeToString(id_->type());
667}
668
669void StatsReport::AddString(StatsReport::StatsValueName name,
670                            const std::string& value) {
671  const Value* found = FindValue(name);
672  if (!found || !(*found == value))
673    values_[name] = ValuePtr(new Value(name, value));
674}
675
676void StatsReport::AddString(StatsReport::StatsValueName name,
677                            const char* value) {
678  const Value* found = FindValue(name);
679  if (!found || !(*found == value))
680    values_[name] = ValuePtr(new Value(name, value));
681}
682
683void StatsReport::AddInt64(StatsReport::StatsValueName name, int64 value) {
684  const Value* found = FindValue(name);
685  if (!found || !(*found == value))
686    values_[name] = ValuePtr(new Value(name, value, Value::kInt64));
687}
688
689void StatsReport::AddInt(StatsReport::StatsValueName name, int value) {
690  const Value* found = FindValue(name);
691  if (!found || !(*found == static_cast<int64>(value)))
692    values_[name] = ValuePtr(new Value(name, value, Value::kInt));
693}
694
695void StatsReport::AddFloat(StatsReport::StatsValueName name, float value) {
696  const Value* found = FindValue(name);
697  if (!found || !(*found == value))
698    values_[name] = ValuePtr(new Value(name, value));
699}
700
701void StatsReport::AddBoolean(StatsReport::StatsValueName name, bool value) {
702  const Value* found = FindValue(name);
703  if (!found || !(*found == value))
704    values_[name] = ValuePtr(new Value(name, value));
705}
706
707void StatsReport::AddId(StatsReport::StatsValueName name,
708                        const Id& value) {
709  const Value* found = FindValue(name);
710  if (!found || !(*found == value))
711    values_[name] = ValuePtr(new Value(name, value));
712}
713
714const StatsReport::Value* StatsReport::FindValue(StatsValueName name) const {
715  Values::const_iterator it = values_.find(name);
716  return it == values_.end() ? nullptr : it->second.get();
717}
718
719StatsCollection::StatsCollection() {
720}
721
722StatsCollection::~StatsCollection() {
723  for (auto* r : list_)
724    delete r;
725}
726
727StatsCollection::const_iterator StatsCollection::begin() const {
728  return list_.begin();
729}
730
731StatsCollection::const_iterator StatsCollection::end() const {
732  return list_.end();
733}
734
735size_t StatsCollection::size() const {
736  return list_.size();
737}
738
739StatsReport* StatsCollection::InsertNew(const StatsReport::Id& id) {
740  DCHECK(Find(id) == nullptr);
741  StatsReport* report = new StatsReport(id);
742  list_.push_back(report);
743  return report;
744}
745
746StatsReport* StatsCollection::FindOrAddNew(const StatsReport::Id& id) {
747  StatsReport* ret = Find(id);
748  return ret ? ret : InsertNew(id);
749}
750
751StatsReport* StatsCollection::ReplaceOrAddNew(const StatsReport::Id& id) {
752  DCHECK(id.get());
753  Container::iterator it = std::find_if(list_.begin(), list_.end(),
754      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
755  if (it != end()) {
756    StatsReport* report = new StatsReport((*it)->id());
757    delete *it;
758    *it = report;
759    return report;
760  }
761  return InsertNew(id);
762}
763
764// Looks for a report with the given |id|.  If one is not found, NULL
765// will be returned.
766StatsReport* StatsCollection::Find(const StatsReport::Id& id) {
767  Container::iterator it = std::find_if(list_.begin(), list_.end(),
768      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
769  return it == list_.end() ? nullptr : *it;
770}
771
772}  // namespace webrtc
773