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