Revert "Reland "[Stats] Cleanup: Remove unimplemented metrics and obsolete TODOs.""

This reverts commit 2843bbc96dc3deee0406bac5ec9440cf3385ef2e.

Reason for revert: Even more references to unimplemented metrics remaining...

Original change's description:
> Reland "[Stats] Cleanup: Remove unimplemented metrics and obsolete TODOs."
>
> This is a reland of commit 626f87d90501fd8d7a4ea071686cd8befd0d430c
>
> Original change's description:
> > [Stats] Cleanup: Remove unimplemented metrics and obsolete TODOs.
> >
> > In preparation for the spec moving closer to PR, let's not have
> > placeholder metrics not implemented.
> >
> > Bug: webrtc:14167
> > Change-Id: If4688ef85b57f88154d490186b306b30414874e4
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265383
> > Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> > Commit-Queue: Henrik Boström <hbos@webrtc.org>
> > Cr-Commit-Position: refs/heads/main@{#37205}
>
> Bug: webrtc:14167
> Change-Id: Ifdc37e7a48fea516c727c06d2f510780386cb204
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265805
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Auto-Submit: Henrik Boström <hbos@webrtc.org>
> Commit-Queue: Harald Alvestrand <hta@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#37215}

Bug: webrtc:14167
Change-Id: I959d61512d5896224302a70aadbac6f75afc819e
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265810
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#37217}
diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h
index 6984169..7f93c1c 100644
--- a/api/stats/rtcstats_objects.h
+++ b/api/stats/rtcstats_objects.h
@@ -176,7 +176,7 @@
   RTCStatsMember<std::string> label;
   RTCStatsMember<std::string> protocol;
   RTCStatsMember<int32_t> data_channel_identifier;
-  // Enum type RTCDataChannelState.
+  // TODO(hbos): Support enum types? "RTCStatsMember<RTCDataChannelState>"?
   RTCStatsMember<std::string> state;
   RTCStatsMember<uint32_t> messages_sent;
   RTCStatsMember<uint64_t> bytes_sent;
@@ -185,6 +185,7 @@
 };
 
 // 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();
@@ -197,16 +198,17 @@
   RTCStatsMember<std::string> transport_id;
   RTCStatsMember<std::string> local_candidate_id;
   RTCStatsMember<std::string> remote_candidate_id;
-  // Enum type RTCStatsIceCandidatePairState.
+  // TODO(hbos): Support enum types?
+  // "RTCStatsMember<RTCStatsIceCandidatePairState>"?
   RTCStatsMember<std::string> state;
   // Obsolete: priority
   RTCStatsMember<uint64_t> priority;
   RTCStatsMember<bool> 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.
+  // 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<bool> writable;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
+  RTCStatsMember<bool> readable;
   RTCStatsMember<uint64_t> packets_sent;
   RTCStatsMember<uint64_t> packets_received;
   RTCStatsMember<uint64_t> bytes_sent;
@@ -214,17 +216,35 @@
   RTCStatsMember<double> total_round_trip_time;
   RTCStatsMember<double> current_round_trip_time;
   RTCStatsMember<double> 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<double> available_incoming_bitrate;
   RTCStatsMember<uint64_t> requests_received;
   RTCStatsMember<uint64_t> requests_sent;
   RTCStatsMember<uint64_t> responses_received;
   RTCStatsMember<uint64_t> responses_sent;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
+  RTCStatsMember<uint64_t> retransmissions_received;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
+  RTCStatsMember<uint64_t> retransmissions_sent;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
+  RTCStatsMember<uint64_t> consent_requests_received;
   RTCStatsMember<uint64_t> consent_requests_sent;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
+  RTCStatsMember<uint64_t> consent_responses_received;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
+  RTCStatsMember<uint64_t> consent_responses_sent;
   RTCStatsMember<uint64_t> packets_discarded_on_send;
   RTCStatsMember<uint64_t> bytes_discarded_on_send;
 };
 
 // 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();
@@ -241,7 +261,7 @@
   RTCStatsMember<int32_t> port;
   RTCStatsMember<std::string> protocol;
   RTCStatsMember<std::string> relay_protocol;
-  // Enum type RTCIceCandidateType.
+  // TODO(hbos): Support enum types? "RTCStatsMember<RTCIceCandidateType>"?
   RTCStatsMember<std::string> candidate_type;
   RTCStatsMember<int32_t> priority;
   RTCStatsMember<std::string> url;
@@ -280,8 +300,8 @@
   const char* type() const override;
 };
 
-// https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats
-// TODO(https://crbug.com/webrtc/14172): Deprecate and remove.
+// 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();
@@ -295,8 +315,8 @@
   RTCStatsMember<std::vector<std::string>> track_ids;
 };
 
-// TODO(https://crbug.com/webrtc/14175): Deprecate and remove in favor of
-// RTCMediaSourceStats/RTCOutboundRtpStreamStats and RTCInboundRtpStreamStats.
+// 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();
@@ -314,20 +334,29 @@
   RTCStatsMember<std::string> media_source_id;
   RTCStatsMember<bool> remote_source;
   RTCStatsMember<bool> ended;
-  // TODO(https://crbug.com/webrtc/14173): Remove this obsolete metric.
+  // TODO(hbos): `RTCStatsCollector` does not return stats for detached tracks.
+  // crbug.com/659137
   RTCStatsMember<bool> detached;
-  // Enum type RTCMediaStreamTrackKind.
+  // See `RTCMediaStreamTrackKind` for valid values.
   RTCStatsMember<std::string> kind;
   RTCStatsMember<double> jitter_buffer_delay;
   RTCStatsMember<uint64_t> jitter_buffer_emitted_count;
   // Video-only members
   RTCStatsMember<uint32_t> frame_width;
   RTCStatsMember<uint32_t> frame_height;
+  // TODO(hbos): Not collected by `RTCStatsCollector`. crbug.com/659137
+  RTCStatsMember<double> frames_per_second;
   RTCStatsMember<uint32_t> frames_sent;
   RTCStatsMember<uint32_t> huge_frames_sent;
   RTCStatsMember<uint32_t> frames_received;
   RTCStatsMember<uint32_t> frames_decoded;
   RTCStatsMember<uint32_t> frames_dropped;
+  // TODO(hbos): Not collected by `RTCStatsCollector`. crbug.com/659137
+  RTCStatsMember<uint32_t> frames_corrupted;
+  // TODO(hbos): Not collected by `RTCStatsCollector`. crbug.com/659137
+  RTCStatsMember<uint32_t> partial_frames_lost;
+  // TODO(hbos): Not collected by `RTCStatsCollector`. crbug.com/659137
+  RTCStatsMember<uint32_t> full_frames_lost;
   // Audio-only members
   RTCStatsMember<double> audio_level;         // Receive-only
   RTCStatsMember<double> total_audio_energy;  // Receive-only
@@ -341,7 +370,7 @@
   RTCStatsMember<uint64_t> inserted_samples_for_deceleration;
   RTCStatsMember<uint64_t> removed_samples_for_acceleration;
   // Non-standard audio-only member
-  // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcaudioreceiverstats-jitterbufferflushes
+  // TODO(kuddai): Add description to standard. crbug.com/webrtc/10042
   RTCNonStandardStatsMember<uint64_t> jitter_buffer_flushes;
   RTCNonStandardStatsMember<uint64_t> delayed_packet_outage_samples;
   RTCNonStandardStatsMember<double> relative_packet_arrival_delay;
@@ -351,15 +380,14 @@
   // 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(https://crbug.com/webrtc/14176): This should be moved to
-  // RTCInboundRtpStreamStats and it should be implemented for video as well.
+  // TODO(titovartem) implement for video streams when will be requested.
   RTCNonStandardStatsMember<double> jitter_buffer_target_delay;
   // TODO(henrik.lundin): Add description of the interruption metrics at
-  // https://github.com/w3c/webrtc-provisional-stats/issues/17
+  // https://github.com/henbos/webrtc-provisional-stats/issues/17
   RTCNonStandardStatsMember<uint32_t> interruption_count;
   RTCNonStandardStatsMember<double> total_interruption_duration;
   // Non-standard video-only members.
-  // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcvideoreceiverstats
+  // https://henbos.github.io/webrtc-provisional-stats/#RTCVideoReceiverStats-dict*
   RTCNonStandardStatsMember<uint32_t> freeze_count;
   RTCNonStandardStatsMember<uint32_t> pause_count;
   RTCNonStandardStatsMember<double> total_freezes_duration;
@@ -383,6 +411,7 @@
 };
 
 // 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();
@@ -413,6 +442,13 @@
   RTCReceivedRtpStreamStats(const RTCReceivedRtpStreamStats& other);
   ~RTCReceivedRtpStreamStats() override;
 
+  // TODO(hbos) The following fields need to be added and migrated
+  // both from RTCInboundRtpStreamStats and RTCRemoteInboundRtpStreamStats:
+  // packetsReceived, packetsRepaired, burstPacketsLost,
+  // burstPacketDiscarded, burstLossCount, burstDiscardCount, burstLossRate,
+  // burstDiscardRate, gapLossRate, gapDiscardRate, framesDropped,
+  // partialFramesLost, fullFramesLost
+  // crbug.com/webrtc/12532
   RTCStatsMember<double> jitter;
   RTCStatsMember<int32_t> packets_lost;  // Signed per RFC 3550
   RTCStatsMember<uint64_t> packets_discarded;
@@ -439,6 +475,8 @@
 };
 
 // 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 RTCReceivedRtpStreamStats {
  public:
@@ -449,8 +487,6 @@
   RTCInboundRTPStreamStats(const RTCInboundRTPStreamStats& other);
   ~RTCInboundRTPStreamStats() override;
 
-  // TODO(https://crbug.com/webrtc/14174): Implement trackIdentifier and kind.
-
   RTCStatsMember<std::string> remote_id;
   RTCStatsMember<uint32_t> packets_received;
   RTCStatsMember<uint64_t> fec_packets_received;
@@ -469,28 +505,48 @@
   RTCStatsMember<double> audio_level;
   RTCStatsMember<double> total_audio_energy;
   RTCStatsMember<double> total_samples_duration;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<double> round_trip_time;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<uint32_t> packets_repaired;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<uint32_t> burst_packets_lost;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<uint32_t> burst_packets_discarded;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<uint32_t> burst_loss_count;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<uint32_t> burst_discard_count;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<double> burst_loss_rate;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<double> burst_discard_rate;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<double> gap_loss_rate;
+  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
+  RTCStatsMember<double> gap_discard_rate;
   // Stats below are only implemented or defined for video.
   RTCStatsMember<int32_t> frames_received;
   RTCStatsMember<uint32_t> frame_width;
   RTCStatsMember<uint32_t> frame_height;
+  RTCStatsMember<uint32_t> frame_bit_depth;
   RTCStatsMember<double> frames_per_second;
   RTCStatsMember<uint32_t> frames_decoded;
   RTCStatsMember<uint32_t> key_frames_decoded;
   RTCStatsMember<uint32_t> frames_dropped;
   RTCStatsMember<double> total_decode_time;
   RTCStatsMember<double> total_processing_delay;
-  // TODO(https://crbug.com/webrtc/13986): standardize
+  // TODO(bugs.webrtc.org/13986): standardize
   RTCNonStandardStatsMember<double> total_assembly_time;
   RTCNonStandardStatsMember<uint32_t> frames_assembled_from_multiple_packets;
   RTCStatsMember<double> total_inter_frame_delay;
   RTCStatsMember<double> total_squared_inter_frame_delay;
-  // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype
+  // https://henbos.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype
   RTCStatsMember<std::string> content_type;
-  // Only populated if audio/video sync is enabled.
-  // TODO(https://crbug.com/webrtc/14177): Expose even if A/V sync is off?
+  // TODO(asapersson): Currently only populated if audio/video sync is enabled.
   RTCStatsMember<double> estimated_playout_timestamp;
-  // Only implemented for video.
-  // TODO(https://crbug.com/webrtc/14178): Also implement for audio.
+  // TODO(hbos): This is only implemented for video; implement it for audio as
+  // well.
   RTCStatsMember<std::string> decoder_implementation;
   // FIR and PLI counts are only defined for |kind == "video"|.
   RTCStatsMember<uint32_t> fir_count;
@@ -503,6 +559,8 @@
 };
 
 // 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();
@@ -539,10 +597,10 @@
   RTCStatsMember<std::map<std::string, double>> quality_limitation_durations;
   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges
   RTCStatsMember<uint32_t> quality_limitation_resolution_changes;
-  // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype
+  // https://henbos.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype
   RTCStatsMember<std::string> content_type;
-  // Only implemented for video.
-  // TODO(https://crbug.com/webrtc/14178): Implement for audio as well.
+  // TODO(hbos): This is only implemented for video; implement it for audio as
+  // well.
   RTCStatsMember<std::string> encoder_implementation;
   // FIR and PLI counts are only defined for |kind == "video"|.
   RTCStatsMember<uint32_t> fir_count;
@@ -562,6 +620,11 @@
   RTCRemoteInboundRtpStreamStats(const RTCRemoteInboundRtpStreamStats& other);
   ~RTCRemoteInboundRtpStreamStats() override;
 
+  // TODO(hbos): The following RTCReceivedRtpStreamStats metrics should also be
+  // implemented: packetsReceived, packetsRepaired,
+  // burstPacketsLost, burstPacketsDiscarded, burstLossCount, burstDiscardCount,
+  // burstLossRate, burstDiscardRate, gapLossRate and gapDiscardRate.
+  // RTCRemoteInboundRtpStreamStats
   RTCStatsMember<std::string> local_id;
   RTCStatsMember<double> round_trip_time;
   RTCStatsMember<double> fraction_lost;
@@ -652,7 +715,7 @@
   RTCStatsMember<uint64_t> bytes_received;
   RTCStatsMember<uint64_t> packets_received;
   RTCStatsMember<std::string> rtcp_transport_stats_id;
-  // Enum type RTCDtlsTransportState.
+  // TODO(hbos): Support enum types? "RTCStatsMember<RTCDtlsTransportState>"?
   RTCStatsMember<std::string> dtls_state;
   RTCStatsMember<std::string> selected_candidate_pair_id;
   RTCStatsMember<std::string> local_certificate_id;
diff --git a/pc/rtc_stats_integrationtest.cc b/pc/rtc_stats_integrationtest.cc
index cc3e8e1..b5d86a9 100644
--- a/pc/rtc_stats_integrationtest.cc
+++ b/pc/rtc_stats_integrationtest.cc
@@ -486,6 +486,7 @@
     verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.priority);
     verifier.TestMemberIsDefined(candidate_pair.nominated);
     verifier.TestMemberIsDefined(candidate_pair.writable);
+    verifier.TestMemberIsUndefined(candidate_pair.readable);
     verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.packets_sent);
     verifier.TestMemberIsNonNegative<uint64_t>(
         candidate_pair.packets_discarded_on_send);
@@ -513,8 +514,13 @@
     verifier.TestMemberIsNonNegative<uint64_t>(
         candidate_pair.responses_received);
     verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.responses_sent);
+    verifier.TestMemberIsUndefined(candidate_pair.retransmissions_received);
+    verifier.TestMemberIsUndefined(candidate_pair.retransmissions_sent);
+    verifier.TestMemberIsUndefined(candidate_pair.consent_requests_received);
     verifier.TestMemberIsNonNegative<uint64_t>(
         candidate_pair.consent_requests_sent);
+    verifier.TestMemberIsUndefined(candidate_pair.consent_responses_received);
+    verifier.TestMemberIsUndefined(candidate_pair.consent_responses_sent);
 
     return verifier.ExpectAllMembersSuccessfullyTested();
   }
@@ -630,6 +636,10 @@
           media_stream_track.frame_width);
       verifier.TestMemberIsNonNegative<uint32_t>(
           media_stream_track.frame_height);
+      verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
+      verifier.TestMemberIsUndefined(media_stream_track.frames_corrupted);
+      verifier.TestMemberIsUndefined(media_stream_track.partial_frames_lost);
+      verifier.TestMemberIsUndefined(media_stream_track.full_frames_lost);
       // Audio-only members should be undefined
       verifier.TestMemberIsUndefined(media_stream_track.audio_level);
       verifier.TestMemberIsUndefined(media_stream_track.echo_return_loss);
@@ -731,11 +741,15 @@
       // Video-only members should be undefined
       verifier.TestMemberIsUndefined(media_stream_track.frame_width);
       verifier.TestMemberIsUndefined(media_stream_track.frame_height);
+      verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
       verifier.TestMemberIsUndefined(media_stream_track.frames_sent);
       verifier.TestMemberIsUndefined(media_stream_track.huge_frames_sent);
       verifier.TestMemberIsUndefined(media_stream_track.frames_received);
       verifier.TestMemberIsUndefined(media_stream_track.frames_decoded);
       verifier.TestMemberIsUndefined(media_stream_track.frames_dropped);
+      verifier.TestMemberIsUndefined(media_stream_track.frames_corrupted);
+      verifier.TestMemberIsUndefined(media_stream_track.partial_frames_lost);
+      verifier.TestMemberIsUndefined(media_stream_track.full_frames_lost);
       verifier.TestMemberIsUndefined(media_stream_track.freeze_count);
       verifier.TestMemberIsUndefined(media_stream_track.pause_count);
       verifier.TestMemberIsUndefined(media_stream_track.total_freezes_duration);
@@ -836,6 +850,7 @@
     } else {
       verifier.TestMemberIsUndefined(inbound_stream.frames_per_second);
     }
+    verifier.TestMemberIsUndefined(inbound_stream.frame_bit_depth);
     verifier.TestMemberIsNonNegative<double>(
         inbound_stream.jitter_buffer_delay);
     verifier.TestMemberIsNonNegative<uint64_t>(
@@ -879,6 +894,16 @@
           inbound_stream.total_samples_duration);
       verifier.TestMemberIsUndefined(inbound_stream.frames_received);
     }
+    verifier.TestMemberIsUndefined(inbound_stream.round_trip_time);
+    verifier.TestMemberIsUndefined(inbound_stream.packets_repaired);
+    verifier.TestMemberIsUndefined(inbound_stream.burst_packets_lost);
+    verifier.TestMemberIsUndefined(inbound_stream.burst_packets_discarded);
+    verifier.TestMemberIsUndefined(inbound_stream.burst_loss_count);
+    verifier.TestMemberIsUndefined(inbound_stream.burst_discard_count);
+    verifier.TestMemberIsUndefined(inbound_stream.burst_loss_rate);
+    verifier.TestMemberIsUndefined(inbound_stream.burst_discard_rate);
+    verifier.TestMemberIsUndefined(inbound_stream.gap_loss_rate);
+    verifier.TestMemberIsUndefined(inbound_stream.gap_discard_rate);
     // Test runtime too short to get an estimate (at least two RTCP sender
     // reports need to be received).
     verifier.MarkMemberTested(inbound_stream.estimated_playout_timestamp, true);
diff --git a/stats/rtcstats_objects.cc b/stats/rtcstats_objects.cc
index a087359..b0003c3 100644
--- a/stats/rtcstats_objects.cc
+++ b/stats/rtcstats_objects.cc
@@ -191,6 +191,7 @@
     &priority,
     &nominated,
     &writable,
+    &readable,
     &packets_sent,
     &packets_received,
     &bytes_sent,
@@ -203,7 +204,12 @@
     &requests_sent,
     &responses_received,
     &responses_sent,
+    &retransmissions_received,
+    &retransmissions_sent,
+    &consent_requests_received,
     &consent_requests_sent,
+    &consent_responses_received,
+    &consent_responses_sent,
     &packets_discarded_on_send,
     &bytes_discarded_on_send)
 // clang-format on
@@ -222,6 +228,7 @@
       priority("priority"),
       nominated("nominated"),
       writable("writable"),
+      readable("readable"),
       packets_sent("packetsSent"),
       packets_received("packetsReceived"),
       bytes_sent("bytesSent"),
@@ -234,7 +241,12 @@
       requests_sent("requestsSent"),
       responses_received("responsesReceived"),
       responses_sent("responsesSent"),
+      retransmissions_received("retransmissionsReceived"),
+      retransmissions_sent("retransmissionsSent"),
+      consent_requests_received("consentRequestsReceived"),
       consent_requests_sent("consentRequestsSent"),
+      consent_responses_received("consentResponsesReceived"),
+      consent_responses_sent("consentResponsesSent"),
       packets_discarded_on_send("packetsDiscardedOnSend"),
       bytes_discarded_on_send("bytesDiscardedOnSend") {}
 
@@ -248,6 +260,7 @@
       priority(other.priority),
       nominated(other.nominated),
       writable(other.writable),
+      readable(other.readable),
       packets_sent(other.packets_sent),
       packets_received(other.packets_received),
       bytes_sent(other.bytes_sent),
@@ -260,7 +273,12 @@
       requests_sent(other.requests_sent),
       responses_received(other.responses_received),
       responses_sent(other.responses_sent),
+      retransmissions_received(other.retransmissions_received),
+      retransmissions_sent(other.retransmissions_sent),
+      consent_requests_received(other.consent_requests_received),
       consent_requests_sent(other.consent_requests_sent),
+      consent_responses_received(other.consent_responses_received),
+      consent_responses_sent(other.consent_responses_sent),
       packets_discarded_on_send(other.packets_discarded_on_send),
       bytes_discarded_on_send(other.bytes_discarded_on_send) {}
 
@@ -394,11 +412,15 @@
                      &jitter_buffer_emitted_count,
                      &frame_width,
                      &frame_height,
+                     &frames_per_second,
                      &frames_sent,
                      &huge_frames_sent,
                      &frames_received,
                      &frames_decoded,
                      &frames_dropped,
+                     &frames_corrupted,
+                     &partial_frames_lost,
+                     &full_frames_lost,
                      &audio_level,
                      &total_audio_energy,
                      &echo_return_loss,
@@ -443,11 +465,15 @@
       jitter_buffer_emitted_count("jitterBufferEmittedCount"),
       frame_width("frameWidth"),
       frame_height("frameHeight"),
+      frames_per_second("framesPerSecond"),
       frames_sent("framesSent"),
       huge_frames_sent("hugeFramesSent"),
       frames_received("framesReceived"),
       frames_decoded("framesDecoded"),
       frames_dropped("framesDropped"),
+      frames_corrupted("framesCorrupted"),
+      partial_frames_lost("partialFramesLost"),
+      full_frames_lost("fullFramesLost"),
       audio_level("audioLevel"),
       total_audio_energy("totalAudioEnergy"),
       echo_return_loss("echoReturnLoss"),
@@ -495,11 +521,15 @@
       jitter_buffer_emitted_count(other.jitter_buffer_emitted_count),
       frame_width(other.frame_width),
       frame_height(other.frame_height),
+      frames_per_second(other.frames_per_second),
       frames_sent(other.frames_sent),
       huge_frames_sent(other.huge_frames_sent),
       frames_received(other.frames_received),
       frames_decoded(other.frames_decoded),
       frames_dropped(other.frames_dropped),
+      frames_corrupted(other.frames_corrupted),
+      partial_frames_lost(other.partial_frames_lost),
+      full_frames_lost(other.full_frames_lost),
       audio_level(other.audio_level),
       total_audio_energy(other.total_audio_energy),
       echo_return_loss(other.echo_return_loss),
@@ -658,9 +688,20 @@
     &audio_level,
     &total_audio_energy,
     &total_samples_duration,
+    &round_trip_time,
+    &packets_repaired,
+    &burst_packets_lost,
+    &burst_packets_discarded,
+    &burst_loss_count,
+    &burst_discard_count,
+    &burst_loss_rate,
+    &burst_discard_rate,
+    &gap_loss_rate,
+    &gap_discard_rate,
     &frames_received,
     &frame_width,
     &frame_height,
+    &frame_bit_depth,
     &frames_per_second,
     &frames_decoded,
     &key_frames_decoded,
@@ -706,9 +747,20 @@
       audio_level("audioLevel"),
       total_audio_energy("totalAudioEnergy"),
       total_samples_duration("totalSamplesDuration"),
+      round_trip_time("roundTripTime"),
+      packets_repaired("packetsRepaired"),
+      burst_packets_lost("burstPacketsLost"),
+      burst_packets_discarded("burstPacketsDiscarded"),
+      burst_loss_count("burstLossCount"),
+      burst_discard_count("burstDiscardCount"),
+      burst_loss_rate("burstLossRate"),
+      burst_discard_rate("burstDiscardRate"),
+      gap_loss_rate("gapLossRate"),
+      gap_discard_rate("gapDiscardRate"),
       frames_received("framesReceived"),
       frame_width("frameWidth"),
       frame_height("frameHeight"),
+      frame_bit_depth("frameBitDepth"),
       frames_per_second("framesPerSecond"),
       frames_decoded("framesDecoded"),
       key_frames_decoded("keyFramesDecoded"),
@@ -751,9 +803,20 @@
       audio_level(other.audio_level),
       total_audio_energy(other.total_audio_energy),
       total_samples_duration(other.total_samples_duration),
+      round_trip_time(other.round_trip_time),
+      packets_repaired(other.packets_repaired),
+      burst_packets_lost(other.burst_packets_lost),
+      burst_packets_discarded(other.burst_packets_discarded),
+      burst_loss_count(other.burst_loss_count),
+      burst_discard_count(other.burst_discard_count),
+      burst_loss_rate(other.burst_loss_rate),
+      burst_discard_rate(other.burst_discard_rate),
+      gap_loss_rate(other.gap_loss_rate),
+      gap_discard_rate(other.gap_discard_rate),
       frames_received(other.frames_received),
       frame_width(other.frame_width),
       frame_height(other.frame_height),
+      frame_bit_depth(other.frame_bit_depth),
       frames_per_second(other.frames_per_second),
       frames_decoded(other.frames_decoded),
       key_frames_decoded(other.key_frames_decoded),