diff --git a/api/BUILD.gn b/api/BUILD.gn index 56e92379d1..b3c51802ab 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -206,6 +206,8 @@ rtc_library("libjingle_peerconnection_api") { "jsep_ice_candidate.cc", "jsep_ice_candidate.h", "jsep_session_description.h", + "legacy_stats_types.cc", + "legacy_stats_types.h", "peer_connection_interface.cc", "peer_connection_interface.h", "rtp_receiver_interface.cc", @@ -217,7 +219,6 @@ rtc_library("libjingle_peerconnection_api") { "sctp_transport_interface.h", "set_local_description_observer_interface.h", "set_remote_description_observer_interface.h", - "stats_types.cc", "stats_types.h", "uma_metrics.h", "video_track_source_proxy_factory.h", diff --git a/api/DEPS b/api/DEPS index 5f01204068..bcfd705741 100644 --- a/api/DEPS +++ b/api/DEPS @@ -182,7 +182,7 @@ specific_include_rules = { "+rtc_base/ref_count.h", ], - "stats_types\.h": [ + "legacy_stats_types\.h": [ "+rtc_base/ref_count.h", "+rtc_base/thread_checker.h", ], diff --git a/api/stats_types.cc b/api/legacy_stats_types.cc similarity index 99% rename from api/stats_types.cc rename to api/legacy_stats_types.cc index 61a0b8499d..e3b2144edd 100644 --- a/api/stats_types.cc +++ b/api/legacy_stats_types.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "api/stats_types.h" +#include "api/legacy_stats_types.h" #include diff --git a/api/legacy_stats_types.h b/api/legacy_stats_types.h new file mode 100644 index 0000000000..a62e014834 --- /dev/null +++ b/api/legacy_stats_types.h @@ -0,0 +1,455 @@ +/* + * Copyright 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This file contains structures used for retrieving statistics from an ongoing +// libjingle session. + +#ifndef API_LEGACY_STATS_TYPES_H_ +#define API_LEGACY_STATS_TYPES_H_ + +#include +#include +#include +#include +#include + +#include "api/scoped_refptr.h" +#include "api/sequence_checker.h" +#include "rtc_base/ref_count.h" +#include "rtc_base/system/rtc_export.h" + +namespace webrtc { + +class RTC_EXPORT StatsReport { + public: + // Indicates whether a track is for sending or receiving. + // Used in reports for audio/video tracks. + enum Direction { + kSend = 0, + kReceive, + }; + + enum StatsType { + // StatsReport types. + // A StatsReport of `type` = "googSession" contains overall information + // about the thing libjingle calls a session (which may contain one + // or more RTP sessions. + kStatsReportTypeSession, + + // A StatsReport of `type` = "googTransport" contains information + // about a libjingle "transport". + kStatsReportTypeTransport, + + // A StatsReport of `type` = "googComponent" contains information + // about a libjingle "channel" (typically, RTP or RTCP for a transport). + // This is intended to be the same thing as an ICE "Component". + kStatsReportTypeComponent, + + // A StatsReport of `type` = "googCandidatePair" contains information + // about a libjingle "connection" - a single source/destination port pair. + // This is intended to be the same thing as an ICE "candidate pair". + kStatsReportTypeCandidatePair, + + // A StatsReport of `type` = "VideoBWE" is statistics for video Bandwidth + // Estimation, which is global per-session. The `id` field is "bweforvideo" + // (will probably change in the future). + kStatsReportTypeBwe, + + // A StatsReport of `type` = "ssrc" is statistics for a specific rtp stream. + // The `id` field is the SSRC in decimal form of the rtp stream. + kStatsReportTypeSsrc, + + // A StatsReport of `type` = "remoteSsrc" is statistics for a specific + // rtp stream, generated by the remote end of the connection. + kStatsReportTypeRemoteSsrc, + + // A StatsReport of `type` = "googTrack" is statistics for a specific media + // track. The `id` field is the track id. + kStatsReportTypeTrack, + + // A StatsReport of `type` = "localcandidate" or "remotecandidate" is + // attributes on a specific ICE Candidate. It links to its connection pair + // by candidate id. The string value is taken from + // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*. + kStatsReportTypeIceLocalCandidate, + kStatsReportTypeIceRemoteCandidate, + + // A StatsReport of `type` = "googCertificate" contains an SSL certificate + // transmitted by one of the endpoints of this connection. The `id` is + // controlled by the fingerprint, and is used to identify the certificate in + // the Channel stats (as "googLocalCertificateId" or + // "googRemoteCertificateId") and in any child certificates (as + // "googIssuerId"). + kStatsReportTypeCertificate, + + // A StatsReport of `type` = "datachannel" with statistics for a + // particular DataChannel. + kStatsReportTypeDataChannel, + }; + + enum StatsValueName { + kStatsValueNameActiveConnection, + kStatsValueNameAecDivergentFilterFraction, + kStatsValueNameAudioInputLevel, + kStatsValueNameAudioOutputLevel, + kStatsValueNameBytesReceived, + kStatsValueNameBytesSent, + kStatsValueNameCodecImplementationName, + kStatsValueNameConcealedSamples, + kStatsValueNameConcealmentEvents, + kStatsValueNameDataChannelId, + kStatsValueNameFramesDecoded, + kStatsValueNameFramesEncoded, + kStatsValueNameJitterBufferDelay, + kStatsValueNameMediaType, + kStatsValueNamePacketsLost, + kStatsValueNamePacketsReceived, + kStatsValueNamePacketsSent, + kStatsValueNameProtocol, + kStatsValueNameQpSum, + kStatsValueNameReceiving, + kStatsValueNameSelectedCandidatePairId, + kStatsValueNameSsrc, + kStatsValueNameState, + kStatsValueNameTotalAudioEnergy, + kStatsValueNameTotalSamplesDuration, + kStatsValueNameTotalSamplesReceived, + kStatsValueNameTransportId, + kStatsValueNameSentPingRequestsTotal, + kStatsValueNameSentPingRequestsBeforeFirstResponse, + kStatsValueNameSentPingResponses, + kStatsValueNameRecvPingRequests, + kStatsValueNameRecvPingResponses, + kStatsValueNameSentStunKeepaliveRequests, + kStatsValueNameRecvStunKeepaliveResponses, + kStatsValueNameStunKeepaliveRttTotal, + kStatsValueNameStunKeepaliveRttSquaredTotal, + + // Internal StatsValue names. + kStatsValueNameAccelerateRate, + kStatsValueNameActualEncBitrate, + kStatsValueNameAdaptationChanges, + kStatsValueNameAvailableReceiveBandwidth, + kStatsValueNameAvailableSendBandwidth, + kStatsValueNameAvgEncodeMs, + kStatsValueNameBandwidthLimitedResolution, + kStatsValueNameBucketDelay, + kStatsValueNameCaptureStartNtpTimeMs, + kStatsValueNameCandidateIPAddress, + kStatsValueNameCandidateNetworkType, + kStatsValueNameCandidatePortNumber, + kStatsValueNameCandidatePriority, + kStatsValueNameCandidateTransportType, + kStatsValueNameCandidateType, + kStatsValueNameChannelId, + kStatsValueNameCodecName, + kStatsValueNameComponent, + kStatsValueNameContentName, + kStatsValueNameContentType, + kStatsValueNameCpuLimitedResolution, + kStatsValueNameCurrentDelayMs, + kStatsValueNameDecodeMs, + kStatsValueNameDecodingCNG, + kStatsValueNameDecodingCTN, + kStatsValueNameDecodingCTSG, + kStatsValueNameDecodingMutedOutput, + kStatsValueNameDecodingNormal, + kStatsValueNameDecodingPLC, + kStatsValueNameDecodingCodecPLC, + kStatsValueNameDecodingPLCCNG, + kStatsValueNameDer, + kStatsValueNameDtlsCipher, + kStatsValueNameEchoDelayMedian, + kStatsValueNameEchoDelayStdDev, + kStatsValueNameEchoReturnLoss, + kStatsValueNameEchoReturnLossEnhancement, + kStatsValueNameEncodeUsagePercent, + kStatsValueNameExpandRate, + kStatsValueNameFingerprint, + kStatsValueNameFingerprintAlgorithm, + kStatsValueNameFirsReceived, + kStatsValueNameFirsSent, + kStatsValueNameFirstFrameReceivedToDecodedMs, + kStatsValueNameFrameHeightInput, + kStatsValueNameFrameHeightReceived, + kStatsValueNameFrameHeightSent, + kStatsValueNameFrameRateDecoded, + kStatsValueNameFrameRateInput, + kStatsValueNameFrameRateOutput, + kStatsValueNameFrameRateReceived, + kStatsValueNameFrameRateSent, + kStatsValueNameFrameWidthInput, + kStatsValueNameFrameWidthReceived, + kStatsValueNameFrameWidthSent, + kStatsValueNameHasEnteredLowResolution, + kStatsValueNameHugeFramesSent, + kStatsValueNameInitiator, + kStatsValueNameInterframeDelayMaxMs, // Max over last 10 seconds. + kStatsValueNameIssuerId, + kStatsValueNameJitterBufferMs, + kStatsValueNameJitterReceived, + kStatsValueNameLabel, + kStatsValueNameLocalAddress, + kStatsValueNameLocalCandidateId, + kStatsValueNameLocalCandidateType, + kStatsValueNameLocalCertificateId, + kStatsValueNameMaxDecodeMs, + kStatsValueNameMinPlayoutDelayMs, + kStatsValueNameNacksReceived, + kStatsValueNameNacksSent, + kStatsValueNamePlisReceived, + kStatsValueNamePlisSent, + kStatsValueNamePreemptiveExpandRate, + kStatsValueNamePreferredJitterBufferMs, + kStatsValueNameRemoteAddress, + kStatsValueNameRemoteCandidateId, + kStatsValueNameRemoteCandidateType, + kStatsValueNameRemoteCertificateId, + kStatsValueNameRenderDelayMs, + kStatsValueNameResidualEchoLikelihood, + kStatsValueNameResidualEchoLikelihoodRecentMax, + kStatsValueNameAnaBitrateActionCounter, + kStatsValueNameAnaChannelActionCounter, + kStatsValueNameAnaDtxActionCounter, + kStatsValueNameAnaFecActionCounter, + kStatsValueNameAnaFrameLengthIncreaseCounter, + kStatsValueNameAnaFrameLengthDecreaseCounter, + kStatsValueNameAnaUplinkPacketLossFraction, + kStatsValueNameRetransmitBitrate, + kStatsValueNameRtt, + kStatsValueNameSecondaryDecodedRate, + kStatsValueNameSecondaryDiscardedRate, + kStatsValueNameSendPacketsDiscarded, + kStatsValueNameSpeechExpandRate, + kStatsValueNameSrtpCipher, + kStatsValueNameTargetDelayMs, + kStatsValueNameTargetEncBitrate, + kStatsValueNameTimingFrameInfo, // Result of `TimingFrameInfo::ToString` + kStatsValueNameTrackId, + kStatsValueNameTransmitBitrate, + kStatsValueNameTransportType, + kStatsValueNameWritable, + kStatsValueNameAudioDeviceUnderrunCounter, + kStatsValueNameLocalCandidateRelayProtocol, + }; + + class RTC_EXPORT IdBase : public rtc::RefCountInterface { + public: + ~IdBase() override; + StatsType type() const; + + // Users of IdBase will be using the Id typedef, which is compatible with + // this Equals() function. It simply calls the protected (and overridden) + // Equals() method. + bool Equals(const rtc::scoped_refptr& other) const { + return Equals(*other.get()); + } + + virtual std::string ToString() const = 0; + + protected: + // Protected since users of the IdBase type will be using the Id typedef. + virtual bool Equals(const IdBase& other) const; + + explicit IdBase(StatsType type); // Only meant for derived classes. + const StatsType type_; + + static const char kSeparator = '_'; + }; + + typedef rtc::scoped_refptr Id; + + struct RTC_EXPORT Value { + enum Type { + kInt, // int. + kInt64, // int64_t. + kFloat, // float. + kString, // std::string + kStaticString, // const char*. + kBool, // bool. + kId, // Id. + }; + + Value(StatsValueName name, int64_t value, Type int_type); + Value(StatsValueName name, float f); + Value(StatsValueName name, const std::string& value); + Value(StatsValueName name, const char* value); + Value(StatsValueName name, bool b); + Value(StatsValueName name, const Id& value); + + ~Value(); + + Value(const Value&) = delete; + Value& operator=(const Value&) = delete; + + // Support ref counting. Note that for performance reasons, we + // don't use thread safe operations. Therefore, all operations + // affecting the ref count (in practice, creation and copying of + // the Values mapping) must occur on webrtc's signalling thread. + int AddRef() const { + RTC_DCHECK_RUN_ON(&thread_checker_); + return ++ref_count_; + } + int Release() const { + RTC_DCHECK_RUN_ON(&thread_checker_); + int count = --ref_count_; + if (!count) + delete this; + return count; + } + + // TODO(tommi): This compares name as well as value... + // I think we should only need to compare the value part and + // move the name part into a hash map. + bool Equals(const Value& other) const; + + // Comparison operators. Return true iff the current instance is of the + // correct type and holds the same value. No conversion is performed so + // a string value of "123" is not equal to an int value of 123 and an int + // value of 123 is not equal to a float value of 123.0f. + // One exception to this is that types kInt and kInt64 can be compared and + // kString and kStaticString too. + bool operator==(const std::string& value) const; + bool operator==(const char* value) const; + bool operator==(int64_t value) const; + bool operator==(bool value) const; + bool operator==(float value) const; + bool operator==(const Id& value) const; + + // Getters that allow getting the native value directly. + // The caller must know the type beforehand or else hit a check. + int int_val() const; + int64_t int64_val() const; + float float_val() const; + const char* static_string_val() const; + const std::string& string_val() const; + bool bool_val() const; + const Id& id_val() const; + + // Returns the string representation of `name`. + const char* display_name() const; + + // Converts the native value to a string representation of the value. + std::string ToString() const; + + Type type() const { return type_; } + + // TODO(tommi): Move `name` and `display_name` out of the Value struct. + const StatsValueName name; + + private: + webrtc::SequenceChecker thread_checker_; + mutable int ref_count_ RTC_GUARDED_BY(thread_checker_) = 0; + + const Type type_; + // TODO(tommi): Use C++ 11 union and make value_ const. + union InternalType { + int int_; + int64_t int64_; + float float_; + bool bool_; + std::string* string_; + const char* static_string_; + Id* id_; + } value_; + }; + + typedef rtc::scoped_refptr ValuePtr; + typedef std::map Values; + + // Ownership of `id` is passed to `this`. + explicit StatsReport(const Id& id); + ~StatsReport(); + + StatsReport(const StatsReport&) = delete; + StatsReport& operator=(const StatsReport&) = delete; + + // Factory functions for various types of stats IDs. + static Id NewBandwidthEstimationId(); + static Id NewTypedId(StatsType type, const std::string& id); + static Id NewTypedIntId(StatsType type, int id); + static Id NewIdWithDirection(StatsType type, + const std::string& id, + Direction direction); + static Id NewCandidateId(bool local, const std::string& id); + static Id NewComponentId(const std::string& content_name, int component); + static Id NewCandidatePairId(const std::string& content_name, + int component, + int index); + + const Id& id() const { return id_; } + StatsType type() const { return id_->type(); } + double timestamp() const { return timestamp_; } + void set_timestamp(double t) { timestamp_ = t; } + bool empty() const { return values_.empty(); } + const Values& values() const { return values_; } + + const char* TypeToString() const; + + void AddString(StatsValueName name, const std::string& value); + void AddString(StatsValueName name, const char* value); + void AddInt64(StatsValueName name, int64_t value); + void AddInt(StatsValueName name, int value); + void AddFloat(StatsValueName name, float value); + void AddBoolean(StatsValueName name, bool value); + void AddId(StatsValueName name, const Id& value); + + const Value* FindValue(StatsValueName name) const; + + private: + // The unique identifier for this object. + // This is used as a key for this report in ordered containers, + // so it must never be changed. + const Id id_; + double timestamp_; // Time since 1970-01-01T00:00:00Z in milliseconds. + Values values_; +}; + +// Typedef for an array of const StatsReport pointers. +// Ownership of the pointers held by this implementation is assumed to lie +// elsewhere and lifetime guarantees are made by the implementation that uses +// this type. In the StatsCollector, object ownership lies with the +// StatsCollection class. +typedef std::vector StatsReports; + +// A map from the report id to the report. +// This class wraps an STL container and provides a limited set of +// functionality in order to keep things simple. +class StatsCollection { + public: + StatsCollection(); + ~StatsCollection(); + + typedef std::list Container; + typedef Container::iterator iterator; + typedef Container::const_iterator const_iterator; + + const_iterator begin() const; + const_iterator end() const; + size_t size() const; + + // Creates a new report object with `id` that does not already + // exist in the list of reports. + StatsReport* InsertNew(const StatsReport::Id& id); + StatsReport* FindOrAddNew(const StatsReport::Id& id); + StatsReport* ReplaceOrAddNew(const StatsReport::Id& id); + + // Looks for a report with the given `id`. If one is not found, null + // will be returned. + StatsReport* Find(const StatsReport::Id& id); + + private: + Container list_; + webrtc::SequenceChecker thread_checker_; +}; + +} // namespace webrtc + +#endif // API_LEGACY_STATS_TYPES_H_ diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h index f8689ebc1b..1037afa081 100644 --- a/api/peer_connection_interface.h +++ b/api/peer_connection_interface.h @@ -94,6 +94,7 @@ #include "api/field_trials_view.h" #include "api/ice_transport_interface.h" #include "api/jsep.h" +#include "api/legacy_stats_types.h" #include "api/media_stream_interface.h" #include "api/media_types.h" #include "api/metronome/metronome.h" @@ -112,7 +113,6 @@ #include "api/set_local_description_observer_interface.h" #include "api/set_remote_description_observer_interface.h" #include "api/stats/rtc_stats_collector_callback.h" -#include "api/stats_types.h" #include "api/task_queue/task_queue_factory.h" #include "api/transport/bitrate_settings.h" #include "api/transport/enums.h" diff --git a/api/stats_types.h b/api/stats_types.h index d75da46439..cc94ecb646 100644 --- a/api/stats_types.h +++ b/api/stats_types.h @@ -1,5 +1,5 @@ /* - * Copyright 2012 The WebRTC project authors. All Rights Reserved. + * Copyright 2022 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source @@ -8,448 +8,12 @@ * be found in the AUTHORS file in the root of the source tree. */ -// This file contains structures used for retrieving statistics from an ongoing -// libjingle session. - #ifndef API_STATS_TYPES_H_ #define API_STATS_TYPES_H_ -#include -#include -#include -#include -#include - -#include "api/scoped_refptr.h" -#include "api/sequence_checker.h" -#include "rtc_base/ref_count.h" -#include "rtc_base/system/rtc_export.h" - -namespace webrtc { - -class RTC_EXPORT StatsReport { - public: - // Indicates whether a track is for sending or receiving. - // Used in reports for audio/video tracks. - enum Direction { - kSend = 0, - kReceive, - }; - - enum StatsType { - // StatsReport types. - // A StatsReport of `type` = "googSession" contains overall information - // about the thing libjingle calls a session (which may contain one - // or more RTP sessions. - kStatsReportTypeSession, - - // A StatsReport of `type` = "googTransport" contains information - // about a libjingle "transport". - kStatsReportTypeTransport, - - // A StatsReport of `type` = "googComponent" contains information - // about a libjingle "channel" (typically, RTP or RTCP for a transport). - // This is intended to be the same thing as an ICE "Component". - kStatsReportTypeComponent, - - // A StatsReport of `type` = "googCandidatePair" contains information - // about a libjingle "connection" - a single source/destination port pair. - // This is intended to be the same thing as an ICE "candidate pair". - kStatsReportTypeCandidatePair, - - // A StatsReport of `type` = "VideoBWE" is statistics for video Bandwidth - // Estimation, which is global per-session. The `id` field is "bweforvideo" - // (will probably change in the future). - kStatsReportTypeBwe, - - // A StatsReport of `type` = "ssrc" is statistics for a specific rtp stream. - // The `id` field is the SSRC in decimal form of the rtp stream. - kStatsReportTypeSsrc, - - // A StatsReport of `type` = "remoteSsrc" is statistics for a specific - // rtp stream, generated by the remote end of the connection. - kStatsReportTypeRemoteSsrc, - - // A StatsReport of `type` = "googTrack" is statistics for a specific media - // track. The `id` field is the track id. - kStatsReportTypeTrack, - - // A StatsReport of `type` = "localcandidate" or "remotecandidate" is - // attributes on a specific ICE Candidate. It links to its connection pair - // by candidate id. The string value is taken from - // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*. - kStatsReportTypeIceLocalCandidate, - kStatsReportTypeIceRemoteCandidate, - - // A StatsReport of `type` = "googCertificate" contains an SSL certificate - // transmitted by one of the endpoints of this connection. The `id` is - // controlled by the fingerprint, and is used to identify the certificate in - // the Channel stats (as "googLocalCertificateId" or - // "googRemoteCertificateId") and in any child certificates (as - // "googIssuerId"). - kStatsReportTypeCertificate, - - // A StatsReport of `type` = "datachannel" with statistics for a - // particular DataChannel. - kStatsReportTypeDataChannel, - }; - - enum StatsValueName { - kStatsValueNameActiveConnection, - kStatsValueNameAecDivergentFilterFraction, - kStatsValueNameAudioInputLevel, - kStatsValueNameAudioOutputLevel, - kStatsValueNameBytesReceived, - kStatsValueNameBytesSent, - kStatsValueNameCodecImplementationName, - kStatsValueNameConcealedSamples, - kStatsValueNameConcealmentEvents, - kStatsValueNameDataChannelId, - kStatsValueNameFramesDecoded, - kStatsValueNameFramesEncoded, - kStatsValueNameJitterBufferDelay, - kStatsValueNameMediaType, - kStatsValueNamePacketsLost, - kStatsValueNamePacketsReceived, - kStatsValueNamePacketsSent, - kStatsValueNameProtocol, - kStatsValueNameQpSum, - kStatsValueNameReceiving, - kStatsValueNameSelectedCandidatePairId, - kStatsValueNameSsrc, - kStatsValueNameState, - kStatsValueNameTotalAudioEnergy, - kStatsValueNameTotalSamplesDuration, - kStatsValueNameTotalSamplesReceived, - kStatsValueNameTransportId, - kStatsValueNameSentPingRequestsTotal, - kStatsValueNameSentPingRequestsBeforeFirstResponse, - kStatsValueNameSentPingResponses, - kStatsValueNameRecvPingRequests, - kStatsValueNameRecvPingResponses, - kStatsValueNameSentStunKeepaliveRequests, - kStatsValueNameRecvStunKeepaliveResponses, - kStatsValueNameStunKeepaliveRttTotal, - kStatsValueNameStunKeepaliveRttSquaredTotal, - - // Internal StatsValue names. - kStatsValueNameAccelerateRate, - kStatsValueNameActualEncBitrate, - kStatsValueNameAdaptationChanges, - kStatsValueNameAvailableReceiveBandwidth, - kStatsValueNameAvailableSendBandwidth, - kStatsValueNameAvgEncodeMs, - kStatsValueNameBandwidthLimitedResolution, - kStatsValueNameBucketDelay, - kStatsValueNameCaptureStartNtpTimeMs, - kStatsValueNameCandidateIPAddress, - kStatsValueNameCandidateNetworkType, - kStatsValueNameCandidatePortNumber, - kStatsValueNameCandidatePriority, - kStatsValueNameCandidateTransportType, - kStatsValueNameCandidateType, - kStatsValueNameChannelId, - kStatsValueNameCodecName, - kStatsValueNameComponent, - kStatsValueNameContentName, - kStatsValueNameContentType, - kStatsValueNameCpuLimitedResolution, - kStatsValueNameCurrentDelayMs, - kStatsValueNameDecodeMs, - kStatsValueNameDecodingCNG, - kStatsValueNameDecodingCTN, - kStatsValueNameDecodingCTSG, - kStatsValueNameDecodingMutedOutput, - kStatsValueNameDecodingNormal, - kStatsValueNameDecodingPLC, - kStatsValueNameDecodingCodecPLC, - kStatsValueNameDecodingPLCCNG, - kStatsValueNameDer, - kStatsValueNameDtlsCipher, - kStatsValueNameEchoDelayMedian, - kStatsValueNameEchoDelayStdDev, - kStatsValueNameEchoReturnLoss, - kStatsValueNameEchoReturnLossEnhancement, - kStatsValueNameEncodeUsagePercent, - kStatsValueNameExpandRate, - kStatsValueNameFingerprint, - kStatsValueNameFingerprintAlgorithm, - kStatsValueNameFirsReceived, - kStatsValueNameFirsSent, - kStatsValueNameFirstFrameReceivedToDecodedMs, - kStatsValueNameFrameHeightInput, - kStatsValueNameFrameHeightReceived, - kStatsValueNameFrameHeightSent, - kStatsValueNameFrameRateDecoded, - kStatsValueNameFrameRateInput, - kStatsValueNameFrameRateOutput, - kStatsValueNameFrameRateReceived, - kStatsValueNameFrameRateSent, - kStatsValueNameFrameWidthInput, - kStatsValueNameFrameWidthReceived, - kStatsValueNameFrameWidthSent, - kStatsValueNameHasEnteredLowResolution, - kStatsValueNameHugeFramesSent, - kStatsValueNameInitiator, - kStatsValueNameInterframeDelayMaxMs, // Max over last 10 seconds. - kStatsValueNameIssuerId, - kStatsValueNameJitterBufferMs, - kStatsValueNameJitterReceived, - kStatsValueNameLabel, - kStatsValueNameLocalAddress, - kStatsValueNameLocalCandidateId, - kStatsValueNameLocalCandidateType, - kStatsValueNameLocalCertificateId, - kStatsValueNameMaxDecodeMs, - kStatsValueNameMinPlayoutDelayMs, - kStatsValueNameNacksReceived, - kStatsValueNameNacksSent, - kStatsValueNamePlisReceived, - kStatsValueNamePlisSent, - kStatsValueNamePreemptiveExpandRate, - kStatsValueNamePreferredJitterBufferMs, - kStatsValueNameRemoteAddress, - kStatsValueNameRemoteCandidateId, - kStatsValueNameRemoteCandidateType, - kStatsValueNameRemoteCertificateId, - kStatsValueNameRenderDelayMs, - kStatsValueNameResidualEchoLikelihood, - kStatsValueNameResidualEchoLikelihoodRecentMax, - kStatsValueNameAnaBitrateActionCounter, - kStatsValueNameAnaChannelActionCounter, - kStatsValueNameAnaDtxActionCounter, - kStatsValueNameAnaFecActionCounter, - kStatsValueNameAnaFrameLengthIncreaseCounter, - kStatsValueNameAnaFrameLengthDecreaseCounter, - kStatsValueNameAnaUplinkPacketLossFraction, - kStatsValueNameRetransmitBitrate, - kStatsValueNameRtt, - kStatsValueNameSecondaryDecodedRate, - kStatsValueNameSecondaryDiscardedRate, - kStatsValueNameSendPacketsDiscarded, - kStatsValueNameSpeechExpandRate, - kStatsValueNameSrtpCipher, - kStatsValueNameTargetDelayMs, - kStatsValueNameTargetEncBitrate, - kStatsValueNameTimingFrameInfo, // Result of `TimingFrameInfo::ToString` - kStatsValueNameTrackId, - kStatsValueNameTransmitBitrate, - kStatsValueNameTransportType, - kStatsValueNameWritable, - kStatsValueNameAudioDeviceUnderrunCounter, - kStatsValueNameLocalCandidateRelayProtocol, - }; - - class RTC_EXPORT IdBase : public rtc::RefCountInterface { - public: - ~IdBase() override; - StatsType type() const; - - // Users of IdBase will be using the Id typedef, which is compatible with - // this Equals() function. It simply calls the protected (and overridden) - // Equals() method. - bool Equals(const rtc::scoped_refptr& other) const { - return Equals(*other.get()); - } - - virtual std::string ToString() const = 0; - - protected: - // Protected since users of the IdBase type will be using the Id typedef. - virtual bool Equals(const IdBase& other) const; - - explicit IdBase(StatsType type); // Only meant for derived classes. - const StatsType type_; - - static const char kSeparator = '_'; - }; - - typedef rtc::scoped_refptr Id; - - struct RTC_EXPORT Value { - enum Type { - kInt, // int. - kInt64, // int64_t. - kFloat, // float. - kString, // std::string - kStaticString, // const char*. - kBool, // bool. - kId, // Id. - }; - - Value(StatsValueName name, int64_t value, Type int_type); - Value(StatsValueName name, float f); - Value(StatsValueName name, const std::string& value); - Value(StatsValueName name, const char* value); - Value(StatsValueName name, bool b); - Value(StatsValueName name, const Id& value); - - ~Value(); - - Value(const Value&) = delete; - Value& operator=(const Value&) = delete; - - // Support ref counting. Note that for performance reasons, we - // don't use thread safe operations. Therefore, all operations - // affecting the ref count (in practice, creation and copying of - // the Values mapping) must occur on webrtc's signalling thread. - int AddRef() const { - RTC_DCHECK_RUN_ON(&thread_checker_); - return ++ref_count_; - } - int Release() const { - RTC_DCHECK_RUN_ON(&thread_checker_); - int count = --ref_count_; - if (!count) - delete this; - return count; - } - - // TODO(tommi): This compares name as well as value... - // I think we should only need to compare the value part and - // move the name part into a hash map. - bool Equals(const Value& other) const; - - // Comparison operators. Return true iff the current instance is of the - // correct type and holds the same value. No conversion is performed so - // a string value of "123" is not equal to an int value of 123 and an int - // value of 123 is not equal to a float value of 123.0f. - // One exception to this is that types kInt and kInt64 can be compared and - // kString and kStaticString too. - bool operator==(const std::string& value) const; - bool operator==(const char* value) const; - bool operator==(int64_t value) const; - bool operator==(bool value) const; - bool operator==(float value) const; - bool operator==(const Id& value) const; - - // Getters that allow getting the native value directly. - // The caller must know the type beforehand or else hit a check. - int int_val() const; - int64_t int64_val() const; - float float_val() const; - const char* static_string_val() const; - const std::string& string_val() const; - bool bool_val() const; - const Id& id_val() const; - - // Returns the string representation of `name`. - const char* display_name() const; - - // Converts the native value to a string representation of the value. - std::string ToString() const; - - Type type() const { return type_; } - - // TODO(tommi): Move `name` and `display_name` out of the Value struct. - const StatsValueName name; - - private: - webrtc::SequenceChecker thread_checker_; - mutable int ref_count_ RTC_GUARDED_BY(thread_checker_) = 0; - - const Type type_; - // TODO(tommi): Use C++ 11 union and make value_ const. - union InternalType { - int int_; - int64_t int64_; - float float_; - bool bool_; - std::string* string_; - const char* static_string_; - Id* id_; - } value_; - }; - - typedef rtc::scoped_refptr ValuePtr; - typedef std::map Values; - - // Ownership of `id` is passed to `this`. - explicit StatsReport(const Id& id); - ~StatsReport(); - - StatsReport(const StatsReport&) = delete; - StatsReport& operator=(const StatsReport&) = delete; - - // Factory functions for various types of stats IDs. - static Id NewBandwidthEstimationId(); - static Id NewTypedId(StatsType type, const std::string& id); - static Id NewTypedIntId(StatsType type, int id); - static Id NewIdWithDirection(StatsType type, - const std::string& id, - Direction direction); - static Id NewCandidateId(bool local, const std::string& id); - static Id NewComponentId(const std::string& content_name, int component); - static Id NewCandidatePairId(const std::string& content_name, - int component, - int index); - - const Id& id() const { return id_; } - StatsType type() const { return id_->type(); } - double timestamp() const { return timestamp_; } - void set_timestamp(double t) { timestamp_ = t; } - bool empty() const { return values_.empty(); } - const Values& values() const { return values_; } - - const char* TypeToString() const; - - void AddString(StatsValueName name, const std::string& value); - void AddString(StatsValueName name, const char* value); - void AddInt64(StatsValueName name, int64_t value); - void AddInt(StatsValueName name, int value); - void AddFloat(StatsValueName name, float value); - void AddBoolean(StatsValueName name, bool value); - void AddId(StatsValueName name, const Id& value); - - const Value* FindValue(StatsValueName name) const; - - private: - // The unique identifier for this object. - // This is used as a key for this report in ordered containers, - // so it must never be changed. - const Id id_; - double timestamp_; // Time since 1970-01-01T00:00:00Z in milliseconds. - Values values_; -}; - -// Typedef for an array of const StatsReport pointers. -// Ownership of the pointers held by this implementation is assumed to lie -// elsewhere and lifetime guarantees are made by the implementation that uses -// this type. In the StatsCollector, object ownership lies with the -// StatsCollection class. -typedef std::vector StatsReports; - -// A map from the report id to the report. -// This class wraps an STL container and provides a limited set of -// functionality in order to keep things simple. -class StatsCollection { - public: - StatsCollection(); - ~StatsCollection(); - - typedef std::list Container; - typedef Container::iterator iterator; - typedef Container::const_iterator const_iterator; - - const_iterator begin() const; - const_iterator end() const; - size_t size() const; - - // Creates a new report object with `id` that does not already - // exist in the list of reports. - StatsReport* InsertNew(const StatsReport::Id& id); - StatsReport* FindOrAddNew(const StatsReport::Id& id); - StatsReport* ReplaceOrAddNew(const StatsReport::Id& id); - - // Looks for a report with the given `id`. If one is not found, null - // will be returned. - StatsReport* Find(const StatsReport::Id& id); - - private: - Container list_; - webrtc::SequenceChecker thread_checker_; -}; - -} // namespace webrtc +// TODO(https://crbug.com/webrtc/14180): When downstream dependencies are +// including legacy_stats_types.h directly (or use spec-compliant stats) instead +// of this file, delete it. +#include "api/legacy_stats_types.h" #endif // API_STATS_TYPES_H_ diff --git a/pc/legacy_stats_collector.h b/pc/legacy_stats_collector.h index 21f51c5143..cedd36c853 100644 --- a/pc/legacy_stats_collector.h +++ b/pc/legacy_stats_collector.h @@ -27,10 +27,10 @@ #include "absl/types/optional.h" #include "api/field_trials_view.h" +#include "api/legacy_stats_types.h" #include "api/media_stream_interface.h" #include "api/peer_connection_interface.h" #include "api/scoped_refptr.h" -#include "api/stats_types.h" #include "p2p/base/connection_info.h" #include "p2p/base/port.h" #include "pc/legacy_stats_collector_interface.h" diff --git a/pc/peer_connection_message_handler.cc b/pc/peer_connection_message_handler.cc index 2d674aad4d..8ddeddea58 100644 --- a/pc/peer_connection_message_handler.cc +++ b/pc/peer_connection_message_handler.cc @@ -13,11 +13,11 @@ #include #include "api/jsep.h" +#include "api/legacy_stats_types.h" #include "api/media_stream_interface.h" #include "api/peer_connection_interface.h" #include "api/scoped_refptr.h" #include "api/sequence_checker.h" -#include "api/stats_types.h" #include "api/task_queue/pending_task_safety_flag.h" #include "pc/legacy_stats_collector_interface.h" #include "rtc_base/checks.h" diff --git a/pc/peer_connection_message_handler.h b/pc/peer_connection_message_handler.h index 1351a279b6..8bd0e5ebb1 100644 --- a/pc/peer_connection_message_handler.h +++ b/pc/peer_connection_message_handler.h @@ -14,10 +14,10 @@ #include #include "api/jsep.h" +#include "api/legacy_stats_types.h" #include "api/media_stream_interface.h" #include "api/peer_connection_interface.h" #include "api/rtc_error.h" -#include "api/stats_types.h" #include "api/task_queue/pending_task_safety_flag.h" #include "api/task_queue/task_queue_base.h" #include "pc/legacy_stats_collector_interface.h"