/* * 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/types/optional.h" #include "api/array_view.h" #include "api/call/transport.h" #include "api/video/video_content_type.h" #include "common_types.h" // NOLINT(build/include) #include "modules/rtp_rtcp/include/flexfec_sender.h" #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "modules/rtp_rtcp/source/playout_delay_oracle.h" #include "modules/rtp_rtcp/source/rtp_packet_history.h" #include "modules/rtp_rtcp/source/rtp_rtcp_config.h" #include "modules/rtp_rtcp/source/rtp_utility.h" #include "rtc_base/constructormagic.h" #include "rtc_base/criticalsection.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 OverheadObserver; class RateLimiter; class RtcEventLog; class RtpPacketToSend; class RTPSenderAudio; class RTPSenderVideo; class RTPSender { public: RTPSender(bool audio, Clock* clock, Transport* transport, RtpPacketSender* paced_sender, // TODO(brandtr): Remove |flexfec_sender| when that is hooked up // to PacedSender instead. FlexfecSender* flexfec_sender, TransportSequenceNumberAllocator* sequence_number_allocator, TransportFeedbackObserver* transport_feedback_callback, BitrateStatisticsObserver* bitrate_callback, FrameCountObserver* frame_count_observer, SendSideDelayObserver* send_side_delay_observer, RtcEventLog* event_log, SendPacketObserver* send_packet_observer, RateLimiter* nack_rate_limiter, OverheadObserver* overhead_observer, bool populate_network2_timestamp); ~RTPSender(); void ProcessBitrate(); uint16_t ActualSendBitrateKbit() const; uint32_t VideoBitrateSent() const; uint32_t FecOverheadRate() const; uint32_t NackOverheadRate() const; int32_t RegisterPayload(const char* payload_name, const int8_t payload_type, const uint32_t frequency, const size_t channels, const uint32_t rate); int32_t DeRegisterSendPayload(const int8_t payload_type); void SetSendingMediaStatus(bool enabled); bool SendingMedia() const; void GetDataCounters(StreamDataCounters* rtp_stats, StreamDataCounters* rtx_stats) const; uint32_t TimestampOffset() const; void SetTimestampOffset(uint32_t timestamp); void SetSSRC(uint32_t ssrc); 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); bool SendOutgoingData(FrameType frame_type, int8_t payload_type, uint32_t timestamp, int64_t capture_time_ms, const uint8_t* payload_data, size_t payload_size, const RTPFragmentationHeader* fragmentation, const RTPVideoHeader* rtp_header, uint32_t* transport_frame_id_out, int64_t expected_retransmission_time_ms); // RTP header extension int32_t RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id); bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) const; int32_t DeregisterRtpHeaderExtension(RTPExtensionType type); bool TimeToSendPacket(uint32_t ssrc, uint16_t sequence_number, int64_t capture_time_ms, bool retransmission, const PacedPacketInfo& pacing_info); size_t TimeToSendPadding(size_t bytes, const PacedPacketInfo& pacing_info); // NACK. int SelectiveRetransmissions() const; int SetSelectiveRetransmissions(uint8_t settings); void OnReceivedNack(const std::vector& nack_sequence_numbers, int64_t avg_rtt); void SetStorePacketsStatus(bool enable, uint16_t number_to_store); bool StorePackets() const; int32_t ReSendPacket(uint16_t packet_id); // Feedback to decide when to stop sending the playout delay and MID header // extensions. void OnReceivedRtcpReportBlocks(const ReportBlockList& report_blocks); // RTX. void SetRtxStatus(int mode); int RtxStatus() const; uint32_t RtxSsrc() const; void SetRtxSsrc(uint32_t 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; absl::optional FlexfecSsrc() const; bool SendToNetwork(std::unique_ptr packet, StorageType storage, RtpPacketSender::Priority priority); // Audio. // Send a DTMF tone using RFC 2833 (4733). int32_t SendTelephoneEvent(uint8_t key, uint16_t time_ms, uint8_t level); // Store the audio level in d_bov for // header-extension-for-audio-level-indication. int32_t SetAudioLevel(uint8_t level_d_bov); uint32_t MaxConfiguredBitrateVideo() const; // ULPFEC. void SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type); bool SetFecParameters(const FecProtectionParams& delta_params, const FecProtectionParams& key_params); // Called on update of RTP statistics. void RegisterRtpStatisticsCallback(StreamDataCountersCallback* callback); StreamDataCountersCallback* GetRtpStatisticsCallback() const; uint32_t BitrateSent() const; void SetRtpState(const RtpState& rtp_state); RtpState GetRtpState() const; void SetRtxRtpState(const RtpState& rtp_state); RtpState GetRtxRtpState() const; int64_t LastTimestampTimeMs() const; void SendKeepAlive(uint8_t payload_type); void SetRtt(int64_t rtt_ms); protected: int32_t CheckPayloadType(int8_t payload_type, VideoCodecType* video_type); private: // Maps capture time in milliseconds to send-side delay in milliseconds. // Send-side delay is the difference between transmission time and capture // time. typedef std::map SendDelayMap; size_t SendPadData(size_t bytes, const PacedPacketInfo& pacing_info); bool PrepareAndSendPacket(std::unique_ptr packet, bool send_over_rtx, bool is_retransmit, const PacedPacketInfo& pacing_info); // Return the number of bytes sent. Note that both of these functions may // return a larger value that their argument. size_t TrySendRedundantPayloads(size_t bytes, const PacedPacketInfo& pacing_info); std::unique_ptr BuildRtxPacket( const RtpPacketToSend& packet); bool SendPacketToNetwork(const RtpPacketToSend& packet, const PacketOptions& options, const PacedPacketInfo& pacing_info); void UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms); void UpdateOnSendPacket(int packet_id, int64_t capture_time_ms, uint32_t ssrc); bool UpdateTransportSequenceNumber(RtpPacketToSend* packet, int* packet_id) const; void UpdateRtpStats(const RtpPacketToSend& packet, bool is_rtx, bool is_retransmit); bool IsFecPacket(const RtpPacketToSend& packet) const; void AddPacketToTransportFeedback(uint16_t packet_id, const RtpPacketToSend& packet, const PacedPacketInfo& pacing_info); void UpdateRtpOverhead(const RtpPacketToSend& packet); Clock* const clock_; const int64_t clock_delta_ms_; Random random_ RTC_GUARDED_BY(send_critsect_); const bool audio_configured_; const std::unique_ptr audio_; const std::unique_ptr video_; RtpPacketSender* const paced_sender_; TransportSequenceNumberAllocator* const transport_sequence_number_allocator_; TransportFeedbackObserver* const transport_feedback_observer_; int64_t last_capture_time_ms_sent_; rtc::CriticalSection send_critsect_; Transport* transport_; bool sending_media_ RTC_GUARDED_BY(send_critsect_); size_t max_packet_size_; int8_t last_payload_type_ RTC_GUARDED_BY(send_critsect_); std::map payload_type_map_; RtpHeaderExtensionMap rtp_header_extension_map_ RTC_GUARDED_BY(send_critsect_); // Tracks the current request for playout delay limits from application // and decides whether the current RTP frame should include the playout // delay extension on header. PlayoutDelayOracle playout_delay_oracle_; RtpPacketHistory packet_history_; // TODO(brandtr): Remove |flexfec_packet_history_| when the FlexfecSender // is hooked up to the PacedSender. RtpPacketHistory flexfec_packet_history_; // Statistics rtc::CriticalSection statistics_crit_; SendDelayMap send_delays_ RTC_GUARDED_BY(statistics_crit_); FrameCounts frame_counts_ RTC_GUARDED_BY(statistics_crit_); StreamDataCounters rtp_stats_ RTC_GUARDED_BY(statistics_crit_); StreamDataCounters rtx_rtp_stats_ RTC_GUARDED_BY(statistics_crit_); StreamDataCountersCallback* rtp_stats_callback_ RTC_GUARDED_BY(statistics_crit_); RateStatistics total_bitrate_sent_ RTC_GUARDED_BY(statistics_crit_); RateStatistics nack_bitrate_sent_ RTC_GUARDED_BY(statistics_crit_); FrameCountObserver* const frame_count_observer_; SendSideDelayObserver* const send_side_delay_observer_; RtcEventLog* const event_log_; SendPacketObserver* const send_packet_observer_; BitrateStatisticsObserver* const bitrate_callback_; // RTP variables uint32_t timestamp_offset_ RTC_GUARDED_BY(send_critsect_); uint32_t remote_ssrc_ 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_); // Must be explicitly set by the application, use of absl::optional // only to keep track of correct use. absl::optional ssrc_ RTC_GUARDED_BY(send_critsect_); // MID value to send in the MID header extension. std::string mid_ 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 media_has_been_sent_ 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_); absl::optional ssrc_rtx_ RTC_GUARDED_BY(send_critsect_); // Mapping rtx_payload_type_map_[associated] = rtx. std::map rtx_payload_type_map_ RTC_GUARDED_BY(send_critsect_); size_t rtp_overhead_bytes_per_packet_ RTC_GUARDED_BY(send_critsect_); RateLimiter* const retransmission_rate_limiter_; OverheadObserver* overhead_observer_; const bool populate_network2_timestamp_; const bool send_side_bwe_with_overhead_; const bool unlimited_retransmission_experiment_; absl::optional video_content_type_ RTC_GUARDED_BY(send_critsect_); RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RTPSender); }; } // namespace webrtc #endif // MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_