/* * Copyright 2016 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef API_STATS_RTCSTATS_OBJECTS_H_ #define API_STATS_RTCSTATS_OBJECTS_H_ #include #include #include #include #include #include "api/stats/rtc_stats.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { // https://w3c.github.io/webrtc-stats/#certificatestats-dict* class RTC_EXPORT RTCCertificateStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCCertificateStats(std::string id, Timestamp timestamp); RTCCertificateStats(const RTCCertificateStats& other); ~RTCCertificateStats() override; RTCStatsMember fingerprint; RTCStatsMember fingerprint_algorithm; RTCStatsMember base64_certificate; RTCStatsMember issuer_certificate_id; }; // https://w3c.github.io/webrtc-stats/#codec-dict* class RTC_EXPORT RTCCodecStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCCodecStats(std::string id, Timestamp timestamp); RTCCodecStats(const RTCCodecStats& other); ~RTCCodecStats() override; RTCStatsMember transport_id; RTCStatsMember payload_type; RTCStatsMember mime_type; RTCStatsMember clock_rate; RTCStatsMember channels; RTCStatsMember sdp_fmtp_line; }; // https://w3c.github.io/webrtc-stats/#dcstats-dict* class RTC_EXPORT RTCDataChannelStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCDataChannelStats(std::string id, Timestamp timestamp); RTCDataChannelStats(const RTCDataChannelStats& other); ~RTCDataChannelStats() override; RTCStatsMember label; RTCStatsMember protocol; RTCStatsMember data_channel_identifier; RTCStatsMember state; RTCStatsMember messages_sent; RTCStatsMember bytes_sent; RTCStatsMember messages_received; RTCStatsMember bytes_received; }; // https://w3c.github.io/webrtc-stats/#candidatepair-dict* class RTC_EXPORT RTCIceCandidatePairStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCIceCandidatePairStats(std::string id, Timestamp timestamp); RTCIceCandidatePairStats(const RTCIceCandidatePairStats& other); ~RTCIceCandidatePairStats() override; RTCStatsMember transport_id; RTCStatsMember local_candidate_id; RTCStatsMember remote_candidate_id; RTCStatsMember state; // Obsolete: priority RTCStatsMember priority; RTCStatsMember nominated; // `writable` does not exist in the spec and old comments suggest it used to // exist but was incorrectly implemented. // TODO(https://crbug.com/webrtc/14171): Standardize and/or modify // implementation. RTCStatsMember writable; RTCStatsMember packets_sent; RTCStatsMember packets_received; RTCStatsMember bytes_sent; RTCStatsMember bytes_received; RTCStatsMember total_round_trip_time; RTCStatsMember current_round_trip_time; RTCStatsMember available_outgoing_bitrate; RTCStatsMember available_incoming_bitrate; RTCStatsMember requests_received; RTCStatsMember requests_sent; RTCStatsMember responses_received; RTCStatsMember responses_sent; RTCStatsMember consent_requests_sent; RTCStatsMember packets_discarded_on_send; RTCStatsMember bytes_discarded_on_send; RTCStatsMember last_packet_received_timestamp; RTCStatsMember last_packet_sent_timestamp; }; // https://w3c.github.io/webrtc-stats/#icecandidate-dict* class RTC_EXPORT RTCIceCandidateStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCIceCandidateStats(const RTCIceCandidateStats& other); ~RTCIceCandidateStats() override; RTCStatsMember transport_id; // Obsolete: is_remote RTCStatsMember is_remote; RTCStatsMember network_type; RTCStatsMember ip; RTCStatsMember address; RTCStatsMember port; RTCStatsMember protocol; RTCStatsMember relay_protocol; RTCStatsMember candidate_type; RTCStatsMember priority; RTCStatsMember url; RTCStatsMember foundation; RTCStatsMember related_address; RTCStatsMember related_port; RTCStatsMember username_fragment; RTCStatsMember tcp_type; // The following metrics are NOT exposed to JavaScript. We should consider // standardizing or removing them. RTCStatsMember vpn; RTCStatsMember network_adapter_type; protected: RTCIceCandidateStats(std::string id, Timestamp timestamp, bool is_remote); }; // In the spec both local and remote varieties are of type RTCIceCandidateStats. // But here we define them as subclasses of `RTCIceCandidateStats` because the // `kType` need to be different ("RTCStatsType type") in the local/remote case. // https://w3c.github.io/webrtc-stats/#rtcstatstype-str* // This forces us to have to override copy() and type(). class RTC_EXPORT RTCLocalIceCandidateStats final : public RTCIceCandidateStats { public: static const char kType[]; RTCLocalIceCandidateStats(std::string id, Timestamp timestamp); std::unique_ptr copy() const override; const char* type() const override; }; class RTC_EXPORT RTCRemoteIceCandidateStats final : public RTCIceCandidateStats { public: static const char kType[]; RTCRemoteIceCandidateStats(std::string id, Timestamp timestamp); std::unique_ptr copy() const override; const char* type() const override; }; // https://w3c.github.io/webrtc-stats/#pcstats-dict* class RTC_EXPORT RTCPeerConnectionStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCPeerConnectionStats(std::string id, Timestamp timestamp); RTCPeerConnectionStats(const RTCPeerConnectionStats& other); ~RTCPeerConnectionStats() override; RTCStatsMember data_channels_opened; RTCStatsMember data_channels_closed; }; // https://w3c.github.io/webrtc-stats/#streamstats-dict* class RTC_EXPORT RTCRtpStreamStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCRtpStreamStats(const RTCRtpStreamStats& other); ~RTCRtpStreamStats() override; RTCStatsMember ssrc; RTCStatsMember kind; RTCStatsMember transport_id; RTCStatsMember codec_id; protected: RTCRtpStreamStats(std::string id, Timestamp timestamp); }; // https://www.w3.org/TR/webrtc-stats/#receivedrtpstats-dict* class RTC_EXPORT RTCReceivedRtpStreamStats : public RTCRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCReceivedRtpStreamStats(const RTCReceivedRtpStreamStats& other); ~RTCReceivedRtpStreamStats() override; RTCStatsMember jitter; RTCStatsMember packets_lost; // Signed per RFC 3550 protected: RTCReceivedRtpStreamStats(std::string id, Timestamp timestamp); }; // https://www.w3.org/TR/webrtc-stats/#sentrtpstats-dict* class RTC_EXPORT RTCSentRtpStreamStats : public RTCRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCSentRtpStreamStats(const RTCSentRtpStreamStats& other); ~RTCSentRtpStreamStats() override; RTCStatsMember packets_sent; RTCStatsMember bytes_sent; protected: RTCSentRtpStreamStats(std::string id, Timestamp timestamp); }; // https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict* class RTC_EXPORT RTCInboundRtpStreamStats final : public RTCReceivedRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCInboundRtpStreamStats(std::string id, Timestamp timestamp); RTCInboundRtpStreamStats(const RTCInboundRtpStreamStats& other); ~RTCInboundRtpStreamStats() override; RTCStatsMember playout_id; RTCStatsMember track_identifier; RTCStatsMember mid; RTCStatsMember remote_id; RTCStatsMember packets_received; RTCStatsMember packets_discarded; RTCStatsMember fec_packets_received; RTCStatsMember fec_bytes_received; RTCStatsMember fec_packets_discarded; // Inbound FEC SSRC. Only present if a mechanism like FlexFEC is negotiated. RTCStatsMember fec_ssrc; RTCStatsMember bytes_received; RTCStatsMember header_bytes_received; // Inbound RTX stats. Only defined when RTX is used and it is therefore // possible to distinguish retransmissions. RTCStatsMember retransmitted_packets_received; RTCStatsMember retransmitted_bytes_received; RTCStatsMember rtx_ssrc; RTCStatsMember last_packet_received_timestamp; RTCStatsMember jitter_buffer_delay; RTCStatsMember jitter_buffer_target_delay; RTCStatsMember jitter_buffer_minimum_delay; RTCStatsMember jitter_buffer_emitted_count; RTCStatsMember total_samples_received; RTCStatsMember concealed_samples; RTCStatsMember silent_concealed_samples; RTCStatsMember concealment_events; RTCStatsMember inserted_samples_for_deceleration; RTCStatsMember removed_samples_for_acceleration; RTCStatsMember audio_level; RTCStatsMember total_audio_energy; RTCStatsMember total_samples_duration; // Stats below are only implemented or defined for video. RTCStatsMember frames_received; RTCStatsMember frame_width; RTCStatsMember frame_height; RTCStatsMember frames_per_second; RTCStatsMember frames_decoded; RTCStatsMember key_frames_decoded; RTCStatsMember frames_dropped; RTCStatsMember total_decode_time; RTCStatsMember total_processing_delay; RTCStatsMember total_assembly_time; RTCStatsMember frames_assembled_from_multiple_packets; // TODO(https://crbug.com/webrtc/15600): Implement framesRendered, which is // incremented at the same time that totalInterFrameDelay and // totalSquaredInterFrameDelay is incremented. (Dividing inter-frame delay by // framesDecoded is slightly wrong.) // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-framesrendered // // TODO(https://crbug.com/webrtc/15601): Inter-frame, pause and freeze metrics // all related to when the frame is rendered, but our implementation measures // at delivery to sink, not at actual render time. When we have an actual // frame rendered callback, move the calculating of these metrics to there in // order to make them more accurate. RTCStatsMember total_inter_frame_delay; RTCStatsMember total_squared_inter_frame_delay; RTCStatsMember pause_count; RTCStatsMember total_pauses_duration; RTCStatsMember freeze_count; RTCStatsMember total_freezes_duration; // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype RTCStatsMember content_type; // Only populated if audio/video sync is enabled. // TODO(https://crbug.com/webrtc/14177): Expose even if A/V sync is off? RTCStatsMember estimated_playout_timestamp; // Only defined for video. // In JavaScript, this is only exposed if HW exposure is allowed. RTCStatsMember decoder_implementation; // FIR and PLI counts are only defined for |kind == "video"|. RTCStatsMember fir_count; RTCStatsMember pli_count; RTCStatsMember nack_count; RTCStatsMember qp_sum; // This is a remnant of the legacy getStats() API. When the "video-timing" // header extension is used, // https://webrtc.github.io/webrtc-org/experiments/rtp-hdrext/video-timing/, // `googTimingFrameInfo` is exposed with the value of // TimingFrameInfo::ToString(). // TODO(https://crbug.com/webrtc/14586): Unship or standardize this metric. RTCStatsMember goog_timing_frame_info; // In JavaScript, this is only exposed if HW exposure is allowed. RTCStatsMember power_efficient_decoder; // The following metrics are NOT exposed to JavaScript. We should consider // standardizing or removing them. RTCStatsMember jitter_buffer_flushes; RTCStatsMember delayed_packet_outage_samples; RTCStatsMember relative_packet_arrival_delay; RTCStatsMember interruption_count; RTCStatsMember total_interruption_duration; RTCStatsMember min_playout_delay; }; // https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict* class RTC_EXPORT RTCOutboundRtpStreamStats final : public RTCSentRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCOutboundRtpStreamStats(std::string id, Timestamp timestamp); RTCOutboundRtpStreamStats(const RTCOutboundRtpStreamStats& other); ~RTCOutboundRtpStreamStats() override; RTCStatsMember media_source_id; RTCStatsMember remote_id; RTCStatsMember mid; RTCStatsMember rid; RTCStatsMember retransmitted_packets_sent; RTCStatsMember header_bytes_sent; RTCStatsMember retransmitted_bytes_sent; RTCStatsMember target_bitrate; RTCStatsMember frames_encoded; RTCStatsMember key_frames_encoded; RTCStatsMember total_encode_time; RTCStatsMember total_encoded_bytes_target; RTCStatsMember frame_width; RTCStatsMember frame_height; RTCStatsMember frames_per_second; RTCStatsMember frames_sent; RTCStatsMember huge_frames_sent; RTCStatsMember total_packet_send_delay; RTCStatsMember quality_limitation_reason; RTCStatsMember> quality_limitation_durations; // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges RTCStatsMember quality_limitation_resolution_changes; // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype RTCStatsMember content_type; // In JavaScript, this is only exposed if HW exposure is allowed. // Only implemented for video. // TODO(https://crbug.com/webrtc/14178): Implement for audio as well. RTCStatsMember encoder_implementation; // FIR and PLI counts are only defined for |kind == "video"|. RTCStatsMember fir_count; RTCStatsMember pli_count; RTCStatsMember nack_count; RTCStatsMember qp_sum; RTCStatsMember active; // In JavaScript, this is only exposed if HW exposure is allowed. RTCStatsMember power_efficient_encoder; RTCStatsMember scalability_mode; // RTX ssrc. Only present if RTX is negotiated. RTCStatsMember rtx_ssrc; }; // https://w3c.github.io/webrtc-stats/#remoteinboundrtpstats-dict* class RTC_EXPORT RTCRemoteInboundRtpStreamStats final : public RTCReceivedRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCRemoteInboundRtpStreamStats(std::string id, Timestamp timestamp); RTCRemoteInboundRtpStreamStats(const RTCRemoteInboundRtpStreamStats& other); ~RTCRemoteInboundRtpStreamStats() override; RTCStatsMember local_id; RTCStatsMember round_trip_time; RTCStatsMember fraction_lost; RTCStatsMember total_round_trip_time; RTCStatsMember round_trip_time_measurements; }; // https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict* class RTC_EXPORT RTCRemoteOutboundRtpStreamStats final : public RTCSentRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCRemoteOutboundRtpStreamStats(std::string id, Timestamp timestamp); RTCRemoteOutboundRtpStreamStats(const RTCRemoteOutboundRtpStreamStats& other); ~RTCRemoteOutboundRtpStreamStats() override; RTCStatsMember local_id; RTCStatsMember remote_timestamp; RTCStatsMember reports_sent; RTCStatsMember round_trip_time; RTCStatsMember round_trip_time_measurements; RTCStatsMember total_round_trip_time; }; // https://w3c.github.io/webrtc-stats/#dom-rtcmediasourcestats class RTC_EXPORT RTCMediaSourceStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCMediaSourceStats(const RTCMediaSourceStats& other); ~RTCMediaSourceStats() override; RTCStatsMember track_identifier; RTCStatsMember kind; protected: RTCMediaSourceStats(std::string id, Timestamp timestamp); }; // https://w3c.github.io/webrtc-stats/#dom-rtcaudiosourcestats class RTC_EXPORT RTCAudioSourceStats final : public RTCMediaSourceStats { public: WEBRTC_RTCSTATS_DECL(); RTCAudioSourceStats(std::string id, Timestamp timestamp); RTCAudioSourceStats(const RTCAudioSourceStats& other); ~RTCAudioSourceStats() override; RTCStatsMember audio_level; RTCStatsMember total_audio_energy; RTCStatsMember total_samples_duration; RTCStatsMember echo_return_loss; RTCStatsMember echo_return_loss_enhancement; }; // https://w3c.github.io/webrtc-stats/#dom-rtcvideosourcestats class RTC_EXPORT RTCVideoSourceStats final : public RTCMediaSourceStats { public: WEBRTC_RTCSTATS_DECL(); RTCVideoSourceStats(std::string id, Timestamp timestamp); RTCVideoSourceStats(const RTCVideoSourceStats& other); ~RTCVideoSourceStats() override; RTCStatsMember width; RTCStatsMember height; RTCStatsMember frames; RTCStatsMember frames_per_second; }; // https://w3c.github.io/webrtc-stats/#transportstats-dict* class RTC_EXPORT RTCTransportStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCTransportStats(std::string id, Timestamp timestamp); RTCTransportStats(const RTCTransportStats& other); ~RTCTransportStats() override; RTCStatsMember bytes_sent; RTCStatsMember packets_sent; RTCStatsMember bytes_received; RTCStatsMember packets_received; RTCStatsMember rtcp_transport_stats_id; RTCStatsMember dtls_state; RTCStatsMember selected_candidate_pair_id; RTCStatsMember local_certificate_id; RTCStatsMember remote_certificate_id; RTCStatsMember tls_version; RTCStatsMember dtls_cipher; RTCStatsMember dtls_role; RTCStatsMember srtp_cipher; RTCStatsMember selected_candidate_pair_changes; RTCStatsMember ice_role; RTCStatsMember ice_local_username_fragment; RTCStatsMember ice_state; }; // https://w3c.github.io/webrtc-stats/#playoutstats-dict* class RTC_EXPORT RTCAudioPlayoutStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCAudioPlayoutStats(const std::string& id, Timestamp timestamp); RTCAudioPlayoutStats(const RTCAudioPlayoutStats& other); ~RTCAudioPlayoutStats() override; RTCStatsMember kind; RTCStatsMember synthesized_samples_duration; RTCStatsMember synthesized_samples_events; RTCStatsMember total_samples_duration; RTCStatsMember total_playout_delay; RTCStatsMember total_samples_count; }; } // namespace webrtc #endif // API_STATS_RTCSTATS_OBJECTS_H_