Delete RtcpStatisticsCallback in favor of ReportBlockDataObserver

Bug: webrtc:10678
Change-Id: Ie016cbc47dbba15176fc5e7ad7d01a438db7dfb3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/218842
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34013}
diff --git a/call/rtp_transport_controller_send_interface.h b/call/rtp_transport_controller_send_interface.h
index 5926344..2aa6d73 100644
--- a/call/rtp_transport_controller_send_interface.h
+++ b/call/rtp_transport_controller_send_interface.h
@@ -52,7 +52,6 @@
   RtcpRttStats* rtcp_rtt_stats;
   RtcpIntraFrameObserver* intra_frame_callback;
   RtcpLossNotificationObserver* rtcp_loss_notification_observer;
-  RtcpStatisticsCallback* rtcp_stats;
   ReportBlockDataObserver* report_block_data_observer;
   StreamDataCountersCallback* rtp_stats;
   BitrateStatisticsObserver* bitrate_observer;
diff --git a/call/rtp_video_sender.cc b/call/rtp_video_sender.cc
index 022c97d..c2a6a56 100644
--- a/call/rtp_video_sender.cc
+++ b/call/rtp_video_sender.cc
@@ -216,7 +216,6 @@
   configuration.rtt_stats = observers.rtcp_rtt_stats;
   configuration.rtcp_packet_type_counter_observer =
       observers.rtcp_type_observer;
-  configuration.rtcp_statistics_callback = observers.rtcp_stats;
   configuration.report_block_data_observer =
       observers.report_block_data_observer;
   configuration.paced_sender = transport->packet_sender();
diff --git a/call/rtp_video_sender_unittest.cc b/call/rtp_video_sender_unittest.cc
index 88cbeed..85934cc 100644
--- a/call/rtp_video_sender_unittest.cc
+++ b/call/rtp_video_sender_unittest.cc
@@ -61,7 +61,6 @@
 RtpSenderObservers CreateObservers(
     RtcpRttStats* rtcp_rtt_stats,
     RtcpIntraFrameObserver* intra_frame_callback,
-    RtcpStatisticsCallback* rtcp_stats,
     ReportBlockDataObserver* report_block_data_observer,
     StreamDataCountersCallback* rtp_stats,
     BitrateStatisticsObserver* bitrate_observer,
@@ -73,7 +72,6 @@
   observers.rtcp_rtt_stats = rtcp_rtt_stats;
   observers.intra_frame_callback = intra_frame_callback;
   observers.rtcp_loss_notification_observer = nullptr;
-  observers.rtcp_stats = rtcp_stats;
   observers.report_block_data_observer = report_block_data_observer;
   observers.rtp_stats = rtp_stats;
   observers.bitrate_observer = bitrate_observer;
@@ -147,9 +145,8 @@
         time_controller_.GetClock(), suspended_ssrcs, suspended_payload_states,
         config_.rtp, config_.rtcp_report_interval_ms, &transport_,
         CreateObservers(nullptr, &encoder_feedback_, &stats_proxy_,
-                        &stats_proxy_, &stats_proxy_, &stats_proxy_,
-                        frame_count_observer, &stats_proxy_, &stats_proxy_,
-                        &send_delay_stats_),
+                        &stats_proxy_, &stats_proxy_, frame_count_observer,
+                        &stats_proxy_, &stats_proxy_, &send_delay_stats_),
         &transport_controller_, &event_log_, &retransmission_rate_limiter_,
         std::make_unique<FecControllerDefault>(time_controller_.GetClock()),
         nullptr, CryptoOptions{}, frame_transformer);
diff --git a/modules/rtp_rtcp/include/rtcp_statistics.h b/modules/rtp_rtcp/include/rtcp_statistics.h
index e26c475..8a63324 100644
--- a/modules/rtp_rtcp/include/rtcp_statistics.h
+++ b/modules/rtp_rtcp/include/rtcp_statistics.h
@@ -18,6 +18,8 @@
 namespace webrtc {
 
 // Statistics for an RTCP channel
+// TODO(bugs.webrtc.org/10678): Remove remaining usages of this struct in favor
+// of RTCPReportBlock, rtcp::ReportBlock or other similar structs.
 struct RtcpStatistics {
   uint8_t fraction_lost = 0;
   int32_t packets_lost = 0;  // Defined as a 24 bit signed integer in RTCP
@@ -25,14 +27,6 @@
   uint32_t jitter = 0;
 };
 
-class RtcpStatisticsCallback {
- public:
-  virtual ~RtcpStatisticsCallback() {}
-
-  virtual void StatisticsUpdated(const RtcpStatistics& statistics,
-                                 uint32_t ssrc) = 0;
-};
-
 // Statistics for RTCP packet types.
 struct RtcpPacketTypeCounter {
   RtcpPacketTypeCounter()
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc
index 104b61b..526acf5 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -142,7 +142,6 @@
       xr_rrtr_status_(config.non_sender_rtt_measurement),
       xr_rr_rtt_ms_(0),
       oldest_tmmbr_info_ms_(0),
-      stats_callback_(config.rtcp_statistics_callback),
       cname_callback_(config.rtcp_cname_callback),
       report_block_data_observer_(config.report_block_data_observer),
       packet_type_counter_observer_(config.rtcp_packet_type_counter_observer),
@@ -1105,18 +1104,6 @@
   }
 
   if (!receiver_only_) {
-    if (stats_callback_) {
-      for (const auto& report_block : packet_information.report_blocks) {
-        RtcpStatistics stats;
-        stats.packets_lost = report_block.packets_lost;
-        stats.extended_highest_sequence_number =
-            report_block.extended_highest_sequence_number;
-        stats.fraction_lost = report_block.fraction_lost;
-        stats.jitter = report_block.jitter;
-
-        stats_callback_->StatisticsUpdated(stats, report_block.source_ssrc);
-      }
-    }
     if (report_block_data_observer_) {
       for (const auto& report_block_data :
            packet_information.report_block_datas) {
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.h b/modules/rtp_rtcp/source/rtcp_receiver.h
index 370a875..429df55 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -340,11 +340,7 @@
   // delivered RTP packet to the remote side.
   Timestamp last_increased_sequence_number_ = Timestamp::PlusInfinity();
 
-  RtcpStatisticsCallback* const stats_callback_;
   RtcpCnameCallback* const cname_callback_;
-  // TODO(hbos): Remove RtcpStatisticsCallback in favor of
-  // ReportBlockDataObserver; the ReportBlockData contains a superset of the
-  // RtcpStatistics data.
   ReportBlockDataObserver* const report_block_data_observer_;
 
   RtcpPacketTypeCounterObserver* const packet_type_counter_observer_;
diff --git a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
index 068a110..c71bbcc 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -87,14 +87,6 @@
               (override));
 };
 
-class MockRtcpCallbackImpl : public RtcpStatisticsCallback {
- public:
-  MOCK_METHOD(void,
-              StatisticsUpdated,
-              (const RtcpStatistics&, uint32_t),
-              (override));
-};
-
 class MockCnameCallbackImpl : public RtcpCnameCallback {
  public:
   MOCK_METHOD(void, OnCname, (uint32_t, absl::string_view), (override));
@@ -1280,43 +1272,6 @@
                   Property(&rtcp::TmmbItem::ssrc, Eq(kSenderSsrc + 2))));
 }
 
-TEST(RtcpReceiverTest, Callbacks) {
-  ReceiverMocks mocks;
-  MockRtcpCallbackImpl callback;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  config.rtcp_statistics_callback = &callback;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
-  receiver.SetRemoteSSRC(kSenderSsrc);
-
-  const uint8_t kFractionLoss = 3;
-  const uint32_t kCumulativeLoss = 7;
-  const uint32_t kJitter = 9;
-  const uint16_t kSequenceNumber = 1234;
-
-  // First packet, all numbers should just propagate.
-  rtcp::ReportBlock rb1;
-  rb1.SetMediaSsrc(kReceiverMainSsrc);
-  rb1.SetExtHighestSeqNum(kSequenceNumber);
-  rb1.SetFractionLost(kFractionLoss);
-  rb1.SetCumulativeLost(kCumulativeLoss);
-  rb1.SetJitter(kJitter);
-
-  rtcp::ReceiverReport rr1;
-  rr1.SetSenderSsrc(kSenderSsrc);
-  rr1.AddReportBlock(rb1);
-  EXPECT_CALL(callback,
-              StatisticsUpdated(
-                  AllOf(Field(&RtcpStatistics::fraction_lost, kFractionLoss),
-                        Field(&RtcpStatistics::packets_lost, kCumulativeLoss),
-                        Field(&RtcpStatistics::extended_highest_sequence_number,
-                              kSequenceNumber),
-                        Field(&RtcpStatistics::jitter, kJitter)),
-                  kReceiverMainSsrc));
-  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
-  EXPECT_CALL(mocks.bandwidth_observer, OnReceivedRtcpReceiverReport);
-  receiver.IncomingPacket(rr1.Build());
-}
-
 TEST(RtcpReceiverTest,
      VerifyBlockAndTimestampObtainedFromReportBlockDataObserver) {
   ReceiverMocks mocks;
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_interface.h b/modules/rtp_rtcp/source/rtp_rtcp_interface.h
index 5ab48c9..457a993 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_interface.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_interface.h
@@ -77,13 +77,10 @@
     RtcpRttStats* rtt_stats = nullptr;
     RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer = nullptr;
     // Called on receipt of RTCP report block from remote side.
-    // TODO(bugs.webrtc.org/10678): Remove RtcpStatisticsCallback in
-    // favor of ReportBlockDataObserver.
     // TODO(bugs.webrtc.org/10679): Consider whether we want to use
     // only getters or only callbacks. If we decide on getters, the
     // ReportBlockDataObserver should also be removed in favor of
     // GetLatestReportBlockData().
-    RtcpStatisticsCallback* rtcp_statistics_callback = nullptr;
     RtcpCnameCallback* rtcp_cname_callback = nullptr;
     ReportBlockDataObserver* report_block_data_observer = nullptr;
 
diff --git a/video/send_statistics_proxy.cc b/video/send_statistics_proxy.cc
index 6752abe..971e42f 100644
--- a/video/send_statistics_proxy.cc
+++ b/video/send_statistics_proxy.cc
@@ -1285,17 +1285,6 @@
     uma_container_->first_rtcp_stats_time_ms_ = clock_->TimeInMilliseconds();
 }
 
-void SendStatisticsProxy::StatisticsUpdated(const RtcpStatistics& statistics,
-                                            uint32_t ssrc) {
-  MutexLock lock(&mutex_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-
-  stats->rtcp_stats = statistics;
-  uma_container_->report_block_stats_.Store(ssrc, statistics);
-}
-
 void SendStatisticsProxy::OnReportBlockDataUpdated(
     ReportBlockData report_block_data) {
   MutexLock lock(&mutex_);
@@ -1303,6 +1292,15 @@
       GetStatsEntry(report_block_data.report_block().source_ssrc);
   if (!stats)
     return;
+  const RTCPReportBlock& report_block = report_block_data.report_block();
+  stats->rtcp_stats.fraction_lost = report_block.fraction_lost;
+  stats->rtcp_stats.packets_lost = report_block.packets_lost;
+  stats->rtcp_stats.extended_highest_sequence_number =
+      report_block.extended_highest_sequence_number;
+  stats->rtcp_stats.jitter = report_block.jitter;
+  uma_container_->report_block_stats_.Store(report_block.source_ssrc,
+                                            stats->rtcp_stats);
+
   stats->report_block_data = std::move(report_block_data);
 }
 
diff --git a/video/send_statistics_proxy.h b/video/send_statistics_proxy.h
index 0de7df2..bfb221f 100644
--- a/video/send_statistics_proxy.h
+++ b/video/send_statistics_proxy.h
@@ -37,7 +37,6 @@
 namespace webrtc {
 
 class SendStatisticsProxy : public VideoStreamEncoderObserver,
-                            public RtcpStatisticsCallback,
                             public ReportBlockDataObserver,
                             public RtcpPacketTypeCounterObserver,
                             public StreamDataCountersCallback,
@@ -106,9 +105,6 @@
   int GetSendFrameRate() const;
 
  protected:
-  // From RtcpStatisticsCallback.
-  void StatisticsUpdated(const RtcpStatistics& statistics,
-                         uint32_t ssrc) override;
   // From ReportBlockDataObserver.
   void OnReportBlockDataUpdated(ReportBlockData report_block_data) override;
   // From RtcpPacketTypeCounterObserver.
diff --git a/video/send_statistics_proxy_unittest.cc b/video/send_statistics_proxy_unittest.cc
index 71b84c9..aa13302 100644
--- a/video/send_statistics_proxy_unittest.cc
+++ b/video/send_statistics_proxy_unittest.cc
@@ -174,29 +174,51 @@
   VideoSendStream::Stats expected_;
 };
 
-TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
-  RtcpStatisticsCallback* callback = statistics_proxy_.get();
-  for (const auto& ssrc : config_.rtp.ssrcs) {
+TEST_F(SendStatisticsProxyTest, ReportBlockDataObserver) {
+  ReportBlockDataObserver* callback = statistics_proxy_.get();
+  for (uint32_t ssrc : config_.rtp.ssrcs) {
     VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
 
     // Add statistics with some arbitrary, but unique, numbers.
     uint32_t offset = ssrc * sizeof(RtcpStatistics);
-    ssrc_stats.rtcp_stats.packets_lost = offset;
-    ssrc_stats.rtcp_stats.extended_highest_sequence_number = offset + 1;
-    ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
-    ssrc_stats.rtcp_stats.jitter = offset + 3;
-    callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
+    RTCPReportBlock report_block;
+    report_block.source_ssrc = ssrc;
+    report_block.packets_lost = offset;
+    report_block.extended_highest_sequence_number = offset + 1;
+    report_block.fraction_lost = offset + 2;
+    report_block.jitter = offset + 3;
+
+    ssrc_stats.rtcp_stats.packets_lost = report_block.packets_lost;
+    ssrc_stats.rtcp_stats.extended_highest_sequence_number =
+        report_block.extended_highest_sequence_number;
+    ssrc_stats.rtcp_stats.fraction_lost = report_block.fraction_lost;
+    ssrc_stats.rtcp_stats.jitter = report_block.jitter;
+    ReportBlockData data;
+    data.SetReportBlock(report_block, 0);
+
+    callback->OnReportBlockDataUpdated(data);
   }
-  for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
+  for (uint32_t ssrc : config_.rtp.rtx.ssrcs) {
     VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
 
     // Add statistics with some arbitrary, but unique, numbers.
     uint32_t offset = ssrc * sizeof(RtcpStatistics);
-    ssrc_stats.rtcp_stats.packets_lost = offset;
-    ssrc_stats.rtcp_stats.extended_highest_sequence_number = offset + 1;
-    ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
-    ssrc_stats.rtcp_stats.jitter = offset + 3;
-    callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
+    RTCPReportBlock report_block;
+    report_block.source_ssrc = ssrc;
+    report_block.packets_lost = offset;
+    report_block.extended_highest_sequence_number = offset + 1;
+    report_block.fraction_lost = offset + 2;
+    report_block.jitter = offset + 3;
+
+    ssrc_stats.rtcp_stats.packets_lost = report_block.packets_lost;
+    ssrc_stats.rtcp_stats.extended_highest_sequence_number =
+        report_block.extended_highest_sequence_number;
+    ssrc_stats.rtcp_stats.fraction_lost = report_block.fraction_lost;
+    ssrc_stats.rtcp_stats.jitter = report_block.jitter;
+    ReportBlockData data;
+    data.SetReportBlock(report_block, 0);
+
+    callback->OnReportBlockDataUpdated(data);
   }
   VideoSendStream::Stats stats = statistics_proxy_->GetStats();
   ExpectEqual(expected_, stats);
@@ -2171,10 +2193,13 @@
       std::max(*absl::c_max_element(config_.rtp.ssrcs),
                *absl::c_max_element(config_.rtp.rtx.ssrcs)) +
       1;
-  // From RtcpStatisticsCallback.
-  RtcpStatistics rtcp_stats;
-  RtcpStatisticsCallback* rtcp_callback = statistics_proxy_.get();
-  rtcp_callback->StatisticsUpdated(rtcp_stats, excluded_ssrc);
+  // From ReportBlockDataObserver.
+  ReportBlockDataObserver* rtcp_callback = statistics_proxy_.get();
+  RTCPReportBlock report_block;
+  report_block.source_ssrc = excluded_ssrc;
+  ReportBlockData data;
+  data.SetReportBlock(report_block, 0);
+  rtcp_callback->OnReportBlockDataUpdated(data);
 
   // From BitrateStatisticsObserver.
   uint32_t total = 0;
@@ -2221,9 +2246,12 @@
 
   // Update the first SSRC with bogus RTCP stats to make sure that encoded
   // resolution still times out (no global timeout for all stats).
-  RtcpStatistics rtcp_statistics;
-  RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get();
-  rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]);
+  ReportBlockDataObserver* rtcp_callback = statistics_proxy_.get();
+  RTCPReportBlock report_block;
+  report_block.source_ssrc = config_.rtp.ssrcs[0];
+  ReportBlockData data;
+  data.SetReportBlock(report_block, 0);
+  rtcp_callback->OnReportBlockDataUpdated(data);
 
   // Report stats for second SSRC to make sure it's not outdated along with the
   // first SSRC.
diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc
index b4adc13..ebd4445 100644
--- a/video/video_send_stream_impl.cc
+++ b/video/video_send_stream_impl.cc
@@ -146,7 +146,6 @@
   observers.rtcp_rtt_stats = call_stats;
   observers.intra_frame_callback = encoder_feedback;
   observers.rtcp_loss_notification_observer = encoder_feedback;
-  observers.rtcp_stats = stats_proxy;
   observers.report_block_data_observer = stats_proxy;
   observers.rtp_stats = stats_proxy;
   observers.bitrate_observer = stats_proxy;