blob: a8be605d39d80a224c631456d36d28eeccaba50f [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 {
Optional<uint32_t> ssrc;
String associateStatsId;
bool isRemote { false };
String mediaType;
String trackId;
String transportId;
String codecId;
Optional<uint32_t> firCount;
Optional<uint32_t> pliCount;
Optional<uint32_t> nackCount;
Optional<uint32_t> sliCount;
Optional<uint64_t> qpSum;
};
struct InboundRTPStreamStats : RTCRTPStreamStats {
InboundRTPStreamStats() { type = RTCStatsReport::Type::InboundRtp; }
Optional<uint32_t> packetsReceived;
Optional<uint64_t> bytesReceived;
Optional<uint32_t> packetsLost;
Optional<double> jitter;
Optional<double> fractionLost;
Optional<uint32_t> packetsDiscarded;
Optional<uint32_t> packetsRepaired;
Optional<uint32_t> burstPacketsLost;
Optional<uint32_t> burstPacketsDiscarded;
Optional<uint32_t> burstLossCount;
Optional<uint32_t> burstDiscardCount;
Optional<double> burstLossRate;
Optional<double> burstDiscardRate;
Optional<double> gapLossRate;
Optional<double> gapDiscardRate;
Optional<uint32_t> framesDecoded;
};
struct OutboundRTPStreamStats : RTCRTPStreamStats {
OutboundRTPStreamStats() { type = RTCStatsReport::Type::OutboundRtp; }
Optional<uint32_t> packetsSent;
Optional<uint64_t> bytesSent;
Optional<double> targetBitrate;
Optional<uint32_t> framesEncoded;
};
struct MediaStreamTrackStats : Stats {
MediaStreamTrackStats() { type = RTCStatsReport::Type::Track; }
String trackIdentifier;
Optional<bool> remoteSource;
Optional<bool> ended;
Optional<bool> detached;
Optional<uint32_t> frameWidth;
Optional<uint32_t> frameHeight;
Optional<double> framesPerSecond;
Optional<uint32_t> framesSent;
Optional<uint32_t> framesReceived;
Optional<uint32_t> framesDecoded;
Optional<uint32_t> framesDropped;
Optional<uint32_t> framesCorrupted;
Optional<uint32_t> partialFramesLost;
Optional<uint32_t> fullFramesLost;
Optional<double> audioLevel;
Optional<double> echoReturnLoss;
Optional<double> echoReturnLossEnhancement;
};
struct DataChannelStats : Stats {
DataChannelStats() { type = RTCStatsReport::Type::DataChannel; }
String label;
String protocol;
Optional<int> datachannelid;
String state;
Optional<uint32_t> messagesSent;
Optional<uint64_t> bytesSent;
Optional<uint32_t> messagesReceived;
Optional<uint64_t> bytesReceived;
};
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;
Optional<uint64_t> priority;
Optional<bool> nominated;
Optional<bool> writable;
Optional<bool> readable;
Optional<uint64_t> bytesSent;
Optional<uint64_t> bytesReceived;
Optional<double> totalRoundTripTime;
Optional<double> currentRoundTripTime;
Optional<double> availableOutgoingBitrate;
Optional<double> availableIncomingBitrate;
Optional<uint64_t> requestsReceived;
Optional<uint64_t> requestsSent;
Optional<uint64_t> responsesReceived;
Optional<uint64_t> responsesSent;
Optional<uint64_t> retransmissionsReceived;
Optional<uint64_t> retransmissionsSent;
Optional<uint64_t> consentRequestsReceived;
Optional<uint64_t> consentRequestsSent;
Optional<uint64_t> consentResponsesReceived;
Optional<uint64_t> consentResponsesSent;
};
enum class IceCandidateType { Host, Srflx, Prflx, Relay };
struct IceCandidateStats : Stats {
String transportId;
String address;
Optional<int32_t> port;
String protocol;
Optional<IceCandidateType> candidateType;
Optional<int32_t> priority;
String url;
bool deleted { false };
};
struct CertificateStats : Stats {
CertificateStats() { type = RTCStatsReport::Type::Certificate; }
String fingerprint;
String fingerprintAlgorithm;
String base64Certificate;
String issuerCertificateId;
};
enum class CodecType {
Encode,
Decode
};
struct CodecStats : Stats {
CodecStats() { type = RTCStatsReport::Type::Codec; }
Optional<uint32_t> payloadType;
Optional<CodecType> codecType;
String transportId;
String mimeType;
Optional<uint32_t> clockRate;
Optional<uint32_t> channels;
String sdpFmtpLine;
String implementation;
};
struct TransportStats : Stats {
TransportStats() { type = RTCStatsReport::Type::Transport; }
Optional<uint64_t> bytesSent;
Optional<uint64_t> bytesReceived;
String rtcpTransportStatsId;
String selectedCandidatePairId;
String localCertificateId;
String remoteCertificateId;
};
struct PeerConnectionStats : Stats {
PeerConnectionStats() { type = RTCStatsReport::Type::PeerConnection; }
Optional<uint32_t> dataChannelsOpened;
Optional<uint32_t> dataChannelsClosed;
};
private:
RTCStatsReport() = default;
private:
RefPtr<DOMMapLike> m_mapLike;
};
} // namespace WebCore