xref: /aosp_15_r20/external/webrtc/call/rtp_video_sender.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 CALL_RTP_VIDEO_SENDER_H_
12*d9f75844SAndroid Build Coastguard Worker #define CALL_RTP_VIDEO_SENDER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <map>
15*d9f75844SAndroid Build Coastguard Worker #include <memory>
16*d9f75844SAndroid Build Coastguard Worker #include <unordered_set>
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/call/transport.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/fec_controller.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/fec_controller_override.h"
24*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h"
25*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_event_log/rtc_event_log.h"
26*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h"
27*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h"
28*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_factory.h"
29*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_encoder.h"
30*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_config.h"
31*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_payload_params.h"
32*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_transport_controller_send_interface.h"
33*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_video_sender_interface.h"
34*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/flexfec_sender.h"
35*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
36*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_sender.h"
37*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_sender_video.h"
38*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_sequence_number_map.h"
39*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_video_header.h"
40*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/rate_limiter.h"
41*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
42*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h"
43*d9f75844SAndroid Build Coastguard Worker 
44*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
45*d9f75844SAndroid Build Coastguard Worker 
46*d9f75844SAndroid Build Coastguard Worker class FrameEncryptorInterface;
47*d9f75844SAndroid Build Coastguard Worker class RtpTransportControllerSendInterface;
48*d9f75844SAndroid Build Coastguard Worker 
49*d9f75844SAndroid Build Coastguard Worker namespace webrtc_internal_rtp_video_sender {
50*d9f75844SAndroid Build Coastguard Worker // RTP state for a single simulcast stream. Internal to the implementation of
51*d9f75844SAndroid Build Coastguard Worker // RtpVideoSender.
52*d9f75844SAndroid Build Coastguard Worker struct RtpStreamSender {
53*d9f75844SAndroid Build Coastguard Worker   RtpStreamSender(std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp,
54*d9f75844SAndroid Build Coastguard Worker                   std::unique_ptr<RTPSenderVideo> sender_video,
55*d9f75844SAndroid Build Coastguard Worker                   std::unique_ptr<VideoFecGenerator> fec_generator);
56*d9f75844SAndroid Build Coastguard Worker   ~RtpStreamSender();
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker   RtpStreamSender(RtpStreamSender&&) = default;
59*d9f75844SAndroid Build Coastguard Worker   RtpStreamSender& operator=(RtpStreamSender&&) = default;
60*d9f75844SAndroid Build Coastguard Worker 
61*d9f75844SAndroid Build Coastguard Worker   // Note: Needs pointer stability.
62*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp;
63*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<RTPSenderVideo> sender_video;
64*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<VideoFecGenerator> fec_generator;
65*d9f75844SAndroid Build Coastguard Worker };
66*d9f75844SAndroid Build Coastguard Worker 
67*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc_internal_rtp_video_sender
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker // RtpVideoSender routes outgoing data to the correct sending RTP module, based
70*d9f75844SAndroid Build Coastguard Worker // on the simulcast layer in RTPVideoHeader.
71*d9f75844SAndroid Build Coastguard Worker class RtpVideoSender : public RtpVideoSenderInterface,
72*d9f75844SAndroid Build Coastguard Worker                        public VCMProtectionCallback,
73*d9f75844SAndroid Build Coastguard Worker                        public StreamFeedbackObserver {
74*d9f75844SAndroid Build Coastguard Worker  public:
75*d9f75844SAndroid Build Coastguard Worker   // Rtp modules are assumed to be sorted in simulcast index order.
76*d9f75844SAndroid Build Coastguard Worker   RtpVideoSender(
77*d9f75844SAndroid Build Coastguard Worker       Clock* clock,
78*d9f75844SAndroid Build Coastguard Worker       const std::map<uint32_t, RtpState>& suspended_ssrcs,
79*d9f75844SAndroid Build Coastguard Worker       const std::map<uint32_t, RtpPayloadState>& states,
80*d9f75844SAndroid Build Coastguard Worker       const RtpConfig& rtp_config,
81*d9f75844SAndroid Build Coastguard Worker       int rtcp_report_interval_ms,
82*d9f75844SAndroid Build Coastguard Worker       Transport* send_transport,
83*d9f75844SAndroid Build Coastguard Worker       const RtpSenderObservers& observers,
84*d9f75844SAndroid Build Coastguard Worker       RtpTransportControllerSendInterface* transport,
85*d9f75844SAndroid Build Coastguard Worker       RtcEventLog* event_log,
86*d9f75844SAndroid Build Coastguard Worker       RateLimiter* retransmission_limiter,  // move inside RtpTransport
87*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<FecController> fec_controller,
88*d9f75844SAndroid Build Coastguard Worker       FrameEncryptorInterface* frame_encryptor,
89*d9f75844SAndroid Build Coastguard Worker       const CryptoOptions& crypto_options,  // move inside RtpTransport
90*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
91*d9f75844SAndroid Build Coastguard Worker       const FieldTrialsView& field_trials,
92*d9f75844SAndroid Build Coastguard Worker       TaskQueueFactory* task_queue_factory);
93*d9f75844SAndroid Build Coastguard Worker   ~RtpVideoSender() override;
94*d9f75844SAndroid Build Coastguard Worker 
95*d9f75844SAndroid Build Coastguard Worker   RtpVideoSender(const RtpVideoSender&) = delete;
96*d9f75844SAndroid Build Coastguard Worker   RtpVideoSender& operator=(const RtpVideoSender&) = delete;
97*d9f75844SAndroid Build Coastguard Worker 
98*d9f75844SAndroid Build Coastguard Worker   // Sets the sending status of the rtp modules and appropriately sets the
99*d9f75844SAndroid Build Coastguard Worker   // payload router to active if any rtp modules are active.
100*d9f75844SAndroid Build Coastguard Worker   void SetActiveModules(const std::vector<bool>& active_modules)
101*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
102*d9f75844SAndroid Build Coastguard Worker   void Stop() RTC_LOCKS_EXCLUDED(mutex_) override;
103*d9f75844SAndroid Build Coastguard Worker   bool IsActive() RTC_LOCKS_EXCLUDED(mutex_) override;
104*d9f75844SAndroid Build Coastguard Worker 
105*d9f75844SAndroid Build Coastguard Worker   void OnNetworkAvailability(bool network_available)
106*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
107*d9f75844SAndroid Build Coastguard Worker   std::map<uint32_t, RtpState> GetRtpStates() const
108*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
109*d9f75844SAndroid Build Coastguard Worker   std::map<uint32_t, RtpPayloadState> GetRtpPayloadStates() const
110*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
111*d9f75844SAndroid Build Coastguard Worker 
112*d9f75844SAndroid Build Coastguard Worker   void DeliverRtcp(const uint8_t* packet, size_t length)
113*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
114*d9f75844SAndroid Build Coastguard Worker 
115*d9f75844SAndroid Build Coastguard Worker   // Implements webrtc::VCMProtectionCallback.
116*d9f75844SAndroid Build Coastguard Worker   int ProtectionRequest(const FecProtectionParams* delta_params,
117*d9f75844SAndroid Build Coastguard Worker                         const FecProtectionParams* key_params,
118*d9f75844SAndroid Build Coastguard Worker                         uint32_t* sent_video_rate_bps,
119*d9f75844SAndroid Build Coastguard Worker                         uint32_t* sent_nack_rate_bps,
120*d9f75844SAndroid Build Coastguard Worker                         uint32_t* sent_fec_rate_bps)
121*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
122*d9f75844SAndroid Build Coastguard Worker 
123*d9f75844SAndroid Build Coastguard Worker   // Implements FecControllerOverride.
124*d9f75844SAndroid Build Coastguard Worker   void SetFecAllowed(bool fec_allowed) RTC_LOCKS_EXCLUDED(mutex_) override;
125*d9f75844SAndroid Build Coastguard Worker 
126*d9f75844SAndroid Build Coastguard Worker   // Implements EncodedImageCallback.
127*d9f75844SAndroid Build Coastguard Worker   // Returns 0 if the packet was routed / sent, -1 otherwise.
128*d9f75844SAndroid Build Coastguard Worker   EncodedImageCallback::Result OnEncodedImage(
129*d9f75844SAndroid Build Coastguard Worker       const EncodedImage& encoded_image,
130*d9f75844SAndroid Build Coastguard Worker       const CodecSpecificInfo* codec_specific_info)
131*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
132*d9f75844SAndroid Build Coastguard Worker 
133*d9f75844SAndroid Build Coastguard Worker   void OnBitrateAllocationUpdated(const VideoBitrateAllocation& bitrate)
134*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
135*d9f75844SAndroid Build Coastguard Worker   void OnVideoLayersAllocationUpdated(
136*d9f75844SAndroid Build Coastguard Worker       const VideoLayersAllocation& layers) override;
137*d9f75844SAndroid Build Coastguard Worker   void OnTransportOverheadChanged(size_t transport_overhead_bytes_per_packet)
138*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
139*d9f75844SAndroid Build Coastguard Worker   void OnBitrateUpdated(BitrateAllocationUpdate update, int framerate)
140*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
141*d9f75844SAndroid Build Coastguard Worker   uint32_t GetPayloadBitrateBps() const RTC_LOCKS_EXCLUDED(mutex_) override;
142*d9f75844SAndroid Build Coastguard Worker   uint32_t GetProtectionBitrateBps() const RTC_LOCKS_EXCLUDED(mutex_) override;
143*d9f75844SAndroid Build Coastguard Worker   void SetEncodingData(size_t width, size_t height, size_t num_temporal_layers)
144*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
145*d9f75844SAndroid Build Coastguard Worker 
146*d9f75844SAndroid Build Coastguard Worker   std::vector<RtpSequenceNumberMap::Info> GetSentRtpPacketInfos(
147*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
148*d9f75844SAndroid Build Coastguard Worker       rtc::ArrayView<const uint16_t> sequence_numbers) const
149*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker   // From StreamFeedbackObserver.
152*d9f75844SAndroid Build Coastguard Worker   void OnPacketFeedbackVector(
153*d9f75844SAndroid Build Coastguard Worker       std::vector<StreamPacketInfo> packet_feedback_vector)
154*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(mutex_) override;
155*d9f75844SAndroid Build Coastguard Worker 
156*d9f75844SAndroid Build Coastguard Worker  private:
157*d9f75844SAndroid Build Coastguard Worker   bool IsActiveLocked() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
158*d9f75844SAndroid Build Coastguard Worker   void SetActiveModulesLocked(const std::vector<bool>& active_modules)
159*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
160*d9f75844SAndroid Build Coastguard Worker   void UpdateModuleSendingState() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
161*d9f75844SAndroid Build Coastguard Worker   void ConfigureProtection();
162*d9f75844SAndroid Build Coastguard Worker   void ConfigureSsrcs(const std::map<uint32_t, RtpState>& suspended_ssrcs);
163*d9f75844SAndroid Build Coastguard Worker   bool NackEnabled() const;
164*d9f75844SAndroid Build Coastguard Worker   uint32_t GetPacketizationOverheadRate() const;
165*d9f75844SAndroid Build Coastguard Worker   DataRate CalculateOverheadRate(DataRate data_rate,
166*d9f75844SAndroid Build Coastguard Worker                                  DataSize packet_size,
167*d9f75844SAndroid Build Coastguard Worker                                  DataSize overhead_per_packet,
168*d9f75844SAndroid Build Coastguard Worker                                  Frequency framerate) const;
169*d9f75844SAndroid Build Coastguard Worker 
170*d9f75844SAndroid Build Coastguard Worker   const FieldTrialsView& field_trials_;
171*d9f75844SAndroid Build Coastguard Worker   const bool use_frame_rate_for_overhead_;
172*d9f75844SAndroid Build Coastguard Worker   const bool has_packet_feedback_;
173*d9f75844SAndroid Build Coastguard Worker 
174*d9f75844SAndroid Build Coastguard Worker   // Semantically equivalent to checking for `transport_->GetWorkerQueue()`
175*d9f75844SAndroid Build Coastguard Worker   // but some tests need to be updated to call from the correct context.
176*d9f75844SAndroid Build Coastguard Worker   RTC_NO_UNIQUE_ADDRESS SequenceChecker transport_checker_;
177*d9f75844SAndroid Build Coastguard Worker 
178*d9f75844SAndroid Build Coastguard Worker   // TODO(bugs.webrtc.org/13517): Remove mutex_ once RtpVideoSender runs on the
179*d9f75844SAndroid Build Coastguard Worker   // transport task queue.
180*d9f75844SAndroid Build Coastguard Worker   mutable Mutex mutex_;
181*d9f75844SAndroid Build Coastguard Worker   bool active_ RTC_GUARDED_BY(mutex_);
182*d9f75844SAndroid Build Coastguard Worker   bool registered_for_feedback_ RTC_GUARDED_BY(transport_checker_) = false;
183*d9f75844SAndroid Build Coastguard Worker 
184*d9f75844SAndroid Build Coastguard Worker   const std::unique_ptr<FecController> fec_controller_;
185*d9f75844SAndroid Build Coastguard Worker   bool fec_allowed_ RTC_GUARDED_BY(mutex_);
186*d9f75844SAndroid Build Coastguard Worker 
187*d9f75844SAndroid Build Coastguard Worker   // Rtp modules are assumed to be sorted in simulcast index order.
188*d9f75844SAndroid Build Coastguard Worker   const std::vector<webrtc_internal_rtp_video_sender::RtpStreamSender>
189*d9f75844SAndroid Build Coastguard Worker       rtp_streams_;
190*d9f75844SAndroid Build Coastguard Worker   const RtpConfig rtp_config_;
191*d9f75844SAndroid Build Coastguard Worker   const absl::optional<VideoCodecType> codec_type_;
192*d9f75844SAndroid Build Coastguard Worker   RtpTransportControllerSendInterface* const transport_;
193*d9f75844SAndroid Build Coastguard Worker 
194*d9f75844SAndroid Build Coastguard Worker   // When using the generic descriptor we want all simulcast streams to share
195*d9f75844SAndroid Build Coastguard Worker   // one frame id space (so that the SFU can switch stream without having to
196*d9f75844SAndroid Build Coastguard Worker   // rewrite the frame id), therefore `shared_frame_id` has to live in a place
197*d9f75844SAndroid Build Coastguard Worker   // where we are aware of all the different streams.
198*d9f75844SAndroid Build Coastguard Worker   int64_t shared_frame_id_ = 0;
199*d9f75844SAndroid Build Coastguard Worker   std::vector<RtpPayloadParams> params_ RTC_GUARDED_BY(mutex_);
200*d9f75844SAndroid Build Coastguard Worker 
201*d9f75844SAndroid Build Coastguard Worker   size_t transport_overhead_bytes_per_packet_ RTC_GUARDED_BY(mutex_);
202*d9f75844SAndroid Build Coastguard Worker   uint32_t protection_bitrate_bps_;
203*d9f75844SAndroid Build Coastguard Worker   uint32_t encoder_target_rate_bps_;
204*d9f75844SAndroid Build Coastguard Worker 
205*d9f75844SAndroid Build Coastguard Worker   std::vector<bool> loss_mask_vector_ RTC_GUARDED_BY(mutex_);
206*d9f75844SAndroid Build Coastguard Worker 
207*d9f75844SAndroid Build Coastguard Worker   std::vector<FrameCounts> frame_counts_ RTC_GUARDED_BY(mutex_);
208*d9f75844SAndroid Build Coastguard Worker   FrameCountObserver* const frame_count_observer_;
209*d9f75844SAndroid Build Coastguard Worker 
210*d9f75844SAndroid Build Coastguard Worker   // Effectively const map from SSRC to RtpRtcp, for all media SSRCs.
211*d9f75844SAndroid Build Coastguard Worker   // This map is set at construction time and never changed, but it's
212*d9f75844SAndroid Build Coastguard Worker   // non-trivial to make it properly const.
213*d9f75844SAndroid Build Coastguard Worker   std::map<uint32_t, RtpRtcpInterface*> ssrc_to_rtp_module_;
214*d9f75844SAndroid Build Coastguard Worker };
215*d9f75844SAndroid Build Coastguard Worker 
216*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
217*d9f75844SAndroid Build Coastguard Worker 
218*d9f75844SAndroid Build Coastguard Worker #endif  // CALL_RTP_VIDEO_SENDER_H_
219