blob: 01f3e7f1e1480fe0334542e7b5874e172302e8c3 [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
* Copyright (C) 2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include "JSDOMMapLike.h"
namespace WebCore {
class RTCStatsReport : public RefCounted<RTCStatsReport> {
public:
static Ref<RTCStatsReport> create() { return adoptRef(*new RTCStatsReport); }
void synchronizeBackingMap(Ref<DOMMapLike>&& mapLike) { m_mapLike = WTFMove(mapLike); }
DOMMapLike* backingMap() { return m_mapLike.get(); }
template<typename Value> void addStats(typename Value::ParameterType&& value) { m_mapLike->set<IDLDOMString, Value>(value.id, std::forward<typename Value::ParameterType>(value)); }
enum class Type {
Codec,
InboundRtp,
OutboundRtp,
PeerConnection,
DataChannel,
Track,
Transport,
CandidatePair,
LocalCandidate,
RemoteCandidate,
Certificate
};
struct Stats {
double timestamp;
Type type;
String id;
};
struct RTCRTPStreamStats : Stats {
uint32_t ssrc;
String associateStatsId;
bool isRemote { false };
String mediaType;
String mediaTrackId;
String transportId;
String codecId;
unsigned long firCount { 0 };
unsigned long pliCount { 0 };
unsigned long nackCount { 0 };
unsigned long sliCount { 0 };
unsigned long long qpSum { 0 };
};
struct InboundRTPStreamStats : RTCRTPStreamStats {
InboundRTPStreamStats() { type = RTCStatsReport::Type::InboundRtp; }
uint32_t ssrc;
String associateStatsId;
bool isRemote { false };
String mediaType;
String mediaTrackId;
String transportId;
String codecId;
unsigned long firCount { 0 };
unsigned long pliCount { 0 };
unsigned long nackCount { 0 };
unsigned long sliCount { 0 };
unsigned long long qpSum { 0 };
unsigned long packetsReceived { 0 };
unsigned long long bytesReceived { 0 };
unsigned long packetsLost { 0 };
double jitter { 0 };
double fractionLost { 0 };
unsigned long packetsDiscarded { 0 };
unsigned long packetsRepaired { 0 };
unsigned long burstPacketsLost { 0 };
unsigned long burstPacketsDiscarded { 0 };
unsigned long burstLossCount { 0 };
unsigned long burstDiscardCount { 0 };
double burstLossRate { 0 };
double burstDiscardRate { 0 };
double gapLossRate { 0 };
double gapDiscardRate { 0 };
unsigned long framesDecoded { 0 };
};
struct OutboundRTPStreamStats : RTCRTPStreamStats {
OutboundRTPStreamStats() { type = RTCStatsReport::Type::OutboundRtp; }
unsigned long packetsSent { 0 };
unsigned long long bytesSent { 0 };
double targetBitrate { 0 };
unsigned long framesEncoded { 0 };
};
struct MediaStreamTrackStats : Stats {
MediaStreamTrackStats() { type = RTCStatsReport::Type::Track; }
String trackIdentifier;
bool remoteSource { false };
bool ended { false };
bool detached { false };
unsigned long frameWidth { 0 };
unsigned long frameHeight { 0 };
double framesPerSecond { 0 };
unsigned long framesSent { 0 };
unsigned long framesReceived { 0 };
unsigned long framesDecoded { 0 };
unsigned long framesDropped { 0 };
unsigned long framesCorrupted { 0 };
unsigned long partialFramesLost { 0 };
unsigned long fullFramesLost { 0 };
double audioLevel { 0 };
double echoReturnLoss { 0 };
double echoReturnLossEnhancement { 0 };
};
struct DataChannelStats : Stats {
DataChannelStats() { type = RTCStatsReport::Type::DataChannel; }
String label;
String protocol;
long datachannelid { 0 };
String state;
unsigned long messagesSent { 0 };
unsigned long long bytesSent { 0 };
unsigned long messagesReceived { 0 };
unsigned long long bytesReceived { 0 };
};
enum class IceCandidatePairState {
Frozen,
Waiting,
Inprogress,
Failed,
Succeeded,
Cancelled
};
struct IceCandidatePairStats : Stats {
IceCandidatePairStats() { type = RTCStatsReport::Type::CandidatePair; }
String transportId;
String localCandidateId;
String remoteCandidateId;
IceCandidatePairState state;
unsigned long long priority { 0 };
bool nominated { false };
bool writable { false };
bool readable { false };
unsigned long long bytesSent { 0 };
unsigned long long bytesReceived { 0 };
double totalRoundTripTime { 0 };
double currentRoundTripTime { 0 };
double availableOutgoingBitrate { 0 };
double availableIncomingBitrate { 0 };
unsigned long long requestsReceived { 0 };
unsigned long long requestsSent { 0 };
unsigned long long responsesReceived { 0 };
unsigned long long responsesSent { 0 };
unsigned long long retransmissionsReceived { 0 };
unsigned long long retransmissionsSent { 0 };
unsigned long long consentRequestsReceived { 0 };
unsigned long long consentRequestsSent { 0 };
unsigned long long consentResponsesReceived { 0 };
unsigned long long consentResponsesSent { 0 };
};
struct CertificateStats : Stats {
CertificateStats() { type = RTCStatsReport::Type::Certificate; }
String fingerprint;
String fingerprintAlgorithm;
String base64Certificate;
String issuerCertificateId;
};
private:
RTCStatsReport() = default;
private:
RefPtr<DOMMapLike> m_mapLike;
};
} // namespace WebCore