/* * 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 "api/stats/rtc_stats.h" #include "rtc_base/system/rtc_export.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/#dom-rtcqualitylimitationreason struct RTCQualityLimitationReason { static const char* const kNone; static const char* const kCpu; static const char* const kBandwidth; static const char* const kOther; }; // https://webrtc.org/experiments/rtp-hdrext/video-content-type/ struct RTCContentType { static const char* const kUnspecified; static const char* const kScreenshare; }; // https://w3c.github.io/webrtc-stats/#certificatestats-dict* class RTC_EXPORT 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 RTC_EXPORT 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 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(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 data_channel_identifier; // 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 RTC_EXPORT 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 // TODO(qingsi): Add the stats of STUN binding requests (keepalives) and collect // them in the new PeerConnection::GetStats. class RTC_EXPORT 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; RTCStatsMember relay_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* // This forces us to have to override copy() and type(). class RTC_EXPORT 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); std::unique_ptr copy() const override; const char* type() const override; }; class RTC_EXPORT 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); std::unique_ptr copy() const override; const char* type() const override; }; // https://w3c.github.io/webrtc-stats/#msstats-dict* // TODO(hbos): Tracking bug crbug.com/660827 class RTC_EXPORT 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 RTC_EXPORT 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 media_source_id; 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; RTCStatsMember jitter_buffer_delay; RTCStatsMember jitter_buffer_emitted_count; // 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 huge_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; // Receive-only RTCStatsMember total_audio_energy; // Receive-only RTCStatsMember echo_return_loss; RTCStatsMember echo_return_loss_enhancement; RTCStatsMember total_samples_received; RTCStatsMember total_samples_duration; // Receive-only RTCStatsMember concealed_samples; RTCStatsMember silent_concealed_samples; RTCStatsMember concealment_events; RTCStatsMember inserted_samples_for_deceleration; RTCStatsMember removed_samples_for_acceleration; // Non-standard audio-only member // TODO(kuddai): Add description to standard. crbug.com/webrtc/10042 RTCNonStandardStatsMember jitter_buffer_flushes; RTCNonStandardStatsMember delayed_packet_outage_samples; RTCNonStandardStatsMember relative_packet_arrival_delay; // Non-standard metric showing target delay of jitter buffer. // This value is increased by the target jitter buffer delay every time a // sample is emitted by the jitter buffer. The added target is the target // delay, in seconds, at the time that the sample was emitted from the jitter // buffer. (https://github.com/w3c/webrtc-provisional-stats/pull/20) // Currently it is implemented only for audio. // TODO(titovartem) implement for video streams when will be requested. RTCNonStandardStatsMember jitter_buffer_target_delay; // TODO(henrik.lundin): Add description of the interruption metrics at // https://github.com/henbos/webrtc-provisional-stats/issues/17 RTCNonStandardStatsMember interruption_count; RTCNonStandardStatsMember total_interruption_duration; // Non-standard video-only members. // https://henbos.github.io/webrtc-provisional-stats/#RTCVideoReceiverStats-dict* RTCNonStandardStatsMember freeze_count; RTCNonStandardStatsMember pause_count; RTCNonStandardStatsMember total_freezes_duration; RTCNonStandardStatsMember total_pauses_duration; RTCNonStandardStatsMember total_frames_duration; RTCNonStandardStatsMember sum_squared_frame_durations; }; // https://w3c.github.io/webrtc-stats/#pcstats-dict* class RTC_EXPORT 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 RTC_EXPORT RTCRTPStreamStats : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCRTPStreamStats(const RTCRTPStreamStats& other); ~RTCRTPStreamStats() override; RTCStatsMember ssrc; // TODO(hbos): Remote case not supported by |RTCStatsCollector|. // crbug.com/657855, 657856 RTCStatsMember is_remote; // = false RTCStatsMember media_type; // renamed to kind. RTCStatsMember kind; 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 RTC_EXPORT 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 fec_packets_received; RTCStatsMember fec_packets_discarded; RTCStatsMember bytes_received; RTCStatsMember header_bytes_received; RTCStatsMember packets_lost; // Signed per RFC 3550 RTCStatsMember last_packet_received_timestamp; // 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 jitter_buffer_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; RTCStatsMember frames_received; // 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 frame_width; RTCStatsMember frame_height; RTCStatsMember frame_bit_depth; RTCStatsMember frames_per_second; RTCStatsMember frames_decoded; RTCStatsMember key_frames_decoded; RTCStatsMember frames_dropped; RTCStatsMember total_decode_time; RTCStatsMember total_inter_frame_delay; RTCStatsMember total_squared_inter_frame_delay; // https://henbos.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype RTCStatsMember content_type; // TODO(asapersson): Currently only populated if audio/video sync is enabled. RTCStatsMember estimated_playout_timestamp; // TODO(hbos): This is only implemented for video; implement it for audio as // well. RTCStatsMember decoder_implementation; }; // https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict* // TODO(hbos): Support the remote case |is_remote = true|. // https://bugs.webrtc.org/7066 class RTC_EXPORT 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 media_source_id; RTCStatsMember remote_id; RTCStatsMember rid; RTCStatsMember packets_sent; RTCStatsMember retransmitted_packets_sent; RTCStatsMember bytes_sent; RTCStatsMember header_bytes_sent; RTCStatsMember retransmitted_bytes_sent; // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7066 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; // TODO(https://crbug.com/webrtc/10635): This is only implemented for video; // implement it for audio as well. RTCStatsMember total_packet_send_delay; // Enum type RTCQualityLimitationReason // TODO(https://crbug.com/webrtc/10686): Also expose // qualityLimitationDurations. Requires RTCStatsMember support for // "record", see https://crbug.com/webrtc/10685. RTCStatsMember quality_limitation_reason; // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges RTCStatsMember quality_limitation_resolution_changes; // https://henbos.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype RTCStatsMember content_type; // TODO(hbos): This is only implemented for video; implement it for audio as // well. RTCStatsMember encoder_implementation; }; // TODO(https://crbug.com/webrtc/10671): Refactor the stats dictionaries to have // the same hierarchy as in the spec; implement RTCReceivedRtpStreamStats. // Several metrics are shared between "outbound-rtp", "remote-inbound-rtp", // "inbound-rtp" and "remote-outbound-rtp". In the spec there is a hierarchy of // dictionaries that minimizes defining the same metrics in multiple places. // From JavaScript this hierarchy is not observable and the spec's hierarchy is // purely editorial. In C++ non-final classes in the hierarchy could be used to // refer to different stats objects within the hierarchy. // https://w3c.github.io/webrtc-stats/#remoteinboundrtpstats-dict* class RTC_EXPORT RTCRemoteInboundRtpStreamStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); RTCRemoteInboundRtpStreamStats(const std::string& id, int64_t timestamp_us); RTCRemoteInboundRtpStreamStats(std::string&& id, int64_t timestamp_us); RTCRemoteInboundRtpStreamStats(const RTCRemoteInboundRtpStreamStats& other); ~RTCRemoteInboundRtpStreamStats() override; // In the spec RTCRemoteInboundRtpStreamStats inherits from RTCRtpStreamStats // and RTCReceivedRtpStreamStats. The members here are listed based on where // they are defined in the spec. // RTCRtpStreamStats RTCStatsMember ssrc; RTCStatsMember kind; RTCStatsMember transport_id; RTCStatsMember codec_id; // RTCReceivedRtpStreamStats RTCStatsMember packets_lost; RTCStatsMember jitter; // TODO(hbos): The following RTCReceivedRtpStreamStats metrics should also be // implemented: packetsReceived, packetsDiscarded, packetsRepaired, // burstPacketsLost, burstPacketsDiscarded, burstLossCount, burstDiscardCount, // burstLossRate, burstDiscardRate, gapLossRate and gapDiscardRate. // RTCRemoteInboundRtpStreamStats RTCStatsMember local_id; RTCStatsMember round_trip_time; // TODO(hbos): The following RTCRemoteInboundRtpStreamStats metric should also // be implemented: fractionLost. }; // 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(const std::string& id, int64_t timestamp_us); RTCMediaSourceStats(std::string&& id, int64_t timestamp_us); }; // https://w3c.github.io/webrtc-stats/#dom-rtcaudiosourcestats class RTC_EXPORT RTCAudioSourceStats final : public RTCMediaSourceStats { public: WEBRTC_RTCSTATS_DECL(); RTCAudioSourceStats(const std::string& id, int64_t timestamp_us); RTCAudioSourceStats(std::string&& id, int64_t timestamp_us); RTCAudioSourceStats(const RTCAudioSourceStats& other); ~RTCAudioSourceStats() override; RTCStatsMember audio_level; RTCStatsMember total_audio_energy; RTCStatsMember total_samples_duration; }; // https://w3c.github.io/webrtc-stats/#dom-rtcvideosourcestats class RTC_EXPORT RTCVideoSourceStats final : public RTCMediaSourceStats { public: WEBRTC_RTCSTATS_DECL(); RTCVideoSourceStats(const std::string& id, int64_t timestamp_us); RTCVideoSourceStats(std::string&& id, int64_t timestamp_us); RTCVideoSourceStats(const RTCVideoSourceStats& other); ~RTCVideoSourceStats() override; RTCStatsMember width; RTCStatsMember height; // TODO(hbos): Implement this metric. 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(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 packets_sent; RTCStatsMember bytes_received; RTCStatsMember packets_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; RTCStatsMember tls_version; RTCStatsMember dtls_cipher; RTCStatsMember srtp_cipher; RTCStatsMember selected_candidate_pair_changes; }; } // namespace webrtc #endif // API_STATS_RTCSTATS_OBJECTS_H_