blob: c1922a8a227456becd7076c0e3368bf40755b658 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
11// This file contains structures used for retrieving statistics from an ongoing
12// libjingle session.
13
Steve Anton10542f22019-01-11 09:11:00 -080014#ifndef API_STATS_TYPES_H_
15#define API_STATS_TYPES_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
tommi@webrtc.org5c3ee4b2014-12-09 10:47:01 +000017#include <algorithm>
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000018#include <list>
tommi@webrtc.org92f40182015-03-04 15:25:19 +000019#include <map>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020#include <string>
oprypin803dc292017-02-01 01:55:59 -080021#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022
Mirko Bonadeid9708072019-01-25 20:26:48 +010023#include "api/scoped_refptr.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "rtc_base/constructor_magic.h"
25#include "rtc_base/ref_count.h"
Steve Anton10542f22019-01-11 09:11:00 -080026#include "rtc_base/string_encode.h"
Mirko Bonadei35214fc2019-09-23 14:54:28 +020027#include "rtc_base/system/rtc_export.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "rtc_base/thread_checker.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
30namespace webrtc {
31
Mirko Bonadei35214fc2019-09-23 14:54:28 +020032class RTC_EXPORT StatsReport {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000033 public:
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000034 // Indicates whether a track is for sending or receiving.
35 // Used in reports for audio/video tracks.
36 enum Direction {
37 kSend = 0,
38 kReceive,
39 };
tommi@webrtc.orgaa2c3422014-12-09 20:23:06 +000040
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000041 enum StatsType {
42 // StatsReport types.
43 // A StatsReport of |type| = "googSession" contains overall information
44 // about the thing libjingle calls a session (which may contain one
45 // or more RTP sessions.
46 kStatsReportTypeSession,
tommi@webrtc.org5b06b062014-08-15 08:38:30 +000047
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000048 // A StatsReport of |type| = "googTransport" contains information
49 // about a libjingle "transport".
50 kStatsReportTypeTransport,
tommi@webrtc.orgc9d155f2014-12-09 18:18:06 +000051
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000052 // A StatsReport of |type| = "googComponent" contains information
53 // about a libjingle "channel" (typically, RTP or RTCP for a transport).
54 // This is intended to be the same thing as an ICE "Component".
55 kStatsReportTypeComponent,
tommi@webrtc.org5b06b062014-08-15 08:38:30 +000056
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000057 // A StatsReport of |type| = "googCandidatePair" contains information
58 // about a libjingle "connection" - a single source/destination port pair.
59 // This is intended to be the same thing as an ICE "candidate pair".
60 kStatsReportTypeCandidatePair,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000062 // A StatsReport of |type| = "VideoBWE" is statistics for video Bandwidth
63 // Estimation, which is global per-session. The |id| field is "bweforvideo"
64 // (will probably change in the future).
65 kStatsReportTypeBwe,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +000067 // A StatsReport of |type| = "ssrc" is statistics for a specific rtp stream.
68 // The |id| field is the SSRC in decimal form of the rtp stream.
69 kStatsReportTypeSsrc,
70
71 // A StatsReport of |type| = "remoteSsrc" is statistics for a specific
72 // rtp stream, generated by the remote end of the connection.
73 kStatsReportTypeRemoteSsrc,
74
75 // A StatsReport of |type| = "googTrack" is statistics for a specific media
76 // track. The |id| field is the track id.
77 kStatsReportTypeTrack,
78
79 // A StatsReport of |type| = "localcandidate" or "remotecandidate" is
80 // attributes on a specific ICE Candidate. It links to its connection pair
81 // by candidate id. The string value is taken from
82 // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
83 kStatsReportTypeIceLocalCandidate,
84 kStatsReportTypeIceRemoteCandidate,
85
86 // A StatsReport of |type| = "googCertificate" contains an SSL certificate
87 // transmitted by one of the endpoints of this connection. The |id| is
88 // controlled by the fingerprint, and is used to identify the certificate in
89 // the Channel stats (as "googLocalCertificateId" or
90 // "googRemoteCertificateId") and in any child certificates (as
91 // "googIssuerId").
92 kStatsReportTypeCertificate,
93
94 // A StatsReport of |type| = "datachannel" with statistics for a
95 // particular DataChannel.
96 kStatsReportTypeDataChannel,
97 };
98
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +000099 enum StatsValueName {
100 kStatsValueNameActiveConnection,
Minyue2a8a78c2016-04-07 16:48:15 +0200101 kStatsValueNameAecDivergentFilterFraction,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000102 kStatsValueNameAudioInputLevel,
103 kStatsValueNameAudioOutputLevel,
104 kStatsValueNameBytesReceived,
105 kStatsValueNameBytesSent,
Peter Boströmb7d9a972015-12-18 16:01:11 +0100106 kStatsValueNameCodecImplementationName,
Steve Anton2dbc69f2017-08-24 17:15:13 -0700107 kStatsValueNameConcealedSamples,
Gustaf Ullberg9a2e9062017-09-18 09:28:20 +0200108 kStatsValueNameConcealmentEvents,
decurtis@webrtc.org487a4442015-01-15 22:55:07 +0000109 kStatsValueNameDataChannelId,
sakale5ba44e2016-10-26 07:09:24 -0700110 kStatsValueNameFramesDecoded,
sakal43536c32016-10-24 01:46:43 -0700111 kStatsValueNameFramesEncoded,
Gustaf Ullbergb0a02072017-10-02 12:00:34 +0200112 kStatsValueNameJitterBufferDelay,
fippobec70ab2016-01-28 01:27:15 -0800113 kStatsValueNameMediaType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000114 kStatsValueNamePacketsLost,
115 kStatsValueNamePacketsReceived,
116 kStatsValueNamePacketsSent,
decurtis@webrtc.org487a4442015-01-15 22:55:07 +0000117 kStatsValueNameProtocol,
sakal87da4042016-10-31 06:53:47 -0700118 kStatsValueNameQpSum,
Peter Thatcher04ac81f2015-09-21 11:48:28 -0700119 kStatsValueNameReceiving,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000120 kStatsValueNameSelectedCandidatePairId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000121 kStatsValueNameSsrc,
decurtis@webrtc.org487a4442015-01-15 22:55:07 +0000122 kStatsValueNameState,
zsteine76bd3a2017-07-14 12:17:49 -0700123 kStatsValueNameTotalAudioEnergy,
124 kStatsValueNameTotalSamplesDuration,
Steve Anton2dbc69f2017-08-24 17:15:13 -0700125 kStatsValueNameTotalSamplesReceived,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000126 kStatsValueNameTransportId,
zhihuang5ecf16c2016-06-01 17:09:15 -0700127 kStatsValueNameSentPingRequestsTotal,
128 kStatsValueNameSentPingRequestsBeforeFirstResponse,
129 kStatsValueNameSentPingResponses,
130 kStatsValueNameRecvPingRequests,
131 kStatsValueNameRecvPingResponses,
Qingsi Wang72a43a12018-02-20 16:03:18 -0800132 kStatsValueNameSentStunKeepaliveRequests,
133 kStatsValueNameRecvStunKeepaliveResponses,
134 kStatsValueNameStunKeepaliveRttTotal,
135 kStatsValueNameStunKeepaliveRttSquaredTotal,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000136
137 // Internal StatsValue names.
Henrik Lundin8e6fd462015-06-02 09:24:52 +0200138 kStatsValueNameAccelerateRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000139 kStatsValueNameActualEncBitrate,
140 kStatsValueNameAdaptationChanges,
141 kStatsValueNameAvailableReceiveBandwidth,
142 kStatsValueNameAvailableSendBandwidth,
143 kStatsValueNameAvgEncodeMs,
144 kStatsValueNameBandwidthLimitedResolution,
145 kStatsValueNameBucketDelay,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000146 kStatsValueNameCaptureStartNtpTimeMs,
guoweis@webrtc.org950c5182014-12-16 23:01:31 +0000147 kStatsValueNameCandidateIPAddress,
148 kStatsValueNameCandidateNetworkType,
149 kStatsValueNameCandidatePortNumber,
150 kStatsValueNameCandidatePriority,
151 kStatsValueNameCandidateTransportType,
152 kStatsValueNameCandidateType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000153 kStatsValueNameChannelId,
154 kStatsValueNameCodecName,
155 kStatsValueNameComponent,
156 kStatsValueNameContentName,
ilnik2e1b40b2017-09-04 07:57:17 -0700157 kStatsValueNameContentType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000158 kStatsValueNameCpuLimitedResolution,
159 kStatsValueNameCurrentDelayMs,
160 kStatsValueNameDecodeMs,
161 kStatsValueNameDecodingCNG,
162 kStatsValueNameDecodingCTN,
163 kStatsValueNameDecodingCTSG,
henrik.lundin63489782016-09-20 01:47:12 -0700164 kStatsValueNameDecodingMutedOutput,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000165 kStatsValueNameDecodingNormal,
166 kStatsValueNameDecodingPLC,
Alex Narest5b5d97c2019-08-07 18:15:08 +0200167 kStatsValueNameDecodingCodecPLC,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000168 kStatsValueNameDecodingPLCCNG,
169 kStatsValueNameDer,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000170 kStatsValueNameDtlsCipher,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000171 kStatsValueNameEchoDelayMedian,
172 kStatsValueNameEchoDelayStdDev,
173 kStatsValueNameEchoReturnLoss,
174 kStatsValueNameEchoReturnLossEnhancement,
175 kStatsValueNameEncodeUsagePercent,
176 kStatsValueNameExpandRate,
177 kStatsValueNameFingerprint,
178 kStatsValueNameFingerprintAlgorithm,
179 kStatsValueNameFirsReceived,
180 kStatsValueNameFirsSent,
Benjamin Wright514f0842018-12-10 09:55:17 -0800181 kStatsValueNameFirstFrameReceivedToDecodedMs,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000182 kStatsValueNameFrameHeightInput,
183 kStatsValueNameFrameHeightReceived,
184 kStatsValueNameFrameHeightSent,
185 kStatsValueNameFrameRateDecoded,
186 kStatsValueNameFrameRateInput,
187 kStatsValueNameFrameRateOutput,
188 kStatsValueNameFrameRateReceived,
189 kStatsValueNameFrameRateSent,
190 kStatsValueNameFrameWidthInput,
191 kStatsValueNameFrameWidthReceived,
192 kStatsValueNameFrameWidthSent,
Ă…sa Perssonc3ed6302017-11-16 14:04:52 +0100193 kStatsValueNameHasEnteredLowResolution,
Ilya Nikolaevskiy70473fc2018-02-28 16:35:03 +0100194 kStatsValueNameHugeFramesSent,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000195 kStatsValueNameInitiator,
ilnik2e1b40b2017-09-04 07:57:17 -0700196 kStatsValueNameInterframeDelayMaxMs, // Max over last 10 seconds.
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000197 kStatsValueNameIssuerId,
198 kStatsValueNameJitterBufferMs,
199 kStatsValueNameJitterReceived,
decurtis@webrtc.org487a4442015-01-15 22:55:07 +0000200 kStatsValueNameLabel,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000201 kStatsValueNameLocalAddress,
guoweis@webrtc.org950c5182014-12-16 23:01:31 +0000202 kStatsValueNameLocalCandidateId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000203 kStatsValueNameLocalCandidateType,
204 kStatsValueNameLocalCertificateId,
205 kStatsValueNameMaxDecodeMs,
206 kStatsValueNameMinPlayoutDelayMs,
207 kStatsValueNameNacksReceived,
208 kStatsValueNameNacksSent,
209 kStatsValueNamePlisReceived,
210 kStatsValueNamePlisSent,
Henrik Lundin8e6fd462015-06-02 09:24:52 +0200211 kStatsValueNamePreemptiveExpandRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000212 kStatsValueNamePreferredJitterBufferMs,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000213 kStatsValueNameRemoteAddress,
guoweis@webrtc.org950c5182014-12-16 23:01:31 +0000214 kStatsValueNameRemoteCandidateId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000215 kStatsValueNameRemoteCandidateType,
216 kStatsValueNameRemoteCertificateId,
217 kStatsValueNameRenderDelayMs,
ivoc8c63a822016-10-21 04:10:03 -0700218 kStatsValueNameResidualEchoLikelihood,
ivoc4e477a12017-01-15 08:29:46 -0800219 kStatsValueNameResidualEchoLikelihoodRecentMax,
ivoce1198e02017-09-08 08:13:19 -0700220 kStatsValueNameAnaBitrateActionCounter,
221 kStatsValueNameAnaChannelActionCounter,
222 kStatsValueNameAnaDtxActionCounter,
223 kStatsValueNameAnaFecActionCounter,
ivoc0d0b9122017-09-08 13:24:21 -0700224 kStatsValueNameAnaFrameLengthIncreaseCounter,
225 kStatsValueNameAnaFrameLengthDecreaseCounter,
226 kStatsValueNameAnaUplinkPacketLossFraction,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000227 kStatsValueNameRetransmitBitrate,
228 kStatsValueNameRtt,
minyue@webrtc.org652bc372015-02-18 23:50:46 +0000229 kStatsValueNameSecondaryDecodedRate,
minyue-webrtc0e320ec2017-08-28 13:51:27 +0200230 kStatsValueNameSecondaryDiscardedRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000231 kStatsValueNameSendPacketsDiscarded,
minyue@webrtc.org652bc372015-02-18 23:50:46 +0000232 kStatsValueNameSpeechExpandRate,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000233 kStatsValueNameSrtpCipher,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000234 kStatsValueNameTargetDelayMs,
235 kStatsValueNameTargetEncBitrate,
ilnik2edc6842017-07-06 03:06:50 -0700236 kStatsValueNameTimingFrameInfo, // Result of |TimingFrameInfo::ToString|
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000237 kStatsValueNameTrackId,
238 kStatsValueNameTransmitBitrate,
239 kStatsValueNameTransportType,
240 kStatsValueNameTypingNoiseState,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000241 kStatsValueNameWritable,
Alex Narestbbeb1092019-08-16 11:49:04 +0200242 kStatsValueNameAudioDeviceUnderrunCounter,
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000243 };
244
Mirko Bonadei051cae52019-11-12 13:01:23 +0100245 class RTC_EXPORT IdBase : public rtc::RefCountInterface {
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000246 public:
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000247 ~IdBase() override;
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000248 StatsType type() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000249
250 // Users of IdBase will be using the Id typedef, which is compatible with
251 // this Equals() function. It simply calls the protected (and overridden)
252 // Equals() method.
253 bool Equals(const rtc::scoped_refptr<IdBase>& other) const {
254 return Equals(*other.get());
255 }
256
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000257 virtual std::string ToString() const = 0;
258
259 protected:
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000260 // Protected since users of the IdBase type will be using the Id typedef.
261 virtual bool Equals(const IdBase& other) const;
262
oprypin803dc292017-02-01 01:55:59 -0800263 explicit IdBase(StatsType type); // Only meant for derived classes.
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000264 const StatsType type_;
decurtis@webrtc.org322a5642015-02-03 22:09:37 +0000265
266 static const char kSeparator = '_';
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000267 };
268
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000269 typedef rtc::scoped_refptr<IdBase> Id;
270
Mirko Bonadei051cae52019-11-12 13:01:23 +0100271 struct RTC_EXPORT Value {
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000272 enum Type {
Peter Boström0c4e06b2015-10-07 12:23:21 +0200273 kInt, // int.
274 kInt64, // int64_t.
275 kFloat, // float.
276 kString, // std::string
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000277 kStaticString, // const char*.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200278 kBool, // bool.
279 kId, // Id.
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000280 };
281
Peter Boström0c4e06b2015-10-07 12:23:21 +0200282 Value(StatsValueName name, int64_t value, Type int_type);
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000283 Value(StatsValueName name, float f);
tommi@webrtc.orgc9d155f2014-12-09 18:18:06 +0000284 Value(StatsValueName name, const std::string& value);
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000285 Value(StatsValueName name, const char* value);
286 Value(StatsValueName name, bool b);
287 Value(StatsValueName name, const Id& value);
288
289 ~Value();
290
nisse6da303d2017-01-18 06:10:54 -0800291 // Support ref counting. Note that for performance reasons, we
292 // don't use thread safe operations. Therefore, all operations
293 // affecting the ref count (in practice, creation and copying of
294 // the Values mapping) must occur on webrtc's signalling thread.
295 int AddRef() const {
296 RTC_DCHECK_RUN_ON(&thread_checker_);
297 return ++ref_count_;
298 }
299 int Release() const {
300 RTC_DCHECK_RUN_ON(&thread_checker_);
301 int count = --ref_count_;
302 if (!count)
303 delete this;
304 return count;
305 }
306
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000307 // TODO(tommi): This compares name as well as value...
308 // I think we should only need to compare the value part and
309 // move the name part into a hash map.
310 bool Equals(const Value& other) const;
311
312 // Comparison operators. Return true iff the current instance is of the
313 // correct type and holds the same value. No conversion is performed so
314 // a string value of "123" is not equal to an int value of 123 and an int
315 // value of 123 is not equal to a float value of 123.0f.
316 // One exception to this is that types kInt and kInt64 can be compared and
317 // kString and kStaticString too.
318 bool operator==(const std::string& value) const;
319 bool operator==(const char* value) const;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200320 bool operator==(int64_t value) const;
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000321 bool operator==(bool value) const;
322 bool operator==(float value) const;
323 bool operator==(const Id& value) const;
324
325 // Getters that allow getting the native value directly.
326 // The caller must know the type beforehand or else hit a check.
327 int int_val() const;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200328 int64_t int64_val() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000329 float float_val() const;
330 const char* static_string_val() const;
331 const std::string& string_val() const;
332 bool bool_val() const;
333 const Id& id_val() const;
tommi@webrtc.org242068d2014-07-14 20:19:56 +0000334
tommi@webrtc.orgc57310b2014-12-12 17:41:28 +0000335 // Returns the string representation of |name|.
tommi@webrtc.orgc9d155f2014-12-09 18:18:06 +0000336 const char* display_name() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000337
338 // Converts the native value to a string representation of the value.
339 std::string ToString() const;
340
341 Type type() const { return type_; }
342
tommi@webrtc.org92f40182015-03-04 15:25:19 +0000343 // TODO(tommi): Move |name| and |display_name| out of the Value struct.
tommi@webrtc.org242068d2014-07-14 20:19:56 +0000344 const StatsValueName name;
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000345
346 private:
nisse6da303d2017-01-18 06:10:54 -0800347 rtc::ThreadChecker thread_checker_;
Niels Möller1e062892018-02-07 10:18:32 +0100348 mutable int ref_count_ RTC_GUARDED_BY(thread_checker_) = 0;
nisse6da303d2017-01-18 06:10:54 -0800349
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000350 const Type type_;
351 // TODO(tommi): Use C++ 11 union and make value_ const.
352 union InternalType {
353 int int_;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200354 int64_t int64_;
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000355 float float_;
356 bool bool_;
357 std::string* string_;
358 const char* static_string_;
359 Id* id_;
360 } value_;
tommi@webrtc.org242068d2014-07-14 20:19:56 +0000361
henrikg3c089d72015-09-16 05:37:44 -0700362 RTC_DISALLOW_COPY_AND_ASSIGN(Value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000363 };
364
nisse6da303d2017-01-18 06:10:54 -0800365 typedef rtc::scoped_refptr<Value> ValuePtr;
tommi@webrtc.org92f40182015-03-04 15:25:19 +0000366 typedef std::map<StatsValueName, ValuePtr> Values;
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000367
368 // Ownership of |id| is passed to |this|.
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000369 explicit StatsReport(const Id& id);
ossu7bb87ee2017-01-23 04:56:25 -0800370 ~StatsReport();
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000371
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000372 // Factory functions for various types of stats IDs.
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000373 static Id NewBandwidthEstimationId();
374 static Id NewTypedId(StatsType type, const std::string& id);
375 static Id NewTypedIntId(StatsType type, int id);
Yves Gerey665174f2018-06-19 15:03:05 +0200376 static Id NewIdWithDirection(StatsType type,
377 const std::string& id,
378 Direction direction);
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000379 static Id NewCandidateId(bool local, const std::string& id);
Yves Gerey665174f2018-06-19 15:03:05 +0200380 static Id NewComponentId(const std::string& content_name, int component);
381 static Id NewCandidatePairId(const std::string& content_name,
382 int component,
383 int index);
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000384
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000385 const Id& id() const { return id_; }
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000386 StatsType type() const { return id_->type(); }
387 double timestamp() const { return timestamp_; }
388 void set_timestamp(double t) { timestamp_ = t; }
tommi@webrtc.org92f40182015-03-04 15:25:19 +0000389 bool empty() const { return values_.empty(); }
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000390 const Values& values() const { return values_; }
391
392 const char* TypeToString() const;
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000393
tommi@webrtc.org92f40182015-03-04 15:25:19 +0000394 void AddString(StatsValueName name, const std::string& value);
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000395 void AddString(StatsValueName name, const char* value);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200396 void AddInt64(StatsValueName name, int64_t value);
tommi@webrtc.org92f40182015-03-04 15:25:19 +0000397 void AddInt(StatsValueName name, int value);
398 void AddFloat(StatsValueName name, float value);
tommi@webrtc.org242068d2014-07-14 20:19:56 +0000399 void AddBoolean(StatsValueName name, bool value);
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000400 void AddId(StatsValueName name, const Id& value);
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000401
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000402 const Value* FindValue(StatsValueName name) const;
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000403
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000404 private:
405 // The unique identifier for this object.
406 // This is used as a key for this report in ordered containers,
407 // so it must never be changed.
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000408 const Id id_;
tommi@webrtc.org8e327c42015-01-19 20:41:26 +0000409 double timestamp_; // Time since 1970-01-01T00:00:00Z in milliseconds.
410 Values values_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411
henrikg3c089d72015-09-16 05:37:44 -0700412 RTC_DISALLOW_COPY_AND_ASSIGN(StatsReport);
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000413};
414
415// Typedef for an array of const StatsReport pointers.
416// Ownership of the pointers held by this implementation is assumed to lie
417// elsewhere and lifetime guarantees are made by the implementation that uses
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000418// this type. In the StatsCollector, object ownership lies with the
419// StatsCollection class.
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000420typedef std::vector<const StatsReport*> StatsReports;
421
422// A map from the report id to the report.
423// This class wraps an STL container and provides a limited set of
424// functionality in order to keep things simple.
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000425class StatsCollection {
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000426 public:
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000427 StatsCollection();
428 ~StatsCollection();
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000429
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000430 typedef std::list<StatsReport*> Container;
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000431 typedef Container::iterator iterator;
432 typedef Container::const_iterator const_iterator;
433
tommi@webrtc.orgc9d155f2014-12-09 18:18:06 +0000434 const_iterator begin() const;
435 const_iterator end() const;
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000436 size_t size() const;
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000437
438 // Creates a new report object with |id| that does not already
439 // exist in the list of reports.
tommi@webrtc.orgd3900292015-03-12 16:35:55 +0000440 StatsReport* InsertNew(const StatsReport::Id& id);
441 StatsReport* FindOrAddNew(const StatsReport::Id& id);
442 StatsReport* ReplaceOrAddNew(const StatsReport::Id& id);
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000443
deadbeef8d60a942017-02-27 14:47:33 -0800444 // Looks for a report with the given |id|. If one is not found, null
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000445 // will be returned.
tommi@webrtc.org4fb7e252015-01-21 11:36:18 +0000446 StatsReport* Find(const StatsReport::Id& id);
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000447
448 private:
449 Container list_;
jbauch25c96d02015-08-07 09:48:18 -0700450 rtc::ThreadChecker thread_checker_;
tommi@webrtc.org5b06b062014-08-15 08:38:30 +0000451};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452
453} // namespace webrtc
454
Steve Anton10542f22019-01-11 09:11:00 -0800455#endif // API_STATS_TYPES_H_