xref: /aosp_15_r20/external/webrtc/modules/pacing/packet_router.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef MODULES_PACING_PACKET_ROUTER_H_
12*d9f75844SAndroid Build Coastguard Worker #define MODULES_PACING_PACKET_ROUTER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
15*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include <list>
18*d9f75844SAndroid Build Coastguard Worker #include <memory>
19*d9f75844SAndroid Build Coastguard Worker #include <unordered_map>
20*d9f75844SAndroid Build Coastguard Worker #include <utility>
21*d9f75844SAndroid Build Coastguard Worker #include <vector>
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker #include "api/transport/network_types.h"
24*d9f75844SAndroid Build Coastguard Worker #include "modules/pacing/pacing_controller.h"
25*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
26*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet.h"
27*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
28*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
29*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h"
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
32*d9f75844SAndroid Build Coastguard Worker 
33*d9f75844SAndroid Build Coastguard Worker class RtpRtcpInterface;
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker // PacketRouter keeps track of rtp send modules to support the pacer.
36*d9f75844SAndroid Build Coastguard Worker // In addition, it handles feedback messages, which are sent on a send
37*d9f75844SAndroid Build Coastguard Worker // module if possible (sender report), otherwise on receive module
38*d9f75844SAndroid Build Coastguard Worker // (receiver report). For the latter case, we also keep track of the
39*d9f75844SAndroid Build Coastguard Worker // receive modules.
40*d9f75844SAndroid Build Coastguard Worker class PacketRouter : public PacingController::PacketSender {
41*d9f75844SAndroid Build Coastguard Worker  public:
42*d9f75844SAndroid Build Coastguard Worker   PacketRouter();
43*d9f75844SAndroid Build Coastguard Worker   explicit PacketRouter(uint16_t start_transport_seq);
44*d9f75844SAndroid Build Coastguard Worker   ~PacketRouter() override;
45*d9f75844SAndroid Build Coastguard Worker 
46*d9f75844SAndroid Build Coastguard Worker   PacketRouter(const PacketRouter&) = delete;
47*d9f75844SAndroid Build Coastguard Worker   PacketRouter& operator=(const PacketRouter&) = delete;
48*d9f75844SAndroid Build Coastguard Worker 
49*d9f75844SAndroid Build Coastguard Worker   void AddSendRtpModule(RtpRtcpInterface* rtp_module, bool remb_candidate);
50*d9f75844SAndroid Build Coastguard Worker   void RemoveSendRtpModule(RtpRtcpInterface* rtp_module);
51*d9f75844SAndroid Build Coastguard Worker 
52*d9f75844SAndroid Build Coastguard Worker   void AddReceiveRtpModule(RtcpFeedbackSenderInterface* rtcp_sender,
53*d9f75844SAndroid Build Coastguard Worker                            bool remb_candidate);
54*d9f75844SAndroid Build Coastguard Worker   void RemoveReceiveRtpModule(RtcpFeedbackSenderInterface* rtcp_sender);
55*d9f75844SAndroid Build Coastguard Worker 
56*d9f75844SAndroid Build Coastguard Worker   void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
57*d9f75844SAndroid Build Coastguard Worker                   const PacedPacketInfo& cluster_info) override;
58*d9f75844SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override;
59*d9f75844SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
60*d9f75844SAndroid Build Coastguard Worker       DataSize size) override;
61*d9f75844SAndroid Build Coastguard Worker   void OnAbortedRetransmissions(
62*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
63*d9f75844SAndroid Build Coastguard Worker       rtc::ArrayView<const uint16_t> sequence_numbers) override;
64*d9f75844SAndroid Build Coastguard Worker   absl::optional<uint32_t> GetRtxSsrcForMedia(uint32_t ssrc) const override;
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker   uint16_t CurrentTransportSequenceNumber() const;
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker   // Send REMB feedback.
69*d9f75844SAndroid Build Coastguard Worker   void SendRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs);
70*d9f75844SAndroid Build Coastguard Worker 
71*d9f75844SAndroid Build Coastguard Worker   // Sends `packets` in one or more IP packets.
72*d9f75844SAndroid Build Coastguard Worker   void SendCombinedRtcpPacket(
73*d9f75844SAndroid Build Coastguard Worker       std::vector<std::unique_ptr<rtcp::RtcpPacket>> packets);
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker  private:
76*d9f75844SAndroid Build Coastguard Worker   void AddRembModuleCandidate(RtcpFeedbackSenderInterface* candidate_module,
77*d9f75844SAndroid Build Coastguard Worker                               bool media_sender)
78*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_mutex_);
79*d9f75844SAndroid Build Coastguard Worker   void MaybeRemoveRembModuleCandidate(
80*d9f75844SAndroid Build Coastguard Worker       RtcpFeedbackSenderInterface* candidate_module,
81*d9f75844SAndroid Build Coastguard Worker       bool media_sender) RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_mutex_);
82*d9f75844SAndroid Build Coastguard Worker   void UnsetActiveRembModule() RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_mutex_);
83*d9f75844SAndroid Build Coastguard Worker   void DetermineActiveRembModule() RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_mutex_);
84*d9f75844SAndroid Build Coastguard Worker   void AddSendRtpModuleToMap(RtpRtcpInterface* rtp_module, uint32_t ssrc)
85*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_mutex_);
86*d9f75844SAndroid Build Coastguard Worker   void RemoveSendRtpModuleFromMap(uint32_t ssrc)
87*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_mutex_);
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker   mutable Mutex modules_mutex_;
90*d9f75844SAndroid Build Coastguard Worker   // Ssrc to RtpRtcpInterface module;
91*d9f75844SAndroid Build Coastguard Worker   std::unordered_map<uint32_t, RtpRtcpInterface*> send_modules_map_
92*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(modules_mutex_);
93*d9f75844SAndroid Build Coastguard Worker   std::list<RtpRtcpInterface*> send_modules_list_
94*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(modules_mutex_);
95*d9f75844SAndroid Build Coastguard Worker   // The last module used to send media.
96*d9f75844SAndroid Build Coastguard Worker   RtpRtcpInterface* last_send_module_ RTC_GUARDED_BY(modules_mutex_);
97*d9f75844SAndroid Build Coastguard Worker   // Rtcp modules of the rtp receivers.
98*d9f75844SAndroid Build Coastguard Worker   std::vector<RtcpFeedbackSenderInterface*> rtcp_feedback_senders_
99*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(modules_mutex_);
100*d9f75844SAndroid Build Coastguard Worker 
101*d9f75844SAndroid Build Coastguard Worker   // Candidates for the REMB module can be RTP sender/receiver modules, with
102*d9f75844SAndroid Build Coastguard Worker   // the sender modules taking precedence.
103*d9f75844SAndroid Build Coastguard Worker   std::vector<RtcpFeedbackSenderInterface*> sender_remb_candidates_
104*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(modules_mutex_);
105*d9f75844SAndroid Build Coastguard Worker   std::vector<RtcpFeedbackSenderInterface*> receiver_remb_candidates_
106*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(modules_mutex_);
107*d9f75844SAndroid Build Coastguard Worker   RtcpFeedbackSenderInterface* active_remb_module_
108*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(modules_mutex_);
109*d9f75844SAndroid Build Coastguard Worker 
110*d9f75844SAndroid Build Coastguard Worker   uint64_t transport_seq_ RTC_GUARDED_BY(modules_mutex_);
111*d9f75844SAndroid Build Coastguard Worker 
112*d9f75844SAndroid Build Coastguard Worker   // TODO(bugs.webrtc.org/10809): Replace lock with a sequence checker once the
113*d9f75844SAndroid Build Coastguard Worker   // process thread is gone.
114*d9f75844SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<RtpPacketToSend>> pending_fec_packets_
115*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(modules_mutex_);
116*d9f75844SAndroid Build Coastguard Worker };
117*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
118*d9f75844SAndroid Build Coastguard Worker #endif  // MODULES_PACING_PACKET_ROUTER_H_
119