Narrow interface PacketRouter use to send Remb and TransportFeedback

This allows to use RtcpTransceiver implementation instead of RtpRtcp.
No functional changes.

Bug: webrtc:8239
Change-Id: I3c5bd23ff2136eb844e85b567b70380fc2a65929
Reviewed-on: https://webrtc-review.googlesource.com/33005
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21298}
diff --git a/modules/pacing/packet_router.cc b/modules/pacing/packet_router.cc
index ba1359a..e3d935e 100644
--- a/modules/pacing/packet_router.cc
+++ b/modules/pacing/packet_router.cc
@@ -37,7 +37,7 @@
 
 PacketRouter::~PacketRouter() {
   RTC_DCHECK(rtp_send_modules_.empty());
-  RTC_DCHECK(rtp_receive_modules_.empty());
+  RTC_DCHECK(rtcp_feedback_senders_.empty());
   RTC_DCHECK(sender_remb_candidates_.empty());
   RTC_DCHECK(receiver_remb_candidates_.empty());
   RTC_DCHECK(active_remb_module_ == nullptr);
@@ -56,39 +56,41 @@
   }
 
   if (remb_candidate) {
-    AddRembModuleCandidate(rtp_module, true);
+    AddRembModuleCandidate(rtp_module, /* media_sender = */ true);
   }
 }
 
 void PacketRouter::RemoveSendRtpModule(RtpRtcp* rtp_module) {
   rtc::CritScope cs(&modules_crit_);
-  MaybeRemoveRembModuleCandidate(rtp_module, /* sender = */ true);
+  MaybeRemoveRembModuleCandidate(rtp_module, /* media_sender = */ true);
   auto it =
       std::find(rtp_send_modules_.begin(), rtp_send_modules_.end(), rtp_module);
   RTC_DCHECK(it != rtp_send_modules_.end());
   rtp_send_modules_.erase(it);
 }
 
-void PacketRouter::AddReceiveRtpModule(RtpRtcp* rtp_module,
+void PacketRouter::AddReceiveRtpModule(RtcpFeedbackSenderInterface* rtcp_sender,
                                        bool remb_candidate) {
   rtc::CritScope cs(&modules_crit_);
-  RTC_DCHECK(std::find(rtp_receive_modules_.begin(), rtp_receive_modules_.end(),
-                       rtp_module) == rtp_receive_modules_.end());
+  RTC_DCHECK(std::find(rtcp_feedback_senders_.begin(),
+                       rtcp_feedback_senders_.end(),
+                       rtcp_sender) == rtcp_feedback_senders_.end());
 
-  rtp_receive_modules_.push_back(rtp_module);
+  rtcp_feedback_senders_.push_back(rtcp_sender);
 
   if (remb_candidate) {
-    AddRembModuleCandidate(rtp_module, false);
+    AddRembModuleCandidate(rtcp_sender, /* media_sender = */ false);
   }
 }
 
-void PacketRouter::RemoveReceiveRtpModule(RtpRtcp* rtp_module) {
+void PacketRouter::RemoveReceiveRtpModule(
+    RtcpFeedbackSenderInterface* rtcp_sender) {
   rtc::CritScope cs(&modules_crit_);
-  MaybeRemoveRembModuleCandidate(rtp_module, /* sender = */ false);
-  const auto& it = std::find(rtp_receive_modules_.begin(),
-                             rtp_receive_modules_.end(), rtp_module);
-  RTC_DCHECK(it != rtp_receive_modules_.end());
-  rtp_receive_modules_.erase(it);
+  MaybeRemoveRembModuleCandidate(rtcp_sender, /* media_sender = */ false);
+  auto it = std::find(rtcp_feedback_senders_.begin(),
+                      rtcp_feedback_senders_.end(), rtcp_sender);
+  RTC_DCHECK(it != rtcp_feedback_senders_.end());
+  rtcp_feedback_senders_.erase(it);
 }
 
 bool PacketRouter::TimeToSendPacket(uint32_t ssrc,
@@ -229,30 +231,32 @@
     if (rtp_module->SendFeedbackPacket(*packet))
       return true;
   }
-  for (auto* rtp_module : rtp_receive_modules_) {
-    packet->SetSenderSsrc(rtp_module->SSRC());
-    if (rtp_module->SendFeedbackPacket(*packet))
+  for (auto* rtcp_sender : rtcp_feedback_senders_) {
+    packet->SetSenderSsrc(rtcp_sender->SSRC());
+    if (rtcp_sender->SendFeedbackPacket(*packet))
       return true;
   }
   return false;
 }
 
-void PacketRouter::AddRembModuleCandidate(RtpRtcp* candidate_module,
-                                          bool sender) {
+void PacketRouter::AddRembModuleCandidate(
+    RtcpFeedbackSenderInterface* candidate_module,
+    bool media_sender) {
   RTC_DCHECK(candidate_module);
-  std::vector<RtpRtcp*>& candidates =
-      sender ? sender_remb_candidates_ : receiver_remb_candidates_;
+  std::vector<RtcpFeedbackSenderInterface*>& candidates =
+      media_sender ? sender_remb_candidates_ : receiver_remb_candidates_;
   RTC_DCHECK(std::find(candidates.cbegin(), candidates.cend(),
                        candidate_module) == candidates.cend());
   candidates.push_back(candidate_module);
   DetermineActiveRembModule();
 }
 
-void PacketRouter::MaybeRemoveRembModuleCandidate(RtpRtcp* candidate_module,
-                                                  bool sender) {
+void PacketRouter::MaybeRemoveRembModuleCandidate(
+    RtcpFeedbackSenderInterface* candidate_module,
+    bool media_sender) {
   RTC_DCHECK(candidate_module);
-  std::vector<RtpRtcp*>& candidates =
-      sender ? sender_remb_candidates_ : receiver_remb_candidates_;
+  std::vector<RtcpFeedbackSenderInterface*>& candidates =
+      media_sender ? sender_remb_candidates_ : receiver_remb_candidates_;
   auto it = std::find(candidates.begin(), candidates.end(), candidate_module);
 
   if (it == candidates.end()) {
@@ -278,7 +282,7 @@
   // When adding the first sender module, we should change the active REMB
   // module to be that. Otherwise, we remain with the current active module.
 
-  RtpRtcp* new_active_remb_module;
+  RtcpFeedbackSenderInterface* new_active_remb_module;
 
   if (!sender_remb_candidates_.empty()) {
     new_active_remb_module = sender_remb_candidates_.front();
diff --git a/modules/pacing/packet_router.h b/modules/pacing/packet_router.h
index 77d46d7..9597896 100644
--- a/modules/pacing/packet_router.h
+++ b/modules/pacing/packet_router.h
@@ -46,8 +46,9 @@
   void AddSendRtpModule(RtpRtcp* rtp_module, bool remb_candidate);
   void RemoveSendRtpModule(RtpRtcp* rtp_module);
 
-  void AddReceiveRtpModule(RtpRtcp* rtp_module, bool remb_candidate);
-  void RemoveReceiveRtpModule(RtpRtcp* rtp_module);
+  void AddReceiveRtpModule(RtcpFeedbackSenderInterface* rtcp_sender,
+                           bool remb_candidate);
+  void RemoveReceiveRtpModule(RtcpFeedbackSenderInterface* rtcp_sender);
 
   // Implements PacedSender::Callback.
   bool TimeToSendPacket(uint32_t ssrc,
@@ -81,17 +82,22 @@
   bool SendTransportFeedback(rtcp::TransportFeedback* packet) override;
 
  private:
-  void AddRembModuleCandidate(RtpRtcp* candidate_module, bool sender)
+  void AddRembModuleCandidate(RtcpFeedbackSenderInterface* candidate_module,
+                              bool media_sender)
       RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
-  void MaybeRemoveRembModuleCandidate(RtpRtcp* candidate_module, bool sender)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
+  void MaybeRemoveRembModuleCandidate(
+      RtcpFeedbackSenderInterface* candidate_module,
+      bool media_sender) RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
   void UnsetActiveRembModule() RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
   void DetermineActiveRembModule() RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
 
   rtc::RaceChecker pacer_race_;
   rtc::CriticalSection modules_crit_;
+  // Rtp and Rtcp modules of the rtp senders.
   std::list<RtpRtcp*> rtp_send_modules_ RTC_GUARDED_BY(modules_crit_);
-  std::vector<RtpRtcp*> rtp_receive_modules_ RTC_GUARDED_BY(modules_crit_);
+  // Rtcp modules of the rtp receivers.
+  std::vector<RtcpFeedbackSenderInterface*> rtcp_feedback_senders_
+      RTC_GUARDED_BY(modules_crit_);
 
   // TODO(eladalon): remb_crit_ only ever held from one function, and it's not
   // clear if that function can actually be called from more than one thread.
@@ -105,9 +111,12 @@
 
   // Candidates for the REMB module can be RTP sender/receiver modules, with
   // the sender modules taking precedence.
-  std::vector<RtpRtcp*> sender_remb_candidates_ RTC_GUARDED_BY(modules_crit_);
-  std::vector<RtpRtcp*> receiver_remb_candidates_ RTC_GUARDED_BY(modules_crit_);
-  RtpRtcp* active_remb_module_ RTC_GUARDED_BY(modules_crit_);
+  std::vector<RtcpFeedbackSenderInterface*> sender_remb_candidates_
+      RTC_GUARDED_BY(modules_crit_);
+  std::vector<RtcpFeedbackSenderInterface*> receiver_remb_candidates_
+      RTC_GUARDED_BY(modules_crit_);
+  RtcpFeedbackSenderInterface* active_remb_module_
+      RTC_GUARDED_BY(modules_crit_);
 
   volatile int transport_seq_;
 
diff --git a/modules/rtp_rtcp/include/rtp_rtcp.h b/modules/rtp_rtcp/include/rtp_rtcp.h
index 6e14622..7e85cb6 100644
--- a/modules/rtp_rtcp/include/rtp_rtcp.h
+++ b/modules/rtp_rtcp/include/rtp_rtcp.h
@@ -42,7 +42,7 @@
 class TransportFeedback;
 }
 
-class RtpRtcp : public Module {
+class RtpRtcp : public Module, public RtcpFeedbackSenderInterface {
  public:
   struct Configuration {
     Configuration();
@@ -165,7 +165,7 @@
   virtual RtpState GetRtxState() const = 0;
 
   // Returns SSRC.
-  virtual uint32_t SSRC() const = 0;
+  uint32_t SSRC() const override = 0;
 
   // Sets SSRC, default is a random number.
   virtual void SetSSRC(uint32_t ssrc) = 0;
@@ -341,9 +341,9 @@
 
   // (REMB) Receiver Estimated Max Bitrate.
   // Schedules sending REMB on next and following sender/receiver reports.
-  virtual void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) = 0;
+  void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) override = 0;
   // Stops sending REMB on next and following sender/receiver reports.
-  virtual void UnsetRemb() = 0;
+  void UnsetRemb() override = 0;
 
   // (TMMBR) Temporary Max Media Bit Rate
   virtual bool TMMBR() const = 0;
@@ -391,7 +391,7 @@
       RtcpStatisticsCallback* callback) = 0;
   virtual RtcpStatisticsCallback* GetRtcpStatisticsCallback() = 0;
   // BWE feedback packets.
-  virtual bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) = 0;
+  bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) override = 0;
 
   virtual void SetVideoBitrateAllocation(const BitrateAllocation& bitrate) = 0;
 
diff --git a/modules/rtp_rtcp/include/rtp_rtcp_defines.h b/modules/rtp_rtcp/include/rtp_rtcp_defines.h
index 97a2a98..61b1577 100644
--- a/modules/rtp_rtcp/include/rtp_rtcp_defines.h
+++ b/modules/rtp_rtcp/include/rtp_rtcp_defines.h
@@ -407,6 +407,19 @@
   virtual std::vector<PacketFeedback> GetTransportFeedbackVector() const = 0;
 };
 
+// Interface for PacketRouter to send rtcp feedback on behalf of
+// congestion controller.
+// TODO(bugs.webrtc.org/8239): Remove and use RtcpTransceiver directly
+// when RtcpTransceiver always present in rtp transport.
+class RtcpFeedbackSenderInterface {
+ public:
+  virtual ~RtcpFeedbackSenderInterface() = default;
+  virtual uint32_t SSRC() const = 0;
+  virtual bool SendFeedbackPacket(const rtcp::TransportFeedback& feedback) = 0;
+  virtual void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) = 0;
+  virtual void UnsetRemb() = 0;
+};
+
 class PacketFeedbackObserver {
  public:
   virtual ~PacketFeedbackObserver() = default;
diff --git a/modules/rtp_rtcp/source/rtcp_transceiver.h b/modules/rtp_rtcp/source/rtcp_transceiver.h
index 8ce2db5..9df56d1 100644
--- a/modules/rtp_rtcp/source/rtcp_transceiver.h
+++ b/modules/rtp_rtcp/source/rtcp_transceiver.h
@@ -27,10 +27,10 @@
 // Manage incoming and outgoing rtcp messages for multiple BUNDLED streams.
 //
 // This class is thread-safe wrapper of RtcpTransceiverImpl
-class RtcpTransceiver {
+class RtcpTransceiver : public RtcpFeedbackSenderInterface {
  public:
   explicit RtcpTransceiver(const RtcpTransceiverConfig& config);
-  ~RtcpTransceiver();
+  ~RtcpTransceiver() override;
 
   // Registers observer to be notified about incoming rtcp packets.
   // Calls to observer will be done on the |config.task_queue|.
@@ -51,17 +51,17 @@
 
   // (REMB) Receiver Estimated Max Bitrate.
   // Includes REMB in following compound packets.
-  void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs);
+  void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) override;
   // Stops sending REMB in following compound packets.
-  void UnsetRemb();
+  void UnsetRemb() override;
 
   // TODO(bugs.webrtc.org/8239): Remove SendFeedbackPacket and SSRC functions
   // and move generating of the TransportFeedback message inside
   // RtcpTransceiverImpl when there is one RtcpTransceiver per rtp transport.
 
   // Returns ssrc to put as sender ssrc into rtcp::TransportFeedback.
-  uint32_t SSRC() const;
-  bool SendFeedbackPacket(const rtcp::TransportFeedback& packet);
+  uint32_t SSRC() const override;
+  bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) override;
 
   // Reports missing packets, https://tools.ietf.org/html/rfc4585#section-6.2.1
   void SendNack(uint32_t ssrc, std::vector<uint16_t> sequence_numbers);