From: Andreas Pehrson <apehrson@mozilla.com>
Date: Mon, 18 Jan 2021 11:04:00 +0100
Subject: Bug 1654112 - Include RtcpPacketTypeCounter in audio send stats, to
 not regress nackCount. r=ng

This is similar to how it's already included for video send.

Differential Revision: https://phabricator.services.mozilla.com/D102273
Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/d380a43d59f4f7cbc001f4eab9b63ee993b32cd8
---
 audio/audio_send_stream.cc |  1 +
 audio/channel_send.cc      | 31 +++++++++++++++++++++++++++++++
 audio/channel_send.h       |  1 +
 call/audio_send_stream.h   |  2 ++
 4 files changed, 35 insertions(+)

diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
index 692527d000..91d0281775 100644
--- a/audio/audio_send_stream.cc
+++ b/audio/audio_send_stream.cc
@@ -436,6 +436,7 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats(
   stats.target_bitrate_bps = channel_send_->GetTargetBitrate();
 
   webrtc::CallSendStatistics call_stats = channel_send_->GetRTCPStatistics();
+  stats.rtcp_packet_type_counts = call_stats.rtcp_packet_type_counts;
   stats.payload_bytes_sent = call_stats.payload_bytes_sent;
   stats.header_and_padding_bytes_sent =
       call_stats.header_and_padding_bytes_sent;
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index 06ebdd2346..885b0c01ff 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -81,6 +81,31 @@ constexpr TimeDelta kMinRetransmissionWindow = TimeDelta::Millis(30);
 class RtpPacketSenderProxy;
 class TransportSequenceNumberProxy;
 
+class RtcpCounterObserver : public RtcpPacketTypeCounterObserver {
+ public:
+  explicit RtcpCounterObserver(uint32_t ssrc) : ssrc_(ssrc) {}
+
+  void RtcpPacketTypesCounterUpdated(
+      uint32_t ssrc, const RtcpPacketTypeCounter& packet_counter) override {
+    if (ssrc_ != ssrc) {
+      return;
+    }
+
+    MutexLock lock(&mutex_);
+    packet_counter_ = packet_counter;
+  }
+
+  RtcpPacketTypeCounter GetCounts() {
+    MutexLock lock(&mutex_);
+    return packet_counter_;
+  }
+
+ private:
+  Mutex mutex_;
+  const uint32_t ssrc_;
+  RtcpPacketTypeCounter packet_counter_;
+};
+
 class AudioBitrateAccountant {
  public:
   void RegisterPacketOverhead(int packet_byte_overhead) {
@@ -288,6 +313,8 @@ class ChannelSend : public ChannelSendInterface,
   bool input_mute_ RTC_GUARDED_BY(volume_settings_mutex_) = false;
   bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_checker_) = false;
 
+  const std::unique_ptr<RtcpCounterObserver> rtcp_counter_observer_;
+
   PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
       nullptr;
   const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_pacer_proxy_;
@@ -500,6 +527,7 @@ ChannelSend::ChannelSend(
     RtpTransportControllerSendInterface* transport_controller)
     : env_(env),
       ssrc_(ssrc),
+      rtcp_counter_observer_(new RtcpCounterObserver(ssrc)),
       rtp_packet_pacer_proxy_(new RtpPacketSenderProxy()),
       retransmission_rate_limiter_(
           new RateLimiter(&env_.clock(), kMaxRetransmissionWindow.ms())),
@@ -521,6 +549,8 @@ ChannelSend::ChannelSend(
 
   configuration.paced_sender = rtp_packet_pacer_proxy_.get();
   configuration.rtt_stats = rtcp_rtt_stats;
+  configuration.rtcp_packet_type_counter_observer =
+      rtcp_counter_observer_.get();
   if (env_.field_trials().IsDisabled("WebRTC-DisableRtxRateLimiter")) {
     configuration.retransmission_rate_limiter =
         retransmission_rate_limiter_.get();
@@ -795,6 +825,7 @@ CallSendStatistics ChannelSend::GetRTCPStatistics() const {
   RTC_DCHECK_RUN_ON(&worker_thread_checker_);
   CallSendStatistics stats = {0};
   stats.rttMs = rtp_rtcp_->LastRtt().value_or(TimeDelta::Zero()).ms();
+  stats.rtcp_packet_type_counts = rtcp_counter_observer_->GetCounts();
 
   StreamDataCounters rtp_stats;
   StreamDataCounters rtx_stats;
diff --git a/audio/channel_send.h b/audio/channel_send.h
index 0ed544afed..7047248c1f 100644
--- a/audio/channel_send.h
+++ b/audio/channel_send.h
@@ -50,6 +50,7 @@ struct CallSendStatistics {
   TimeDelta total_packet_send_delay = TimeDelta::Zero();
   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
   uint64_t retransmitted_packets_sent;
+  RtcpPacketTypeCounter rtcp_packet_type_counts;
   // 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/call/audio_send_stream.h b/call/audio_send_stream.h
index 021a2976dd..d2ff41b0f4 100644
--- a/call/audio_send_stream.h
+++ b/call/audio_send_stream.h
@@ -32,6 +32,7 @@
 #include "api/units/time_delta.h"
 #include "call/audio_sender.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
+#include "modules/rtp_rtcp/include/rtcp_statistics.h"
 
 namespace webrtc {
 
@@ -66,6 +67,7 @@ class AudioSendStream : public AudioSender {
 
     ANAStats ana_statistics;
     AudioProcessingStats apm_statistics;
+    RtcpPacketTypeCounter rtcp_packet_type_counts;
 
     int64_t target_bitrate_bps = 0;
     // A snapshot of Report Blocks with additional data of interest to
