From: Andreas Pehrson <apehrson@mozilla.com>
Date: Tue, 2 Nov 2021 14:35:00 +0000
Subject: Bug 1729455 - Add to stats the local receive time for receiving video
 Sender Reports. r=ng

Differential Revision: https://phabricator.services.mozilla.com/D125712
Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/99267b6d193fbcb3e4c845c5e80770424d6d06e2
---
 call/video_receive_stream.h                  |  3 ++-
 modules/rtp_rtcp/source/rtcp_receiver.cc     |  6 ++++--
 modules/rtp_rtcp/source/rtcp_receiver.h      |  3 ++-
 modules/rtp_rtcp/source/rtp_rtcp_impl.cc     | 10 +++++-----
 modules/rtp_rtcp/source/rtp_rtcp_impl.h      |  3 ++-
 modules/rtp_rtcp/source/rtp_rtcp_impl2.cc    | 10 +++++-----
 modules/rtp_rtcp/source/rtp_rtcp_impl2.h     |  3 ++-
 modules/rtp_rtcp/source/rtp_rtcp_interface.h |  5 +++--
 video/rtp_video_stream_receiver2.cc          |  5 +++--
 video/rtp_video_stream_receiver2.h           |  3 ++-
 video/video_receive_stream2.cc               |  3 ++-
 11 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/call/video_receive_stream.h b/call/video_receive_stream.h
index 5800598b75..17c56bb2b1 100644
--- a/call/video_receive_stream.h
+++ b/call/video_receive_stream.h
@@ -171,10 +171,11 @@ class VideoReceiveStreamInterface : public MediaReceiveStreamInterface {
     RtcpPacketTypeCounter rtcp_packet_type_counts;
     std::optional<RtpReceiveStats> rtx_rtp_stats;
 
-    // Mozilla modification: Init these three.
+    // Mozilla modification: Init these.
     uint32_t rtcp_sender_packets_sent = 0;
     uint32_t rtcp_sender_octets_sent = 0;
     int64_t rtcp_sender_ntp_timestamp_ms = 0;
+    int64_t rtcp_sender_remote_ntp_timestamp_ms = 0;
 
     // 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 9e4aadde46..41b106ac26 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -389,11 +389,13 @@ RTCPReceiver::ConsumeReceivedXrReferenceTimeInfo() {
 
 void RTCPReceiver::RemoteRTCPSenderInfo(uint32_t* packet_count,
                                         uint32_t* octet_count,
-                                        int64_t* ntp_timestamp_ms) const {
+                                        int64_t* ntp_timestamp_ms,
+                                        int64_t* remote_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();
+  *ntp_timestamp_ms = last_received_sr_ntp_.ToMs();
+  *remote_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 9b9ddb4987..05f7024d62 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -126,7 +126,8 @@ class RTCPReceiver final {
   // Get received sender packet and octet counts
   void RemoteRTCPSenderInfo(uint32_t* packet_count,
                             uint32_t* octet_count,
-                            int64_t* ntp_timestamp_ms) const;
+                            int64_t* ntp_timestamp_ms,
+                            int64_t* remote_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 399f0f60ce..552826106e 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -516,11 +516,11 @@ void ModuleRtpRtcpImpl::GetSendStreamDataCounters(
 }
 
 // Received RTCP report.
-void ModuleRtpRtcpImpl::RemoteRTCPSenderInfo(uint32_t* packet_count,
-                                             uint32_t* octet_count,
-                                             int64_t* ntp_timestamp_ms) const {
-  return rtcp_receiver_.RemoteRTCPSenderInfo(packet_count, octet_count,
-                                             ntp_timestamp_ms);
+void ModuleRtpRtcpImpl::RemoteRTCPSenderInfo(
+    uint32_t* packet_count, uint32_t* octet_count, int64_t* ntp_timestamp_ms,
+    int64_t* remote_ntp_timestamp_ms) const {
+  return rtcp_receiver_.RemoteRTCPSenderInfo(
+      packet_count, octet_count, ntp_timestamp_ms, remote_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 b0218aadc0..20f9397e91 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.h
@@ -205,7 +205,8 @@ class ABSL_DEPRECATED("") ModuleRtpRtcpImpl
 
   void RemoteRTCPSenderInfo(uint32_t* packet_count,
                             uint32_t* octet_count,
-                            int64_t* ntp_timestamp_ms) const override;
+                            int64_t* ntp_timestamp_ms,
+                            int64_t* remote_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 e391771e49..74d77e3e69 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
@@ -527,11 +527,11 @@ void ModuleRtpRtcpImpl2::GetSendStreamDataCounters(
 }
 
 // Received RTCP report.
-void ModuleRtpRtcpImpl2::RemoteRTCPSenderInfo(uint32_t* packet_count,
-                                             uint32_t* octet_count,
-                                             int64_t* ntp_timestamp_ms) const {
-  return rtcp_receiver_.RemoteRTCPSenderInfo(packet_count, octet_count,
-                                             ntp_timestamp_ms);
+void ModuleRtpRtcpImpl2::RemoteRTCPSenderInfo(
+    uint32_t* packet_count, uint32_t* octet_count, int64_t* ntp_timestamp_ms,
+    int64_t* remote_ntp_timestamp_ms) const {
+  return rtcp_receiver_.RemoteRTCPSenderInfo(
+      packet_count, octet_count, ntp_timestamp_ms, remote_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 fa9d16c48e..ec277a3a5d 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2.h
@@ -199,7 +199,8 @@ class ModuleRtpRtcpImpl2 final : public RtpRtcpInterface,
 
   void RemoteRTCPSenderInfo(uint32_t* packet_count,
                             uint32_t* octet_count,
-                            int64_t* ntp_timestamp_ms) const override;
+                            int64_t* ntp_timestamp_ms,
+                            int64_t* remote_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 d2304e87db..bbdb38864e 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_interface.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_interface.h
@@ -407,10 +407,11 @@ class RtpRtcpInterface : public RtcpFeedbackSenderInterface {
       StreamDataCounters* rtx_counters) const = 0;
 
 
-  // Returns packet count, octet count, and timestamp from RTCP sender report.
+  // Returns packet count, octet count, and timestamps from RTCP sender report.
   virtual void RemoteRTCPSenderInfo(uint32_t* packet_count,
                                     uint32_t* octet_count,
-                                    int64_t* ntp_timestamp_ms) const = 0;
+                                    int64_t* ntp_timestamp_ms,
+                                    int64_t* remote_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
diff --git a/video/rtp_video_stream_receiver2.cc b/video/rtp_video_stream_receiver2.cc
index af42c12aa4..beb2c93f82 100644
--- a/video/rtp_video_stream_receiver2.cc
+++ b/video/rtp_video_stream_receiver2.cc
@@ -1179,9 +1179,10 @@ std::optional<int64_t> RtpVideoStreamReceiver2::LastReceivedKeyframePacketMs()
 // seem to be any support for these stats right now. So, we hack this in.
 void RtpVideoStreamReceiver2::RemoteRTCPSenderInfo(
     uint32_t* packet_count, uint32_t* octet_count,
-    int64_t* ntp_timestamp_ms) const {
+    int64_t* ntp_timestamp_ms, int64_t* remote_ntp_timestamp_ms) const {
   RTC_DCHECK_RUN_ON(&worker_task_checker_);
-  rtp_rtcp_->RemoteRTCPSenderInfo(packet_count, octet_count, ntp_timestamp_ms);
+  rtp_rtcp_->RemoteRTCPSenderInfo(packet_count, octet_count, ntp_timestamp_ms,
+                                  remote_ntp_timestamp_ms);
 }
 
 std::optional<RtpRtcpInterface::SenderReportStats>
diff --git a/video/rtp_video_stream_receiver2.h b/video/rtp_video_stream_receiver2.h
index 7864dfb709..3cf94ec4b2 100644
--- a/video/rtp_video_stream_receiver2.h
+++ b/video/rtp_video_stream_receiver2.h
@@ -232,7 +232,8 @@ class RtpVideoStreamReceiver2 : public LossNotificationSender,
   // stats at all, and even on the most recent libwebrtc code there does not
   // seem to be any support for these stats right now. So, we hack this in.
   void RemoteRTCPSenderInfo(uint32_t* packet_count, uint32_t* octet_count,
-                            int64_t* ntp_timestamp_ms) const;
+                            int64_t* ntp_timestamp_ms,
+                            int64_t* remote_ntp_timestamp_ms) const;
 
  private:
   // Implements RtpVideoFrameReceiver.
diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc
index 30917c0349..ec9be0a5a2 100644
--- a/video/video_receive_stream2.cc
+++ b/video/video_receive_stream2.cc
@@ -632,7 +632,8 @@ VideoReceiveStreamInterface::Stats VideoReceiveStream2::GetStats() const {
   // seem to be any support for these stats right now. So, we hack this in.
   rtp_video_stream_receiver_.RemoteRTCPSenderInfo(
       &stats.rtcp_sender_packets_sent, &stats.rtcp_sender_octets_sent,
-      &stats.rtcp_sender_ntp_timestamp_ms);
+      &stats.rtcp_sender_ntp_timestamp_ms,
+      &stats.rtcp_sender_remote_ntp_timestamp_ms);
 
   return stats;
 }
