128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/*
228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle
35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2012 Google Inc.
428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     this list of conditions and the following disclaimer.
1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     and/or other materials provided with the distribution.
1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     derived from this software without specific prior written permission.
1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */
2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This file contains structures used for retrieving statistics from an ongoing
2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// libjingle session.
3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#ifndef TALK_APP_WEBRTC_STATSTYPES_H_
3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#define TALK_APP_WEBRTC_STATSTYPES_H_
3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
345c3ee4bce6c61bb4095eb3746ba39d3eeab2ee93tommi@webrtc.org#include <algorithm>
354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org#include <list>
3692f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org#include <map>
3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <string>
3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
39d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/basictypes.h"
406ae5a6d7fefff6759d338b5a3e3613e050ebaa62andrew@webrtc.org#include "webrtc/base/common.h"
41d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#include "webrtc/base/refcount.h"
428e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org#include "webrtc/base/scoped_ptr.h"
43d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#include "webrtc/base/linked_ptr.h"
44d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org#include "webrtc/base/scoped_ref_ptr.h"
45d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/stringencode.h"
4625c96d02cdd2460b378ab89e4b90b17a81bf0d4ajbauch#include "webrtc/base/thread_checker.h"
4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace webrtc {
4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsReport {
5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public:
524fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  // Indicates whether a track is for sending or receiving.
534fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  // Used in reports for audio/video tracks.
544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  enum Direction {
554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kSend = 0,
564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kReceive,
574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  };
5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  enum StatsType {
604fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // StatsReport types.
614fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "googSession" contains overall information
624fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // about the thing libjingle calls a session (which may contain one
634fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // or more RTP sessions.
644fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeSession,
654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "googTransport" contains information
674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // about a libjingle "transport".
684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeTransport,
694fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "googComponent" contains information
714fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // about a libjingle "channel" (typically, RTP or RTCP for a transport).
724fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // This is intended to be the same thing as an ICE "Component".
734fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeComponent,
744fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
754fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "googCandidatePair" contains information
764fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // about a libjingle "connection" - a single source/destination port pair.
774fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // This is intended to be the same thing as an ICE "candidate pair".
784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeCandidatePair,
794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "VideoBWE" is statistics for video Bandwidth
814fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // Estimation, which is global per-session.  The |id| field is "bweforvideo"
824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // (will probably change in the future).
834fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeBwe,
844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "ssrc" is statistics for a specific rtp stream.
864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // The |id| field is the SSRC in decimal form of the rtp stream.
874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeSsrc,
884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "remoteSsrc" is statistics for a specific
904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // rtp stream, generated by the remote end of the connection.
914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeRemoteSsrc,
924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "googTrack" is statistics for a specific media
944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // track. The |id| field is the track id.
954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeTrack,
964fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
974fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "localcandidate" or "remotecandidate" is
984fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // attributes on a specific ICE Candidate. It links to its connection pair
994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // by candidate id. The string value is taken from
1004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
1014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeIceLocalCandidate,
1024fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeIceRemoteCandidate,
1034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "googCertificate" contains an SSL certificate
1054fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // transmitted by one of the endpoints of this connection.  The |id| is
1064fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // controlled by the fingerprint, and is used to identify the certificate in
1074fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // the Channel stats (as "googLocalCertificateId" or
1084fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // "googRemoteCertificateId") and in any child certificates (as
1094fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // "googIssuerId").
1104fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeCertificate,
1114fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
1124fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // A StatsReport of |type| = "datachannel" with statistics for a
1134fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    // particular DataChannel.
1144fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    kStatsReportTypeDataChannel,
1154fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  };
11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
117c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  enum StatsValueName {
118c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameActiveConnection,
119c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameAudioInputLevel,
120c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameAudioOutputLevel,
121c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameBytesReceived,
122c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameBytesSent,
123b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström    kStatsValueNameCodecImplementationName,
124487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    kStatsValueNameDataChannelId,
125c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNamePacketsLost,
126c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNamePacketsReceived,
127c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNamePacketsSent,
128487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    kStatsValueNameProtocol,
12904ac81f2fd8ef6680522438fac1894db5415a0ecPeter Thatcher    kStatsValueNameReceiving,
1307bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    kStatsValueNameSelectedCandidatePairId,
131c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameSsrc,
132487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    kStatsValueNameState,
133c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameTransportId,
134c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org
135c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    // Internal StatsValue names.
1368e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin    kStatsValueNameAccelerateRate,
137c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameActualEncBitrate,
138c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameAdaptationChanges,
139c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameAvailableReceiveBandwidth,
140c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameAvailableSendBandwidth,
141c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameAvgEncodeMs,
142c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameBandwidthLimitedResolution,
143c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameBucketDelay,
144c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameCaptureStartNtpTimeMs,
145950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameCandidateIPAddress,
146950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameCandidateNetworkType,
147950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameCandidatePortNumber,
148950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameCandidatePriority,
149950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameCandidateTransportType,
150950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameCandidateType,
151c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameChannelId,
152c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameCodecName,
153c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameComponent,
154c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameContentName,
155c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameCpuLimitedResolution,
156c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameCurrentDelayMs,
157c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDecodeMs,
158c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDecodingCNG,
159c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDecodingCTN,
160c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDecodingCTSG,
161c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDecodingNormal,
162c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDecodingPLC,
163c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDecodingPLCCNG,
164c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameDer,
1657bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    kStatsValueNameDtlsCipher,
166c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameEchoCancellationQualityMin,
167c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameEchoDelayMedian,
168c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameEchoDelayStdDev,
169c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameEchoReturnLoss,
170c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameEchoReturnLossEnhancement,
171c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameEncodeUsagePercent,
172c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameExpandRate,
173c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFingerprint,
174c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFingerprintAlgorithm,
175c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFirsReceived,
176c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFirsSent,
177c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameHeightInput,
178c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameHeightReceived,
179c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameHeightSent,
180c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameRateDecoded,
181c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameRateInput,
182c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameRateOutput,
183c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameRateReceived,
184c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameRateSent,
185c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameWidthInput,
186c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameWidthReceived,
187c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameFrameWidthSent,
188c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameInitiator,
189c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameIssuerId,
190c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameJitterBufferMs,
191c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameJitterReceived,
192487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org    kStatsValueNameLabel,
193c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameLocalAddress,
194950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameLocalCandidateId,
195c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameLocalCandidateType,
196c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameLocalCertificateId,
197c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameMaxDecodeMs,
198c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameMinPlayoutDelayMs,
199c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameNacksReceived,
200c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameNacksSent,
201c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNamePlisReceived,
202c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNamePlisSent,
2038e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin    kStatsValueNamePreemptiveExpandRate,
204c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNamePreferredJitterBufferMs,
205c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameRemoteAddress,
206950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org    kStatsValueNameRemoteCandidateId,
207c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameRemoteCandidateType,
208c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameRemoteCertificateId,
209c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameRenderDelayMs,
210c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameRetransmitBitrate,
211c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameRtt,
212652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org    kStatsValueNameSecondaryDecodedRate,
213c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameSendPacketsDiscarded,
214652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org    kStatsValueNameSpeechExpandRate,
2157bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org    kStatsValueNameSrtpCipher,
216c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameTargetDelayMs,
217c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameTargetEncBitrate,
218c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameTrackId,
219c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameTransmitBitrate,
220c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameTransportType,
221c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameTypingNoiseState,
222c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameViewLimitedResolution,
223c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    kStatsValueNameWritable,
224c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org  };
225c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org
226d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  class IdBase : public rtc::RefCountInterface {
2278e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org   public:
228d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    ~IdBase() override;
2294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    StatsType type() const;
2304fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
231d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // Users of IdBase will be using the Id typedef, which is compatible with
232d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // this Equals() function.  It simply calls the protected (and overridden)
233d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // Equals() method.
234d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool Equals(const rtc::scoped_refptr<IdBase>& other) const {
235d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      return Equals(*other.get());
236d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    }
237d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
238d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    virtual std::string ToString() const = 0;
23975b7f17c29565ac8ddba38c14239113ac471ca5atommi@webrtc.org
2404fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org   protected:
241d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // Protected since users of the IdBase type will be using the Id typedef.
242d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    virtual bool Equals(const IdBase& other) const;
243d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
244d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    IdBase(StatsType type);  // Only meant for derived classes.
2454fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org    const StatsType type_;
246322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org
247322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org    static const char kSeparator = '_';
2488e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org  };
2498e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
250d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  typedef rtc::scoped_refptr<IdBase> Id;
251d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
25228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  struct Value {
253d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    enum Type {
2540c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      kInt,           // int.
2550c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      kInt64,         // int64_t.
2560c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      kFloat,         // float.
2570c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      kString,        // std::string
258d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      kStaticString,  // const char*.
2590c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      kBool,          // bool.
2600c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      kId,            // Id.
261d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    };
262d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
2630c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström    Value(StatsValueName name, int64_t value, Type int_type);
264d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    Value(StatsValueName name, float f);
265c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org    Value(StatsValueName name, const std::string& value);
266d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    Value(StatsValueName name, const char* value);
267d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    Value(StatsValueName name, bool b);
268d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    Value(StatsValueName name, const Id& value);
269d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
270d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    ~Value();
271d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
272d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // TODO(tommi): This compares name as well as value...
273d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // I think we should only need to compare the value part and
274d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // move the name part into a hash map.
275d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool Equals(const Value& other) const;
276d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
277d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // Comparison operators. Return true iff the current instance is of the
278d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // correct type and holds the same value.  No conversion is performed so
279d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // a string value of "123" is not equal to an int value of 123 and an int
280d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // value of 123 is not equal to a float value of 123.0f.
281d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // One exception to this is that types kInt and kInt64 can be compared and
282d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // kString and kStaticString too.
283d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool operator==(const std::string& value) const;
284d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool operator==(const char* value) const;
2850c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström    bool operator==(int64_t value) const;
286d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool operator==(bool value) const;
287d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool operator==(float value) const;
288d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool operator==(const Id& value) const;
289d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
290d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // Getters that allow getting the native value directly.
291d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // The caller must know the type beforehand or else hit a check.
292d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    int int_val() const;
2930c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström    int64_t int64_val() const;
294d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    float float_val() const;
295d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    const char* static_string_val() const;
296d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    const std::string& string_val() const;
297d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    bool bool_val() const;
298d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    const Id& id_val() const;
299242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org
300c57310b982cdce138723de91d7b722f8199834abtommi@webrtc.org    // Returns the string representation of |name|.
301c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org    const char* display_name() const;
302d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
303d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // Converts the native value to a string representation of the value.
304d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    std::string ToString() const;
305d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
306d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    Type type() const { return type_; }
307d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
30892f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org    // TODO(tommi): Move |name| and |display_name| out of the Value struct.
309242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org    const StatsValueName name;
310d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org
311d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org   private:
312d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    const Type type_;
313d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    // TODO(tommi): Use C++ 11 union and make value_ const.
314d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    union InternalType {
315d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      int int_;
3160c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      int64_t int64_;
317d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      float float_;
318d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      bool bool_;
319d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      std::string* string_;
320d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      const char* static_string_;
321d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org      Id* id_;
322d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org    } value_;
323242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org
3244fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org   private:
3253c089d751ede283e21e186885eaf705c3257ccd2henrikg    RTC_DISALLOW_COPY_AND_ASSIGN(Value);
32628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  };
32728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
328d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  // TODO(tommi): Consider using a similar approach to how we store Ids using
329d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  // scoped_refptr for values.
3308e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org  typedef rtc::linked_ptr<Value> ValuePtr;
33192f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  typedef std::map<StatsValueName, ValuePtr> Values;
3328e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
3338e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org  // Ownership of |id| is passed to |this|.
334d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  explicit StatsReport(const Id& id);
3358e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
3364fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  // Factory functions for various types of stats IDs.
337d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  static Id NewBandwidthEstimationId();
338d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  static Id NewTypedId(StatsType type, const std::string& id);
339d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  static Id NewTypedIntId(StatsType type, int id);
340d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  static Id NewIdWithDirection(
3414fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      StatsType type, const std::string& id, Direction direction);
342d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  static Id NewCandidateId(bool local, const std::string& id);
343d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  static Id NewComponentId(
3444fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      const std::string& content_name, int component);
345d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  static Id NewCandidatePairId(
3464fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org      const std::string& content_name, int component, int index);
3474fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
348d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Id& id() const { return id_; }
3494fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  StatsType type() const { return id_->type(); }
3504fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  double timestamp() const { return timestamp_; }
3514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  void set_timestamp(double t) { timestamp_ = t; }
35292f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  bool empty() const { return values_.empty(); }
3534fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const Values& values() const { return values_; }
3544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org
3554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const char* TypeToString() const;
3568e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
35792f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  void AddString(StatsValueName name, const std::string& value);
358d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  void AddString(StatsValueName name, const char* value);
3590c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  void AddInt64(StatsValueName name, int64_t value);
36092f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  void AddInt(StatsValueName name, int value);
36192f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org  void AddFloat(StatsValueName name, float value);
362242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org  void AddBoolean(StatsValueName name, bool value);
363d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  void AddId(StatsValueName name, const Id& value);
3648e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
3654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  const Value* FindValue(StatsValueName name) const;
3668e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org
3674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org private:
3684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  // The unique identifier for this object.
3694fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  // This is used as a key for this report in ordered containers,
3704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  // so it must never be changed.
371d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  const Id id_;
3728e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org  double timestamp_;  // Time since 1970-01-01T00:00:00Z in milliseconds.
3738e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org  Values values_;
37428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
3753c089d751ede283e21e186885eaf705c3257ccd2henrikg  RTC_DISALLOW_COPY_AND_ASSIGN(StatsReport);
3765b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org};
3775b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org
3785b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org// Typedef for an array of const StatsReport pointers.
3795b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org// Ownership of the pointers held by this implementation is assumed to lie
3805b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org// elsewhere and lifetime guarantees are made by the implementation that uses
3814fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// this type.  In the StatsCollector, object ownership lies with the
3824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// StatsCollection class.
3835b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.orgtypedef std::vector<const StatsReport*> StatsReports;
3845b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org
3855b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org// A map from the report id to the report.
3865b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org// This class wraps an STL container and provides a limited set of
3875b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org// functionality in order to keep things simple.
3884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgclass StatsCollection {
3895b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org public:
3904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  StatsCollection();
3914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  ~StatsCollection();
3925b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org
3934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  typedef std::list<StatsReport*> Container;
3945b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org  typedef Container::iterator iterator;
3955b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org  typedef Container::const_iterator const_iterator;
3965b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org
397c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org  const_iterator begin() const;
398c9d155faebd5556c9ea86306dc15aa9dac0e13f7tommi@webrtc.org  const_iterator end() const;
3994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  size_t size() const;
4005b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org
4015b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org  // Creates a new report object with |id| that does not already
4025b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org  // exist in the list of reports.
403d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  StatsReport* InsertNew(const StatsReport::Id& id);
404d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  StatsReport* FindOrAddNew(const StatsReport::Id& id);
405d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org  StatsReport* ReplaceOrAddNew(const StatsReport::Id& id);
4065b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org
4075b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org  // Looks for a report with the given |id|.  If one is not found, NULL
4085b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org  // will be returned.
4094fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org  StatsReport* Find(const StatsReport::Id& id);
4105b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org
4115b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org private:
4125b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org  Container list_;
41325c96d02cdd2460b378ab89e4b90b17a81bf0d4ajbauch  rtc::ThreadChecker thread_checker_;
4145b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org};
41528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
41628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}  // namespace webrtc
41728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
41828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#endif  // TALK_APP_WEBRTC_STATSTYPES_H_
419