mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00
Rename api/stats_types.h to api/legacy_stats_types.h.
As to not break downstream projects, the old name api/stats_types.h is kept around to help include api/legacy_stats_types.h. We can delete this in a follow-up. NOTRY=True Bug: webrtc:14180 Change-Id: I270ca5e366ae36e324cbc9f982bbb066ab92d203 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/283081 Commit-Queue: Henrik Boström <hbos@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#38610}
This commit is contained in:
parent
95c950af03
commit
3e6931b183
9 changed files with 468 additions and 448 deletions
|
@ -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",
|
||||
|
|
2
api/DEPS
2
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",
|
||||
],
|
||||
|
|
|
@ -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 <string.h>
|
||||
|
455
api/legacy_stats_types.h
Normal file
455
api/legacy_stats_types.h
Normal file
|
@ -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 <algorithm>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#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<IdBase>& 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<IdBase> 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<Value> ValuePtr;
|
||||
typedef std::map<StatsValueName, ValuePtr> 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<const StatsReport*> 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<StatsReport*> 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_
|
|
@ -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"
|
||||
|
|
|
@ -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 <algorithm>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#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<IdBase>& 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<IdBase> 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<Value> ValuePtr;
|
||||
typedef std::map<StatsValueName, ValuePtr> 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<const StatsReport*> 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<StatsReport*> 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_
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -13,11 +13,11 @@
|
|||
#include <utility>
|
||||
|
||||
#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"
|
||||
|
|
|
@ -14,10 +14,10 @@
|
|||
#include <functional>
|
||||
|
||||
#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"
|
||||
|
|
Loading…
Reference in a new issue