| /* | 
 |  *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef CALL_RTP_TRANSPORT_CONTROLLER_SEND_H_ | 
 | #define CALL_RTP_TRANSPORT_CONTROLLER_SEND_H_ | 
 |  | 
 | #include <cstddef> | 
 | #include <cstdint> | 
 | #include <map> | 
 | #include <memory> | 
 | #include <optional> | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "absl/strings/string_view.h" | 
 | #include "api/array_view.h" | 
 | #include "api/environment/environment.h" | 
 | #include "api/fec_controller.h" | 
 | #include "api/frame_transformer_interface.h" | 
 | #include "api/scoped_refptr.h" | 
 | #include "api/sequence_checker.h" | 
 | #include "api/task_queue/pending_task_safety_flag.h" | 
 | #include "api/task_queue/task_queue_base.h" | 
 | #include "api/transport/bandwidth_estimation_settings.h" | 
 | #include "api/transport/bitrate_settings.h" | 
 | #include "api/transport/network_control.h" | 
 | #include "api/transport/network_types.h" | 
 | #include "api/units/data_rate.h" | 
 | #include "api/units/data_size.h" | 
 | #include "api/units/time_delta.h" | 
 | #include "api/units/timestamp.h" | 
 | #include "call/rtp_bitrate_configurator.h" | 
 | #include "call/rtp_config.h" | 
 | #include "call/rtp_transport_config.h" | 
 | #include "call/rtp_transport_controller_send_interface.h" | 
 | #include "call/rtp_video_sender.h" | 
 | #include "modules/congestion_controller/rtp/control_handler.h" | 
 | #include "modules/congestion_controller/rtp/transport_feedback_adapter.h" | 
 | #include "modules/congestion_controller/rtp/transport_feedback_demuxer.h" | 
 | #include "modules/pacing/packet_router.h" | 
 | #include "modules/pacing/task_queue_paced_sender.h" | 
 | #include "modules/rtp_rtcp/include/report_block_data.h" | 
 | #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 
 | #include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h" | 
 | #include "rtc_base/experiments/field_trial_parser.h" | 
 | #include "rtc_base/network_route.h" | 
 | #include "rtc_base/rate_limiter.h" | 
 | #include "rtc_base/task_utils/repeating_task.h" | 
 | #include "rtc_base/thread_annotations.h" | 
 |  | 
 | namespace webrtc { | 
 | class FrameEncryptorInterface; | 
 |  | 
 | class RtpTransportControllerSend final | 
 |     : public RtpTransportControllerSendInterface, | 
 |       public NetworkLinkRtcpObserver, | 
 |       public NetworkStateEstimateObserver { | 
 |  public: | 
 |   explicit RtpTransportControllerSend(const RtpTransportConfig& config); | 
 |   ~RtpTransportControllerSend() override; | 
 |  | 
 |   RtpTransportControllerSend(const RtpTransportControllerSend&) = delete; | 
 |   RtpTransportControllerSend& operator=(const RtpTransportControllerSend&) = | 
 |       delete; | 
 |  | 
 |   // TODO(tommi): Change to std::unique_ptr<>. | 
 |   RtpVideoSenderInterface* CreateRtpVideoSender( | 
 |       const std::map<uint32_t, RtpState>& suspended_ssrcs, | 
 |       const std::map<uint32_t, RtpPayloadState>& | 
 |           states,  // move states into RtpTransportControllerSend | 
 |       const RtpConfig& rtp_config, | 
 |       int rtcp_report_interval_ms, | 
 |       Transport* send_transport, | 
 |       const RtpSenderObservers& observers, | 
 |       std::unique_ptr<FecController> fec_controller, | 
 |       const RtpSenderFrameEncryptionConfig& frame_encryption_config, | 
 |       scoped_refptr<FrameTransformerInterface> frame_transformer) override; | 
 |   void DestroyRtpVideoSender( | 
 |       RtpVideoSenderInterface* rtp_video_sender) override; | 
 |  | 
 |   // Implements RtpTransportControllerSendInterface | 
 |   void RegisterSendingRtpStream(RtpRtcpInterface& rtp_module) override; | 
 |   void DeRegisterSendingRtpStream(RtpRtcpInterface& rtp_module) override; | 
 |   PacketRouter* packet_router() override; | 
 |  | 
 |   NetworkStateEstimateObserver* network_state_estimate_observer() override; | 
 |   RtpPacketSender* packet_sender() override; | 
 |  | 
 |   void SetAllocatedSendBitrateLimits(BitrateAllocationLimits limits) override; | 
 |   void ReconfigureBandwidthEstimation( | 
 |       const BandwidthEstimationSettings& settings) override; | 
 |  | 
 |   void SetPacingFactor(float pacing_factor) override; | 
 |   void SetQueueTimeLimit(int limit_ms) override; | 
 |   StreamFeedbackProvider* GetStreamFeedbackProvider() override; | 
 |   void RegisterTargetTransferRateObserver( | 
 |       TargetTransferRateObserver* observer) override; | 
 |   void OnNetworkRouteChanged(absl::string_view transport_name, | 
 |                              const NetworkRoute& network_route) override; | 
 |   void OnNetworkAvailability(bool network_available) override; | 
 |   NetworkLinkRtcpObserver* GetRtcpObserver() override; | 
 |   int64_t GetPacerQueuingDelayMs() const override; | 
 |   std::optional<Timestamp> GetFirstPacketTime() const override; | 
 |   void EnablePeriodicAlrProbing(bool enable) override; | 
 |   void OnSentPacket(const SentPacketInfo& sent_packet) override; | 
 |   void OnReceivedPacket(const ReceivedPacket& packet_msg) override; | 
 |  | 
 |   void SetSdpBitrateParameters(const BitrateConstraints& constraints) override; | 
 |   void SetClientBitratePreferences(const BitrateSettings& preferences) override; | 
 |  | 
 |   void OnTransportOverheadChanged( | 
 |       size_t transport_overhead_bytes_per_packet) override; | 
 |  | 
 |   void AccountForAudioPacketsInPacedSender(bool account_for_audio) override; | 
 |   void IncludeOverheadInPacedSender() override; | 
 |   void EnsureStarted() override; | 
 |  | 
 |   // Implements NetworkLinkRtcpObserver interface | 
 |   void OnReceiverEstimatedMaxBitrate(Timestamp receive_time, | 
 |                                      DataRate bitrate) override; | 
 |   void OnReport(Timestamp receive_time, | 
 |                 ArrayView<const ReportBlockData> report_blocks) override; | 
 |   void OnRttUpdate(Timestamp receive_time, TimeDelta rtt) override; | 
 |   void OnTransportFeedback(Timestamp receive_time, | 
 |                            const rtcp::TransportFeedback& feedback) override; | 
 |   void OnCongestionControlFeedback( | 
 |       Timestamp receive_time, | 
 |       const rtcp::CongestionControlFeedback& feedback) override; | 
 |  | 
 |   // Implements NetworkStateEstimateObserver interface | 
 |   void OnRemoteNetworkEstimate(NetworkStateEstimate estimate) override; | 
 |  | 
 |   NetworkControllerInterface* GetNetworkController() override { | 
 |     RTC_DCHECK_RUN_ON(&sequence_checker_); | 
 |     return controller_.get(); | 
 |   } | 
 |  | 
 |   // Called once it's known that the remote end supports RFC 8888. | 
 |   void EnableCongestionControlFeedbackAccordingToRfc8888() override; | 
 |  | 
 |   int ReceivedCongestionControlFeedbackCount() const override { | 
 |     RTC_DCHECK_RUN_ON(&sequence_checker_); | 
 |     return feedback_count_; | 
 |   } | 
 |   int ReceivedTransportCcFeedbackCount() const override { | 
 |     RTC_DCHECK_RUN_ON(&sequence_checker_); | 
 |     return transport_cc_feedback_count_; | 
 |   } | 
 |  | 
 |  private: | 
 |   void MaybeCreateControllers() RTC_RUN_ON(sequence_checker_); | 
 |   void HandleTransportPacketsFeedback(const TransportPacketsFeedback& feedback) | 
 |       RTC_RUN_ON(sequence_checker_); | 
 |   void UpdateNetworkAvailability() RTC_RUN_ON(sequence_checker_); | 
 |   void UpdateInitialConstraints(TargetRateConstraints new_contraints) | 
 |       RTC_RUN_ON(sequence_checker_); | 
 |  | 
 |   void StartProcessPeriodicTasks() RTC_RUN_ON(sequence_checker_); | 
 |   void UpdateControllerWithTimeInterval() RTC_RUN_ON(sequence_checker_); | 
 |  | 
 |   std::optional<BitrateConstraints> ApplyOrLiftRelayCap(bool is_relayed); | 
 |   bool IsRelevantRouteChange(const NetworkRoute& old_route, | 
 |                              const NetworkRoute& new_route) const; | 
 |   void UpdateBitrateConstraints(const BitrateConstraints& updated); | 
 |   void UpdateStreamsConfig() RTC_RUN_ON(sequence_checker_); | 
 |   void PostUpdates(NetworkControlUpdate update) RTC_RUN_ON(sequence_checker_); | 
 |   void UpdateControlState() RTC_RUN_ON(sequence_checker_); | 
 |   void UpdateCongestedState() RTC_RUN_ON(sequence_checker_); | 
 |   std::optional<bool> GetCongestedStateUpdate() const | 
 |       RTC_RUN_ON(sequence_checker_); | 
 |  | 
 |   // Called by packet router just before packet is sent to the RTP modules. | 
 |   void NotifyBweOfPacedSentPacket(const RtpPacketToSend& packet, | 
 |                                   const PacedPacketInfo& pacing_info); | 
 |   void ProcessSentPacket(const SentPacketInfo& sent_packet) | 
 |       RTC_RUN_ON(sequence_checker_); | 
 |   void ProcessSentPacketUpdates(NetworkControlUpdate updates) | 
 |       RTC_RUN_ON(sequence_checker_); | 
 |  | 
 |   const Environment env_; | 
 |   SequenceChecker sequence_checker_; | 
 |   TaskQueueBase* task_queue_; | 
 |   PacketRouter packet_router_; | 
 |  | 
 |   std::vector<std::unique_ptr<RtpVideoSenderInterface>> video_rtp_senders_ | 
 |       RTC_GUARDED_BY(&sequence_checker_); | 
 |   RtpBitrateConfigurator bitrate_configurator_; | 
 |   std::map<std::string, NetworkRoute> network_routes_ | 
 |       RTC_GUARDED_BY(sequence_checker_); | 
 |   BandwidthEstimationSettings bwe_settings_ RTC_GUARDED_BY(sequence_checker_); | 
 |   bool pacer_started_ RTC_GUARDED_BY(sequence_checker_); | 
 |   TaskQueuePacedSender pacer_; | 
 |  | 
 |   TargetTransferRateObserver* observer_ RTC_GUARDED_BY(sequence_checker_); | 
 |   TransportFeedbackDemuxer feedback_demuxer_; | 
 |  | 
 |   TransportFeedbackAdapter transport_feedback_adapter_ | 
 |       RTC_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   NetworkControllerFactoryInterface* const controller_factory_override_ | 
 |       RTC_PT_GUARDED_BY(sequence_checker_); | 
 |   const std::unique_ptr<NetworkControllerFactoryInterface> | 
 |       controller_factory_fallback_ RTC_PT_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   std::unique_ptr<CongestionControlHandler> control_handler_ | 
 |       RTC_GUARDED_BY(sequence_checker_) RTC_PT_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   std::unique_ptr<NetworkControllerInterface> controller_ | 
 |       RTC_GUARDED_BY(sequence_checker_) RTC_PT_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   TimeDelta process_interval_ RTC_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   struct LossReport { | 
 |     uint32_t extended_highest_sequence_number = 0; | 
 |     int cumulative_lost = 0; | 
 |   }; | 
 |   std::map<uint32_t, LossReport> last_report_blocks_ | 
 |       RTC_GUARDED_BY(sequence_checker_); | 
 |   Timestamp last_report_block_time_ RTC_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   NetworkControllerConfig initial_config_ RTC_GUARDED_BY(sequence_checker_); | 
 |   StreamsConfig streams_config_ RTC_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   const bool reset_feedback_on_route_change_; | 
 |   const bool add_pacing_to_cwin_; | 
 |   const bool reset_bwe_on_adapter_id_change_; | 
 |  | 
 |   FieldTrialParameter<DataRate> relay_bandwidth_cap_; | 
 |  | 
 |   size_t transport_overhead_bytes_per_packet_ RTC_GUARDED_BY(sequence_checker_); | 
 |   bool network_available_ RTC_GUARDED_BY(sequence_checker_); | 
 |   RepeatingTaskHandle pacer_queue_update_task_ | 
 |       RTC_GUARDED_BY(sequence_checker_); | 
 |   RepeatingTaskHandle controller_task_ RTC_GUARDED_BY(sequence_checker_); | 
 |  | 
 |   DataSize congestion_window_size_ RTC_GUARDED_BY(sequence_checker_); | 
 |   bool is_congested_ RTC_GUARDED_BY(sequence_checker_); | 
 |   bool transport_maybe_support_ecn_ = | 
 |       false;  // True if RFC8888 has been negotiated. | 
 |   bool sending_packets_as_ect1_ = false; | 
 |   // Count of feedback messages received. | 
 |   int feedback_count_ RTC_GUARDED_BY(sequence_checker_) = 0; | 
 |   int transport_cc_feedback_count_ RTC_GUARDED_BY(sequence_checker_) = 0; | 
 |  | 
 |   // Protected by internal locks. | 
 |   RateLimiter retransmission_rate_limiter_; | 
 |  | 
 |   ScopedTaskSafety safety_; | 
 | }; | 
 |  | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // CALL_RTP_TRANSPORT_CONTROLLER_SEND_H_ |