[Stats] Add minimum RTCReceivedRtpStreamStats with jitter and packetsLost

    Spec: https://www.w3.org/TR/webrtc-stats/#receivedrtpstats-dict*

    According to the spec, |RTCReceivedRtpStreamStats| is the base class for |RTCInboundRtpStreamStats| and |RTCRemoteInboundRtpStreamStats|. This structure isn't visible in JavaScript but it's important to bring it up to spec for the C++ part. This CL adds the barebone |RTCReceivedRtpStreamStats| with a bunch of TODOs for later migrations.

    This commit makes the minimum |RTCReceivedRtpStreamStats| and rebase |RTCInboundRtpStreamStats| and |RTCRemoteInboundRtpStreamStats| to use the new class as the parent class.

    This commit also moves |jitter| and |packets_lost| to |RTCReceivedRtpStreamStats|, from |RTCInboundRtpStreamStats| and |RTCRemoteInboundRtpStreamStats|. Moving these two first because they are the two that exist in both subclasses for now.

Bug: webrtc:12532
Change-Id: I0ec74fd241f16c1e1a6498b6baa621ca0489f279
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/210340
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33435}
diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h
index 7590a62..a4e8ead 100644
--- a/api/stats/rtcstats_objects.h
+++ b/api/stats/rtcstats_objects.h
@@ -374,34 +374,46 @@
   ~RTCRTPStreamStats() override;
 
   RTCStatsMember<uint32_t> ssrc;
-  // TODO(hbos): Remote case not supported by |RTCStatsCollector|.
-  // crbug.com/657855, 657856
-  RTCStatsMember<bool> is_remote;          // = false
-  RTCStatsMember<std::string> media_type;  // renamed to kind.
   RTCStatsMember<std::string> kind;
   RTCStatsMember<std::string> track_id;
   RTCStatsMember<std::string> transport_id;
   RTCStatsMember<std::string> codec_id;
-  // FIR and PLI counts are only defined for |media_type == "video"|.
-  RTCStatsMember<uint32_t> fir_count;
-  RTCStatsMember<uint32_t> 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<uint32_t> nack_count;
-  // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/657854
-  // SLI count is only defined for |media_type == "video"|.
-  RTCStatsMember<uint32_t> sli_count;
-  RTCStatsMember<uint64_t> qp_sum;
+
+  // Obsolete
+  RTCStatsMember<std::string> media_type;  // renamed to kind.
 
  protected:
   RTCRTPStreamStats(const std::string& id, int64_t timestamp_us);
   RTCRTPStreamStats(std::string&& id, int64_t timestamp_us);
 };
 
+class RTC_EXPORT RTCReceivedRtpStreamStats : public RTCRTPStreamStats {
+ public:
+  WEBRTC_RTCSTATS_DECL();
+
+  RTCReceivedRtpStreamStats(const RTCReceivedRtpStreamStats& other);
+  ~RTCReceivedRtpStreamStats() override;
+
+  // TODO(hbos) The following fields need to be added and migrated
+  // both from RTCInboundRtpStreamStats and RTCRemoteInboundRtpStreamStats:
+  // packetsReceived, packetsDiscarded, 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
+
+ protected:
+  RTCReceivedRtpStreamStats(const std::string&& id, int64_t timestamp_us);
+  RTCReceivedRtpStreamStats(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 {
+class RTC_EXPORT RTCInboundRTPStreamStats final
+    : public RTCReceivedRtpStreamStats {
  public:
   WEBRTC_RTCSTATS_DECL();
 
@@ -415,9 +427,7 @@
   RTCStatsMember<uint64_t> fec_packets_discarded;
   RTCStatsMember<uint64_t> bytes_received;
   RTCStatsMember<uint64_t> header_bytes_received;
-  RTCStatsMember<int32_t> packets_lost;  // Signed per RFC 3550
   RTCStatsMember<double> last_packet_received_timestamp;
-  RTCStatsMember<double> jitter;
   RTCStatsMember<double> jitter_buffer_delay;
   RTCStatsMember<uint64_t> jitter_buffer_emitted_count;
   RTCStatsMember<uint64_t> total_samples_received;
@@ -469,6 +479,16 @@
   // 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 |media_type == "video"|.
+  RTCStatsMember<uint32_t> fir_count;
+  RTCStatsMember<uint32_t> 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<uint32_t> nack_count;
+  RTCStatsMember<uint64_t> qp_sum;
+
+  // Obsolete
+  RTCStatsMember<bool> is_remote;  // = false
 };
 
 // https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict*
@@ -517,18 +537,21 @@
   // 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 |media_type == "video"|.
+  RTCStatsMember<uint32_t> fir_count;
+  RTCStatsMember<uint32_t> 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<uint32_t> nack_count;
+  RTCStatsMember<uint64_t> qp_sum;
+
+  // Obsolete
+  RTCStatsMember<bool> is_remote;  // = false
 };
 
-// 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 {
+class RTC_EXPORT RTCRemoteInboundRtpStreamStats final
+    : public RTCReceivedRtpStreamStats {
  public:
   WEBRTC_RTCSTATS_DECL();
 
@@ -537,17 +560,6 @@
   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<uint32_t> ssrc;
-  RTCStatsMember<std::string> kind;
-  RTCStatsMember<std::string> transport_id;
-  RTCStatsMember<std::string> codec_id;
-  // RTCReceivedRtpStreamStats
-  RTCStatsMember<int32_t> packets_lost;
-  RTCStatsMember<double> jitter;
   // TODO(hbos): The following RTCReceivedRtpStreamStats metrics should also be
   // implemented: packetsReceived, packetsDiscarded, packetsRepaired,
   // burstPacketsLost, burstPacketsDiscarded, burstLossCount, burstDiscardCount,