blob: f910b4a1648399ad42c09469579957d6b1158560 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:363 *
kjellanderb24317b2016-02-10 15:54:434 * 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:369 */
10
11// This file contains structures used for retrieving statistics from an ongoing
12// libjingle session.
13
Steve Anton10542f22019-01-11 17:11:0014#ifndef API_STATS_TYPES_H_
15#define API_STATS_TYPES_H_
henrike@webrtc.org28e20752013-07-10 00:45:3616
tommi@webrtc.org5c3ee4b2014-12-09 10:47:0117#include <algorithm>
tommi@webrtc.org4fb7e252015-01-21 11:36:1818#include <list>
tommi@webrtc.org92f40182015-03-04 15:25:1919#include <map>
henrike@webrtc.org28e20752013-07-10 00:45:3620#include <string>
oprypin803dc292017-02-01 09:55:5921#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:3622
Mirko Bonadeid9708072019-01-25 19:26:4823#include "api/scoped_refptr.h"
Artem Titov06159aa2021-02-09 22:38:1324#include "api/sequence_checker.h"
Steve Anton10542f22019-01-11 17:11:0025#include "rtc_base/constructor_magic.h"
26#include "rtc_base/ref_count.h"
Steve Anton10542f22019-01-11 17:11:0027#include "rtc_base/string_encode.h"
Mirko Bonadei35214fc2019-09-23 12:54:2828#include "rtc_base/system/rtc_export.h"
henrike@webrtc.org28e20752013-07-10 00:45:3629
30namespace webrtc {
31
Mirko Bonadei35214fc2019-09-23 12:54:2832class RTC_EXPORT StatsReport {
henrike@webrtc.org28e20752013-07-10 00:45:3633 public:
tommi@webrtc.org4fb7e252015-01-21 11:36:1834 // 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:0640
tommi@webrtc.org4fb7e252015-01-21 11:36:1841 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:3047
tommi@webrtc.org4fb7e252015-01-21 11:36:1848 // A StatsReport of |type| = "googTransport" contains information
49 // about a libjingle "transport".
50 kStatsReportTypeTransport,
tommi@webrtc.orgc9d155f2014-12-09 18:18:0651
tommi@webrtc.org4fb7e252015-01-21 11:36:1852 // 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:3056
tommi@webrtc.org4fb7e252015-01-21 11:36:1857 // 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:3661
tommi@webrtc.org4fb7e252015-01-21 11:36:1862 // 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:3666
tommi@webrtc.org4fb7e252015-01-21 11:36:1867 // 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:2899 enum StatsValueName {
100 kStatsValueNameActiveConnection,
Minyue2a8a78c2016-04-07 14:48:15101 kStatsValueNameAecDivergentFilterFraction,
tommi@webrtc.orgc57310b2014-12-12 17:41:28102 kStatsValueNameAudioInputLevel,
103 kStatsValueNameAudioOutputLevel,
104 kStatsValueNameBytesReceived,
105 kStatsValueNameBytesSent,
Peter Boströmb7d9a972015-12-18 15:01:11106 kStatsValueNameCodecImplementationName,
Steve Anton2dbc69f2017-08-25 00:15:13107 kStatsValueNameConcealedSamples,
Gustaf Ullberg9a2e9062017-09-18 07:28:20108 kStatsValueNameConcealmentEvents,
decurtis@webrtc.org487a4442015-01-15 22:55:07109 kStatsValueNameDataChannelId,
sakale5ba44e2016-10-26 14:09:24110 kStatsValueNameFramesDecoded,
sakal43536c32016-10-24 08:46:43111 kStatsValueNameFramesEncoded,
Gustaf Ullbergb0a02072017-10-02 10:00:34112 kStatsValueNameJitterBufferDelay,
fippobec70ab2016-01-28 09:27:15113 kStatsValueNameMediaType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28114 kStatsValueNamePacketsLost,
115 kStatsValueNamePacketsReceived,
116 kStatsValueNamePacketsSent,
decurtis@webrtc.org487a4442015-01-15 22:55:07117 kStatsValueNameProtocol,
sakal87da4042016-10-31 13:53:47118 kStatsValueNameQpSum,
Peter Thatcher04ac81f2015-09-21 18:48:28119 kStatsValueNameReceiving,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30120 kStatsValueNameSelectedCandidatePairId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28121 kStatsValueNameSsrc,
decurtis@webrtc.org487a4442015-01-15 22:55:07122 kStatsValueNameState,
zsteine76bd3a2017-07-14 19:17:49123 kStatsValueNameTotalAudioEnergy,
124 kStatsValueNameTotalSamplesDuration,
Steve Anton2dbc69f2017-08-25 00:15:13125 kStatsValueNameTotalSamplesReceived,
tommi@webrtc.orgc57310b2014-12-12 17:41:28126 kStatsValueNameTransportId,
zhihuang5ecf16c2016-06-02 00:09:15127 kStatsValueNameSentPingRequestsTotal,
128 kStatsValueNameSentPingRequestsBeforeFirstResponse,
129 kStatsValueNameSentPingResponses,
130 kStatsValueNameRecvPingRequests,
131 kStatsValueNameRecvPingResponses,
Qingsi Wang72a43a12018-02-21 00:03:18132 kStatsValueNameSentStunKeepaliveRequests,
133 kStatsValueNameRecvStunKeepaliveResponses,
134 kStatsValueNameStunKeepaliveRttTotal,
135 kStatsValueNameStunKeepaliveRttSquaredTotal,
tommi@webrtc.orgc57310b2014-12-12 17:41:28136
137 // Internal StatsValue names.
Henrik Lundin8e6fd462015-06-02 07:24:52138 kStatsValueNameAccelerateRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28139 kStatsValueNameActualEncBitrate,
140 kStatsValueNameAdaptationChanges,
141 kStatsValueNameAvailableReceiveBandwidth,
142 kStatsValueNameAvailableSendBandwidth,
143 kStatsValueNameAvgEncodeMs,
144 kStatsValueNameBandwidthLimitedResolution,
145 kStatsValueNameBucketDelay,
tommi@webrtc.orgc57310b2014-12-12 17:41:28146 kStatsValueNameCaptureStartNtpTimeMs,
guoweis@webrtc.org950c5182014-12-16 23:01:31147 kStatsValueNameCandidateIPAddress,
148 kStatsValueNameCandidateNetworkType,
149 kStatsValueNameCandidatePortNumber,
150 kStatsValueNameCandidatePriority,
151 kStatsValueNameCandidateTransportType,
152 kStatsValueNameCandidateType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28153 kStatsValueNameChannelId,
154 kStatsValueNameCodecName,
155 kStatsValueNameComponent,
156 kStatsValueNameContentName,
ilnik2e1b40b2017-09-04 14:57:17157 kStatsValueNameContentType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28158 kStatsValueNameCpuLimitedResolution,
159 kStatsValueNameCurrentDelayMs,
160 kStatsValueNameDecodeMs,
161 kStatsValueNameDecodingCNG,
162 kStatsValueNameDecodingCTN,
163 kStatsValueNameDecodingCTSG,
henrik.lundin63489782016-09-20 08:47:12164 kStatsValueNameDecodingMutedOutput,
tommi@webrtc.orgc57310b2014-12-12 17:41:28165 kStatsValueNameDecodingNormal,
166 kStatsValueNameDecodingPLC,
Alex Narest5b5d97c2019-08-07 16:15:08167 kStatsValueNameDecodingCodecPLC,
tommi@webrtc.orgc57310b2014-12-12 17:41:28168 kStatsValueNameDecodingPLCCNG,
169 kStatsValueNameDer,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30170 kStatsValueNameDtlsCipher,
tommi@webrtc.orgc57310b2014-12-12 17:41:28171 kStatsValueNameEchoDelayMedian,
172 kStatsValueNameEchoDelayStdDev,
173 kStatsValueNameEchoReturnLoss,
174 kStatsValueNameEchoReturnLossEnhancement,
175 kStatsValueNameEncodeUsagePercent,
176 kStatsValueNameExpandRate,
177 kStatsValueNameFingerprint,
178 kStatsValueNameFingerprintAlgorithm,
179 kStatsValueNameFirsReceived,
180 kStatsValueNameFirsSent,
Benjamin Wright514f0842018-12-10 17:55:17181 kStatsValueNameFirstFrameReceivedToDecodedMs,
tommi@webrtc.orgc57310b2014-12-12 17:41:28182 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 13:04:52193 kStatsValueNameHasEnteredLowResolution,
Ilya Nikolaevskiy70473fc2018-02-28 15:35:03194 kStatsValueNameHugeFramesSent,
tommi@webrtc.orgc57310b2014-12-12 17:41:28195 kStatsValueNameInitiator,
ilnik2e1b40b2017-09-04 14:57:17196 kStatsValueNameInterframeDelayMaxMs, // Max over last 10 seconds.
tommi@webrtc.orgc57310b2014-12-12 17:41:28197 kStatsValueNameIssuerId,
198 kStatsValueNameJitterBufferMs,
199 kStatsValueNameJitterReceived,
decurtis@webrtc.org487a4442015-01-15 22:55:07200 kStatsValueNameLabel,
tommi@webrtc.orgc57310b2014-12-12 17:41:28201 kStatsValueNameLocalAddress,
guoweis@webrtc.org950c5182014-12-16 23:01:31202 kStatsValueNameLocalCandidateId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28203 kStatsValueNameLocalCandidateType,
204 kStatsValueNameLocalCertificateId,
205 kStatsValueNameMaxDecodeMs,
206 kStatsValueNameMinPlayoutDelayMs,
207 kStatsValueNameNacksReceived,
208 kStatsValueNameNacksSent,
209 kStatsValueNamePlisReceived,
210 kStatsValueNamePlisSent,
Henrik Lundin8e6fd462015-06-02 07:24:52211 kStatsValueNamePreemptiveExpandRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28212 kStatsValueNamePreferredJitterBufferMs,
tommi@webrtc.orgc57310b2014-12-12 17:41:28213 kStatsValueNameRemoteAddress,
guoweis@webrtc.org950c5182014-12-16 23:01:31214 kStatsValueNameRemoteCandidateId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28215 kStatsValueNameRemoteCandidateType,
216 kStatsValueNameRemoteCertificateId,
217 kStatsValueNameRenderDelayMs,
ivoc8c63a822016-10-21 11:10:03218 kStatsValueNameResidualEchoLikelihood,
ivoc4e477a12017-01-15 16:29:46219 kStatsValueNameResidualEchoLikelihoodRecentMax,
ivoce1198e02017-09-08 15:13:19220 kStatsValueNameAnaBitrateActionCounter,
221 kStatsValueNameAnaChannelActionCounter,
222 kStatsValueNameAnaDtxActionCounter,
223 kStatsValueNameAnaFecActionCounter,
ivoc0d0b9122017-09-08 20:24:21224 kStatsValueNameAnaFrameLengthIncreaseCounter,
225 kStatsValueNameAnaFrameLengthDecreaseCounter,
226 kStatsValueNameAnaUplinkPacketLossFraction,
tommi@webrtc.orgc57310b2014-12-12 17:41:28227 kStatsValueNameRetransmitBitrate,
228 kStatsValueNameRtt,
minyue@webrtc.org652bc372015-02-18 23:50:46229 kStatsValueNameSecondaryDecodedRate,
minyue-webrtc0e320ec2017-08-28 11:51:27230 kStatsValueNameSecondaryDiscardedRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28231 kStatsValueNameSendPacketsDiscarded,
minyue@webrtc.org652bc372015-02-18 23:50:46232 kStatsValueNameSpeechExpandRate,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30233 kStatsValueNameSrtpCipher,
tommi@webrtc.orgc57310b2014-12-12 17:41:28234 kStatsValueNameTargetDelayMs,
235 kStatsValueNameTargetEncBitrate,
ilnik2edc6842017-07-06 10:06:50236 kStatsValueNameTimingFrameInfo, // Result of |TimingFrameInfo::ToString|
tommi@webrtc.orgc57310b2014-12-12 17:41:28237 kStatsValueNameTrackId,
238 kStatsValueNameTransmitBitrate,
239 kStatsValueNameTransportType,
240 kStatsValueNameTypingNoiseState,
tommi@webrtc.orgc57310b2014-12-12 17:41:28241 kStatsValueNameWritable,
Alex Narestbbeb1092019-08-16 09:49:04242 kStatsValueNameAudioDeviceUnderrunCounter,
tommi@webrtc.orgc57310b2014-12-12 17:41:28243 };
244
Mirko Bonadei051cae52019-11-12 12:01:23245 class RTC_EXPORT IdBase : public rtc::RefCountInterface {
tommi@webrtc.org8e327c42015-01-19 20:41:26246 public:
tommi@webrtc.orgd3900292015-03-12 16:35:55247 ~IdBase() override;
tommi@webrtc.org4fb7e252015-01-21 11:36:18248 StatsType type() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55249
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:18257 virtual std::string ToString() const = 0;
258
259 protected:
tommi@webrtc.orgd3900292015-03-12 16:35:55260 // 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 09:55:59263 explicit IdBase(StatsType type); // Only meant for derived classes.
tommi@webrtc.org4fb7e252015-01-21 11:36:18264 const StatsType type_;
decurtis@webrtc.org322a5642015-02-03 22:09:37265
266 static const char kSeparator = '_';
tommi@webrtc.org8e327c42015-01-19 20:41:26267 };
268
tommi@webrtc.orgd3900292015-03-12 16:35:55269 typedef rtc::scoped_refptr<IdBase> Id;
270
Mirko Bonadei051cae52019-11-12 12:01:23271 struct RTC_EXPORT Value {
tommi@webrtc.orgd3900292015-03-12 16:35:55272 enum Type {
Peter Boström0c4e06b2015-10-07 10:23:21273 kInt, // int.
274 kInt64, // int64_t.
275 kFloat, // float.
276 kString, // std::string
tommi@webrtc.orgd3900292015-03-12 16:35:55277 kStaticString, // const char*.
Peter Boström0c4e06b2015-10-07 10:23:21278 kBool, // bool.
279 kId, // Id.
tommi@webrtc.orgd3900292015-03-12 16:35:55280 };
281
Peter Boström0c4e06b2015-10-07 10:23:21282 Value(StatsValueName name, int64_t value, Type int_type);
tommi@webrtc.orgd3900292015-03-12 16:35:55283 Value(StatsValueName name, float f);
tommi@webrtc.orgc9d155f2014-12-09 18:18:06284 Value(StatsValueName name, const std::string& value);
tommi@webrtc.orgd3900292015-03-12 16:35:55285 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 14:10:54291 // 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:55307 // 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 10:23:21320 bool operator==(int64_t value) const;
tommi@webrtc.orgd3900292015-03-12 16:35:55321 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 10:23:21328 int64_t int64_val() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55329 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:56334
tommi@webrtc.orgc57310b2014-12-12 17:41:28335 // Returns the string representation of |name|.
tommi@webrtc.orgc9d155f2014-12-09 18:18:06336 const char* display_name() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55337
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:19343 // TODO(tommi): Move |name| and |display_name| out of the Value struct.
tommi@webrtc.org242068d2014-07-14 20:19:56344 const StatsValueName name;
tommi@webrtc.orgd3900292015-03-12 16:35:55345
346 private:
Artem Titov06159aa2021-02-09 22:38:13347 webrtc::SequenceChecker thread_checker_;
Niels Möller1e062892018-02-07 09:18:32348 mutable int ref_count_ RTC_GUARDED_BY(thread_checker_) = 0;
nisse6da303d2017-01-18 14:10:54349
tommi@webrtc.orgd3900292015-03-12 16:35:55350 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 10:23:21354 int64_t int64_;
tommi@webrtc.orgd3900292015-03-12 16:35:55355 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:56361
henrikg3c089d72015-09-16 12:37:44362 RTC_DISALLOW_COPY_AND_ASSIGN(Value);
henrike@webrtc.org28e20752013-07-10 00:45:36363 };
364
nisse6da303d2017-01-18 14:10:54365 typedef rtc::scoped_refptr<Value> ValuePtr;
tommi@webrtc.org92f40182015-03-04 15:25:19366 typedef std::map<StatsValueName, ValuePtr> Values;
tommi@webrtc.org8e327c42015-01-19 20:41:26367
368 // Ownership of |id| is passed to |this|.
tommi@webrtc.orgd3900292015-03-12 16:35:55369 explicit StatsReport(const Id& id);
ossu7bb87ee2017-01-23 12:56:25370 ~StatsReport();
tommi@webrtc.org8e327c42015-01-19 20:41:26371
tommi@webrtc.org4fb7e252015-01-21 11:36:18372 // Factory functions for various types of stats IDs.
tommi@webrtc.orgd3900292015-03-12 16:35:55373 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 13:03:05376 static Id NewIdWithDirection(StatsType type,
377 const std::string& id,
378 Direction direction);
tommi@webrtc.orgd3900292015-03-12 16:35:55379 static Id NewCandidateId(bool local, const std::string& id);
Yves Gerey665174f2018-06-19 13:03:05380 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:18384
tommi@webrtc.orgd3900292015-03-12 16:35:55385 const Id& id() const { return id_; }
tommi@webrtc.org4fb7e252015-01-21 11:36:18386 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:19389 bool empty() const { return values_.empty(); }
tommi@webrtc.org4fb7e252015-01-21 11:36:18390 const Values& values() const { return values_; }
391
392 const char* TypeToString() const;
tommi@webrtc.org8e327c42015-01-19 20:41:26393
tommi@webrtc.org92f40182015-03-04 15:25:19394 void AddString(StatsValueName name, const std::string& value);
tommi@webrtc.orgd3900292015-03-12 16:35:55395 void AddString(StatsValueName name, const char* value);
Peter Boström0c4e06b2015-10-07 10:23:21396 void AddInt64(StatsValueName name, int64_t value);
tommi@webrtc.org92f40182015-03-04 15:25:19397 void AddInt(StatsValueName name, int value);
398 void AddFloat(StatsValueName name, float value);
tommi@webrtc.org242068d2014-07-14 20:19:56399 void AddBoolean(StatsValueName name, bool value);
tommi@webrtc.orgd3900292015-03-12 16:35:55400 void AddId(StatsValueName name, const Id& value);
tommi@webrtc.org8e327c42015-01-19 20:41:26401
tommi@webrtc.org4fb7e252015-01-21 11:36:18402 const Value* FindValue(StatsValueName name) const;
tommi@webrtc.org8e327c42015-01-19 20:41:26403
tommi@webrtc.org4fb7e252015-01-21 11:36:18404 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:55408 const Id id_;
tommi@webrtc.org8e327c42015-01-19 20:41:26409 double timestamp_; // Time since 1970-01-01T00:00:00Z in milliseconds.
410 Values values_;
henrike@webrtc.org28e20752013-07-10 00:45:36411
henrikg3c089d72015-09-16 12:37:44412 RTC_DISALLOW_COPY_AND_ASSIGN(StatsReport);
tommi@webrtc.org5b06b062014-08-15 08:38:30413};
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:18418// this type. In the StatsCollector, object ownership lies with the
419// StatsCollection class.
tommi@webrtc.org5b06b062014-08-15 08:38:30420typedef 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:18425class StatsCollection {
tommi@webrtc.org5b06b062014-08-15 08:38:30426 public:
tommi@webrtc.org4fb7e252015-01-21 11:36:18427 StatsCollection();
428 ~StatsCollection();
tommi@webrtc.org5b06b062014-08-15 08:38:30429
tommi@webrtc.org4fb7e252015-01-21 11:36:18430 typedef std::list<StatsReport*> Container;
tommi@webrtc.org5b06b062014-08-15 08:38:30431 typedef Container::iterator iterator;
432 typedef Container::const_iterator const_iterator;
433
tommi@webrtc.orgc9d155f2014-12-09 18:18:06434 const_iterator begin() const;
435 const_iterator end() const;
tommi@webrtc.org4fb7e252015-01-21 11:36:18436 size_t size() const;
tommi@webrtc.org5b06b062014-08-15 08:38:30437
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:55440 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:30443
deadbeef8d60a942017-02-27 22:47:33444 // Looks for a report with the given |id|. If one is not found, null
tommi@webrtc.org5b06b062014-08-15 08:38:30445 // will be returned.
tommi@webrtc.org4fb7e252015-01-21 11:36:18446 StatsReport* Find(const StatsReport::Id& id);
tommi@webrtc.org5b06b062014-08-15 08:38:30447
448 private:
449 Container list_;
Artem Titov06159aa2021-02-09 22:38:13450 webrtc::SequenceChecker thread_checker_;
tommi@webrtc.org5b06b062014-08-15 08:38:30451};
henrike@webrtc.org28e20752013-07-10 00:45:36452
453} // namespace webrtc
454
Steve Anton10542f22019-01-11 17:11:00455#endif // API_STATS_TYPES_H_