blob: 2ba8ba5fd5eaf7c54359d13deddd12312af736b1 [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
Mirko Bonadei92ea95e2017-09-15 04:47:3114#ifndef API_STATSTYPES_H_
15#define API_STATSTYPES_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 Bonadei92ea95e2017-09-15 04:47:3123#include "rtc_base/basictypes.h"
24#include "rtc_base/constructormagic.h"
25#include "rtc_base/refcount.h"
26#include "rtc_base/scoped_ref_ptr.h"
27#include "rtc_base/stringencode.h"
28#include "rtc_base/thread_checker.h"
henrike@webrtc.org28e20752013-07-10 00:45:3629
30namespace webrtc {
31
32class StatsReport {
33 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,
tommi@webrtc.orgc57310b2014-12-12 17:41:28132
133 // Internal StatsValue names.
Henrik Lundin8e6fd462015-06-02 07:24:52134 kStatsValueNameAccelerateRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28135 kStatsValueNameActualEncBitrate,
136 kStatsValueNameAdaptationChanges,
137 kStatsValueNameAvailableReceiveBandwidth,
138 kStatsValueNameAvailableSendBandwidth,
139 kStatsValueNameAvgEncodeMs,
140 kStatsValueNameBandwidthLimitedResolution,
141 kStatsValueNameBucketDelay,
tommi@webrtc.orgc57310b2014-12-12 17:41:28142 kStatsValueNameCaptureStartNtpTimeMs,
guoweis@webrtc.org950c5182014-12-16 23:01:31143 kStatsValueNameCandidateIPAddress,
144 kStatsValueNameCandidateNetworkType,
145 kStatsValueNameCandidatePortNumber,
146 kStatsValueNameCandidatePriority,
147 kStatsValueNameCandidateTransportType,
148 kStatsValueNameCandidateType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28149 kStatsValueNameChannelId,
150 kStatsValueNameCodecName,
151 kStatsValueNameComponent,
152 kStatsValueNameContentName,
ilnik2e1b40b2017-09-04 14:57:17153 kStatsValueNameContentType,
tommi@webrtc.orgc57310b2014-12-12 17:41:28154 kStatsValueNameCpuLimitedResolution,
155 kStatsValueNameCurrentDelayMs,
156 kStatsValueNameDecodeMs,
157 kStatsValueNameDecodingCNG,
158 kStatsValueNameDecodingCTN,
159 kStatsValueNameDecodingCTSG,
henrik.lundin63489782016-09-20 08:47:12160 kStatsValueNameDecodingMutedOutput,
tommi@webrtc.orgc57310b2014-12-12 17:41:28161 kStatsValueNameDecodingNormal,
162 kStatsValueNameDecodingPLC,
163 kStatsValueNameDecodingPLCCNG,
164 kStatsValueNameDer,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30165 kStatsValueNameDtlsCipher,
tommi@webrtc.orgc57310b2014-12-12 17:41:28166 kStatsValueNameEchoDelayMedian,
167 kStatsValueNameEchoDelayStdDev,
168 kStatsValueNameEchoReturnLoss,
169 kStatsValueNameEchoReturnLossEnhancement,
170 kStatsValueNameEncodeUsagePercent,
171 kStatsValueNameExpandRate,
172 kStatsValueNameFingerprint,
173 kStatsValueNameFingerprintAlgorithm,
174 kStatsValueNameFirsReceived,
175 kStatsValueNameFirsSent,
176 kStatsValueNameFrameHeightInput,
177 kStatsValueNameFrameHeightReceived,
178 kStatsValueNameFrameHeightSent,
179 kStatsValueNameFrameRateDecoded,
180 kStatsValueNameFrameRateInput,
181 kStatsValueNameFrameRateOutput,
182 kStatsValueNameFrameRateReceived,
183 kStatsValueNameFrameRateSent,
184 kStatsValueNameFrameWidthInput,
185 kStatsValueNameFrameWidthReceived,
186 kStatsValueNameFrameWidthSent,
Ă…sa Perssonc3ed6302017-11-16 13:04:52187 kStatsValueNameHasEnteredLowResolution,
tommi@webrtc.orgc57310b2014-12-12 17:41:28188 kStatsValueNameInitiator,
ilnik2e1b40b2017-09-04 14:57:17189 kStatsValueNameInterframeDelayMaxMs, // Max over last 10 seconds.
tommi@webrtc.orgc57310b2014-12-12 17:41:28190 kStatsValueNameIssuerId,
191 kStatsValueNameJitterBufferMs,
192 kStatsValueNameJitterReceived,
decurtis@webrtc.org487a4442015-01-15 22:55:07193 kStatsValueNameLabel,
tommi@webrtc.orgc57310b2014-12-12 17:41:28194 kStatsValueNameLocalAddress,
guoweis@webrtc.org950c5182014-12-16 23:01:31195 kStatsValueNameLocalCandidateId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28196 kStatsValueNameLocalCandidateType,
197 kStatsValueNameLocalCertificateId,
198 kStatsValueNameMaxDecodeMs,
199 kStatsValueNameMinPlayoutDelayMs,
200 kStatsValueNameNacksReceived,
201 kStatsValueNameNacksSent,
202 kStatsValueNamePlisReceived,
203 kStatsValueNamePlisSent,
Henrik Lundin8e6fd462015-06-02 07:24:52204 kStatsValueNamePreemptiveExpandRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28205 kStatsValueNamePreferredJitterBufferMs,
tommi@webrtc.orgc57310b2014-12-12 17:41:28206 kStatsValueNameRemoteAddress,
guoweis@webrtc.org950c5182014-12-16 23:01:31207 kStatsValueNameRemoteCandidateId,
tommi@webrtc.orgc57310b2014-12-12 17:41:28208 kStatsValueNameRemoteCandidateType,
209 kStatsValueNameRemoteCertificateId,
210 kStatsValueNameRenderDelayMs,
ivoc8c63a822016-10-21 11:10:03211 kStatsValueNameResidualEchoLikelihood,
ivoc4e477a12017-01-15 16:29:46212 kStatsValueNameResidualEchoLikelihoodRecentMax,
ivoce1198e02017-09-08 15:13:19213 kStatsValueNameAnaBitrateActionCounter,
214 kStatsValueNameAnaChannelActionCounter,
215 kStatsValueNameAnaDtxActionCounter,
216 kStatsValueNameAnaFecActionCounter,
ivoc0d0b9122017-09-08 20:24:21217 kStatsValueNameAnaFrameLengthIncreaseCounter,
218 kStatsValueNameAnaFrameLengthDecreaseCounter,
219 kStatsValueNameAnaUplinkPacketLossFraction,
tommi@webrtc.orgc57310b2014-12-12 17:41:28220 kStatsValueNameRetransmitBitrate,
221 kStatsValueNameRtt,
minyue@webrtc.org652bc372015-02-18 23:50:46222 kStatsValueNameSecondaryDecodedRate,
minyue-webrtc0e320ec2017-08-28 11:51:27223 kStatsValueNameSecondaryDiscardedRate,
tommi@webrtc.orgc57310b2014-12-12 17:41:28224 kStatsValueNameSendPacketsDiscarded,
minyue@webrtc.org652bc372015-02-18 23:50:46225 kStatsValueNameSpeechExpandRate,
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30226 kStatsValueNameSrtpCipher,
tommi@webrtc.orgc57310b2014-12-12 17:41:28227 kStatsValueNameTargetDelayMs,
228 kStatsValueNameTargetEncBitrate,
ilnik2edc6842017-07-06 10:06:50229 kStatsValueNameTimingFrameInfo, // Result of |TimingFrameInfo::ToString|
tommi@webrtc.orgc57310b2014-12-12 17:41:28230 kStatsValueNameTrackId,
231 kStatsValueNameTransmitBitrate,
232 kStatsValueNameTransportType,
233 kStatsValueNameTypingNoiseState,
tommi@webrtc.orgc57310b2014-12-12 17:41:28234 kStatsValueNameWritable,
235 };
236
tommi@webrtc.orgd3900292015-03-12 16:35:55237 class IdBase : public rtc::RefCountInterface {
tommi@webrtc.org8e327c42015-01-19 20:41:26238 public:
tommi@webrtc.orgd3900292015-03-12 16:35:55239 ~IdBase() override;
tommi@webrtc.org4fb7e252015-01-21 11:36:18240 StatsType type() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55241
242 // Users of IdBase will be using the Id typedef, which is compatible with
243 // this Equals() function. It simply calls the protected (and overridden)
244 // Equals() method.
245 bool Equals(const rtc::scoped_refptr<IdBase>& other) const {
246 return Equals(*other.get());
247 }
248
tommi@webrtc.org4fb7e252015-01-21 11:36:18249 virtual std::string ToString() const = 0;
250
251 protected:
tommi@webrtc.orgd3900292015-03-12 16:35:55252 // Protected since users of the IdBase type will be using the Id typedef.
253 virtual bool Equals(const IdBase& other) const;
254
oprypin803dc292017-02-01 09:55:59255 explicit IdBase(StatsType type); // Only meant for derived classes.
tommi@webrtc.org4fb7e252015-01-21 11:36:18256 const StatsType type_;
decurtis@webrtc.org322a5642015-02-03 22:09:37257
258 static const char kSeparator = '_';
tommi@webrtc.org8e327c42015-01-19 20:41:26259 };
260
tommi@webrtc.orgd3900292015-03-12 16:35:55261 typedef rtc::scoped_refptr<IdBase> Id;
262
henrike@webrtc.org28e20752013-07-10 00:45:36263 struct Value {
tommi@webrtc.orgd3900292015-03-12 16:35:55264 enum Type {
Peter Boström0c4e06b2015-10-07 10:23:21265 kInt, // int.
266 kInt64, // int64_t.
267 kFloat, // float.
268 kString, // std::string
tommi@webrtc.orgd3900292015-03-12 16:35:55269 kStaticString, // const char*.
Peter Boström0c4e06b2015-10-07 10:23:21270 kBool, // bool.
271 kId, // Id.
tommi@webrtc.orgd3900292015-03-12 16:35:55272 };
273
Peter Boström0c4e06b2015-10-07 10:23:21274 Value(StatsValueName name, int64_t value, Type int_type);
tommi@webrtc.orgd3900292015-03-12 16:35:55275 Value(StatsValueName name, float f);
tommi@webrtc.orgc9d155f2014-12-09 18:18:06276 Value(StatsValueName name, const std::string& value);
tommi@webrtc.orgd3900292015-03-12 16:35:55277 Value(StatsValueName name, const char* value);
278 Value(StatsValueName name, bool b);
279 Value(StatsValueName name, const Id& value);
280
281 ~Value();
282
nisse6da303d2017-01-18 14:10:54283 // Support ref counting. Note that for performance reasons, we
284 // don't use thread safe operations. Therefore, all operations
285 // affecting the ref count (in practice, creation and copying of
286 // the Values mapping) must occur on webrtc's signalling thread.
287 int AddRef() const {
288 RTC_DCHECK_RUN_ON(&thread_checker_);
289 return ++ref_count_;
290 }
291 int Release() const {
292 RTC_DCHECK_RUN_ON(&thread_checker_);
293 int count = --ref_count_;
294 if (!count)
295 delete this;
296 return count;
297 }
298
tommi@webrtc.orgd3900292015-03-12 16:35:55299 // TODO(tommi): This compares name as well as value...
300 // I think we should only need to compare the value part and
301 // move the name part into a hash map.
302 bool Equals(const Value& other) const;
303
304 // Comparison operators. Return true iff the current instance is of the
305 // correct type and holds the same value. No conversion is performed so
306 // a string value of "123" is not equal to an int value of 123 and an int
307 // value of 123 is not equal to a float value of 123.0f.
308 // One exception to this is that types kInt and kInt64 can be compared and
309 // kString and kStaticString too.
310 bool operator==(const std::string& value) const;
311 bool operator==(const char* value) const;
Peter Boström0c4e06b2015-10-07 10:23:21312 bool operator==(int64_t value) const;
tommi@webrtc.orgd3900292015-03-12 16:35:55313 bool operator==(bool value) const;
314 bool operator==(float value) const;
315 bool operator==(const Id& value) const;
316
317 // Getters that allow getting the native value directly.
318 // The caller must know the type beforehand or else hit a check.
319 int int_val() const;
Peter Boström0c4e06b2015-10-07 10:23:21320 int64_t int64_val() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55321 float float_val() const;
322 const char* static_string_val() const;
323 const std::string& string_val() const;
324 bool bool_val() const;
325 const Id& id_val() const;
tommi@webrtc.org242068d2014-07-14 20:19:56326
tommi@webrtc.orgc57310b2014-12-12 17:41:28327 // Returns the string representation of |name|.
tommi@webrtc.orgc9d155f2014-12-09 18:18:06328 const char* display_name() const;
tommi@webrtc.orgd3900292015-03-12 16:35:55329
330 // Converts the native value to a string representation of the value.
331 std::string ToString() const;
332
333 Type type() const { return type_; }
334
tommi@webrtc.org92f40182015-03-04 15:25:19335 // TODO(tommi): Move |name| and |display_name| out of the Value struct.
tommi@webrtc.org242068d2014-07-14 20:19:56336 const StatsValueName name;
tommi@webrtc.orgd3900292015-03-12 16:35:55337
338 private:
nisse6da303d2017-01-18 14:10:54339 rtc::ThreadChecker thread_checker_;
Niels Möller1e062892018-02-07 09:18:32340 mutable int ref_count_ RTC_GUARDED_BY(thread_checker_) = 0;
nisse6da303d2017-01-18 14:10:54341
tommi@webrtc.orgd3900292015-03-12 16:35:55342 const Type type_;
343 // TODO(tommi): Use C++ 11 union and make value_ const.
344 union InternalType {
345 int int_;
Peter Boström0c4e06b2015-10-07 10:23:21346 int64_t int64_;
tommi@webrtc.orgd3900292015-03-12 16:35:55347 float float_;
348 bool bool_;
349 std::string* string_;
350 const char* static_string_;
351 Id* id_;
352 } value_;
tommi@webrtc.org242068d2014-07-14 20:19:56353
henrikg3c089d72015-09-16 12:37:44354 RTC_DISALLOW_COPY_AND_ASSIGN(Value);
henrike@webrtc.org28e20752013-07-10 00:45:36355 };
356
nisse6da303d2017-01-18 14:10:54357 typedef rtc::scoped_refptr<Value> ValuePtr;
tommi@webrtc.org92f40182015-03-04 15:25:19358 typedef std::map<StatsValueName, ValuePtr> Values;
tommi@webrtc.org8e327c42015-01-19 20:41:26359
360 // Ownership of |id| is passed to |this|.
tommi@webrtc.orgd3900292015-03-12 16:35:55361 explicit StatsReport(const Id& id);
ossu7bb87ee2017-01-23 12:56:25362 ~StatsReport();
tommi@webrtc.org8e327c42015-01-19 20:41:26363
tommi@webrtc.org4fb7e252015-01-21 11:36:18364 // Factory functions for various types of stats IDs.
tommi@webrtc.orgd3900292015-03-12 16:35:55365 static Id NewBandwidthEstimationId();
366 static Id NewTypedId(StatsType type, const std::string& id);
367 static Id NewTypedIntId(StatsType type, int id);
368 static Id NewIdWithDirection(
tommi@webrtc.org4fb7e252015-01-21 11:36:18369 StatsType type, const std::string& id, Direction direction);
tommi@webrtc.orgd3900292015-03-12 16:35:55370 static Id NewCandidateId(bool local, const std::string& id);
371 static Id NewComponentId(
tommi@webrtc.org4fb7e252015-01-21 11:36:18372 const std::string& content_name, int component);
tommi@webrtc.orgd3900292015-03-12 16:35:55373 static Id NewCandidatePairId(
tommi@webrtc.org4fb7e252015-01-21 11:36:18374 const std::string& content_name, int component, int index);
375
tommi@webrtc.orgd3900292015-03-12 16:35:55376 const Id& id() const { return id_; }
tommi@webrtc.org4fb7e252015-01-21 11:36:18377 StatsType type() const { return id_->type(); }
378 double timestamp() const { return timestamp_; }
379 void set_timestamp(double t) { timestamp_ = t; }
tommi@webrtc.org92f40182015-03-04 15:25:19380 bool empty() const { return values_.empty(); }
tommi@webrtc.org4fb7e252015-01-21 11:36:18381 const Values& values() const { return values_; }
382
383 const char* TypeToString() const;
tommi@webrtc.org8e327c42015-01-19 20:41:26384
tommi@webrtc.org92f40182015-03-04 15:25:19385 void AddString(StatsValueName name, const std::string& value);
tommi@webrtc.orgd3900292015-03-12 16:35:55386 void AddString(StatsValueName name, const char* value);
Peter Boström0c4e06b2015-10-07 10:23:21387 void AddInt64(StatsValueName name, int64_t value);
tommi@webrtc.org92f40182015-03-04 15:25:19388 void AddInt(StatsValueName name, int value);
389 void AddFloat(StatsValueName name, float value);
tommi@webrtc.org242068d2014-07-14 20:19:56390 void AddBoolean(StatsValueName name, bool value);
tommi@webrtc.orgd3900292015-03-12 16:35:55391 void AddId(StatsValueName name, const Id& value);
tommi@webrtc.org8e327c42015-01-19 20:41:26392
tommi@webrtc.org4fb7e252015-01-21 11:36:18393 const Value* FindValue(StatsValueName name) const;
tommi@webrtc.org8e327c42015-01-19 20:41:26394
tommi@webrtc.org4fb7e252015-01-21 11:36:18395 private:
396 // The unique identifier for this object.
397 // This is used as a key for this report in ordered containers,
398 // so it must never be changed.
tommi@webrtc.orgd3900292015-03-12 16:35:55399 const Id id_;
tommi@webrtc.org8e327c42015-01-19 20:41:26400 double timestamp_; // Time since 1970-01-01T00:00:00Z in milliseconds.
401 Values values_;
henrike@webrtc.org28e20752013-07-10 00:45:36402
henrikg3c089d72015-09-16 12:37:44403 RTC_DISALLOW_COPY_AND_ASSIGN(StatsReport);
tommi@webrtc.org5b06b062014-08-15 08:38:30404};
405
406// Typedef for an array of const StatsReport pointers.
407// Ownership of the pointers held by this implementation is assumed to lie
408// elsewhere and lifetime guarantees are made by the implementation that uses
tommi@webrtc.org4fb7e252015-01-21 11:36:18409// this type. In the StatsCollector, object ownership lies with the
410// StatsCollection class.
tommi@webrtc.org5b06b062014-08-15 08:38:30411typedef std::vector<const StatsReport*> StatsReports;
412
413// A map from the report id to the report.
414// This class wraps an STL container and provides a limited set of
415// functionality in order to keep things simple.
tommi@webrtc.org4fb7e252015-01-21 11:36:18416class StatsCollection {
tommi@webrtc.org5b06b062014-08-15 08:38:30417 public:
tommi@webrtc.org4fb7e252015-01-21 11:36:18418 StatsCollection();
419 ~StatsCollection();
tommi@webrtc.org5b06b062014-08-15 08:38:30420
tommi@webrtc.org4fb7e252015-01-21 11:36:18421 typedef std::list<StatsReport*> Container;
tommi@webrtc.org5b06b062014-08-15 08:38:30422 typedef Container::iterator iterator;
423 typedef Container::const_iterator const_iterator;
424
tommi@webrtc.orgc9d155f2014-12-09 18:18:06425 const_iterator begin() const;
426 const_iterator end() const;
tommi@webrtc.org4fb7e252015-01-21 11:36:18427 size_t size() const;
tommi@webrtc.org5b06b062014-08-15 08:38:30428
429 // Creates a new report object with |id| that does not already
430 // exist in the list of reports.
tommi@webrtc.orgd3900292015-03-12 16:35:55431 StatsReport* InsertNew(const StatsReport::Id& id);
432 StatsReport* FindOrAddNew(const StatsReport::Id& id);
433 StatsReport* ReplaceOrAddNew(const StatsReport::Id& id);
tommi@webrtc.org5b06b062014-08-15 08:38:30434
deadbeef8d60a942017-02-27 22:47:33435 // Looks for a report with the given |id|. If one is not found, null
tommi@webrtc.org5b06b062014-08-15 08:38:30436 // will be returned.
tommi@webrtc.org4fb7e252015-01-21 11:36:18437 StatsReport* Find(const StatsReport::Id& id);
tommi@webrtc.org5b06b062014-08-15 08:38:30438
439 private:
440 Container list_;
jbauch25c96d02015-08-07 16:48:18441 rtc::ThreadChecker thread_checker_;
tommi@webrtc.org5b06b062014-08-15 08:38:30442};
henrike@webrtc.org28e20752013-07-10 00:45:36443
444} // namespace webrtc
445
Mirko Bonadei92ea95e2017-09-15 04:47:31446#endif // API_STATSTYPES_H_