From: Nico Grunbaum <na-g@nostrum.com>
Date: Fri, 5 Jun 2020 11:41:00 +0000
Subject: Bug 1615191 - P0 - implement remoteTimestamp for
 RTCRemoteOutboundRtpStreamStats in libwebrtc;r=dminor

Differential Revision: https://phabricator.services.mozilla.com/D78004
Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/cd901e96d23e004e4bee19b96c8c2f1ca3b42830

This patch also absorbs two additional patches that collapse into using ms for the remote timestamp:
Bug 1654112 - Plumb RemoteRTCPSenderInfo through also for audio and change unit to ms. r=ng
Bug 1654112 - Replace custom upstream code for remote received audio stats with cherry-pick. r=ng
---
 call/video_receive_stream.h                  | 1 +
 modules/rtp_rtcp/source/rtcp_receiver.cc     | 4 +++-
 modules/rtp_rtcp/source/rtcp_receiver.h      | 3 ++-
 modules/rtp_rtcp/source/rtp_rtcp_impl.cc     | 6 ++++--
 modules/rtp_rtcp/source/rtp_rtcp_impl.h      | 3 ++-
 modules/rtp_rtcp/source/rtp_rtcp_impl2.cc    | 6 ++++--
 modules/rtp_rtcp/source/rtp_rtcp_impl2.h     | 3 ++-
 modules/rtp_rtcp/source/rtp_rtcp_interface.h | 5 +++--
 8 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/call/video_receive_stream.h b/call/video_receive_stream.h
index c2f27ec5f3..ae9951e6f9 100644
--- a/call/video_receive_stream.h
+++ b/call/video_receive_stream.h
@@ -172,6 +172,7 @@ class VideoReceiveStreamInterface : public MediaReceiveStreamInterface {
 
     uint32_t rtcp_sender_packets_sent;
     uint32_t rtcp_sender_octets_sent;
+    int64_t rtcp_sender_ntp_timestamp_ms;
 
     // Timing frame info: all important timestamps for a full lifetime of a
     // single 'timing frame'.
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc
index ee76626b0d..c5b3606c44 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -386,10 +386,12 @@ RTCPReceiver::ConsumeReceivedXrReferenceTimeInfo() {
 }
 
 void RTCPReceiver::RemoteRTCPSenderInfo(uint32_t* packet_count,
-                                        uint32_t* octet_count) const {
+                                        uint32_t* octet_count,
+                                        int64_t* ntp_timestamp_ms) const {
   MutexLock lock(&rtcp_receiver_lock_);
   *packet_count = remote_sender_packet_count_;
   *octet_count = remote_sender_octet_count_;
+  *ntp_timestamp_ms = remote_sender_ntp_time_.ToMs();
 }
 
 std::vector<ReportBlockData> RTCPReceiver::GetLatestReportBlockData() const {
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.h b/modules/rtp_rtcp/source/rtcp_receiver.h
index c5a17b7763..8fc8ea4bf6 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -125,7 +125,8 @@ class RTCPReceiver final {
 
   // Get received sender packet and octet counts
   void RemoteRTCPSenderInfo(uint32_t* packet_count,
-                            uint32_t* octet_count) const;
+                            uint32_t* octet_count,
+                            int64_t* ntp_timestamp_ms) const;
 
   std::optional<TimeDelta> AverageRtt() const;
   std::optional<TimeDelta> LastRtt() const;
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index cee4e53f89..399f0f60ce 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -517,8 +517,10 @@ void ModuleRtpRtcpImpl::GetSendStreamDataCounters(
 
 // Received RTCP report.
 void ModuleRtpRtcpImpl::RemoteRTCPSenderInfo(uint32_t* packet_count,
-                                             uint32_t* octet_count) const {
-  return rtcp_receiver_.RemoteRTCPSenderInfo(packet_count, octet_count);
+                                             uint32_t* octet_count,
+                                             int64_t* ntp_timestamp_ms) const {
+  return rtcp_receiver_.RemoteRTCPSenderInfo(packet_count, octet_count,
+                                             ntp_timestamp_ms);
 }
 
 std::vector<ReportBlockData> ModuleRtpRtcpImpl::GetLatestReportBlockData()
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.h b/modules/rtp_rtcp/source/rtp_rtcp_impl.h
index 34a2bc3dd7..b0218aadc0 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.h
@@ -204,7 +204,8 @@ class ABSL_DEPRECATED("") ModuleRtpRtcpImpl
       StreamDataCounters* rtx_counters) const override;
 
   void RemoteRTCPSenderInfo(uint32_t* packet_count,
-                            uint32_t* octet_count) const override;
+                            uint32_t* octet_count,
+                            int64_t* ntp_timestamp_ms) const override;
 
   // A snapshot of the most recent Report Block with additional data of
   // interest to statistics. Used to implement RTCRemoteInboundRtpStreamStats.
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
index d606b30c02..e391771e49 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
@@ -528,8 +528,10 @@ void ModuleRtpRtcpImpl2::GetSendStreamDataCounters(
 
 // Received RTCP report.
 void ModuleRtpRtcpImpl2::RemoteRTCPSenderInfo(uint32_t* packet_count,
-                                              uint32_t* octet_count) const {
-  return rtcp_receiver_.RemoteRTCPSenderInfo(packet_count, octet_count);
+                                             uint32_t* octet_count,
+                                             int64_t* ntp_timestamp_ms) const {
+  return rtcp_receiver_.RemoteRTCPSenderInfo(packet_count, octet_count,
+                                             ntp_timestamp_ms);
 }
 
 std::vector<ReportBlockData> ModuleRtpRtcpImpl2::GetLatestReportBlockData()
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2.h b/modules/rtp_rtcp/source/rtp_rtcp_impl2.h
index d36280b29f..fa9d16c48e 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2.h
@@ -198,7 +198,8 @@ class ModuleRtpRtcpImpl2 final : public RtpRtcpInterface,
       StreamDataCounters* rtx_counters) const override;
 
   void RemoteRTCPSenderInfo(uint32_t* packet_count,
-                            uint32_t* octet_count) const override;
+                            uint32_t* octet_count,
+                            int64_t* ntp_timestamp_ms) const override;
 
   // A snapshot of the most recent Report Block with additional data of
   // interest to statistics. Used to implement RTCRemoteInboundRtpStreamStats.
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_interface.h b/modules/rtp_rtcp/source/rtp_rtcp_interface.h
index 81f3f04c1b..40836198de 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_interface.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_interface.h
@@ -404,9 +404,10 @@ class RtpRtcpInterface : public RtcpFeedbackSenderInterface {
       StreamDataCounters* rtx_counters) const = 0;
 
 
-  // Returns packet count and octet count from RTCP sender report.
+  // Returns packet count, octet count, and timestamp from RTCP sender report.
   virtual void RemoteRTCPSenderInfo(uint32_t* packet_count,
-                                    uint32_t* octet_count) const = 0;
+                                    uint32_t* octet_count,
+                                    int64_t* ntp_timestamp_ms) const = 0;
   // A snapshot of Report Blocks with additional data of interest to statistics.
   // Within this list, the sender-source SSRC pair is unique and per-pair the
   // ReportBlockData represents the latest Report Block that was received for
