• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 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 WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
13 
14 #include <map>
15 #include <sstream>
16 #include <string>
17 
18 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
19 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
20 #include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h"
21 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
23 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
24 #include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h"
25 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
26 #include "webrtc/typedefs.h"
27 
28 namespace webrtc {
29 
30 class ModuleRtpRtcpImpl;
31 class RTCPReceiver;
32 
33 class NACKStringBuilder
34 {
35 public:
36     NACKStringBuilder();
37     ~NACKStringBuilder();
38 
39     void PushNACK(uint16_t nack);
40     std::string GetResult();
41 
42 private:
43     std::ostringstream _stream;
44     int _count;
45     uint16_t _prevNack;
46     bool _consecutive;
47 };
48 
49 class RTCPSender
50 {
51 public:
52  struct FeedbackState {
53    explicit FeedbackState(ModuleRtpRtcpImpl* module);
54    FeedbackState();
55 
56    uint8_t send_payload_type;
57    uint32_t frequency_hz;
58    uint32_t packet_count_sent;
59    uint32_t byte_count_sent;
60    uint32_t send_bitrate;
61 
62    uint32_t last_rr_ntp_secs;
63    uint32_t last_rr_ntp_frac;
64    uint32_t remote_sr;
65 
66    bool has_last_xr_rr;
67    RtcpReceiveTimeInfo last_xr_rr;
68 
69    // Used when generating TMMBR.
70    ModuleRtpRtcpImpl* module;
71  };
72     RTCPSender(const int32_t id, const bool audio,
73                Clock* clock,
74                ReceiveStatistics* receive_statistics);
75     virtual ~RTCPSender();
76 
77     void ChangeUniqueId(const int32_t id);
78 
79     int32_t Init();
80 
81     int32_t RegisterSendTransport(Transport* outgoingTransport);
82 
83     RTCPMethod Status() const;
84     int32_t SetRTCPStatus(const RTCPMethod method);
85 
86     bool Sending() const;
87     int32_t SetSendingStatus(const FeedbackState& feedback_state,
88                              bool enabled);  // combine the functions
89 
90     int32_t SetNackStatus(const bool enable);
91 
92     void SetStartTimestamp(uint32_t start_timestamp);
93 
94     void SetLastRtpTime(uint32_t rtp_timestamp,
95                         int64_t capture_time_ms);
96 
97     void SetSSRC( const uint32_t ssrc);
98 
99     void SetRemoteSSRC(uint32_t ssrc);
100 
101     int32_t SetCameraDelay(const int32_t delayMS);
102 
103     int32_t CNAME(char cName[RTCP_CNAME_SIZE]);
104     int32_t SetCNAME(const char cName[RTCP_CNAME_SIZE]);
105 
106     int32_t AddMixedCNAME(const uint32_t SSRC,
107                           const char cName[RTCP_CNAME_SIZE]);
108 
109     int32_t RemoveMixedCNAME(const uint32_t SSRC);
110 
111     uint32_t SendTimeOfSendReport(const uint32_t sendReport);
112 
113     bool SendTimeOfXrRrReport(uint32_t mid_ntp, int64_t* time_ms) const;
114 
115     bool TimeToSendRTCPReport(const bool sendKeyframeBeforeRTP = false) const;
116 
117     uint32_t LastSendReport(uint32_t& lastRTCPTime);
118 
119     int32_t SendRTCP(
120         const FeedbackState& feedback_state,
121         uint32_t rtcpPacketTypeFlags,
122         int32_t nackSize = 0,
123         const uint16_t* nackList = 0,
124         bool repeat = false,
125         uint64_t pictureID = 0);
126 
127     int32_t AddExternalReportBlock(
128             uint32_t SSRC,
129             const RTCPReportBlock* receiveBlock);
130 
131     int32_t RemoveExternalReportBlock(uint32_t SSRC);
132 
133     /*
134     *  REMB
135     */
136     bool REMB() const;
137 
138     int32_t SetREMBStatus(const bool enable);
139 
140     int32_t SetREMBData(const uint32_t bitrate,
141                         const uint8_t numberOfSSRC,
142                         const uint32_t* SSRC);
143 
144     /*
145     *   TMMBR
146     */
147     bool TMMBR() const;
148 
149     int32_t SetTMMBRStatus(const bool enable);
150 
151     int32_t SetTMMBN(const TMMBRSet* boundingSet,
152                      const uint32_t maxBitrateKbit);
153 
154     /*
155     *   Extended jitter report
156     */
157     bool IJ() const;
158 
159     int32_t SetIJStatus(const bool enable);
160 
161     /*
162     *
163     */
164 
165     int32_t SetApplicationSpecificData(const uint8_t subType,
166                                        const uint32_t name,
167                                        const uint8_t* data,
168                                        const uint16_t length);
169 
170     int32_t SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric);
171 
172     void SendRtcpXrReceiverReferenceTime(bool enable);
173 
174     bool RtcpXrReceiverReferenceTime() const;
175 
176     int32_t SetCSRCs(const uint32_t arrOfCSRC[kRtpCsrcSize],
177                      const uint8_t arrLength);
178 
179     int32_t SetCSRCStatus(const bool include);
180 
181     void SetTargetBitrate(unsigned int target_bitrate);
182 
183     void GetPacketTypeCounter(RtcpPacketTypeCounter* packet_counter) const;
184 
185 private:
186     int32_t SendToNetwork(const uint8_t* dataBuffer, const uint16_t length);
187 
188     void UpdatePacketRate();
189 
190     int32_t WriteAllReportBlocksToBuffer(uint8_t* rtcpbuffer,
191                             int pos,
192                             uint8_t& numberOfReportBlocks,
193                             const uint32_t NTPsec,
194                             const uint32_t NTPfrac);
195 
196     int32_t WriteReportBlocksToBuffer(
197         uint8_t* rtcpbuffer,
198         int32_t position,
199         const std::map<uint32_t, RTCPReportBlock*>& report_blocks);
200 
201     int32_t AddReportBlock(
202         uint32_t SSRC,
203         std::map<uint32_t, RTCPReportBlock*>* report_blocks,
204         const RTCPReportBlock* receiveBlock);
205 
206     bool PrepareReport(const FeedbackState& feedback_state,
207                        StreamStatistician* statistician,
208                        RTCPReportBlock* report_block,
209                        uint32_t* ntp_secs, uint32_t* ntp_frac);
210 
211     int32_t BuildSR(const FeedbackState& feedback_state,
212                     uint8_t* rtcpbuffer,
213                     int& pos,
214                     uint32_t NTPsec,
215                     uint32_t NTPfrac);
216 
217     int32_t BuildRR(uint8_t* rtcpbuffer,
218                     int& pos,
219                     const uint32_t NTPsec,
220                     const uint32_t NTPfrac);
221 
222     int PrepareRTCP(
223         const FeedbackState& feedback_state,
224         uint32_t packetTypeFlags,
225         int32_t nackSize,
226         const uint16_t* nackList,
227         bool repeat,
228         uint64_t pictureID,
229         uint8_t* rtcp_buffer,
230         int buffer_size);
231 
232     bool ShouldSendReportBlocks(uint32_t rtcp_packet_type) const;
233 
234     int32_t BuildExtendedJitterReport(
235         uint8_t* rtcpbuffer,
236         int& pos,
237         const uint32_t jitterTransmissionTimeOffset);
238 
239     int32_t BuildSDEC(uint8_t* rtcpbuffer, int& pos);
240     int32_t BuildPLI(uint8_t* rtcpbuffer, int& pos);
241     int32_t BuildREMB(uint8_t* rtcpbuffer, int& pos);
242     int32_t BuildTMMBR(ModuleRtpRtcpImpl* module,
243                        uint8_t* rtcpbuffer,
244                        int& pos);
245     int32_t BuildTMMBN(uint8_t* rtcpbuffer, int& pos);
246     int32_t BuildAPP(uint8_t* rtcpbuffer, int& pos);
247     int32_t BuildVoIPMetric(uint8_t* rtcpbuffer, int& pos);
248     int32_t BuildBYE(uint8_t* rtcpbuffer, int& pos);
249     int32_t BuildFIR(uint8_t* rtcpbuffer, int& pos, bool repeat);
250     int32_t BuildSLI(uint8_t* rtcpbuffer,
251                      int& pos,
252                      const uint8_t pictureID);
253     int32_t BuildRPSI(uint8_t* rtcpbuffer,
254                       int& pos,
255                       const uint64_t pictureID,
256                       const uint8_t payloadType);
257 
258     int32_t BuildNACK(uint8_t* rtcpbuffer,
259                       int& pos,
260                       const int32_t nackSize,
261                       const uint16_t* nackList,
262                           std::string* nackString);
263 
264     int32_t BuildReceiverReferenceTime(uint8_t* buffer,
265                                        int& pos,
266                                        uint32_t ntp_sec,
267                                        uint32_t ntp_frac);
268     int32_t BuildDlrr(uint8_t* buffer,
269                       int& pos,
270                       const RtcpReceiveTimeInfo& info);
271 
272 private:
273     int32_t            _id;
274     const bool               _audio;
275     Clock*                   _clock;
276     RTCPMethod               _method;
277 
278     CriticalSectionWrapper* _criticalSectionTransport;
279     Transport*              _cbTransport;
280 
281     CriticalSectionWrapper* _criticalSectionRTCPSender;
282     bool                    _usingNack;
283     bool                    _sending;
284     bool                    _sendTMMBN;
285     bool                    _REMB;
286     bool                    _sendREMB;
287     bool                    _TMMBR;
288     bool                    _IJ;
289 
290     int64_t        _nextTimeToSendRTCP;
291 
292     uint32_t start_timestamp_;
293     uint32_t last_rtp_timestamp_;
294     int64_t last_frame_capture_time_ms_;
295     uint32_t _SSRC;
296     uint32_t _remoteSSRC;  // SSRC that we receive on our RTP channel
297     char _CNAME[RTCP_CNAME_SIZE];
298 
299 
300     ReceiveStatistics* receive_statistics_;
301     std::map<uint32_t, RTCPReportBlock*> internal_report_blocks_;
302     std::map<uint32_t, RTCPReportBlock*> external_report_blocks_;
303     std::map<uint32_t, RTCPUtility::RTCPCnameInformation*> _csrcCNAMEs;
304 
305     int32_t         _cameraDelayMS;
306 
307     // Sent
308     uint32_t        _lastSendReport[RTCP_NUMBER_OF_SR];  // allow packet loss and RTT above 1 sec
309     uint32_t        _lastRTCPTime[RTCP_NUMBER_OF_SR];
310 
311     // Sent XR receiver reference time report.
312     // <mid ntp (mid 32 bits of the 64 bits NTP timestamp), send time in ms>.
313     std::map<uint32_t, int64_t> last_xr_rr_;
314 
315     // send CSRCs
316     uint8_t         _CSRCs;
317     uint32_t        _CSRC[kRtpCsrcSize];
318     bool                _includeCSRCs;
319 
320     // Full intra request
321     uint8_t         _sequenceNumberFIR;
322 
323     // REMB
324     uint8_t       _lengthRembSSRC;
325     uint8_t       _sizeRembSSRC;
326     uint32_t*     _rembSSRC;
327     uint32_t      _rembBitrate;
328 
329     TMMBRHelp           _tmmbrHelp;
330     uint32_t      _tmmbr_Send;
331     uint32_t      _packetOH_Send;
332 
333     // APP
334     bool                 _appSend;
335     uint8_t        _appSubType;
336     uint32_t       _appName;
337     uint8_t*       _appData;
338     uint16_t       _appLength;
339 
340     // True if sending of XR Receiver reference time report is enabled.
341     bool xrSendReceiverReferenceTimeEnabled_;
342 
343     // XR VoIP metric
344     bool                _xrSendVoIPMetric;
345     RTCPVoIPMetric      _xrVoIPMetric;
346 
347     RtcpPacketTypeCounter packet_type_counter_;
348 };
349 }  // namespace webrtc
350 
351 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
352