1 /* 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_IMPL_H_ 12 #define MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_IMPL_H_ 13 14 #include <map> 15 #include <memory> 16 #include <string> 17 #include <vector> 18 19 #include "absl/types/optional.h" 20 #include "api/array_view.h" 21 #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h" 22 #include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h" 23 #include "modules/rtp_rtcp/source/rtcp_packet/remb.h" 24 #include "modules/rtp_rtcp/source/rtcp_packet/report_block.h" 25 #include "modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h" 26 #include "modules/rtp_rtcp/source/rtcp_transceiver_config.h" 27 #include "rtc_base/task_utils/repeating_task.h" 28 #include "system_wrappers/include/ntp_time.h" 29 30 namespace webrtc { 31 // 32 // Manage incoming and outgoing rtcp messages for multiple BUNDLED streams. 33 // 34 // This class is not thread-safe. 35 class RtcpTransceiverImpl { 36 public: 37 explicit RtcpTransceiverImpl(const RtcpTransceiverConfig& config); 38 RtcpTransceiverImpl(const RtcpTransceiverImpl&) = delete; 39 RtcpTransceiverImpl& operator=(const RtcpTransceiverImpl&) = delete; 40 ~RtcpTransceiverImpl(); 41 StopPeriodicTask()42 void StopPeriodicTask() { periodic_task_handle_.Stop(); } 43 44 void AddMediaReceiverRtcpObserver(uint32_t remote_ssrc, 45 MediaReceiverRtcpObserver* observer); 46 void RemoveMediaReceiverRtcpObserver(uint32_t remote_ssrc, 47 MediaReceiverRtcpObserver* observer); 48 49 void SetReadyToSend(bool ready); 50 51 void ReceivePacket(rtc::ArrayView<const uint8_t> packet, int64_t now_us); 52 53 void SendCompoundPacket(); 54 55 void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs); 56 void UnsetRemb(); 57 // Temporary helpers to send pre-built TransportFeedback rtcp packet. sender_ssrc()58 uint32_t sender_ssrc() const { return config_.feedback_ssrc; } 59 void SendRawPacket(rtc::ArrayView<const uint8_t> packet); 60 61 void SendNack(uint32_t ssrc, std::vector<uint16_t> sequence_numbers); 62 63 void SendPictureLossIndication(uint32_t ssrc); 64 // If new_request is true then requested sequence no. will increase for each 65 // requested ssrc. 66 void SendFullIntraRequest(rtc::ArrayView<const uint32_t> ssrcs, 67 bool new_request); 68 69 // SendCombinedRtcpPacket ignores rtcp mode and does not send a compound 70 // message. https://tools.ietf.org/html/rfc4585#section-3.1 71 void SendCombinedRtcpPacket( 72 std::vector<std::unique_ptr<rtcp::RtcpPacket>> rtcp_packets); 73 74 private: 75 class PacketSender; 76 struct RemoteSenderState; 77 78 void HandleReceivedPacket(const rtcp::CommonHeader& rtcp_packet_header, 79 int64_t now_us); 80 // Individual rtcp packet handlers. 81 void HandleBye(const rtcp::CommonHeader& rtcp_packet_header); 82 void HandleSenderReport(const rtcp::CommonHeader& rtcp_packet_header, 83 int64_t now_us); 84 void HandleExtendedReports(const rtcp::CommonHeader& rtcp_packet_header, 85 int64_t now_us); 86 // Extended Reports blocks handlers. 87 void HandleDlrr(const rtcp::Dlrr& dlrr, int64_t now_us); 88 void HandleTargetBitrate(const rtcp::TargetBitrate& target_bitrate, 89 uint32_t remote_ssrc); 90 91 void ReschedulePeriodicCompoundPackets(); 92 void SchedulePeriodicCompoundPackets(int64_t delay_ms); 93 // Creates compound RTCP packet, as defined in 94 // https://tools.ietf.org/html/rfc5506#section-2 95 void CreateCompoundPacket(PacketSender* sender); 96 // Sends RTCP packets. 97 void SendPeriodicCompoundPacket(); 98 void SendImmediateFeedback(const rtcp::RtcpPacket& rtcp_packet); 99 // Generate Report Blocks to be send in Sender or Receiver Report. 100 std::vector<rtcp::ReportBlock> CreateReportBlocks(int64_t now_us); 101 102 const RtcpTransceiverConfig config_; 103 104 bool ready_to_send_; 105 absl::optional<rtcp::Remb> remb_; 106 // TODO(danilchap): Remove entries from remote_senders_ that are no longer 107 // needed. 108 std::map<uint32_t, RemoteSenderState> remote_senders_; 109 RepeatingTaskHandle periodic_task_handle_; 110 }; 111 112 } // namespace webrtc 113 114 #endif // MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_IMPL_H_ 115