/* * 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 "absl/types/optional.h" #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() override; absl::optional fingerprint; absl::optional fingerprint_algorithm; absl::optional base64_certificate; absl::optional 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() override; absl::optional transport_id; absl::optional payload_type; absl::optional mime_type; absl::optional clock_rate; absl::optional channels; absl::optional 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() override; absl::optional label; absl::optional protocol; absl::optional data_channel_identifier; absl::optional state; absl::optional messages_sent; absl::optional bytes_sent; absl::optional messages_received; absl::optional 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() override; absl::optional transport_id; absl::optional local_candidate_id; absl::optional remote_candidate_id; absl::optional state; // Obsolete: priority absl::optional priority; absl::optional 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. absl::optional writable; absl::optional packets_sent; absl::optional packets_received; absl::optional bytes_sent; absl::optional bytes_received; absl::optional total_round_trip_time; absl::optional current_round_trip_time; absl::optional available_outgoing_bitrate; absl::optional available_incoming_bitrate; absl::optional requests_received; absl::optional requests_sent; absl::optional responses_received; absl::optional responses_sent; absl::optional consent_requests_sent; absl::optional packets_discarded_on_send; absl::optional bytes_discarded_on_send; absl::optional last_packet_received_timestamp; absl::optional last_packet_sent_timestamp; }; // https://w3c.github.io/webrtc-stats/#icecandidate-dict* class RTC_EXPORT RTCIceCandidateStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); ~RTCIceCandidateStats() override; absl::optional transport_id; // Obsolete: is_remote absl::optional is_remote; absl::optional network_type; absl::optional ip; absl::optional address; absl::optional port; absl::optional protocol; absl::optional relay_protocol; absl::optional candidate_type; absl::optional priority; absl::optional url; absl::optional foundation; absl::optional related_address; absl::optional related_port; absl::optional username_fragment; absl::optional tcp_type; // The following metrics are NOT exposed to JavaScript. We should consider // standardizing or removing them. absl::optional vpn; absl::optional 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() override; absl::optional data_channels_opened; absl::optional data_channels_closed; }; // https://w3c.github.io/webrtc-stats/#streamstats-dict* class RTC_EXPORT RTCRtpStreamStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); ~RTCRtpStreamStats() override; absl::optional ssrc; absl::optional kind; absl::optional transport_id; absl::optional 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() override; absl::optional jitter; absl::optional 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() override; absl::optional packets_sent; absl::optional 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() override; absl::optional playout_id; absl::optional track_identifier; absl::optional mid; absl::optional remote_id; absl::optional packets_received; absl::optional packets_discarded; absl::optional fec_packets_received; absl::optional fec_bytes_received; absl::optional fec_packets_discarded; // Inbound FEC SSRC. Only present if a mechanism like FlexFEC is negotiated. absl::optional fec_ssrc; absl::optional bytes_received; absl::optional header_bytes_received; // Inbound RTX stats. Only defined when RTX is used and it is therefore // possible to distinguish retransmissions. absl::optional retransmitted_packets_received; absl::optional retransmitted_bytes_received; absl::optional rtx_ssrc; absl::optional last_packet_received_timestamp; absl::optional jitter_buffer_delay; absl::optional jitter_buffer_target_delay; absl::optional jitter_buffer_minimum_delay; absl::optional jitter_buffer_emitted_count; absl::optional total_samples_received; absl::optional concealed_samples; absl::optional silent_concealed_samples; absl::optional concealment_events; absl::optional inserted_samples_for_deceleration; absl::optional removed_samples_for_acceleration; absl::optional audio_level; absl::optional total_audio_energy; absl::optional total_samples_duration; // Stats below are only implemented or defined for video. absl::optional frames_received; absl::optional frame_width; absl::optional frame_height; absl::optional frames_per_second; absl::optional frames_decoded; absl::optional key_frames_decoded; absl::optional frames_dropped; absl::optional total_decode_time; absl::optional total_processing_delay; absl::optional total_assembly_time; absl::optional 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. absl::optional total_inter_frame_delay; absl::optional total_squared_inter_frame_delay; absl::optional pause_count; absl::optional total_pauses_duration; absl::optional freeze_count; absl::optional total_freezes_duration; // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype absl::optional content_type; // Only populated if audio/video sync is enabled. // TODO(https://crbug.com/webrtc/14177): Expose even if A/V sync is off? absl::optional estimated_playout_timestamp; // Only defined for video. // In JavaScript, this is only exposed if HW exposure is allowed. absl::optional decoder_implementation; // FIR and PLI counts are only defined for |kind == "video"|. absl::optional fir_count; absl::optional pli_count; absl::optional nack_count; absl::optional 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. absl::optional goog_timing_frame_info; // In JavaScript, this is only exposed if HW exposure is allowed. absl::optional power_efficient_decoder; // The following metrics are NOT exposed to JavaScript. We should consider // standardizing or removing them. absl::optional jitter_buffer_flushes; absl::optional delayed_packet_outage_samples; absl::optional relative_packet_arrival_delay; absl::optional interruption_count; absl::optional total_interruption_duration; absl::optional 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() override; absl::optional media_source_id; absl::optional remote_id; absl::optional mid; absl::optional rid; absl::optional retransmitted_packets_sent; absl::optional header_bytes_sent; absl::optional retransmitted_bytes_sent; absl::optional target_bitrate; absl::optional frames_encoded; absl::optional key_frames_encoded; absl::optional total_encode_time; absl::optional total_encoded_bytes_target; absl::optional frame_width; absl::optional frame_height; absl::optional frames_per_second; absl::optional frames_sent; absl::optional huge_frames_sent; absl::optional total_packet_send_delay; absl::optional quality_limitation_reason; absl::optional> quality_limitation_durations; // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges absl::optional quality_limitation_resolution_changes; // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype absl::optional 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. absl::optional encoder_implementation; // FIR and PLI counts are only defined for |kind == "video"|. absl::optional fir_count; absl::optional pli_count; absl::optional nack_count; absl::optional qp_sum; absl::optional active; // In JavaScript, this is only exposed if HW exposure is allowed. absl::optional power_efficient_encoder; absl::optional scalability_mode; // RTX ssrc. Only present if RTX is negotiated. absl::optional 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() override; absl::optional local_id; absl::optional round_trip_time; absl::optional fraction_lost; absl::optional total_round_trip_time; absl::optional 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() override; absl::optional local_id; absl::optional remote_timestamp; absl::optional reports_sent; absl::optional round_trip_time; absl::optional round_trip_time_measurements; absl::optional total_round_trip_time; }; // https://w3c.github.io/webrtc-stats/#dom-rtcmediasourcestats class RTC_EXPORT RTCMediaSourceStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); ~RTCMediaSourceStats() override; absl::optional track_identifier; absl::optional 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() override; absl::optional audio_level; absl::optional total_audio_energy; absl::optional total_samples_duration; absl::optional echo_return_loss; absl::optional 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() override; absl::optional width; absl::optional height; absl::optional frames; absl::optional 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() override; absl::optional bytes_sent; absl::optional packets_sent; absl::optional bytes_received; absl::optional packets_received; absl::optional rtcp_transport_stats_id; absl::optional dtls_state; absl::optional selected_candidate_pair_id; absl::optional local_certificate_id; absl::optional remote_certificate_id; absl::optional tls_version; absl::optional dtls_cipher; absl::optional dtls_role; absl::optional srtp_cipher; absl::optional selected_candidate_pair_changes; absl::optional ice_role; absl::optional ice_local_username_fragment; absl::optional 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() override; absl::optional kind; absl::optional synthesized_samples_duration; absl::optional synthesized_samples_events; absl::optional total_samples_duration; absl::optional total_playout_delay; absl::optional total_samples_count; }; } // namespace webrtc #endif // API_STATS_RTCSTATS_OBJECTS_H_