/* * Copyright (c) 2012 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 MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ #define MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ #include #include #include #include #include #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "api/array_view.h" #include "api/call/transport.h" #include "api/transport/webrtc_key_value_config.h" #include "modules/rtp_rtcp/include/flexfec_sender.h" #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" #include "modules/rtp_rtcp/include/rtp_packet_sender.h" #include "modules/rtp_rtcp/include/rtp_rtcp.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "modules/rtp_rtcp/source/rtp_packet_history.h" #include "modules/rtp_rtcp/source/rtp_rtcp_config.h" #include "rtc_base/constructor_magic.h" #include "rtc_base/critical_section.h" #include "rtc_base/deprecation.h" #include "rtc_base/random.h" #include "rtc_base/rate_statistics.h" #include "rtc_base/thread_annotations.h" namespace webrtc { class FrameEncryptorInterface; class OverheadObserver; class RateLimiter; class RtcEventLog; class RtpPacketToSend; class RTPSender { public: RTPSender(const RtpRtcp::Configuration& config, RtpPacketHistory* packet_history, RtpPacketSender* packet_sender); ~RTPSender(); void SetSendingMediaStatus(bool enabled); bool SendingMedia() const; uint32_t TimestampOffset() const; void SetTimestampOffset(uint32_t timestamp); void SetRid(const std::string& rid); void SetMid(const std::string& mid); uint16_t SequenceNumber() const; void SetSequenceNumber(uint16_t seq); void SetCsrcs(const std::vector& csrcs); void SetMaxRtpPacketSize(size_t max_packet_size); void SetExtmapAllowMixed(bool extmap_allow_mixed); // RTP header extension int32_t RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id); bool RegisterRtpHeaderExtension(absl::string_view uri, int id); bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) const; int32_t DeregisterRtpHeaderExtension(RTPExtensionType type); void DeregisterRtpHeaderExtension(absl::string_view uri); bool SupportsPadding() const; bool SupportsRtxPayloadPadding() const; std::vector> GeneratePadding( size_t target_size_bytes, bool media_has_been_sent); // NACK. void OnReceivedNack(const std::vector& nack_sequence_numbers, int64_t avg_rtt); int32_t ReSendPacket(uint16_t packet_id); // ACK. void OnReceivedAckOnSsrc(int64_t extended_highest_sequence_number); void OnReceivedAckOnRtxSsrc(int64_t extended_highest_sequence_number); // RTX. void SetRtxStatus(int mode); int RtxStatus() const; absl::optional RtxSsrc() const { return rtx_ssrc_; } void SetRtxPayloadType(int payload_type, int associated_payload_type); // Size info for header extensions used by FEC packets. static rtc::ArrayView FecExtensionSizes(); // Size info for header extensions used by video packets. static rtc::ArrayView VideoExtensionSizes(); // Create empty packet, fills ssrc, csrcs and reserve place for header // extensions RtpSender updates before sending. std::unique_ptr AllocatePacket() const; // Allocate sequence number for provided packet. // Save packet's fields to generate padding that doesn't break media stream. // Return false if sending was turned off. bool AssignSequenceNumber(RtpPacketToSend* packet); // Used for padding and FEC packets only. size_t RtpHeaderLength() const; uint16_t AllocateSequenceNumber(uint16_t packets_to_send); // Including RTP headers. size_t MaxRtpPacketSize() const; uint32_t SSRC() const { return ssrc_; } absl::optional FlexfecSsrc() const { return flexfec_ssrc_; } // Sends packet to |transport_| or to the pacer, depending on configuration. // TODO(bugs.webrtc.org/XXX): Remove in favor of EnqueuePackets(). bool SendToNetwork(std::unique_ptr packet); // Pass a set of packets to RtpPacketSender instance, for paced or immediate // sending to the network. void EnqueuePackets(std::vector> packets); void SetRtpState(const RtpState& rtp_state); RtpState GetRtpState() const; void SetRtxRtpState(const RtpState& rtp_state); RtpState GetRtxRtpState() const; int64_t LastTimestampTimeMs() const; private: std::unique_ptr BuildRtxPacket( const RtpPacketToSend& packet); bool IsFecPacket(const RtpPacketToSend& packet) const; Clock* const clock_; Random random_ RTC_GUARDED_BY(send_critsect_); const bool audio_configured_; const uint32_t ssrc_; const absl::optional rtx_ssrc_; const absl::optional flexfec_ssrc_; RtpPacketHistory* const packet_history_; RtpPacketSender* const paced_sender_; rtc::CriticalSection send_critsect_; bool sending_media_ RTC_GUARDED_BY(send_critsect_); size_t max_packet_size_; int8_t last_payload_type_ RTC_GUARDED_BY(send_critsect_); RtpHeaderExtensionMap rtp_header_extension_map_ RTC_GUARDED_BY(send_critsect_); // RTP variables uint32_t timestamp_offset_ RTC_GUARDED_BY(send_critsect_); bool sequence_number_forced_ RTC_GUARDED_BY(send_critsect_); uint16_t sequence_number_ RTC_GUARDED_BY(send_critsect_); uint16_t sequence_number_rtx_ RTC_GUARDED_BY(send_critsect_); // RID value to send in the RID or RepairedRID header extension. std::string rid_ RTC_GUARDED_BY(send_critsect_); // MID value to send in the MID header extension. std::string mid_ RTC_GUARDED_BY(send_critsect_); // Track if any ACK has been received on the SSRC and RTX SSRC to indicate // when to stop sending the MID and RID header extensions. bool ssrc_has_acked_ RTC_GUARDED_BY(send_critsect_); bool rtx_ssrc_has_acked_ RTC_GUARDED_BY(send_critsect_); uint32_t last_rtp_timestamp_ RTC_GUARDED_BY(send_critsect_); int64_t capture_time_ms_ RTC_GUARDED_BY(send_critsect_); int64_t last_timestamp_time_ms_ RTC_GUARDED_BY(send_critsect_); bool last_packet_marker_bit_ RTC_GUARDED_BY(send_critsect_); std::vector csrcs_ RTC_GUARDED_BY(send_critsect_); int rtx_ RTC_GUARDED_BY(send_critsect_); // Mapping rtx_payload_type_map_[associated] = rtx. std::map rtx_payload_type_map_ RTC_GUARDED_BY(send_critsect_); bool supports_bwe_extension_ RTC_GUARDED_BY(send_critsect_); RateLimiter* const retransmission_rate_limiter_; RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RTPSender); }; } // namespace webrtc #endif // MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_