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