blob: 1254b93674f754a3b90d9454e6e315871446954e [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 "LibWebRTCStatsCollector.h"
#include "RTCIceCandidateType.h"
namespace WebCore {
class DOMMapAdapter;
class RTCStatsReport : public RefCounted<RTCStatsReport> {
public:
using MapInitializer = Function<void(DOMMapAdapter&)>;
static Ref<RTCStatsReport> create(MapInitializer&& mapInitializer) { return adoptRef(*new RTCStatsReport(WTFMove(mapInitializer))); }
void initializeMapLike(DOMMapAdapter& adapter) { m_mapInitializer(adapter); }
enum class Type {
CandidatePair,
Certificate,
Codec,
DataChannel,
InboundRtp,
LocalCandidate,
MediaSource,
OutboundRtp,
PeerConnection,
RemoteCandidate,
RemoteInboundRtp,
Track,
Transport
};
struct Stats {
double timestamp;
Type type;
String id;
};
struct RtpStreamStats : Stats {
uint32_t ssrc { 0 };
String kind;
String mediaType;
String transportId;
String codecId;
};
struct ReceivedRtpStreamStats : RtpStreamStats {
std::optional<uint64_t> packetsReceived;
std::optional<int64_t> packetsLost;
std::optional<double> jitter;
std::optional<uint64_t> packetsDiscarded;
std::optional<uint64_t> packetsRepaired;
std::optional<uint64_t> burstPacketsLost;
std::optional<uint64_t> burstPacketsDiscarded;
std::optional<uint32_t> burstLossCount;
std::optional<uint32_t> burstDiscardCount;
std::optional<double> burstLossRate;
std::optional<double> burstDiscardRate;
std::optional<double> gapLossRate;
std::optional<double> gapDiscardRate;
std::optional<uint32_t> framesDropped;
std::optional<uint32_t> partialFramesLost;
std::optional<uint32_t> fullFramesLost;
};
struct InboundRtpStreamStats : ReceivedRtpStreamStats {
InboundRtpStreamStats() { type = RTCStatsReport::Type::InboundRtp; }
String receiverId;
String remoteId;
std::optional<uint32_t> framesDecoded;
std::optional<uint32_t> keyFramesDecoded;
std::optional<uint32_t> frameWidth;
std::optional<uint32_t> frameHeight;
std::optional<uint32_t> frameBitDepth;
std::optional<double> framesPerSecond;
std::optional<uint64_t> qpSum;
std::optional<double> totalDecodeTime;
std::optional<double> totalInterFrameDelay;
std::optional<double> totalSquaredInterFrameDelay;
std::optional<bool> voiceActivityFlag;
std::optional<double> lastPacketReceivedTimestamp;
std::optional<double> averageRtcpInterval;
std::optional<uint64_t> headerBytesReceived;
std::optional<uint64_t> fecPacketsReceived;
std::optional<uint64_t> fecPacketsDiscarded;
std::optional<uint64_t> bytesReceived;
std::optional<uint64_t> packetsFailedDecryption;
std::optional<uint64_t> packetsDuplicated;
std::optional<uint32_t> nackCount;
std::optional<uint32_t> firCount;
std::optional<uint32_t> pliCount;
std::optional<uint32_t> sliCount;
std::optional<double> estimatedPlayoutTimestamp;
std::optional<double> jitterBufferDelay;
std::optional<uint64_t> jitterBufferEmittedCount;
std::optional<uint64_t> totalSamplesReceived;
std::optional<uint64_t> samplesDecodedWithSilk;
std::optional<uint64_t> samplesDecodedWithCelt;
std::optional<uint64_t> concealedSamples;
std::optional<uint64_t> silentConcealedSamples;
std::optional<uint64_t> concealmentEvents;
std::optional<uint64_t> insertedSamplesForDeceleration;
std::optional<uint64_t> removedSamplesForAcceleration;
std::optional<double> audioLevel;
std::optional<double> totalAudioEnergy;
std::optional<double> totalSamplesDuration;
std::optional<uint32_t> framesReceived;
String trackId;
};
struct RemoteInboundRtpStreamStats : ReceivedRtpStreamStats {
RemoteInboundRtpStreamStats() { type = RTCStatsReport::Type::RemoteInboundRtp; }
String localId;
std::optional<double> roundTripTime;
std::optional<double> totalRoundTripTime;
std::optional<double> fractionLost;
std::optional<uint64_t> reportsReceived;
std::optional<uint64_t> roundTripTimeMeasurements;
};
struct SentRtpStreamStats : RtpStreamStats {
std::optional<uint32_t> packetsSent;
std::optional<uint64_t> bytesSent;
};
struct OutboundRtpStreamStats : SentRtpStreamStats {
OutboundRtpStreamStats() { type = RTCStatsReport::Type::OutboundRtp; }
std::optional<uint32_t> rtxSsrc;
String mediaSourceId;
String senderId;
String remoteId;
String rid;
std::optional<double> lastPacketSentTimestamp;
std::optional<uint64_t> headerBytesSent;
std::optional<uint32_t> packetsDiscardedOnSend;
std::optional<uint64_t> bytesDiscardedOnSend;
std::optional<uint32_t> fecPacketsSent;
std::optional<uint64_t> retransmittedPacketsSent;
std::optional<uint64_t> retransmittedBytesSent;
std::optional<double> targetBitrate;
std::optional<uint64_t> totalEncodedBytesTarget;
std::optional<uint32_t> frameWidth;
std::optional<uint32_t> frameHeight;
std::optional<uint32_t> frameBitDepth;
std::optional<double> framesPerSecond;
std::optional<uint32_t> framesSent;
std::optional<uint32_t> hugeFramesSent;
std::optional<uint32_t> framesEncoded;
std::optional<uint32_t> keyFramesEncoded;
std::optional<uint32_t> framesDiscardedOnSend;
std::optional<uint64_t> qpSum;
std::optional<uint64_t> totalSamplesSent;
std::optional<uint64_t> samplesEncodedWithSilk;
std::optional<uint64_t> samplesEncodedWithCelt;
std::optional<bool> voiceActivityFlag;
std::optional<double> totalEncodeTime;
std::optional<double> totalPacketSendDelay;
std::optional<double> averageRtcpInterval;
// std::optional<RTCQualityLimitationReason qualityLimitationReason;
// std::optional<record<DOMString, double> qualityLimitationDurations;
std::optional<uint32_t> qualityLimitationResolutionChanges;
// std::optional<record<USVString, unsigned long long> perDscpPacketsSent;
std::optional<uint32_t> nackCount;
std::optional<uint32_t> firCount;
std::optional<uint32_t> pliCount;
std::optional<uint32_t> sliCount;
// DOMString encoderImplementation;
String trackId;
};
struct MediaStreamTrackStats : Stats {
MediaStreamTrackStats() { type = RTCStatsReport::Type::Track; }
String trackIdentifier;
std::optional<bool> remoteSource;
std::optional<bool> ended;
std::optional<bool> detached;
std::optional<uint32_t> frameWidth;
std::optional<uint32_t> frameHeight;
std::optional<double> framesPerSecond;
std::optional<uint32_t> framesSent;
std::optional<uint32_t> framesReceived;
std::optional<uint32_t> framesDecoded;
std::optional<uint32_t> framesDropped;
std::optional<uint32_t> framesCorrupted;
std::optional<uint32_t> partialFramesLost;
std::optional<uint32_t> fullFramesLost;
std::optional<double> audioLevel;
std::optional<double> echoReturnLoss;
std::optional<double> echoReturnLossEnhancement;
std::optional<uint32_t> freezeCount;
std::optional<uint32_t> pauseCount;
std::optional<double> totalFreezesDuration;
std::optional<double> totalPausesDuration;
std::optional<double> totalFramesDuration;
std::optional<double> sumOfSquaredFramesDuration;
std::optional<uint64_t> jitterBufferFlushes;
};
struct DataChannelStats : Stats {
DataChannelStats() { type = RTCStatsReport::Type::DataChannel; }
String label;
String protocol;
std::optional<int> datachannelid;
String state;
std::optional<uint32_t> messagesSent;
std::optional<uint64_t> bytesSent;
std::optional<uint32_t> messagesReceived;
std::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;
std::optional<uint64_t> priority;
std::optional<bool> nominated;
std::optional<bool> writable;
std::optional<bool> readable;
std::optional<uint64_t> bytesSent;
std::optional<uint64_t> bytesReceived;
std::optional<double> totalRoundTripTime;
std::optional<double> currentRoundTripTime;
std::optional<double> availableOutgoingBitrate;
std::optional<double> availableIncomingBitrate;
std::optional<uint64_t> requestsReceived;
std::optional<uint64_t> requestsSent;
std::optional<uint64_t> responsesReceived;
std::optional<uint64_t> responsesSent;
std::optional<uint64_t> retransmissionsReceived;
std::optional<uint64_t> retransmissionsSent;
std::optional<uint64_t> consentRequestsReceived;
std::optional<uint64_t> consentRequestsSent;
std::optional<uint64_t> consentResponsesReceived;
std::optional<uint64_t> consentResponsesSent;
};
struct IceCandidateStats : Stats {
String transportId;
String address;
std::optional<int32_t> port;
String protocol;
std::optional<RTCIceCandidateType> candidateType;
std::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; }
std::optional<uint32_t> payloadType;
std::optional<CodecType> codecType;
String transportId;
String mimeType;
std::optional<uint32_t> clockRate;
std::optional<uint32_t> channels;
String sdpFmtpLine;
String implementation;
};
struct TransportStats : Stats {
TransportStats() { type = RTCStatsReport::Type::Transport; }
std::optional<uint64_t> bytesSent;
std::optional<uint64_t> bytesReceived;
String rtcpTransportStatsId;
String selectedCandidatePairId;
String localCertificateId;
String remoteCertificateId;
String dtlsState;
String tlsVersion;
String dtlsCipher;
String srtpCipher;
};
struct PeerConnectionStats : Stats {
PeerConnectionStats() { type = RTCStatsReport::Type::PeerConnection; }
std::optional<uint32_t> dataChannelsOpened;
std::optional<uint32_t> dataChannelsClosed;
};
struct MediaSourceStats : Stats {
String trackIdentifier;
String kind;
std::optional<bool> relayedSource;
};
struct AudioSourceStats : MediaSourceStats {
AudioSourceStats() { type = RTCStatsReport::Type::MediaSource; }
std::optional<double> audioLevel;
std::optional<double> totalAudioEnergy;
std::optional<double> totalSamplesDuration;
std::optional<double> echoReturnLoss;
std::optional<double> echoReturnLossEnhancement;
};
struct VideoSourceStats : MediaSourceStats {
VideoSourceStats() { type = RTCStatsReport::Type::MediaSource; }
std::optional<unsigned long> width;
std::optional<unsigned long> height;
std::optional<unsigned long> bitDepth;
std::optional<unsigned long> frames;
std::optional<double> framesPerSecond;
};
private:
explicit RTCStatsReport(MapInitializer&&);
MapInitializer m_mapInitializer;
};
inline RTCStatsReport::RTCStatsReport(MapInitializer&& mapInitializer)
: m_mapInitializer(WTFMove(mapInitializer))
{
}
} // namespace WebCore