| Index: talk/app/webrtc/statstypes.cc
|
| diff --git a/talk/app/webrtc/statstypes.cc b/talk/app/webrtc/statstypes.cc
|
| deleted file mode 100644
|
| index 954f90f496beac92d55854c09eddbaf386edbd40..0000000000000000000000000000000000000000
|
| --- a/talk/app/webrtc/statstypes.cc
|
| +++ /dev/null
|
| @@ -1,782 +0,0 @@
|
| -/*
|
| - * libjingle
|
| - * Copyright 2014 Google Inc.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are met:
|
| - *
|
| - * 1. Redistributions of source code must retain the above copyright notice,
|
| - * this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright notice,
|
| - * this list of conditions and the following disclaimer in the documentation
|
| - * and/or other materials provided with the distribution.
|
| - * 3. The name of the author may not be used to endorse or promote products
|
| - * derived from this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
| - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
| - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
| - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
| - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
| - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "talk/app/webrtc/statstypes.h"
|
| -
|
| -#include <string.h>
|
| -
|
| -#include "webrtc/base/checks.h"
|
| -
|
| -// TODO(tommi): Could we have a static map of value name -> expected type
|
| -// and use this to RTC_DCHECK on correct usage (somewhat strongly typed values)?
|
| -// Alternatively, we could define the names+type in a separate document and
|
| -// generate strongly typed inline C++ code that forces the correct type to be
|
| -// used for a given name at compile time.
|
| -
|
| -using rtc::RefCountedObject;
|
| -
|
| -namespace webrtc {
|
| -namespace {
|
| -
|
| -// The id of StatsReport of type kStatsReportTypeBwe.
|
| -const char kStatsReportVideoBweId[] = "bweforvideo";
|
| -
|
| -// NOTE: These names need to be consistent with an external
|
| -// specification (W3C Stats Identifiers).
|
| -const char* InternalTypeToString(StatsReport::StatsType type) {
|
| - switch (type) {
|
| - case StatsReport::kStatsReportTypeSession:
|
| - return "googLibjingleSession";
|
| - case StatsReport::kStatsReportTypeBwe:
|
| - return "VideoBwe";
|
| - case StatsReport::kStatsReportTypeRemoteSsrc:
|
| - return "remoteSsrc";
|
| - case StatsReport::kStatsReportTypeSsrc:
|
| - return "ssrc";
|
| - case StatsReport::kStatsReportTypeTrack:
|
| - return "googTrack";
|
| - case StatsReport::kStatsReportTypeIceLocalCandidate:
|
| - return "localcandidate";
|
| - case StatsReport::kStatsReportTypeIceRemoteCandidate:
|
| - return "remotecandidate";
|
| - case StatsReport::kStatsReportTypeTransport:
|
| - return "transport";
|
| - case StatsReport::kStatsReportTypeComponent:
|
| - return "googComponent";
|
| - case StatsReport::kStatsReportTypeCandidatePair:
|
| - return "googCandidatePair";
|
| - case StatsReport::kStatsReportTypeCertificate:
|
| - return "googCertificate";
|
| - case StatsReport::kStatsReportTypeDataChannel:
|
| - return "datachannel";
|
| - }
|
| - RTC_DCHECK(false);
|
| - return nullptr;
|
| -}
|
| -
|
| -class BandwidthEstimationId : public StatsReport::IdBase {
|
| - public:
|
| - BandwidthEstimationId()
|
| - : StatsReport::IdBase(StatsReport::kStatsReportTypeBwe) {}
|
| - std::string ToString() const override { return kStatsReportVideoBweId; }
|
| -};
|
| -
|
| -class TypedId : public StatsReport::IdBase {
|
| - public:
|
| - TypedId(StatsReport::StatsType type, const std::string& id)
|
| - : StatsReport::IdBase(type), id_(id) {}
|
| -
|
| - bool Equals(const IdBase& other) const override {
|
| - return IdBase::Equals(other) &&
|
| - static_cast<const TypedId&>(other).id_ == id_;
|
| - }
|
| -
|
| - std::string ToString() const override {
|
| - return std::string(InternalTypeToString(type_)) + kSeparator + id_;
|
| - }
|
| -
|
| - protected:
|
| - const std::string id_;
|
| -};
|
| -
|
| -class TypedIntId : public StatsReport::IdBase {
|
| - public:
|
| - TypedIntId(StatsReport::StatsType type, int id)
|
| - : StatsReport::IdBase(type), id_(id) {}
|
| -
|
| - bool Equals(const IdBase& other) const override {
|
| - return IdBase::Equals(other) &&
|
| - static_cast<const TypedIntId&>(other).id_ == id_;
|
| - }
|
| -
|
| - std::string ToString() const override {
|
| - return std::string(InternalTypeToString(type_)) +
|
| - kSeparator +
|
| - rtc::ToString<int>(id_);
|
| - }
|
| -
|
| - protected:
|
| - const int id_;
|
| -};
|
| -
|
| -class IdWithDirection : public TypedId {
|
| - public:
|
| - IdWithDirection(StatsReport::StatsType type, const std::string& id,
|
| - StatsReport::Direction direction)
|
| - : TypedId(type, id), direction_(direction) {}
|
| -
|
| - bool Equals(const IdBase& other) const override {
|
| - return TypedId::Equals(other) &&
|
| - static_cast<const IdWithDirection&>(other).direction_ == direction_;
|
| - }
|
| -
|
| - std::string ToString() const override {
|
| - std::string ret(TypedId::ToString());
|
| - ret += kSeparator;
|
| - ret += direction_ == StatsReport::kSend ? "send" : "recv";
|
| - return ret;
|
| - }
|
| -
|
| - private:
|
| - const StatsReport::Direction direction_;
|
| -};
|
| -
|
| -class CandidateId : public TypedId {
|
| - public:
|
| - CandidateId(bool local, const std::string& id)
|
| - : TypedId(local ?
|
| - StatsReport::kStatsReportTypeIceLocalCandidate :
|
| - StatsReport::kStatsReportTypeIceRemoteCandidate,
|
| - id) {
|
| - }
|
| -
|
| - std::string ToString() const override {
|
| - return "Cand-" + id_;
|
| - }
|
| -};
|
| -
|
| -class ComponentId : public StatsReport::IdBase {
|
| - public:
|
| - ComponentId(const std::string& content_name, int component)
|
| - : ComponentId(StatsReport::kStatsReportTypeComponent, content_name,
|
| - component) {}
|
| -
|
| - bool Equals(const IdBase& other) const override {
|
| - return IdBase::Equals(other) &&
|
| - static_cast<const ComponentId&>(other).component_ == component_ &&
|
| - static_cast<const ComponentId&>(other).content_name_ == content_name_;
|
| - }
|
| -
|
| - std::string ToString() const override {
|
| - return ToString("Channel-");
|
| - }
|
| -
|
| - protected:
|
| - ComponentId(StatsReport::StatsType type, const std::string& content_name,
|
| - int component)
|
| - : IdBase(type),
|
| - content_name_(content_name),
|
| - component_(component) {}
|
| -
|
| - std::string ToString(const char* prefix) const {
|
| - std::string ret(prefix);
|
| - ret += content_name_;
|
| - ret += '-';
|
| - ret += rtc::ToString<>(component_);
|
| - return ret;
|
| - }
|
| -
|
| - private:
|
| - const std::string content_name_;
|
| - const int component_;
|
| -};
|
| -
|
| -class CandidatePairId : public ComponentId {
|
| - public:
|
| - CandidatePairId(const std::string& content_name, int component, int index)
|
| - : ComponentId(StatsReport::kStatsReportTypeCandidatePair, content_name,
|
| - component),
|
| - index_(index) {}
|
| -
|
| - bool Equals(const IdBase& other) const override {
|
| - return ComponentId::Equals(other) &&
|
| - static_cast<const CandidatePairId&>(other).index_ == index_;
|
| - }
|
| -
|
| - std::string ToString() const override {
|
| - std::string ret(ComponentId::ToString("Conn-"));
|
| - ret += '-';
|
| - ret += rtc::ToString<>(index_);
|
| - return ret;
|
| - }
|
| -
|
| - private:
|
| - const int index_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -StatsReport::IdBase::IdBase(StatsType type) : type_(type) {}
|
| -StatsReport::IdBase::~IdBase() {}
|
| -
|
| -StatsReport::StatsType StatsReport::IdBase::type() const { return type_; }
|
| -
|
| -bool StatsReport::IdBase::Equals(const IdBase& other) const {
|
| - return other.type_ == type_;
|
| -}
|
| -
|
| -StatsReport::Value::Value(StatsValueName name, int64_t value, Type int_type)
|
| - : name(name), type_(int_type) {
|
| - RTC_DCHECK(type_ == kInt || type_ == kInt64);
|
| - type_ == kInt ? value_.int_ = static_cast<int>(value) : value_.int64_ = value;
|
| -}
|
| -
|
| -StatsReport::Value::Value(StatsValueName name, float f)
|
| - : name(name), type_(kFloat) {
|
| - value_.float_ = f;
|
| -}
|
| -
|
| -StatsReport::Value::Value(StatsValueName name, const std::string& value)
|
| - : name(name), type_(kString) {
|
| - value_.string_ = new std::string(value);
|
| -}
|
| -
|
| -StatsReport::Value::Value(StatsValueName name, const char* value)
|
| - : name(name), type_(kStaticString) {
|
| - value_.static_string_ = value;
|
| -}
|
| -
|
| -StatsReport::Value::Value(StatsValueName name, bool b)
|
| - : name(name), type_(kBool) {
|
| - value_.bool_ = b;
|
| -}
|
| -
|
| -StatsReport::Value::Value(StatsValueName name, const Id& value)
|
| - : name(name), type_(kId) {
|
| - value_.id_ = new Id(value);
|
| -}
|
| -
|
| -StatsReport::Value::~Value() {
|
| - switch (type_) {
|
| - case kInt:
|
| - case kInt64:
|
| - case kFloat:
|
| - case kBool:
|
| - case kStaticString:
|
| - break;
|
| - case kString:
|
| - delete value_.string_;
|
| - break;
|
| - case kId:
|
| - delete value_.id_;
|
| - break;
|
| - }
|
| -}
|
| -
|
| -bool StatsReport::Value::Equals(const Value& other) const {
|
| - if (name != other.name)
|
| - return false;
|
| -
|
| - // There's a 1:1 relation between a name and a type, so we don't have to
|
| - // check that.
|
| - RTC_DCHECK_EQ(type_, other.type_);
|
| -
|
| - switch (type_) {
|
| - case kInt:
|
| - return value_.int_ == other.value_.int_;
|
| - case kInt64:
|
| - return value_.int64_ == other.value_.int64_;
|
| - case kFloat:
|
| - return value_.float_ == other.value_.float_;
|
| - case kStaticString: {
|
| -#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
|
| - if (value_.static_string_ != other.value_.static_string_) {
|
| - RTC_DCHECK(strcmp(value_.static_string_, other.value_.static_string_) !=
|
| - 0)
|
| - << "Duplicate global?";
|
| - }
|
| -#endif
|
| - return value_.static_string_ == other.value_.static_string_;
|
| - }
|
| - case kString:
|
| - return *value_.string_ == *other.value_.string_;
|
| - case kBool:
|
| - return value_.bool_ == other.value_.bool_;
|
| - case kId:
|
| - return (*value_.id_)->Equals(*other.value_.id_);
|
| - }
|
| - RTC_NOTREACHED();
|
| - return false;
|
| -}
|
| -
|
| -bool StatsReport::Value::operator==(const std::string& value) const {
|
| - return (type_ == kString && value_.string_->compare(value) == 0) ||
|
| - (type_ == kStaticString && value.compare(value_.static_string_) == 0);
|
| -}
|
| -
|
| -bool StatsReport::Value::operator==(const char* value) const {
|
| - if (type_ == kString)
|
| - return value_.string_->compare(value) == 0;
|
| - if (type_ != kStaticString)
|
| - return false;
|
| -#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
|
| - if (value_.static_string_ != value)
|
| - RTC_DCHECK(strcmp(value_.static_string_, value) != 0)
|
| - << "Duplicate global?";
|
| -#endif
|
| - return value == value_.static_string_;
|
| -}
|
| -
|
| -bool StatsReport::Value::operator==(int64_t value) const {
|
| - return type_ == kInt ? value_.int_ == static_cast<int>(value) :
|
| - (type_ == kInt64 ? value_.int64_ == value : false);
|
| -}
|
| -
|
| -bool StatsReport::Value::operator==(bool value) const {
|
| - return type_ == kBool && value_.bool_ == value;
|
| -}
|
| -
|
| -bool StatsReport::Value::operator==(float value) const {
|
| - return type_ == kFloat && value_.float_ == value;
|
| -}
|
| -
|
| -bool StatsReport::Value::operator==(const Id& value) const {
|
| - return type_ == kId && (*value_.id_)->Equals(value);
|
| -}
|
| -
|
| -int StatsReport::Value::int_val() const {
|
| - RTC_DCHECK(type_ == kInt);
|
| - return value_.int_;
|
| -}
|
| -
|
| -int64_t StatsReport::Value::int64_val() const {
|
| - RTC_DCHECK(type_ == kInt64);
|
| - return value_.int64_;
|
| -}
|
| -
|
| -float StatsReport::Value::float_val() const {
|
| - RTC_DCHECK(type_ == kFloat);
|
| - return value_.float_;
|
| -}
|
| -
|
| -const char* StatsReport::Value::static_string_val() const {
|
| - RTC_DCHECK(type_ == kStaticString);
|
| - return value_.static_string_;
|
| -}
|
| -
|
| -const std::string& StatsReport::Value::string_val() const {
|
| - RTC_DCHECK(type_ == kString);
|
| - return *value_.string_;
|
| -}
|
| -
|
| -bool StatsReport::Value::bool_val() const {
|
| - RTC_DCHECK(type_ == kBool);
|
| - return value_.bool_;
|
| -}
|
| -
|
| -const char* StatsReport::Value::display_name() const {
|
| - switch (name) {
|
| - case kStatsValueNameAudioOutputLevel:
|
| - return "audioOutputLevel";
|
| - case kStatsValueNameAudioInputLevel:
|
| - return "audioInputLevel";
|
| - case kStatsValueNameBytesSent:
|
| - return "bytesSent";
|
| - case kStatsValueNamePacketsSent:
|
| - return "packetsSent";
|
| - case kStatsValueNameBytesReceived:
|
| - return "bytesReceived";
|
| - case kStatsValueNameLabel:
|
| - return "label";
|
| - case kStatsValueNamePacketsReceived:
|
| - return "packetsReceived";
|
| - case kStatsValueNamePacketsLost:
|
| - return "packetsLost";
|
| - case kStatsValueNameProtocol:
|
| - return "protocol";
|
| - case kStatsValueNameTransportId:
|
| - return "transportId";
|
| - case kStatsValueNameSelectedCandidatePairId:
|
| - return "selectedCandidatePairId";
|
| - case kStatsValueNameSsrc:
|
| - return "ssrc";
|
| - case kStatsValueNameState:
|
| - return "state";
|
| - case kStatsValueNameDataChannelId:
|
| - return "datachannelid";
|
| - case kStatsValueNameCodecImplementationName:
|
| - return "codecImplementationName";
|
| - case kStatsValueNameMediaType:
|
| - return "mediaType";
|
| - // 'goog' prefixed constants.
|
| - case kStatsValueNameAccelerateRate:
|
| - return "googAccelerateRate";
|
| - case kStatsValueNameActiveConnection:
|
| - return "googActiveConnection";
|
| - case kStatsValueNameActualEncBitrate:
|
| - return "googActualEncBitrate";
|
| - case kStatsValueNameAvailableReceiveBandwidth:
|
| - return "googAvailableReceiveBandwidth";
|
| - case kStatsValueNameAvailableSendBandwidth:
|
| - return "googAvailableSendBandwidth";
|
| - case kStatsValueNameAvgEncodeMs:
|
| - return "googAvgEncodeMs";
|
| - case kStatsValueNameBucketDelay:
|
| - return "googBucketDelay";
|
| - case kStatsValueNameBandwidthLimitedResolution:
|
| - return "googBandwidthLimitedResolution";
|
| -
|
| - // Candidate related attributes. Values are taken from
|
| - // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
|
| - case kStatsValueNameCandidateIPAddress:
|
| - return "ipAddress";
|
| - case kStatsValueNameCandidateNetworkType:
|
| - return "networkType";
|
| - case kStatsValueNameCandidatePortNumber:
|
| - return "portNumber";
|
| - case kStatsValueNameCandidatePriority:
|
| - return "priority";
|
| - case kStatsValueNameCandidateTransportType:
|
| - return "transport";
|
| - case kStatsValueNameCandidateType:
|
| - return "candidateType";
|
| -
|
| - case kStatsValueNameChannelId:
|
| - return "googChannelId";
|
| - case kStatsValueNameCodecName:
|
| - return "googCodecName";
|
| - case kStatsValueNameComponent:
|
| - return "googComponent";
|
| - case kStatsValueNameContentName:
|
| - return "googContentName";
|
| - case kStatsValueNameCpuLimitedResolution:
|
| - return "googCpuLimitedResolution";
|
| - case kStatsValueNameDecodingCTSG:
|
| - return "googDecodingCTSG";
|
| - case kStatsValueNameDecodingCTN:
|
| - return "googDecodingCTN";
|
| - case kStatsValueNameDecodingNormal:
|
| - return "googDecodingNormal";
|
| - case kStatsValueNameDecodingPLC:
|
| - return "googDecodingPLC";
|
| - case kStatsValueNameDecodingCNG:
|
| - return "googDecodingCNG";
|
| - case kStatsValueNameDecodingPLCCNG:
|
| - return "googDecodingPLCCNG";
|
| - case kStatsValueNameDer:
|
| - return "googDerBase64";
|
| - case kStatsValueNameDtlsCipher:
|
| - return "dtlsCipher";
|
| - case kStatsValueNameEchoCancellationQualityMin:
|
| - return "googEchoCancellationQualityMin";
|
| - case kStatsValueNameEchoDelayMedian:
|
| - return "googEchoCancellationEchoDelayMedian";
|
| - case kStatsValueNameEchoDelayStdDev:
|
| - return "googEchoCancellationEchoDelayStdDev";
|
| - case kStatsValueNameEchoReturnLoss:
|
| - return "googEchoCancellationReturnLoss";
|
| - case kStatsValueNameEchoReturnLossEnhancement:
|
| - return "googEchoCancellationReturnLossEnhancement";
|
| - case kStatsValueNameEncodeUsagePercent:
|
| - return "googEncodeUsagePercent";
|
| - case kStatsValueNameExpandRate:
|
| - return "googExpandRate";
|
| - case kStatsValueNameFingerprint:
|
| - return "googFingerprint";
|
| - case kStatsValueNameFingerprintAlgorithm:
|
| - return "googFingerprintAlgorithm";
|
| - case kStatsValueNameFirsReceived:
|
| - return "googFirsReceived";
|
| - case kStatsValueNameFirsSent:
|
| - return "googFirsSent";
|
| - case kStatsValueNameFrameHeightInput:
|
| - return "googFrameHeightInput";
|
| - case kStatsValueNameFrameHeightReceived:
|
| - return "googFrameHeightReceived";
|
| - case kStatsValueNameFrameHeightSent:
|
| - return "googFrameHeightSent";
|
| - case kStatsValueNameFrameRateReceived:
|
| - return "googFrameRateReceived";
|
| - case kStatsValueNameFrameRateDecoded:
|
| - return "googFrameRateDecoded";
|
| - case kStatsValueNameFrameRateOutput:
|
| - return "googFrameRateOutput";
|
| - case kStatsValueNameDecodeMs:
|
| - return "googDecodeMs";
|
| - case kStatsValueNameMaxDecodeMs:
|
| - return "googMaxDecodeMs";
|
| - case kStatsValueNameCurrentDelayMs:
|
| - return "googCurrentDelayMs";
|
| - case kStatsValueNameTargetDelayMs:
|
| - return "googTargetDelayMs";
|
| - case kStatsValueNameJitterBufferMs:
|
| - return "googJitterBufferMs";
|
| - case kStatsValueNameMinPlayoutDelayMs:
|
| - return "googMinPlayoutDelayMs";
|
| - case kStatsValueNameRenderDelayMs:
|
| - return "googRenderDelayMs";
|
| - case kStatsValueNameCaptureStartNtpTimeMs:
|
| - return "googCaptureStartNtpTimeMs";
|
| - case kStatsValueNameFrameRateInput:
|
| - return "googFrameRateInput";
|
| - case kStatsValueNameFrameRateSent:
|
| - return "googFrameRateSent";
|
| - case kStatsValueNameFrameWidthInput:
|
| - return "googFrameWidthInput";
|
| - case kStatsValueNameFrameWidthReceived:
|
| - return "googFrameWidthReceived";
|
| - case kStatsValueNameFrameWidthSent:
|
| - return "googFrameWidthSent";
|
| - case kStatsValueNameInitiator:
|
| - return "googInitiator";
|
| - case kStatsValueNameIssuerId:
|
| - return "googIssuerId";
|
| - case kStatsValueNameJitterReceived:
|
| - return "googJitterReceived";
|
| - case kStatsValueNameLocalAddress:
|
| - return "googLocalAddress";
|
| - case kStatsValueNameLocalCandidateId:
|
| - return "localCandidateId";
|
| - case kStatsValueNameLocalCandidateType:
|
| - return "googLocalCandidateType";
|
| - case kStatsValueNameLocalCertificateId:
|
| - return "localCertificateId";
|
| - case kStatsValueNameAdaptationChanges:
|
| - return "googAdaptationChanges";
|
| - case kStatsValueNameNacksReceived:
|
| - return "googNacksReceived";
|
| - case kStatsValueNameNacksSent:
|
| - return "googNacksSent";
|
| - case kStatsValueNamePreemptiveExpandRate:
|
| - return "googPreemptiveExpandRate";
|
| - case kStatsValueNamePlisReceived:
|
| - return "googPlisReceived";
|
| - case kStatsValueNamePlisSent:
|
| - return "googPlisSent";
|
| - case kStatsValueNamePreferredJitterBufferMs:
|
| - return "googPreferredJitterBufferMs";
|
| - case kStatsValueNameReceiving:
|
| - return "googReadable";
|
| - case kStatsValueNameRemoteAddress:
|
| - return "googRemoteAddress";
|
| - case kStatsValueNameRemoteCandidateId:
|
| - return "remoteCandidateId";
|
| - case kStatsValueNameRemoteCandidateType:
|
| - return "googRemoteCandidateType";
|
| - case kStatsValueNameRemoteCertificateId:
|
| - return "remoteCertificateId";
|
| - case kStatsValueNameRetransmitBitrate:
|
| - return "googRetransmitBitrate";
|
| - case kStatsValueNameRtt:
|
| - return "googRtt";
|
| - case kStatsValueNameSecondaryDecodedRate:
|
| - return "googSecondaryDecodedRate";
|
| - case kStatsValueNameSendPacketsDiscarded:
|
| - return "packetsDiscardedOnSend";
|
| - case kStatsValueNameSpeechExpandRate:
|
| - return "googSpeechExpandRate";
|
| - case kStatsValueNameSrtpCipher:
|
| - return "srtpCipher";
|
| - case kStatsValueNameTargetEncBitrate:
|
| - return "googTargetEncBitrate";
|
| - case kStatsValueNameTransmitBitrate:
|
| - return "googTransmitBitrate";
|
| - case kStatsValueNameTransportType:
|
| - return "googTransportType";
|
| - case kStatsValueNameTrackId:
|
| - return "googTrackId";
|
| - case kStatsValueNameTypingNoiseState:
|
| - return "googTypingNoiseState";
|
| - case kStatsValueNameViewLimitedResolution:
|
| - return "googViewLimitedResolution";
|
| - case kStatsValueNameWritable:
|
| - return "googWritable";
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| -std::string StatsReport::Value::ToString() const {
|
| - switch (type_) {
|
| - case kInt:
|
| - return rtc::ToString(value_.int_);
|
| - case kInt64:
|
| - return rtc::ToString(value_.int64_);
|
| - case kFloat:
|
| - return rtc::ToString(value_.float_);
|
| - case kStaticString:
|
| - return std::string(value_.static_string_);
|
| - case kString:
|
| - return *value_.string_;
|
| - case kBool:
|
| - return value_.bool_ ? "true" : "false";
|
| - case kId:
|
| - return (*value_.id_)->ToString();
|
| - }
|
| - RTC_NOTREACHED();
|
| - return std::string();
|
| -}
|
| -
|
| -StatsReport::StatsReport(const Id& id) : id_(id), timestamp_(0.0) {
|
| - RTC_DCHECK(id_.get());
|
| -}
|
| -
|
| -// static
|
| -StatsReport::Id StatsReport::NewBandwidthEstimationId() {
|
| - return Id(new RefCountedObject<BandwidthEstimationId>());
|
| -}
|
| -
|
| -// static
|
| -StatsReport::Id StatsReport::NewTypedId(StatsType type, const std::string& id) {
|
| - return Id(new RefCountedObject<TypedId>(type, id));
|
| -}
|
| -
|
| -// static
|
| -StatsReport::Id StatsReport::NewTypedIntId(StatsType type, int id) {
|
| - return Id(new RefCountedObject<TypedIntId>(type, id));
|
| -}
|
| -
|
| -// static
|
| -StatsReport::Id StatsReport::NewIdWithDirection(
|
| - StatsType type, const std::string& id, StatsReport::Direction direction) {
|
| - return Id(new RefCountedObject<IdWithDirection>(type, id, direction));
|
| -}
|
| -
|
| -// static
|
| -StatsReport::Id StatsReport::NewCandidateId(bool local, const std::string& id) {
|
| - return Id(new RefCountedObject<CandidateId>(local, id));
|
| -}
|
| -
|
| -// static
|
| -StatsReport::Id StatsReport::NewComponentId(
|
| - const std::string& content_name, int component) {
|
| - return Id(new RefCountedObject<ComponentId>(content_name, component));
|
| -}
|
| -
|
| -// static
|
| -StatsReport::Id StatsReport::NewCandidatePairId(
|
| - const std::string& content_name, int component, int index) {
|
| - return Id(new RefCountedObject<CandidatePairId>(
|
| - content_name, component, index));
|
| -}
|
| -
|
| -const char* StatsReport::TypeToString() const {
|
| - return InternalTypeToString(id_->type());
|
| -}
|
| -
|
| -void StatsReport::AddString(StatsReport::StatsValueName name,
|
| - const std::string& value) {
|
| - const Value* found = FindValue(name);
|
| - if (!found || !(*found == value))
|
| - values_[name] = ValuePtr(new Value(name, value));
|
| -}
|
| -
|
| -void StatsReport::AddString(StatsReport::StatsValueName name,
|
| - const char* value) {
|
| - const Value* found = FindValue(name);
|
| - if (!found || !(*found == value))
|
| - values_[name] = ValuePtr(new Value(name, value));
|
| -}
|
| -
|
| -void StatsReport::AddInt64(StatsReport::StatsValueName name, int64_t value) {
|
| - const Value* found = FindValue(name);
|
| - if (!found || !(*found == value))
|
| - values_[name] = ValuePtr(new Value(name, value, Value::kInt64));
|
| -}
|
| -
|
| -void StatsReport::AddInt(StatsReport::StatsValueName name, int value) {
|
| - const Value* found = FindValue(name);
|
| - if (!found || !(*found == static_cast<int64_t>(value)))
|
| - values_[name] = ValuePtr(new Value(name, value, Value::kInt));
|
| -}
|
| -
|
| -void StatsReport::AddFloat(StatsReport::StatsValueName name, float value) {
|
| - const Value* found = FindValue(name);
|
| - if (!found || !(*found == value))
|
| - values_[name] = ValuePtr(new Value(name, value));
|
| -}
|
| -
|
| -void StatsReport::AddBoolean(StatsReport::StatsValueName name, bool value) {
|
| - const Value* found = FindValue(name);
|
| - if (!found || !(*found == value))
|
| - values_[name] = ValuePtr(new Value(name, value));
|
| -}
|
| -
|
| -void StatsReport::AddId(StatsReport::StatsValueName name,
|
| - const Id& value) {
|
| - const Value* found = FindValue(name);
|
| - if (!found || !(*found == value))
|
| - values_[name] = ValuePtr(new Value(name, value));
|
| -}
|
| -
|
| -const StatsReport::Value* StatsReport::FindValue(StatsValueName name) const {
|
| - Values::const_iterator it = values_.find(name);
|
| - return it == values_.end() ? nullptr : it->second.get();
|
| -}
|
| -
|
| -StatsCollection::StatsCollection() {
|
| -}
|
| -
|
| -StatsCollection::~StatsCollection() {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - for (auto* r : list_)
|
| - delete r;
|
| -}
|
| -
|
| -StatsCollection::const_iterator StatsCollection::begin() const {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - return list_.begin();
|
| -}
|
| -
|
| -StatsCollection::const_iterator StatsCollection::end() const {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - return list_.end();
|
| -}
|
| -
|
| -size_t StatsCollection::size() const {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - return list_.size();
|
| -}
|
| -
|
| -StatsReport* StatsCollection::InsertNew(const StatsReport::Id& id) {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - RTC_DCHECK(Find(id) == nullptr);
|
| - StatsReport* report = new StatsReport(id);
|
| - list_.push_back(report);
|
| - return report;
|
| -}
|
| -
|
| -StatsReport* StatsCollection::FindOrAddNew(const StatsReport::Id& id) {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - StatsReport* ret = Find(id);
|
| - return ret ? ret : InsertNew(id);
|
| -}
|
| -
|
| -StatsReport* StatsCollection::ReplaceOrAddNew(const StatsReport::Id& id) {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - RTC_DCHECK(id.get());
|
| - Container::iterator it = std::find_if(list_.begin(), list_.end(),
|
| - [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
|
| - if (it != end()) {
|
| - StatsReport* report = new StatsReport((*it)->id());
|
| - delete *it;
|
| - *it = report;
|
| - return report;
|
| - }
|
| - return InsertNew(id);
|
| -}
|
| -
|
| -// Looks for a report with the given |id|. If one is not found, NULL
|
| -// will be returned.
|
| -StatsReport* StatsCollection::Find(const StatsReport::Id& id) {
|
| - RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - Container::iterator it = std::find_if(list_.begin(), list_.end(),
|
| - [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
|
| - return it == list_.end() ? nullptr : *it;
|
| -}
|
| -
|
| -} // namespace webrtc
|
|
|