1 /* 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_STATS_RTCSTATS_OBJECTS_H_ 12 #define API_STATS_RTCSTATS_OBJECTS_H_ 13 14 #include <stdint.h> 15 16 #include <memory> 17 #include <string> 18 #include <vector> 19 20 #include "api/stats/rtc_stats.h" 21 #include "rtc_base/system/rtc_export.h" 22 23 namespace webrtc { 24 25 // https://w3c.github.io/webrtc-pc/#idl-def-rtcdatachannelstate 26 struct RTCDataChannelState { 27 static const char* const kConnecting; 28 static const char* const kOpen; 29 static const char* const kClosing; 30 static const char* const kClosed; 31 }; 32 33 // https://w3c.github.io/webrtc-stats/#dom-rtcstatsicecandidatepairstate 34 struct RTCStatsIceCandidatePairState { 35 static const char* const kFrozen; 36 static const char* const kWaiting; 37 static const char* const kInProgress; 38 static const char* const kFailed; 39 static const char* const kSucceeded; 40 }; 41 42 // https://w3c.github.io/webrtc-pc/#rtcicecandidatetype-enum 43 struct RTCIceCandidateType { 44 static const char* const kHost; 45 static const char* const kSrflx; 46 static const char* const kPrflx; 47 static const char* const kRelay; 48 }; 49 50 // https://w3c.github.io/webrtc-pc/#idl-def-rtcdtlstransportstate 51 struct RTCDtlsTransportState { 52 static const char* const kNew; 53 static const char* const kConnecting; 54 static const char* const kConnected; 55 static const char* const kClosed; 56 static const char* const kFailed; 57 }; 58 59 // |RTCMediaStreamTrackStats::kind| is not an enum in the spec but the only 60 // valid values are "audio" and "video". 61 // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-kind 62 struct RTCMediaStreamTrackKind { 63 static const char* const kAudio; 64 static const char* const kVideo; 65 }; 66 67 // https://w3c.github.io/webrtc-stats/#dom-rtcnetworktype 68 struct RTCNetworkType { 69 static const char* const kBluetooth; 70 static const char* const kCellular; 71 static const char* const kEthernet; 72 static const char* const kWifi; 73 static const char* const kWimax; 74 static const char* const kVpn; 75 static const char* const kUnknown; 76 }; 77 78 // https://w3c.github.io/webrtc-stats/#dom-rtcqualitylimitationreason 79 struct RTCQualityLimitationReason { 80 static const char* const kNone; 81 static const char* const kCpu; 82 static const char* const kBandwidth; 83 static const char* const kOther; 84 }; 85 86 // https://webrtc.org/experiments/rtp-hdrext/video-content-type/ 87 struct RTCContentType { 88 static const char* const kUnspecified; 89 static const char* const kScreenshare; 90 }; 91 92 // https://w3c.github.io/webrtc-stats/#certificatestats-dict* 93 class RTC_EXPORT RTCCertificateStats final : public RTCStats { 94 public: 95 WEBRTC_RTCSTATS_DECL(); 96 97 RTCCertificateStats(const std::string& id, int64_t timestamp_us); 98 RTCCertificateStats(std::string&& id, int64_t timestamp_us); 99 RTCCertificateStats(const RTCCertificateStats& other); 100 ~RTCCertificateStats() override; 101 102 RTCStatsMember<std::string> fingerprint; 103 RTCStatsMember<std::string> fingerprint_algorithm; 104 RTCStatsMember<std::string> base64_certificate; 105 RTCStatsMember<std::string> issuer_certificate_id; 106 }; 107 108 // https://w3c.github.io/webrtc-stats/#codec-dict* 109 class RTC_EXPORT RTCCodecStats final : public RTCStats { 110 public: 111 WEBRTC_RTCSTATS_DECL(); 112 113 RTCCodecStats(const std::string& id, int64_t timestamp_us); 114 RTCCodecStats(std::string&& id, int64_t timestamp_us); 115 RTCCodecStats(const RTCCodecStats& other); 116 ~RTCCodecStats() override; 117 118 RTCStatsMember<uint32_t> payload_type; 119 RTCStatsMember<std::string> mime_type; 120 RTCStatsMember<uint32_t> clock_rate; 121 RTCStatsMember<uint32_t> channels; 122 RTCStatsMember<std::string> sdp_fmtp_line; 123 }; 124 125 // https://w3c.github.io/webrtc-stats/#dcstats-dict* 126 class RTC_EXPORT RTCDataChannelStats final : public RTCStats { 127 public: 128 WEBRTC_RTCSTATS_DECL(); 129 130 RTCDataChannelStats(const std::string& id, int64_t timestamp_us); 131 RTCDataChannelStats(std::string&& id, int64_t timestamp_us); 132 RTCDataChannelStats(const RTCDataChannelStats& other); 133 ~RTCDataChannelStats() override; 134 135 RTCStatsMember<std::string> label; 136 RTCStatsMember<std::string> protocol; 137 RTCStatsMember<int32_t> data_channel_identifier; 138 // TODO(hbos): Support enum types? "RTCStatsMember<RTCDataChannelState>"? 139 RTCStatsMember<std::string> state; 140 RTCStatsMember<uint32_t> messages_sent; 141 RTCStatsMember<uint64_t> bytes_sent; 142 RTCStatsMember<uint32_t> messages_received; 143 RTCStatsMember<uint64_t> bytes_received; 144 }; 145 146 // https://w3c.github.io/webrtc-stats/#candidatepair-dict* 147 // TODO(hbos): Tracking bug https://bugs.webrtc.org/7062 148 class RTC_EXPORT RTCIceCandidatePairStats final : public RTCStats { 149 public: 150 WEBRTC_RTCSTATS_DECL(); 151 152 RTCIceCandidatePairStats(const std::string& id, int64_t timestamp_us); 153 RTCIceCandidatePairStats(std::string&& id, int64_t timestamp_us); 154 RTCIceCandidatePairStats(const RTCIceCandidatePairStats& other); 155 ~RTCIceCandidatePairStats() override; 156 157 RTCStatsMember<std::string> transport_id; 158 RTCStatsMember<std::string> local_candidate_id; 159 RTCStatsMember<std::string> remote_candidate_id; 160 // TODO(hbos): Support enum types? 161 // "RTCStatsMember<RTCStatsIceCandidatePairState>"? 162 RTCStatsMember<std::string> state; 163 RTCStatsMember<uint64_t> priority; 164 RTCStatsMember<bool> nominated; 165 // TODO(hbos): Collect this the way the spec describes it. We have a value for 166 // it but it is not spec-compliant. https://bugs.webrtc.org/7062 167 RTCStatsMember<bool> writable; 168 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 169 RTCStatsMember<bool> readable; 170 RTCStatsMember<uint64_t> bytes_sent; 171 RTCStatsMember<uint64_t> bytes_received; 172 RTCStatsMember<double> total_round_trip_time; 173 RTCStatsMember<double> current_round_trip_time; 174 RTCStatsMember<double> available_outgoing_bitrate; 175 // TODO(hbos): Populate this value. It is wired up and collected the same way 176 // "VideoBwe.googAvailableReceiveBandwidth" is, but that value is always 177 // undefined. https://bugs.webrtc.org/7062 178 RTCStatsMember<double> available_incoming_bitrate; 179 RTCStatsMember<uint64_t> requests_received; 180 RTCStatsMember<uint64_t> requests_sent; 181 RTCStatsMember<uint64_t> responses_received; 182 RTCStatsMember<uint64_t> responses_sent; 183 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 184 RTCStatsMember<uint64_t> retransmissions_received; 185 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 186 RTCStatsMember<uint64_t> retransmissions_sent; 187 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 188 RTCStatsMember<uint64_t> consent_requests_received; 189 RTCStatsMember<uint64_t> consent_requests_sent; 190 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 191 RTCStatsMember<uint64_t> consent_responses_received; 192 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062 193 RTCStatsMember<uint64_t> consent_responses_sent; 194 }; 195 196 // https://w3c.github.io/webrtc-stats/#icecandidate-dict* 197 // TODO(hbos): |RTCStatsCollector| only collects candidates that are part of 198 // ice candidate pairs, but there could be candidates not paired with anything. 199 // crbug.com/632723 200 // TODO(qingsi): Add the stats of STUN binding requests (keepalives) and collect 201 // them in the new PeerConnection::GetStats. 202 class RTC_EXPORT RTCIceCandidateStats : public RTCStats { 203 public: 204 WEBRTC_RTCSTATS_DECL(); 205 206 RTCIceCandidateStats(const RTCIceCandidateStats& other); 207 ~RTCIceCandidateStats() override; 208 209 RTCStatsMember<std::string> transport_id; 210 RTCStatsMember<bool> is_remote; 211 RTCStatsMember<std::string> network_type; 212 RTCStatsMember<std::string> ip; 213 RTCStatsMember<int32_t> port; 214 RTCStatsMember<std::string> protocol; 215 RTCStatsMember<std::string> relay_protocol; 216 // TODO(hbos): Support enum types? "RTCStatsMember<RTCIceCandidateType>"? 217 RTCStatsMember<std::string> candidate_type; 218 RTCStatsMember<int32_t> priority; 219 // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/632723 220 RTCStatsMember<std::string> url; 221 // TODO(hbos): |deleted = true| case is not supported by |RTCStatsCollector|. 222 // crbug.com/632723 223 RTCStatsMember<bool> deleted; // = false 224 225 protected: 226 RTCIceCandidateStats(const std::string& id, 227 int64_t timestamp_us, 228 bool is_remote); 229 RTCIceCandidateStats(std::string&& id, int64_t timestamp_us, bool is_remote); 230 }; 231 232 // In the spec both local and remote varieties are of type RTCIceCandidateStats. 233 // But here we define them as subclasses of |RTCIceCandidateStats| because the 234 // |kType| need to be different ("RTCStatsType type") in the local/remote case. 235 // https://w3c.github.io/webrtc-stats/#rtcstatstype-str* 236 // This forces us to have to override copy() and type(). 237 class RTC_EXPORT RTCLocalIceCandidateStats final : public RTCIceCandidateStats { 238 public: 239 static const char kType[]; 240 RTCLocalIceCandidateStats(const std::string& id, int64_t timestamp_us); 241 RTCLocalIceCandidateStats(std::string&& id, int64_t timestamp_us); 242 std::unique_ptr<RTCStats> copy() const override; 243 const char* type() const override; 244 }; 245 246 class RTC_EXPORT RTCRemoteIceCandidateStats final 247 : public RTCIceCandidateStats { 248 public: 249 static const char kType[]; 250 RTCRemoteIceCandidateStats(const std::string& id, int64_t timestamp_us); 251 RTCRemoteIceCandidateStats(std::string&& id, int64_t timestamp_us); 252 std::unique_ptr<RTCStats> copy() const override; 253 const char* type() const override; 254 }; 255 256 // https://w3c.github.io/webrtc-stats/#msstats-dict* 257 // TODO(hbos): Tracking bug crbug.com/660827 258 class RTC_EXPORT RTCMediaStreamStats final : public RTCStats { 259 public: 260 WEBRTC_RTCSTATS_DECL(); 261 262 RTCMediaStreamStats(const std::string& id, int64_t timestamp_us); 263 RTCMediaStreamStats(std::string&& id, int64_t timestamp_us); 264 RTCMediaStreamStats(const RTCMediaStreamStats& other); 265 ~RTCMediaStreamStats() override; 266 267 RTCStatsMember<std::string> stream_identifier; 268 RTCStatsMember<std::vector<std::string>> track_ids; 269 }; 270 271 // https://w3c.github.io/webrtc-stats/#mststats-dict* 272 // TODO(hbos): Tracking bug crbug.com/659137 273 class RTC_EXPORT RTCMediaStreamTrackStats final : public RTCStats { 274 public: 275 WEBRTC_RTCSTATS_DECL(); 276 277 RTCMediaStreamTrackStats(const std::string& id, 278 int64_t timestamp_us, 279 const char* kind); 280 RTCMediaStreamTrackStats(std::string&& id, 281 int64_t timestamp_us, 282 const char* kind); 283 RTCMediaStreamTrackStats(const RTCMediaStreamTrackStats& other); 284 ~RTCMediaStreamTrackStats() override; 285 286 RTCStatsMember<std::string> track_identifier; 287 RTCStatsMember<std::string> media_source_id; 288 RTCStatsMember<bool> remote_source; 289 RTCStatsMember<bool> ended; 290 // TODO(hbos): |RTCStatsCollector| does not return stats for detached tracks. 291 // crbug.com/659137 292 RTCStatsMember<bool> detached; 293 // See |RTCMediaStreamTrackKind| for valid values. 294 RTCStatsMember<std::string> kind; 295 RTCStatsMember<double> jitter_buffer_delay; 296 RTCStatsMember<uint64_t> jitter_buffer_emitted_count; 297 // Video-only members 298 RTCStatsMember<uint32_t> frame_width; 299 RTCStatsMember<uint32_t> frame_height; 300 // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 301 RTCStatsMember<double> frames_per_second; 302 RTCStatsMember<uint32_t> frames_sent; 303 RTCStatsMember<uint32_t> huge_frames_sent; 304 RTCStatsMember<uint32_t> frames_received; 305 RTCStatsMember<uint32_t> frames_decoded; 306 RTCStatsMember<uint32_t> frames_dropped; 307 // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 308 RTCStatsMember<uint32_t> frames_corrupted; 309 // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 310 RTCStatsMember<uint32_t> partial_frames_lost; 311 // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137 312 RTCStatsMember<uint32_t> full_frames_lost; 313 // Audio-only members 314 RTCStatsMember<double> audio_level; // Receive-only 315 RTCStatsMember<double> total_audio_energy; // Receive-only 316 RTCStatsMember<double> echo_return_loss; 317 RTCStatsMember<double> echo_return_loss_enhancement; 318 RTCStatsMember<uint64_t> total_samples_received; 319 RTCStatsMember<double> total_samples_duration; // Receive-only 320 RTCStatsMember<uint64_t> concealed_samples; 321 RTCStatsMember<uint64_t> silent_concealed_samples; 322 RTCStatsMember<uint64_t> concealment_events; 323 RTCStatsMember<uint64_t> inserted_samples_for_deceleration; 324 RTCStatsMember<uint64_t> removed_samples_for_acceleration; 325 // Non-standard audio-only member 326 // TODO(kuddai): Add description to standard. crbug.com/webrtc/10042 327 RTCNonStandardStatsMember<uint64_t> jitter_buffer_flushes; 328 RTCNonStandardStatsMember<uint64_t> delayed_packet_outage_samples; 329 RTCNonStandardStatsMember<double> relative_packet_arrival_delay; 330 // Non-standard metric showing target delay of jitter buffer. 331 // This value is increased by the target jitter buffer delay every time a 332 // sample is emitted by the jitter buffer. The added target is the target 333 // delay, in seconds, at the time that the sample was emitted from the jitter 334 // buffer. (https://github.com/w3c/webrtc-provisional-stats/pull/20) 335 // Currently it is implemented only for audio. 336 // TODO(titovartem) implement for video streams when will be requested. 337 RTCNonStandardStatsMember<double> jitter_buffer_target_delay; 338 // TODO(henrik.lundin): Add description of the interruption metrics at 339 // https://github.com/henbos/webrtc-provisional-stats/issues/17 340 RTCNonStandardStatsMember<uint32_t> interruption_count; 341 RTCNonStandardStatsMember<double> total_interruption_duration; 342 // Non-standard video-only members. 343 // https://henbos.github.io/webrtc-provisional-stats/#RTCVideoReceiverStats-dict* 344 RTCNonStandardStatsMember<uint32_t> freeze_count; 345 RTCNonStandardStatsMember<uint32_t> pause_count; 346 RTCNonStandardStatsMember<double> total_freezes_duration; 347 RTCNonStandardStatsMember<double> total_pauses_duration; 348 RTCNonStandardStatsMember<double> total_frames_duration; 349 RTCNonStandardStatsMember<double> sum_squared_frame_durations; 350 }; 351 352 // https://w3c.github.io/webrtc-stats/#pcstats-dict* 353 class RTC_EXPORT RTCPeerConnectionStats final : public RTCStats { 354 public: 355 WEBRTC_RTCSTATS_DECL(); 356 357 RTCPeerConnectionStats(const std::string& id, int64_t timestamp_us); 358 RTCPeerConnectionStats(std::string&& id, int64_t timestamp_us); 359 RTCPeerConnectionStats(const RTCPeerConnectionStats& other); 360 ~RTCPeerConnectionStats() override; 361 362 RTCStatsMember<uint32_t> data_channels_opened; 363 RTCStatsMember<uint32_t> data_channels_closed; 364 }; 365 366 // https://w3c.github.io/webrtc-stats/#streamstats-dict* 367 // TODO(hbos): Tracking bug crbug.com/657854 368 class RTC_EXPORT RTCRTPStreamStats : public RTCStats { 369 public: 370 WEBRTC_RTCSTATS_DECL(); 371 372 RTCRTPStreamStats(const RTCRTPStreamStats& other); 373 ~RTCRTPStreamStats() override; 374 375 RTCStatsMember<uint32_t> ssrc; 376 // TODO(hbos): Remote case not supported by |RTCStatsCollector|. 377 // crbug.com/657855, 657856 378 RTCStatsMember<bool> is_remote; // = false 379 RTCStatsMember<std::string> media_type; // renamed to kind. 380 RTCStatsMember<std::string> kind; 381 RTCStatsMember<std::string> track_id; 382 RTCStatsMember<std::string> transport_id; 383 RTCStatsMember<std::string> codec_id; 384 // FIR and PLI counts are only defined for |media_type == "video"|. 385 RTCStatsMember<uint32_t> fir_count; 386 RTCStatsMember<uint32_t> pli_count; 387 // TODO(hbos): NACK count should be collected by |RTCStatsCollector| for both 388 // audio and video but is only defined in the "video" case. crbug.com/657856 389 RTCStatsMember<uint32_t> nack_count; 390 // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/657854 391 // SLI count is only defined for |media_type == "video"|. 392 RTCStatsMember<uint32_t> sli_count; 393 RTCStatsMember<uint64_t> qp_sum; 394 395 protected: 396 RTCRTPStreamStats(const std::string& id, int64_t timestamp_us); 397 RTCRTPStreamStats(std::string&& id, int64_t timestamp_us); 398 }; 399 400 // https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict* 401 // TODO(hbos): Support the remote case |is_remote = true|. 402 // https://bugs.webrtc.org/7065 403 class RTC_EXPORT RTCInboundRTPStreamStats final : public RTCRTPStreamStats { 404 public: 405 WEBRTC_RTCSTATS_DECL(); 406 407 RTCInboundRTPStreamStats(const std::string& id, int64_t timestamp_us); 408 RTCInboundRTPStreamStats(std::string&& id, int64_t timestamp_us); 409 RTCInboundRTPStreamStats(const RTCInboundRTPStreamStats& other); 410 ~RTCInboundRTPStreamStats() override; 411 412 RTCStatsMember<uint32_t> packets_received; 413 RTCStatsMember<uint64_t> fec_packets_received; 414 RTCStatsMember<uint64_t> fec_packets_discarded; 415 RTCStatsMember<uint64_t> bytes_received; 416 RTCStatsMember<uint64_t> header_bytes_received; 417 RTCStatsMember<int32_t> packets_lost; // Signed per RFC 3550 418 RTCStatsMember<double> last_packet_received_timestamp; 419 // TODO(hbos): Collect and populate this value for both "audio" and "video", 420 // currently not collected for "video". https://bugs.webrtc.org/7065 421 RTCStatsMember<double> jitter; 422 RTCStatsMember<double> jitter_buffer_delay; 423 RTCStatsMember<uint64_t> jitter_buffer_emitted_count; 424 RTCStatsMember<uint64_t> total_samples_received; 425 RTCStatsMember<uint64_t> concealed_samples; 426 RTCStatsMember<uint64_t> silent_concealed_samples; 427 RTCStatsMember<uint64_t> concealment_events; 428 RTCStatsMember<uint64_t> inserted_samples_for_deceleration; 429 RTCStatsMember<uint64_t> removed_samples_for_acceleration; 430 RTCStatsMember<double> audio_level; 431 RTCStatsMember<double> total_audio_energy; 432 RTCStatsMember<double> total_samples_duration; 433 RTCStatsMember<int32_t> frames_received; 434 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 435 RTCStatsMember<double> round_trip_time; 436 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 437 RTCStatsMember<uint32_t> packets_discarded; 438 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 439 RTCStatsMember<uint32_t> packets_repaired; 440 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 441 RTCStatsMember<uint32_t> burst_packets_lost; 442 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 443 RTCStatsMember<uint32_t> burst_packets_discarded; 444 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 445 RTCStatsMember<uint32_t> burst_loss_count; 446 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 447 RTCStatsMember<uint32_t> burst_discard_count; 448 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 449 RTCStatsMember<double> burst_loss_rate; 450 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 451 RTCStatsMember<double> burst_discard_rate; 452 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 453 RTCStatsMember<double> gap_loss_rate; 454 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065 455 RTCStatsMember<double> gap_discard_rate; 456 RTCStatsMember<uint32_t> frame_width; 457 RTCStatsMember<uint32_t> frame_height; 458 RTCStatsMember<uint32_t> frame_bit_depth; 459 RTCStatsMember<double> frames_per_second; 460 RTCStatsMember<uint32_t> frames_decoded; 461 RTCStatsMember<uint32_t> key_frames_decoded; 462 RTCStatsMember<uint32_t> frames_dropped; 463 RTCStatsMember<double> total_decode_time; 464 RTCStatsMember<double> total_inter_frame_delay; 465 RTCStatsMember<double> total_squared_inter_frame_delay; 466 // https://henbos.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype 467 RTCStatsMember<std::string> content_type; 468 // TODO(asapersson): Currently only populated if audio/video sync is enabled. 469 RTCStatsMember<double> estimated_playout_timestamp; 470 // TODO(hbos): This is only implemented for video; implement it for audio as 471 // well. 472 RTCStatsMember<std::string> decoder_implementation; 473 }; 474 475 // https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict* 476 // TODO(hbos): Support the remote case |is_remote = true|. 477 // https://bugs.webrtc.org/7066 478 class RTC_EXPORT RTCOutboundRTPStreamStats final : public RTCRTPStreamStats { 479 public: 480 WEBRTC_RTCSTATS_DECL(); 481 482 RTCOutboundRTPStreamStats(const std::string& id, int64_t timestamp_us); 483 RTCOutboundRTPStreamStats(std::string&& id, int64_t timestamp_us); 484 RTCOutboundRTPStreamStats(const RTCOutboundRTPStreamStats& other); 485 ~RTCOutboundRTPStreamStats() override; 486 487 RTCStatsMember<std::string> media_source_id; 488 RTCStatsMember<std::string> remote_id; 489 RTCStatsMember<std::string> rid; 490 RTCStatsMember<uint32_t> packets_sent; 491 RTCStatsMember<uint64_t> retransmitted_packets_sent; 492 RTCStatsMember<uint64_t> bytes_sent; 493 RTCStatsMember<uint64_t> header_bytes_sent; 494 RTCStatsMember<uint64_t> retransmitted_bytes_sent; 495 // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7066 496 RTCStatsMember<double> target_bitrate; 497 RTCStatsMember<uint32_t> frames_encoded; 498 RTCStatsMember<uint32_t> key_frames_encoded; 499 RTCStatsMember<double> total_encode_time; 500 RTCStatsMember<uint64_t> total_encoded_bytes_target; 501 RTCStatsMember<uint32_t> frame_width; 502 RTCStatsMember<uint32_t> frame_height; 503 RTCStatsMember<double> frames_per_second; 504 RTCStatsMember<uint32_t> frames_sent; 505 RTCStatsMember<uint32_t> huge_frames_sent; 506 // TODO(https://crbug.com/webrtc/10635): This is only implemented for video; 507 // implement it for audio as well. 508 RTCStatsMember<double> total_packet_send_delay; 509 // Enum type RTCQualityLimitationReason 510 // TODO(https://crbug.com/webrtc/10686): Also expose 511 // qualityLimitationDurations. Requires RTCStatsMember support for 512 // "record<DOMString, double>", see https://crbug.com/webrtc/10685. 513 RTCStatsMember<std::string> quality_limitation_reason; 514 // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges 515 RTCStatsMember<uint32_t> quality_limitation_resolution_changes; 516 // https://henbos.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype 517 RTCStatsMember<std::string> content_type; 518 // TODO(hbos): This is only implemented for video; implement it for audio as 519 // well. 520 RTCStatsMember<std::string> encoder_implementation; 521 }; 522 523 // TODO(https://crbug.com/webrtc/10671): Refactor the stats dictionaries to have 524 // the same hierarchy as in the spec; implement RTCReceivedRtpStreamStats. 525 // Several metrics are shared between "outbound-rtp", "remote-inbound-rtp", 526 // "inbound-rtp" and "remote-outbound-rtp". In the spec there is a hierarchy of 527 // dictionaries that minimizes defining the same metrics in multiple places. 528 // From JavaScript this hierarchy is not observable and the spec's hierarchy is 529 // purely editorial. In C++ non-final classes in the hierarchy could be used to 530 // refer to different stats objects within the hierarchy. 531 // https://w3c.github.io/webrtc-stats/#remoteinboundrtpstats-dict* 532 class RTC_EXPORT RTCRemoteInboundRtpStreamStats final : public RTCStats { 533 public: 534 WEBRTC_RTCSTATS_DECL(); 535 536 RTCRemoteInboundRtpStreamStats(const std::string& id, int64_t timestamp_us); 537 RTCRemoteInboundRtpStreamStats(std::string&& id, int64_t timestamp_us); 538 RTCRemoteInboundRtpStreamStats(const RTCRemoteInboundRtpStreamStats& other); 539 ~RTCRemoteInboundRtpStreamStats() override; 540 541 // In the spec RTCRemoteInboundRtpStreamStats inherits from RTCRtpStreamStats 542 // and RTCReceivedRtpStreamStats. The members here are listed based on where 543 // they are defined in the spec. 544 // RTCRtpStreamStats 545 RTCStatsMember<uint32_t> ssrc; 546 RTCStatsMember<std::string> kind; 547 RTCStatsMember<std::string> transport_id; 548 RTCStatsMember<std::string> codec_id; 549 // RTCReceivedRtpStreamStats 550 RTCStatsMember<int32_t> packets_lost; 551 RTCStatsMember<double> jitter; 552 // TODO(hbos): The following RTCReceivedRtpStreamStats metrics should also be 553 // implemented: packetsReceived, packetsDiscarded, packetsRepaired, 554 // burstPacketsLost, burstPacketsDiscarded, burstLossCount, burstDiscardCount, 555 // burstLossRate, burstDiscardRate, gapLossRate and gapDiscardRate. 556 // RTCRemoteInboundRtpStreamStats 557 RTCStatsMember<std::string> local_id; 558 RTCStatsMember<double> round_trip_time; 559 // TODO(hbos): The following RTCRemoteInboundRtpStreamStats metric should also 560 // be implemented: fractionLost. 561 }; 562 563 // https://w3c.github.io/webrtc-stats/#dom-rtcmediasourcestats 564 class RTC_EXPORT RTCMediaSourceStats : public RTCStats { 565 public: 566 WEBRTC_RTCSTATS_DECL(); 567 568 RTCMediaSourceStats(const RTCMediaSourceStats& other); 569 ~RTCMediaSourceStats() override; 570 571 RTCStatsMember<std::string> track_identifier; 572 RTCStatsMember<std::string> kind; 573 574 protected: 575 RTCMediaSourceStats(const std::string& id, int64_t timestamp_us); 576 RTCMediaSourceStats(std::string&& id, int64_t timestamp_us); 577 }; 578 579 // https://w3c.github.io/webrtc-stats/#dom-rtcaudiosourcestats 580 class RTC_EXPORT RTCAudioSourceStats final : public RTCMediaSourceStats { 581 public: 582 WEBRTC_RTCSTATS_DECL(); 583 584 RTCAudioSourceStats(const std::string& id, int64_t timestamp_us); 585 RTCAudioSourceStats(std::string&& id, int64_t timestamp_us); 586 RTCAudioSourceStats(const RTCAudioSourceStats& other); 587 ~RTCAudioSourceStats() override; 588 589 RTCStatsMember<double> audio_level; 590 RTCStatsMember<double> total_audio_energy; 591 RTCStatsMember<double> total_samples_duration; 592 }; 593 594 // https://w3c.github.io/webrtc-stats/#dom-rtcvideosourcestats 595 class RTC_EXPORT RTCVideoSourceStats final : public RTCMediaSourceStats { 596 public: 597 WEBRTC_RTCSTATS_DECL(); 598 599 RTCVideoSourceStats(const std::string& id, int64_t timestamp_us); 600 RTCVideoSourceStats(std::string&& id, int64_t timestamp_us); 601 RTCVideoSourceStats(const RTCVideoSourceStats& other); 602 ~RTCVideoSourceStats() override; 603 604 RTCStatsMember<uint32_t> width; 605 RTCStatsMember<uint32_t> height; 606 // TODO(hbos): Implement this metric. 607 RTCStatsMember<uint32_t> frames; 608 RTCStatsMember<uint32_t> frames_per_second; 609 }; 610 611 // https://w3c.github.io/webrtc-stats/#transportstats-dict* 612 class RTC_EXPORT RTCTransportStats final : public RTCStats { 613 public: 614 WEBRTC_RTCSTATS_DECL(); 615 616 RTCTransportStats(const std::string& id, int64_t timestamp_us); 617 RTCTransportStats(std::string&& id, int64_t timestamp_us); 618 RTCTransportStats(const RTCTransportStats& other); 619 ~RTCTransportStats() override; 620 621 RTCStatsMember<uint64_t> bytes_sent; 622 RTCStatsMember<uint64_t> packets_sent; 623 RTCStatsMember<uint64_t> bytes_received; 624 RTCStatsMember<uint64_t> packets_received; 625 RTCStatsMember<std::string> rtcp_transport_stats_id; 626 // TODO(hbos): Support enum types? "RTCStatsMember<RTCDtlsTransportState>"? 627 RTCStatsMember<std::string> dtls_state; 628 RTCStatsMember<std::string> selected_candidate_pair_id; 629 RTCStatsMember<std::string> local_certificate_id; 630 RTCStatsMember<std::string> remote_certificate_id; 631 RTCStatsMember<std::string> tls_version; 632 RTCStatsMember<std::string> dtls_cipher; 633 RTCStatsMember<std::string> srtp_cipher; 634 RTCStatsMember<uint32_t> selected_candidate_pair_changes; 635 }; 636 637 } // namespace webrtc 638 639 #endif // API_STATS_RTCSTATS_OBJECTS_H_ 640