/* * 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 "api/stats/rtcstats.h" namespace webrtc { // https://w3c.github.io/webrtc-pc/#idl-def-rtcdatachannelstate struct RTCDataChannelState { static const char* const kConnecting; static const char* const kOpen; static const char* const kClosing; static const char* const kClosed; }; // https://w3c.github.io/webrtc-stats/#dom-rtcstatsicecandidatepairstate struct RTCStatsIceCandidatePairState { static const char* const kFrozen; static const char* const kWaiting; static const char* const kInProgress; static const char* const kFailed; static const char* const kSucceeded; }; // https://w3c.github.io/webrtc-pc/#rtcicecandidatetype-enum struct RTCIceCandidateType { static const char* const kHost; static const char* const kSrflx; static const char* const kPrflx; static const char* const kRelay; }; // https://w3c.github.io/webrtc-pc/#idl-def-rtcdtlstransportstate struct RTCDtlsTransportState { static const char* const kNew; static const char* const kConnecting; static const char* const kConnected; static const char* const kClosed; static const char* const kFailed; }; // |RTCMediaStreamTrackStats::kind| is not an enum in the spec but the only // valid values are "audio" and "video". // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-kind struct RTCMediaStreamTrackKind { static const char* const kAudio; static const char* const kVideo; }; // https://w3c.github.io/webrtc-stats/#dom-rtcnetworktype struct RTCNetworkType { static const char* const kBluetooth; static const char* const kCellular; static const char* const kEthernet; static const char* const kWifi; static const char* const kWimax; static const char* const kVpn; static const char* const kUnknown; }; // https://w3c.github.io/webrtc-stats/#certificatestats-dict* class RTCCertificateStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCCertificateStats(const std::string& id, int64_t timestamp_us); RTCCertificateStats(std::string&& id, int64_t timestamp_us); 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 RTCCodecStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCCodecStats(const std::string& id, int64_t timestamp_us); RTCCodecStats(std::string&& id, int64_t timestamp_us); RTCCodecStats(const RTCCodecStats& other); ~RTCCodecStats() override; RTCStatsMember payload_type; RTCStatsMember mime_type; RTCStatsMember clock_rate; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7061 RTCStatsMember channels; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7061 RTCStatsMember sdp_fmtp_line; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7061 RTCStatsMember implementation; }; // https://w3c.github.io/webrtc-stats/#dcstats-dict* class RTCDataChannelStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCDataChannelStats(const std::string& id, int64_t timestamp_us); RTCDataChannelStats(std::string&& id, int64_t timestamp_us); RTCDataChannelStats(const RTCDataChannelStats& other); ~RTCDataChannelStats() override; RTCStatsMember label; RTCStatsMember protocol; RTCStatsMember datachannelid; // TODO(hbos): Support enum types? "RTCStatsMember"? RTCStatsMember state; RTCStatsMember messages_sent; RTCStatsMember bytes_sent; RTCStatsMember messages_received; RTCStatsMember bytes_received; }; // https://w3c.github.io/webrtc-stats/#candidatepair-dict* // TODO(hbos): Tracking bug https://bugs.webrtc.org/7062 class RTCIceCandidatePairStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCIceCandidatePairStats(const std::string& id, int64_t timestamp_us); RTCIceCandidatePairStats(std::string&& id, int64_t timestamp_us); RTCIceCandidatePairStats(const RTCIceCandidatePairStats& other); ~RTCIceCandidatePairStats() override; RTCStatsMember transport_id; RTCStatsMember local_candidate_id; RTCStatsMember remote_candidate_id; // TODO(hbos): Support enum types? // "RTCStatsMember"? RTCStatsMember state; RTCStatsMember priority; RTCStatsMember nominated; // TODO(hbos): Collect this the way the spec describes it. We have a value for // it but it is not spec-compliant. https://bugs.webrtc.org/7062 RTCStatsMember writable; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 RTCStatsMember readable; RTCStatsMember bytes_sent; RTCStatsMember bytes_received; RTCStatsMember total_round_trip_time; RTCStatsMember current_round_trip_time; RTCStatsMember available_outgoing_bitrate; // TODO(hbos): Populate this value. It is wired up and collected the same way // "VideoBwe.googAvailableReceiveBandwidth" is, but that value is always // undefined. https://bugs.webrtc.org/7062 RTCStatsMember available_incoming_bitrate; RTCStatsMember requests_received; RTCStatsMember requests_sent; RTCStatsMember responses_received; RTCStatsMember responses_sent; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 RTCStatsMember retransmissions_received; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 RTCStatsMember retransmissions_sent; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 RTCStatsMember consent_requests_received; RTCStatsMember consent_requests_sent; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 RTCStatsMember consent_responses_received; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 RTCStatsMember consent_responses_sent; }; // https://w3c.github.io/webrtc-stats/#icecandidate-dict* // TODO(hbos): |RTCStatsCollector| only collects candidates that are part of // ice candidate pairs, but there could be candidates not paired with anything. // crbug.com/632723 class RTCIceCandidateStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCIceCandidateStats(const RTCIceCandidateStats& other); ~RTCIceCandidateStats() override; RTCStatsMember transport_id; RTCStatsMember is_remote; RTCStatsMember network_type; RTCStatsMember ip; RTCStatsMember port; RTCStatsMember protocol; // TODO(hbos): Support enum types? "RTCStatsMember"? RTCStatsMember candidate_type; RTCStatsMember priority; // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/632723 RTCStatsMember url; // TODO(hbos): |deleted = true| case is not supported by |RTCStatsCollector|. // crbug.com/632723 RTCStatsMember deleted; // = false protected: RTCIceCandidateStats( const std::string& id, int64_t timestamp_us, bool is_remote); RTCIceCandidateStats(std::string&& id, int64_t timestamp_us, 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* class RTCLocalIceCandidateStats final : public RTCIceCandidateStats { public: static const char kType[]; RTCLocalIceCandidateStats(const std::string& id, int64_t timestamp_us); RTCLocalIceCandidateStats(std::string&& id, int64_t timestamp_us); const char* type() const override; }; class RTCRemoteIceCandidateStats final : public RTCIceCandidateStats { public: static const char kType[]; RTCRemoteIceCandidateStats(const std::string& id, int64_t timestamp_us); RTCRemoteIceCandidateStats(std::string&& id, int64_t timestamp_us); const char* type() const override; }; // https://w3c.github.io/webrtc-stats/#msstats-dict* // TODO(hbos): Tracking bug crbug.com/660827 class RTCMediaStreamStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCMediaStreamStats(const std::string& id, int64_t timestamp_us); RTCMediaStreamStats(std::string&& id, int64_t timestamp_us); RTCMediaStreamStats(const RTCMediaStreamStats& other); ~RTCMediaStreamStats() override; RTCStatsMember stream_identifier; RTCStatsMember> track_ids; }; // https://w3c.github.io/webrtc-stats/#mststats-dict* // TODO(hbos): Tracking bug crbug.com/659137 class RTCMediaStreamTrackStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCMediaStreamTrackStats(const std::string& id, int64_t timestamp_us, const char* kind); RTCMediaStreamTrackStats(std::string&& id, int64_t timestamp_us, const char* kind); RTCMediaStreamTrackStats(const RTCMediaStreamTrackStats& other); ~RTCMediaStreamTrackStats() override; RTCStatsMember track_identifier; RTCStatsMember remote_source; RTCStatsMember ended; // TODO(hbos): |RTCStatsCollector| does not return stats for detached tracks. // crbug.com/659137 RTCStatsMember detached; // See |RTCMediaStreamTrackKind| for valid values. RTCStatsMember kind; // TODO(gustaf): Implement jitter_buffer_delay for video (currently // implemented for audio only). // https://crbug.com/webrtc/8318 RTCStatsMember jitter_buffer_delay; // Video-only members RTCStatsMember frame_width; RTCStatsMember frame_height; // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 RTCStatsMember frames_per_second; RTCStatsMember frames_sent; RTCStatsMember frames_received; RTCStatsMember frames_decoded; RTCStatsMember frames_dropped; // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 RTCStatsMember frames_corrupted; // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 RTCStatsMember partial_frames_lost; // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 RTCStatsMember full_frames_lost; // Audio-only members RTCStatsMember audio_level; RTCStatsMember total_audio_energy; RTCStatsMember echo_return_loss; RTCStatsMember echo_return_loss_enhancement; RTCStatsMember total_samples_received; RTCStatsMember total_samples_duration; RTCStatsMember concealed_samples; RTCStatsMember concealment_events; }; // https://w3c.github.io/webrtc-stats/#pcstats-dict* class RTCPeerConnectionStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCPeerConnectionStats(const std::string& id, int64_t timestamp_us); RTCPeerConnectionStats(std::string&& id, int64_t timestamp_us); RTCPeerConnectionStats(const RTCPeerConnectionStats& other); ~RTCPeerConnectionStats() override; RTCStatsMember data_channels_opened; RTCStatsMember data_channels_closed; }; // https://w3c.github.io/webrtc-stats/#streamstats-dict* // TODO(hbos): Tracking bug crbug.com/657854 class RTCRTPStreamStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCRTPStreamStats(const RTCRTPStreamStats& other); ~RTCRTPStreamStats() override; RTCStatsMember ssrc; // TODO(hbos): When the remote case is supported |RTCStatsCollector| needs to // set this. crbug.com/657855, 657856 RTCStatsMember associate_stats_id; // TODO(hbos): Remote case not supported by |RTCStatsCollector|. // crbug.com/657855, 657856 RTCStatsMember is_remote; // = false RTCStatsMember media_type; RTCStatsMember track_id; RTCStatsMember transport_id; RTCStatsMember codec_id; // FIR and PLI counts are only defined for |media_type == "video"|. RTCStatsMember fir_count; RTCStatsMember pli_count; // TODO(hbos): NACK count should be collected by |RTCStatsCollector| for both // audio and video but is only defined in the "video" case. crbug.com/657856 RTCStatsMember nack_count; // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/657854 // SLI count is only defined for |media_type == "video"|. RTCStatsMember sli_count; RTCStatsMember qp_sum; protected: RTCRTPStreamStats(const std::string& id, int64_t timestamp_us); RTCRTPStreamStats(std::string&& id, int64_t timestamp_us); }; // https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict* // TODO(hbos): Support the remote case |is_remote = true|. // https://bugs.webrtc.org/7065 class RTCInboundRTPStreamStats final : public RTCRTPStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCInboundRTPStreamStats(const std::string& id, int64_t timestamp_us); RTCInboundRTPStreamStats(std::string&& id, int64_t timestamp_us); RTCInboundRTPStreamStats(const RTCInboundRTPStreamStats& other); ~RTCInboundRTPStreamStats() override; RTCStatsMember packets_received; RTCStatsMember bytes_received; RTCStatsMember packets_lost; // TODO(hbos): Collect and populate this value for both "audio" and "video", // currently not collected for "video". https://bugs.webrtc.org/7065 RTCStatsMember jitter; RTCStatsMember fraction_lost; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember round_trip_time; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember packets_discarded; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember packets_repaired; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember burst_packets_lost; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember burst_packets_discarded; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember burst_loss_count; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember burst_discard_count; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember burst_loss_rate; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember burst_discard_rate; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember gap_loss_rate; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 RTCStatsMember gap_discard_rate; RTCStatsMember frames_decoded; }; // https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict* // TODO(hbos): Support the remote case |is_remote = true|. // https://bugs.webrtc.org/7066 class RTCOutboundRTPStreamStats final : public RTCRTPStreamStats { public: WEBRTC_RTCSTATS_DECL(); RTCOutboundRTPStreamStats(const std::string& id, int64_t timestamp_us); RTCOutboundRTPStreamStats(std::string&& id, int64_t timestamp_us); RTCOutboundRTPStreamStats(const RTCOutboundRTPStreamStats& other); ~RTCOutboundRTPStreamStats() override; RTCStatsMember packets_sent; RTCStatsMember bytes_sent; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7066 RTCStatsMember target_bitrate; RTCStatsMember frames_encoded; }; // https://w3c.github.io/webrtc-stats/#transportstats-dict* class RTCTransportStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCTransportStats(const std::string& id, int64_t timestamp_us); RTCTransportStats(std::string&& id, int64_t timestamp_us); RTCTransportStats(const RTCTransportStats& other); ~RTCTransportStats() override; RTCStatsMember bytes_sent; RTCStatsMember bytes_received; RTCStatsMember rtcp_transport_stats_id; // TODO(hbos): Support enum types? "RTCStatsMember"? RTCStatsMember dtls_state; RTCStatsMember selected_candidate_pair_id; RTCStatsMember local_certificate_id; RTCStatsMember remote_certificate_id; }; } // namespace webrtc #endif // API_STATS_RTCSTATS_OBJECTS_H_