Avoid exposing RemoteBitrateEstimator in ReceiveSideCongestionController

Making RemoteBitrateEstimator to be ReceiveSideCC implementation detail allows code to be cleaner.

Bug: None
Change-Id: I1d3327c44b364c6c2a1005391cf1dc468e0cc8ce
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/266482
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37305}
diff --git a/call/call.cc b/call/call.cc
index 39772a2..1bb107c 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -898,9 +898,7 @@
   audio_receive_stream->UnregisterFromTransport();
 
   uint32_t ssrc = audio_receive_stream->remote_ssrc();
-  receive_side_cc_
-      .GetRemoteBitrateEstimator(UseSendSideBwe(audio_receive_stream))
-      ->RemoveStream(ssrc);
+  receive_side_cc_.RemoveStream(ssrc);
 
   audio_receive_streams_.erase(audio_receive_stream);
 
@@ -1086,9 +1084,7 @@
   video_receive_streams_.erase(receive_stream_impl);
   ConfigureSync(receive_stream_impl->sync_group());
 
-  receive_side_cc_
-      .GetRemoteBitrateEstimator(UseSendSideBwe(receive_stream_impl))
-      ->RemoveStream(receive_stream_impl->remote_ssrc());
+  receive_side_cc_.RemoveStream(receive_stream_impl->remote_ssrc());
 
   UpdateAggregateNetworkState();
   delete receive_stream_impl;
@@ -1132,9 +1128,7 @@
 
   // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be
   // destroyed.
-  receive_side_cc_
-      .GetRemoteBitrateEstimator(UseSendSideBwe(receive_stream_impl))
-      ->RemoveStream(ssrc);
+  receive_side_cc_.RemoveStream(ssrc);
 
   delete receive_stream_impl;
 }
@@ -1165,11 +1159,7 @@
   stats.rtt_ms = call_stats_->LastProcessedRtt();
 
   // Fetch available send/receive bitrates.
-  std::vector<unsigned int> ssrcs;
-  uint32_t recv_bandwidth = 0;
-  receive_side_cc_.GetRemoteBitrateEstimator(false)->LatestEstimate(
-      &ssrcs, &recv_bandwidth);
-  stats.recv_bandwidth_bps = recv_bandwidth;
+  stats.recv_bandwidth_bps = receive_side_cc_.LatestReceiveSideEstimate().bps();
   stats.send_bandwidth_bps =
       last_bandwidth_bps_.load(std::memory_order_relaxed);
   stats.max_padding_bitrate_bps =
diff --git a/modules/congestion_controller/include/receive_side_congestion_controller.h b/modules/congestion_controller/include/receive_side_congestion_controller.h
index 53a0de2..fe30865 100644
--- a/modules/congestion_controller/include/receive_side_congestion_controller.h
+++ b/modules/congestion_controller/include/receive_side_congestion_controller.h
@@ -48,9 +48,10 @@
 
   void SetSendPeriodicFeedback(bool send_periodic_feedback);
   // TODO(nisse): Delete these methods, design a more specific interface.
-  virtual RemoteBitrateEstimator* GetRemoteBitrateEstimator(bool send_side_bwe);
-  virtual const RemoteBitrateEstimator* GetRemoteBitrateEstimator(
-      bool send_side_bwe) const;
+  [[deprecated]] virtual RemoteBitrateEstimator* GetRemoteBitrateEstimator(
+      bool send_side_bwe);
+  [[deprecated]] virtual const RemoteBitrateEstimator*
+  GetRemoteBitrateEstimator(bool send_side_bwe) const;
 
   // Implements CallStatsObserver.
   void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
@@ -64,6 +65,14 @@
 
   void SetTransportOverhead(DataSize overhead_per_packet);
 
+  // Returns latest receive side bandwidth estimation.
+  // Returns zero if receive side bandwidth estimation is unavailable.
+  DataRate LatestReceiveSideEstimate() const;
+
+  // Removes stream from receive side bandwidth estimation.
+  // Noop if receive side bwe is not used or stream doesn't participate in it.
+  void RemoveStream(uint32_t ssrc);
+
   [[deprecated]] int64_t TimeUntilNextProcess();
   [[deprecated]] void Process();
 
diff --git a/modules/congestion_controller/receive_side_congestion_controller.cc b/modules/congestion_controller/receive_side_congestion_controller.cc
index e495a4d..3f337f8 100644
--- a/modules/congestion_controller/receive_side_congestion_controller.cc
+++ b/modules/congestion_controller/receive_side_congestion_controller.cc
@@ -167,6 +167,20 @@
   }
 }
 
+DataRate ReceiveSideCongestionController::LatestReceiveSideEstimate() const {
+  std::vector<uint32_t> unused_ssrcs;
+  uint32_t bitrate_bps = 0;
+  if (remote_bitrate_estimator_.LatestEstimate(&unused_ssrcs, &bitrate_bps)) {
+    return DataRate::BitsPerSec(bitrate_bps);
+  } else {
+    return DataRate::Zero();
+  }
+}
+
+void ReceiveSideCongestionController::RemoveStream(uint32_t ssrc) {
+  remote_bitrate_estimator_.RemoveStream(ssrc);
+}
+
 void ReceiveSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms,
                                                   int64_t max_rtt_ms) {
   remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms);
diff --git a/test/fuzzers/congestion_controller_feedback_fuzzer.cc b/test/fuzzers/congestion_controller_feedback_fuzzer.cc
index 06a73b0..e266b85 100644
--- a/test/fuzzers/congestion_controller_feedback_fuzzer.cc
+++ b/test/fuzzers/congestion_controller_feedback_fuzzer.cc
@@ -26,7 +26,6 @@
       &clock,
       absl::bind_front(&PacketRouter::SendCombinedRtcpPacket, &packet_router),
       absl::bind_front(&PacketRouter::SendRemb, &packet_router), nullptr);
-  RemoteBitrateEstimator* rbe = cc.GetRemoteBitrateEstimator(true);
   RTPHeader header;
   header.ssrc = ByteReader<uint32_t>::ReadBigEndian(&data[i]);
   i += sizeof(uint32_t);
@@ -43,11 +42,11 @@
     header.extension.transportSequenceNumber =
         ByteReader<uint16_t>::ReadBigEndian(&data[i]);
     i += sizeof(uint16_t);
-    rbe->IncomingPacket(arrival_time_ms, payload_size, header);
+    cc.OnReceivedPacket(arrival_time_ms, payload_size, header);
     clock.AdvanceTimeMilliseconds(5);
     arrival_time_ms += ByteReader<uint8_t>::ReadBigEndian(&data[i]);
     i += sizeof(uint8_t);
+    cc.MaybeProcess();
   }
-  rbe->Process();
 }
 }  // namespace webrtc