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