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 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" 12 13 #include <assert.h> // assert 14 #include <stdlib.h> // rand 15 #include <string.h> // memcpy 16 17 #include <algorithm> // min 18 19 #include "webrtc/common_types.h" 20 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" 21 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 22 #include "webrtc/system_wrappers/interface/logging.h" 23 #include "webrtc/system_wrappers/interface/trace_event.h" 24 25 namespace webrtc { 26 27 using RTCPUtility::RTCPCnameInformation; 28 29 NACKStringBuilder::NACKStringBuilder() : 30 _stream(""), _count(0), _consecutive(false) 31 { 32 // Empty. 33 } 34 35 NACKStringBuilder::~NACKStringBuilder() {} 36 37 void NACKStringBuilder::PushNACK(uint16_t nack) 38 { 39 if (_count == 0) 40 { 41 _stream << nack; 42 } else if (nack == _prevNack + 1) 43 { 44 _consecutive = true; 45 } else 46 { 47 if (_consecutive) 48 { 49 _stream << "-" << _prevNack; 50 _consecutive = false; 51 } 52 _stream << "," << nack; 53 } 54 _count++; 55 _prevNack = nack; 56 } 57 58 std::string NACKStringBuilder::GetResult() 59 { 60 if (_consecutive) 61 { 62 _stream << "-" << _prevNack; 63 _consecutive = false; 64 } 65 return _stream.str(); 66 } 67 68 RTCPSender::FeedbackState::FeedbackState() 69 : send_payload_type(0), 70 frequency_hz(0), 71 packets_sent(0), 72 media_bytes_sent(0), 73 send_bitrate(0), 74 last_rr_ntp_secs(0), 75 last_rr_ntp_frac(0), 76 remote_sr(0), 77 has_last_xr_rr(false) {} 78 79 RTCPSender::RTCPSender(const int32_t id, 80 const bool audio, 81 Clock* clock, 82 ReceiveStatistics* receive_statistics) : 83 _id(id), 84 _audio(audio), 85 _clock(clock), 86 _method(kRtcpOff), 87 _criticalSectionTransport(CriticalSectionWrapper::CreateCriticalSection()), 88 _cbTransport(NULL), 89 90 _criticalSectionRTCPSender(CriticalSectionWrapper::CreateCriticalSection()), 91 _usingNack(false), 92 _sending(false), 93 _sendTMMBN(false), 94 _REMB(false), 95 _sendREMB(false), 96 _TMMBR(false), 97 _IJ(false), 98 _nextTimeToSendRTCP(0), 99 start_timestamp_(0), 100 last_rtp_timestamp_(0), 101 last_frame_capture_time_ms_(-1), 102 _SSRC(0), 103 _remoteSSRC(0), 104 _CNAME(), 105 receive_statistics_(receive_statistics), 106 internal_report_blocks_(), 107 external_report_blocks_(), 108 _csrcCNAMEs(), 109 110 _cameraDelayMS(0), 111 112 _lastSendReport(), 113 _lastRTCPTime(), 114 115 last_xr_rr_(), 116 117 _CSRCs(0), 118 _CSRC(), 119 _includeCSRCs(true), 120 121 _sequenceNumberFIR(0), 122 123 _lengthRembSSRC(0), 124 _sizeRembSSRC(0), 125 _rembSSRC(NULL), 126 _rembBitrate(0), 127 128 _tmmbrHelp(), 129 _tmmbr_Send(0), 130 _packetOH_Send(0), 131 132 _appSend(false), 133 _appSubType(0), 134 _appName(), 135 _appData(NULL), 136 _appLength(0), 137 138 xrSendReceiverReferenceTimeEnabled_(false), 139 _xrSendVoIPMetric(false), 140 _xrVoIPMetric() 141 { 142 memset(_CNAME, 0, sizeof(_CNAME)); 143 memset(_lastSendReport, 0, sizeof(_lastSendReport)); 144 memset(_lastRTCPTime, 0, sizeof(_lastRTCPTime)); 145 } 146 147 RTCPSender::~RTCPSender() { 148 delete [] _rembSSRC; 149 delete [] _appData; 150 151 while (!internal_report_blocks_.empty()) { 152 delete internal_report_blocks_.begin()->second; 153 internal_report_blocks_.erase(internal_report_blocks_.begin()); 154 } 155 while (!external_report_blocks_.empty()) { 156 std::map<uint32_t, RTCPReportBlock*>::iterator it = 157 external_report_blocks_.begin(); 158 delete it->second; 159 external_report_blocks_.erase(it); 160 } 161 while (!_csrcCNAMEs.empty()) { 162 std::map<uint32_t, RTCPCnameInformation*>::iterator it = 163 _csrcCNAMEs.begin(); 164 delete it->second; 165 _csrcCNAMEs.erase(it); 166 } 167 delete _criticalSectionTransport; 168 delete _criticalSectionRTCPSender; 169 } 170 171 int32_t 172 RTCPSender::RegisterSendTransport(Transport* outgoingTransport) 173 { 174 CriticalSectionScoped lock(_criticalSectionTransport); 175 _cbTransport = outgoingTransport; 176 return 0; 177 } 178 179 RTCPMethod 180 RTCPSender::Status() const 181 { 182 CriticalSectionScoped lock(_criticalSectionRTCPSender); 183 return _method; 184 } 185 186 int32_t 187 RTCPSender::SetRTCPStatus(const RTCPMethod method) 188 { 189 CriticalSectionScoped lock(_criticalSectionRTCPSender); 190 if(method != kRtcpOff) 191 { 192 if(_audio) 193 { 194 _nextTimeToSendRTCP = _clock->TimeInMilliseconds() + 195 (RTCP_INTERVAL_AUDIO_MS/2); 196 } else 197 { 198 _nextTimeToSendRTCP = _clock->TimeInMilliseconds() + 199 (RTCP_INTERVAL_VIDEO_MS/2); 200 } 201 } 202 _method = method; 203 return 0; 204 } 205 206 bool 207 RTCPSender::Sending() const 208 { 209 CriticalSectionScoped lock(_criticalSectionRTCPSender); 210 return _sending; 211 } 212 213 int32_t 214 RTCPSender::SetSendingStatus(const FeedbackState& feedback_state, bool sending) 215 { 216 bool sendRTCPBye = false; 217 { 218 CriticalSectionScoped lock(_criticalSectionRTCPSender); 219 220 if(_method != kRtcpOff) 221 { 222 if(sending == false && _sending == true) 223 { 224 // Trigger RTCP bye 225 sendRTCPBye = true; 226 } 227 } 228 _sending = sending; 229 } 230 if(sendRTCPBye) 231 { 232 return SendRTCP(feedback_state, kRtcpBye); 233 } 234 return 0; 235 } 236 237 bool 238 RTCPSender::REMB() const 239 { 240 CriticalSectionScoped lock(_criticalSectionRTCPSender); 241 return _REMB; 242 } 243 244 int32_t 245 RTCPSender::SetREMBStatus(const bool enable) 246 { 247 CriticalSectionScoped lock(_criticalSectionRTCPSender); 248 _REMB = enable; 249 return 0; 250 } 251 252 int32_t 253 RTCPSender::SetREMBData(const uint32_t bitrate, 254 const uint8_t numberOfSSRC, 255 const uint32_t* SSRC) 256 { 257 CriticalSectionScoped lock(_criticalSectionRTCPSender); 258 _rembBitrate = bitrate; 259 260 if(_sizeRembSSRC < numberOfSSRC) 261 { 262 delete [] _rembSSRC; 263 _rembSSRC = new uint32_t[numberOfSSRC]; 264 _sizeRembSSRC = numberOfSSRC; 265 } 266 267 _lengthRembSSRC = numberOfSSRC; 268 for (int i = 0; i < numberOfSSRC; i++) 269 { 270 _rembSSRC[i] = SSRC[i]; 271 } 272 _sendREMB = true; 273 // Send a REMB immediately if we have a new REMB. The frequency of REMBs is 274 // throttled by the caller. 275 _nextTimeToSendRTCP = _clock->TimeInMilliseconds(); 276 return 0; 277 } 278 279 bool 280 RTCPSender::TMMBR() const 281 { 282 CriticalSectionScoped lock(_criticalSectionRTCPSender); 283 return _TMMBR; 284 } 285 286 int32_t 287 RTCPSender::SetTMMBRStatus(const bool enable) 288 { 289 CriticalSectionScoped lock(_criticalSectionRTCPSender); 290 _TMMBR = enable; 291 return 0; 292 } 293 294 bool 295 RTCPSender::IJ() const 296 { 297 CriticalSectionScoped lock(_criticalSectionRTCPSender); 298 return _IJ; 299 } 300 301 int32_t 302 RTCPSender::SetIJStatus(const bool enable) 303 { 304 CriticalSectionScoped lock(_criticalSectionRTCPSender); 305 _IJ = enable; 306 return 0; 307 } 308 309 void RTCPSender::SetStartTimestamp(uint32_t start_timestamp) { 310 CriticalSectionScoped lock(_criticalSectionRTCPSender); 311 start_timestamp_ = start_timestamp; 312 } 313 314 void RTCPSender::SetLastRtpTime(uint32_t rtp_timestamp, 315 int64_t capture_time_ms) { 316 CriticalSectionScoped lock(_criticalSectionRTCPSender); 317 last_rtp_timestamp_ = rtp_timestamp; 318 if (capture_time_ms < 0) { 319 // We don't currently get a capture time from VoiceEngine. 320 last_frame_capture_time_ms_ = _clock->TimeInMilliseconds(); 321 } else { 322 last_frame_capture_time_ms_ = capture_time_ms; 323 } 324 } 325 326 void 327 RTCPSender::SetSSRC( const uint32_t ssrc) 328 { 329 CriticalSectionScoped lock(_criticalSectionRTCPSender); 330 331 if(_SSRC != 0) 332 { 333 // not first SetSSRC, probably due to a collision 334 // schedule a new RTCP report 335 // make sure that we send a RTP packet 336 _nextTimeToSendRTCP = _clock->TimeInMilliseconds() + 100; 337 } 338 _SSRC = ssrc; 339 } 340 341 void RTCPSender::SetRemoteSSRC(uint32_t ssrc) 342 { 343 CriticalSectionScoped lock(_criticalSectionRTCPSender); 344 _remoteSSRC = ssrc; 345 } 346 347 int32_t 348 RTCPSender::SetCameraDelay(const int32_t delayMS) 349 { 350 CriticalSectionScoped lock(_criticalSectionRTCPSender); 351 if(delayMS > 1000 || delayMS < -1000) 352 { 353 LOG(LS_WARNING) << "Delay can't be larger than 1 second: " 354 << delayMS << " ms"; 355 return -1; 356 } 357 _cameraDelayMS = delayMS; 358 return 0; 359 } 360 361 int32_t RTCPSender::SetCNAME(const char cName[RTCP_CNAME_SIZE]) { 362 if (!cName) 363 return -1; 364 365 CriticalSectionScoped lock(_criticalSectionRTCPSender); 366 _CNAME[RTCP_CNAME_SIZE - 1] = 0; 367 strncpy(_CNAME, cName, RTCP_CNAME_SIZE - 1); 368 return 0; 369 } 370 371 int32_t RTCPSender::AddMixedCNAME(const uint32_t SSRC, 372 const char cName[RTCP_CNAME_SIZE]) { 373 assert(cName); 374 CriticalSectionScoped lock(_criticalSectionRTCPSender); 375 if (_csrcCNAMEs.size() >= kRtpCsrcSize) { 376 return -1; 377 } 378 RTCPCnameInformation* ptr = new RTCPCnameInformation(); 379 ptr->name[RTCP_CNAME_SIZE - 1] = 0; 380 strncpy(ptr->name, cName, RTCP_CNAME_SIZE - 1); 381 _csrcCNAMEs[SSRC] = ptr; 382 return 0; 383 } 384 385 int32_t RTCPSender::RemoveMixedCNAME(const uint32_t SSRC) { 386 CriticalSectionScoped lock(_criticalSectionRTCPSender); 387 std::map<uint32_t, RTCPCnameInformation*>::iterator it = 388 _csrcCNAMEs.find(SSRC); 389 390 if (it == _csrcCNAMEs.end()) { 391 return -1; 392 } 393 delete it->second; 394 _csrcCNAMEs.erase(it); 395 return 0; 396 } 397 398 bool 399 RTCPSender::TimeToSendRTCPReport(const bool sendKeyframeBeforeRTP) const 400 { 401 /* 402 For audio we use a fix 5 sec interval 403 404 For video we use 1 sec interval fo a BW smaller than 360 kbit/s, 405 technicaly we break the max 5% RTCP BW for video below 10 kbit/s but 406 that should be extremely rare 407 408 409 From RFC 3550 410 411 MAX RTCP BW is 5% if the session BW 412 A send report is approximately 65 bytes inc CNAME 413 A receiver report is approximately 28 bytes 414 415 The RECOMMENDED value for the reduced minimum in seconds is 360 416 divided by the session bandwidth in kilobits/second. This minimum 417 is smaller than 5 seconds for bandwidths greater than 72 kb/s. 418 419 If the participant has not yet sent an RTCP packet (the variable 420 initial is true), the constant Tmin is set to 2.5 seconds, else it 421 is set to 5 seconds. 422 423 The interval between RTCP packets is varied randomly over the 424 range [0.5,1.5] times the calculated interval to avoid unintended 425 synchronization of all participants 426 427 if we send 428 If the participant is a sender (we_sent true), the constant C is 429 set to the average RTCP packet size (avg_rtcp_size) divided by 25% 430 of the RTCP bandwidth (rtcp_bw), and the constant n is set to the 431 number of senders. 432 433 if we receive only 434 If we_sent is not true, the constant C is set 435 to the average RTCP packet size divided by 75% of the RTCP 436 bandwidth. The constant n is set to the number of receivers 437 (members - senders). If the number of senders is greater than 438 25%, senders and receivers are treated together. 439 440 reconsideration NOT required for peer-to-peer 441 "timer reconsideration" is 442 employed. This algorithm implements a simple back-off mechanism 443 which causes users to hold back RTCP packet transmission if the 444 group sizes are increasing. 445 446 n = number of members 447 C = avg_size/(rtcpBW/4) 448 449 3. The deterministic calculated interval Td is set to max(Tmin, n*C). 450 451 4. The calculated interval T is set to a number uniformly distributed 452 between 0.5 and 1.5 times the deterministic calculated interval. 453 454 5. The resulting value of T is divided by e-3/2=1.21828 to compensate 455 for the fact that the timer reconsideration algorithm converges to 456 a value of the RTCP bandwidth below the intended average 457 */ 458 459 int64_t now = _clock->TimeInMilliseconds(); 460 461 CriticalSectionScoped lock(_criticalSectionRTCPSender); 462 463 if(_method == kRtcpOff) 464 { 465 return false; 466 } 467 468 if(!_audio && sendKeyframeBeforeRTP) 469 { 470 // for video key-frames we want to send the RTCP before the large key-frame 471 // if we have a 100 ms margin 472 now += RTCP_SEND_BEFORE_KEY_FRAME_MS; 473 } 474 475 if(now >= _nextTimeToSendRTCP) 476 { 477 return true; 478 479 } else if(now < 0x0000ffff && _nextTimeToSendRTCP > 0xffff0000) // 65 sec margin 480 { 481 // wrap 482 return true; 483 } 484 return false; 485 } 486 487 uint32_t 488 RTCPSender::LastSendReport( uint32_t& lastRTCPTime) 489 { 490 CriticalSectionScoped lock(_criticalSectionRTCPSender); 491 492 lastRTCPTime = _lastRTCPTime[0]; 493 return _lastSendReport[0]; 494 } 495 496 uint32_t 497 RTCPSender::SendTimeOfSendReport(const uint32_t sendReport) 498 { 499 CriticalSectionScoped lock(_criticalSectionRTCPSender); 500 501 // This is only saved when we are the sender 502 if((_lastSendReport[0] == 0) || (sendReport == 0)) 503 { 504 return 0; // will be ignored 505 } else 506 { 507 for(int i = 0; i < RTCP_NUMBER_OF_SR; ++i) 508 { 509 if( _lastSendReport[i] == sendReport) 510 { 511 return _lastRTCPTime[i]; 512 } 513 } 514 } 515 return 0; 516 } 517 518 bool RTCPSender::SendTimeOfXrRrReport(uint32_t mid_ntp, 519 int64_t* time_ms) const { 520 CriticalSectionScoped lock(_criticalSectionRTCPSender); 521 522 if (last_xr_rr_.empty()) { 523 return false; 524 } 525 std::map<uint32_t, int64_t>::const_iterator it = last_xr_rr_.find(mid_ntp); 526 if (it == last_xr_rr_.end()) { 527 return false; 528 } 529 *time_ms = it->second; 530 return true; 531 } 532 533 void RTCPSender::GetPacketTypeCounter( 534 RtcpPacketTypeCounter* packet_counter) const { 535 CriticalSectionScoped lock(_criticalSectionRTCPSender); 536 *packet_counter = packet_type_counter_; 537 } 538 539 int32_t RTCPSender::AddExternalReportBlock( 540 uint32_t SSRC, 541 const RTCPReportBlock* reportBlock) { 542 CriticalSectionScoped lock(_criticalSectionRTCPSender); 543 return AddReportBlock(SSRC, &external_report_blocks_, reportBlock); 544 } 545 546 int32_t RTCPSender::AddReportBlock( 547 uint32_t SSRC, 548 std::map<uint32_t, RTCPReportBlock*>* report_blocks, 549 const RTCPReportBlock* reportBlock) { 550 assert(reportBlock); 551 552 if (report_blocks->size() >= RTCP_MAX_REPORT_BLOCKS) { 553 LOG(LS_WARNING) << "Too many report blocks."; 554 return -1; 555 } 556 std::map<uint32_t, RTCPReportBlock*>::iterator it = 557 report_blocks->find(SSRC); 558 if (it != report_blocks->end()) { 559 delete it->second; 560 report_blocks->erase(it); 561 } 562 RTCPReportBlock* copyReportBlock = new RTCPReportBlock(); 563 memcpy(copyReportBlock, reportBlock, sizeof(RTCPReportBlock)); 564 (*report_blocks)[SSRC] = copyReportBlock; 565 return 0; 566 } 567 568 int32_t RTCPSender::RemoveExternalReportBlock(uint32_t SSRC) { 569 CriticalSectionScoped lock(_criticalSectionRTCPSender); 570 571 std::map<uint32_t, RTCPReportBlock*>::iterator it = 572 external_report_blocks_.find(SSRC); 573 574 if (it == external_report_blocks_.end()) { 575 return -1; 576 } 577 delete it->second; 578 external_report_blocks_.erase(it); 579 return 0; 580 } 581 582 int32_t RTCPSender::BuildSR(const FeedbackState& feedback_state, 583 uint8_t* rtcpbuffer, 584 int& pos, 585 uint32_t NTPsec, 586 uint32_t NTPfrac) 587 { 588 // sanity 589 if(pos + 52 >= IP_PACKET_SIZE) 590 { 591 LOG(LS_WARNING) << "Failed to build Sender Report."; 592 return -2; 593 } 594 uint32_t RTPtime; 595 596 uint32_t posNumberOfReportBlocks = pos; 597 rtcpbuffer[pos++]=(uint8_t)0x80; 598 599 // Sender report 600 rtcpbuffer[pos++]=(uint8_t)200; 601 602 for(int i = (RTCP_NUMBER_OF_SR-2); i >= 0; i--) 603 { 604 // shift old 605 _lastSendReport[i+1] = _lastSendReport[i]; 606 _lastRTCPTime[i+1] =_lastRTCPTime[i]; 607 } 608 609 _lastRTCPTime[0] = Clock::NtpToMs(NTPsec, NTPfrac); 610 _lastSendReport[0] = (NTPsec << 16) + (NTPfrac >> 16); 611 612 // The timestamp of this RTCP packet should be estimated as the timestamp of 613 // the frame being captured at this moment. We are calculating that 614 // timestamp as the last frame's timestamp + the time since the last frame 615 // was captured. 616 RTPtime = start_timestamp_ + last_rtp_timestamp_ + 617 (_clock->TimeInMilliseconds() - last_frame_capture_time_ms_) * 618 (feedback_state.frequency_hz / 1000); 619 620 // Add sender data 621 // Save for our length field 622 pos++; 623 pos++; 624 625 // Add our own SSRC 626 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 627 pos += 4; 628 // NTP 629 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, NTPsec); 630 pos += 4; 631 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, NTPfrac); 632 pos += 4; 633 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, RTPtime); 634 pos += 4; 635 636 //sender's packet count 637 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, 638 feedback_state.packets_sent); 639 pos += 4; 640 641 //sender's octet count 642 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, 643 feedback_state.media_bytes_sent); 644 pos += 4; 645 646 uint8_t numberOfReportBlocks = 0; 647 int32_t retVal = WriteAllReportBlocksToBuffer(rtcpbuffer, pos, 648 numberOfReportBlocks, 649 NTPsec, NTPfrac); 650 if(retVal < 0) 651 { 652 // 653 return retVal ; 654 } 655 pos = retVal; 656 rtcpbuffer[posNumberOfReportBlocks] += numberOfReportBlocks; 657 658 uint16_t len = uint16_t((pos/4) -1); 659 RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + 2, len); 660 return 0; 661 } 662 663 664 int32_t RTCPSender::BuildSDEC(uint8_t* rtcpbuffer, int& pos) { 665 size_t lengthCname = strlen(_CNAME); 666 assert(lengthCname < RTCP_CNAME_SIZE); 667 668 // sanity 669 if(pos + 12 + lengthCname >= IP_PACKET_SIZE) { 670 LOG(LS_WARNING) << "Failed to build SDEC."; 671 return -2; 672 } 673 // SDEC Source Description 674 675 // We always need to add SDES CNAME 676 rtcpbuffer[pos++] = static_cast<uint8_t>(0x80 + 1 + _csrcCNAMEs.size()); 677 rtcpbuffer[pos++] = static_cast<uint8_t>(202); 678 679 // handle SDES length later on 680 uint32_t SDESLengthPos = pos; 681 pos++; 682 pos++; 683 684 // Add our own SSRC 685 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 686 pos += 4; 687 688 // CNAME = 1 689 rtcpbuffer[pos++] = static_cast<uint8_t>(1); 690 691 // 692 rtcpbuffer[pos++] = static_cast<uint8_t>(lengthCname); 693 694 uint16_t SDESLength = 10; 695 696 memcpy(&rtcpbuffer[pos], _CNAME, lengthCname); 697 pos += lengthCname; 698 SDESLength += (uint16_t)lengthCname; 699 700 uint16_t padding = 0; 701 // We must have a zero field even if we have an even multiple of 4 bytes 702 if ((pos % 4) == 0) { 703 padding++; 704 rtcpbuffer[pos++]=0; 705 } 706 while ((pos % 4) != 0) { 707 padding++; 708 rtcpbuffer[pos++]=0; 709 } 710 SDESLength += padding; 711 712 std::map<uint32_t, RTCPUtility::RTCPCnameInformation*>::iterator it = 713 _csrcCNAMEs.begin(); 714 715 for(; it != _csrcCNAMEs.end(); it++) { 716 RTCPCnameInformation* cname = it->second; 717 uint32_t SSRC = it->first; 718 719 // Add SSRC 720 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, SSRC); 721 pos += 4; 722 723 // CNAME = 1 724 rtcpbuffer[pos++] = static_cast<uint8_t>(1); 725 726 size_t length = strlen(cname->name); 727 assert(length < RTCP_CNAME_SIZE); 728 729 rtcpbuffer[pos++]= static_cast<uint8_t>(length); 730 SDESLength += 6; 731 732 memcpy(&rtcpbuffer[pos],cname->name, length); 733 734 pos += length; 735 SDESLength += length; 736 uint16_t padding = 0; 737 738 // We must have a zero field even if we have an even multiple of 4 bytes 739 if((pos % 4) == 0){ 740 padding++; 741 rtcpbuffer[pos++]=0; 742 } 743 while((pos % 4) != 0){ 744 padding++; 745 rtcpbuffer[pos++] = 0; 746 } 747 SDESLength += padding; 748 } 749 // in 32-bit words minus one and we don't count the header 750 uint16_t buffer_length = (SDESLength / 4) - 1; 751 RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + SDESLengthPos, buffer_length); 752 return 0; 753 } 754 755 int32_t 756 RTCPSender::BuildRR(uint8_t* rtcpbuffer, 757 int& pos, 758 const uint32_t NTPsec, 759 const uint32_t NTPfrac) 760 { 761 // sanity one block 762 if(pos + 32 >= IP_PACKET_SIZE) 763 { 764 return -2; 765 } 766 uint32_t posNumberOfReportBlocks = pos; 767 768 rtcpbuffer[pos++]=(uint8_t)0x80; 769 rtcpbuffer[pos++]=(uint8_t)201; 770 771 // Save for our length field 772 pos++; 773 pos++; 774 775 // Add our own SSRC 776 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 777 pos += 4; 778 779 uint8_t numberOfReportBlocks = 0; 780 int retVal = WriteAllReportBlocksToBuffer(rtcpbuffer, pos, 781 numberOfReportBlocks, 782 NTPsec, NTPfrac); 783 if(retVal < 0) 784 { 785 return pos; 786 } 787 pos = retVal; 788 rtcpbuffer[posNumberOfReportBlocks] += numberOfReportBlocks; 789 790 uint16_t len = uint16_t((pos)/4 -1); 791 RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + 2, len); 792 return 0; 793 } 794 795 // From RFC 5450: Transmission Time Offsets in RTP Streams. 796 // 0 1 2 3 797 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 798 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 799 // hdr |V=2|P| RC | PT=IJ=195 | length | 800 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 801 // | inter-arrival jitter | 802 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 803 // . . 804 // . . 805 // . . 806 // | inter-arrival jitter | 807 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 808 // 809 // If present, this RTCP packet must be placed after a receiver report 810 // (inside a compound RTCP packet), and MUST have the same value for RC 811 // (reception report count) as the receiver report. 812 813 int32_t 814 RTCPSender::BuildExtendedJitterReport( 815 uint8_t* rtcpbuffer, 816 int& pos, 817 const uint32_t jitterTransmissionTimeOffset) 818 { 819 if (external_report_blocks_.size() > 0) 820 { 821 // TODO(andresp): Remove external report blocks since they are not 822 // supported. 823 LOG(LS_ERROR) << "Handling of external report blocks not implemented."; 824 return 0; 825 } 826 827 // sanity 828 if(pos + 8 >= IP_PACKET_SIZE) 829 { 830 return -2; 831 } 832 // add picture loss indicator 833 uint8_t RC = 1; 834 rtcpbuffer[pos++]=(uint8_t)0x80 + RC; 835 rtcpbuffer[pos++]=(uint8_t)195; 836 837 // Used fixed length of 2 838 rtcpbuffer[pos++]=(uint8_t)0; 839 rtcpbuffer[pos++]=(uint8_t)(1); 840 841 // Add inter-arrival jitter 842 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, 843 jitterTransmissionTimeOffset); 844 pos += 4; 845 return 0; 846 } 847 848 int32_t 849 RTCPSender::BuildPLI(uint8_t* rtcpbuffer, int& pos) 850 { 851 // sanity 852 if(pos + 12 >= IP_PACKET_SIZE) 853 { 854 return -2; 855 } 856 // add picture loss indicator 857 uint8_t FMT = 1; 858 rtcpbuffer[pos++]=(uint8_t)0x80 + FMT; 859 rtcpbuffer[pos++]=(uint8_t)206; 860 861 //Used fixed length of 2 862 rtcpbuffer[pos++]=(uint8_t)0; 863 rtcpbuffer[pos++]=(uint8_t)(2); 864 865 // Add our own SSRC 866 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 867 pos += 4; 868 869 // Add the remote SSRC 870 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC); 871 pos += 4; 872 return 0; 873 } 874 875 int32_t RTCPSender::BuildFIR(uint8_t* rtcpbuffer, 876 int& pos, 877 bool repeat) { 878 // sanity 879 if(pos + 20 >= IP_PACKET_SIZE) { 880 return -2; 881 } 882 if (!repeat) { 883 _sequenceNumberFIR++; // do not increase if repetition 884 } 885 886 // add full intra request indicator 887 uint8_t FMT = 4; 888 rtcpbuffer[pos++] = (uint8_t)0x80 + FMT; 889 rtcpbuffer[pos++] = (uint8_t)206; 890 891 //Length of 4 892 rtcpbuffer[pos++] = (uint8_t)0; 893 rtcpbuffer[pos++] = (uint8_t)(4); 894 895 // Add our own SSRC 896 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 897 pos += 4; 898 899 // RFC 5104 4.3.1.2. Semantics 900 // SSRC of media source 901 rtcpbuffer[pos++] = (uint8_t)0; 902 rtcpbuffer[pos++] = (uint8_t)0; 903 rtcpbuffer[pos++] = (uint8_t)0; 904 rtcpbuffer[pos++] = (uint8_t)0; 905 906 // Additional Feedback Control Information (FCI) 907 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC); 908 pos += 4; 909 910 rtcpbuffer[pos++] = (uint8_t)(_sequenceNumberFIR); 911 rtcpbuffer[pos++] = (uint8_t)0; 912 rtcpbuffer[pos++] = (uint8_t)0; 913 rtcpbuffer[pos++] = (uint8_t)0; 914 return 0; 915 } 916 917 /* 918 0 1 2 3 919 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 920 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 921 | First | Number | PictureID | 922 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 923 */ 924 int32_t 925 RTCPSender::BuildSLI(uint8_t* rtcpbuffer, int& pos, const uint8_t pictureID) 926 { 927 // sanity 928 if(pos + 16 >= IP_PACKET_SIZE) 929 { 930 return -2; 931 } 932 // add slice loss indicator 933 uint8_t FMT = 2; 934 rtcpbuffer[pos++]=(uint8_t)0x80 + FMT; 935 rtcpbuffer[pos++]=(uint8_t)206; 936 937 //Used fixed length of 3 938 rtcpbuffer[pos++]=(uint8_t)0; 939 rtcpbuffer[pos++]=(uint8_t)(3); 940 941 // Add our own SSRC 942 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 943 pos += 4; 944 945 // Add the remote SSRC 946 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC); 947 pos += 4; 948 949 // Add first, number & picture ID 6 bits 950 // first = 0, 13 - bits 951 // number = 0x1fff, 13 - bits only ones for now 952 uint32_t sliField = (0x1fff << 6)+ (0x3f & pictureID); 953 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, sliField); 954 pos += 4; 955 return 0; 956 } 957 958 /* 959 0 1 2 3 960 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 961 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 962 | PB |0| Payload Type| Native RPSI bit string | 963 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 964 | defined per codec ... | Padding (0) | 965 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 966 */ 967 /* 968 * Note: not generic made for VP8 969 */ 970 int32_t 971 RTCPSender::BuildRPSI(uint8_t* rtcpbuffer, 972 int& pos, 973 const uint64_t pictureID, 974 const uint8_t payloadType) 975 { 976 // sanity 977 if(pos + 24 >= IP_PACKET_SIZE) 978 { 979 return -2; 980 } 981 // add Reference Picture Selection Indication 982 uint8_t FMT = 3; 983 rtcpbuffer[pos++]=(uint8_t)0x80 + FMT; 984 rtcpbuffer[pos++]=(uint8_t)206; 985 986 // calc length 987 uint32_t bitsRequired = 7; 988 uint8_t bytesRequired = 1; 989 while((pictureID>>bitsRequired) > 0) 990 { 991 bitsRequired += 7; 992 bytesRequired++; 993 } 994 995 uint8_t size = 3; 996 if(bytesRequired > 6) 997 { 998 size = 5; 999 } else if(bytesRequired > 2) 1000 { 1001 size = 4; 1002 } 1003 rtcpbuffer[pos++]=(uint8_t)0; 1004 rtcpbuffer[pos++]=size; 1005 1006 // Add our own SSRC 1007 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1008 pos += 4; 1009 1010 // Add the remote SSRC 1011 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC); 1012 pos += 4; 1013 1014 // calc padding length 1015 uint8_t paddingBytes = 4-((2+bytesRequired)%4); 1016 if(paddingBytes == 4) 1017 { 1018 paddingBytes = 0; 1019 } 1020 // add padding length in bits 1021 rtcpbuffer[pos] = paddingBytes*8; // padding can be 0, 8, 16 or 24 1022 pos++; 1023 1024 // add payload type 1025 rtcpbuffer[pos] = payloadType; 1026 pos++; 1027 1028 // add picture ID 1029 for(int i = bytesRequired-1; i > 0; i--) 1030 { 1031 rtcpbuffer[pos] = 0x80 | uint8_t(pictureID >> (i*7)); 1032 pos++; 1033 } 1034 // add last byte of picture ID 1035 rtcpbuffer[pos] = uint8_t(pictureID & 0x7f); 1036 pos++; 1037 1038 // add padding 1039 for(int j = 0; j <paddingBytes; j++) 1040 { 1041 rtcpbuffer[pos] = 0; 1042 pos++; 1043 } 1044 return 0; 1045 } 1046 1047 int32_t 1048 RTCPSender::BuildREMB(uint8_t* rtcpbuffer, int& pos) 1049 { 1050 // sanity 1051 if(pos + 20 + 4 * _lengthRembSSRC >= IP_PACKET_SIZE) 1052 { 1053 return -2; 1054 } 1055 // add application layer feedback 1056 uint8_t FMT = 15; 1057 rtcpbuffer[pos++]=(uint8_t)0x80 + FMT; 1058 rtcpbuffer[pos++]=(uint8_t)206; 1059 1060 rtcpbuffer[pos++]=(uint8_t)0; 1061 rtcpbuffer[pos++]=_lengthRembSSRC + 4; 1062 1063 // Add our own SSRC 1064 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1065 pos += 4; 1066 1067 // Remote SSRC must be 0 1068 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, 0); 1069 pos += 4; 1070 1071 rtcpbuffer[pos++]='R'; 1072 rtcpbuffer[pos++]='E'; 1073 rtcpbuffer[pos++]='M'; 1074 rtcpbuffer[pos++]='B'; 1075 1076 rtcpbuffer[pos++] = _lengthRembSSRC; 1077 // 6 bit Exp 1078 // 18 bit mantissa 1079 uint8_t brExp = 0; 1080 for(uint32_t i=0; i<64; i++) 1081 { 1082 if(_rembBitrate <= ((uint32_t)262143 << i)) 1083 { 1084 brExp = i; 1085 break; 1086 } 1087 } 1088 const uint32_t brMantissa = (_rembBitrate >> brExp); 1089 rtcpbuffer[pos++]=(uint8_t)((brExp << 2) + ((brMantissa >> 16) & 0x03)); 1090 rtcpbuffer[pos++]=(uint8_t)(brMantissa >> 8); 1091 rtcpbuffer[pos++]=(uint8_t)(brMantissa); 1092 1093 for (int i = 0; i < _lengthRembSSRC; i++) 1094 { 1095 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _rembSSRC[i]); 1096 pos += 4; 1097 } 1098 return 0; 1099 } 1100 1101 void 1102 RTCPSender::SetTargetBitrate(unsigned int target_bitrate) 1103 { 1104 CriticalSectionScoped lock(_criticalSectionRTCPSender); 1105 _tmmbr_Send = target_bitrate / 1000; 1106 } 1107 1108 int32_t RTCPSender::BuildTMMBR(ModuleRtpRtcpImpl* rtp_rtcp_module, 1109 uint8_t* rtcpbuffer, 1110 int& pos) { 1111 if (rtp_rtcp_module == NULL) 1112 return -1; 1113 // Before sending the TMMBR check the received TMMBN, only an owner is allowed to raise the bitrate 1114 // If the sender is an owner of the TMMBN -> send TMMBR 1115 // If not an owner but the TMMBR would enter the TMMBN -> send TMMBR 1116 1117 // get current bounding set from RTCP receiver 1118 bool tmmbrOwner = false; 1119 // store in candidateSet, allocates one extra slot 1120 TMMBRSet* candidateSet = _tmmbrHelp.CandidateSet(); 1121 1122 // holding _criticalSectionRTCPSender while calling RTCPreceiver which 1123 // will accuire _criticalSectionRTCPReceiver is a potental deadlock but 1124 // since RTCPreceiver is not doing the reverse we should be fine 1125 int32_t lengthOfBoundingSet = 1126 rtp_rtcp_module->BoundingSet(tmmbrOwner, candidateSet); 1127 1128 if(lengthOfBoundingSet > 0) 1129 { 1130 for (int32_t i = 0; i < lengthOfBoundingSet; i++) 1131 { 1132 if( candidateSet->Tmmbr(i) == _tmmbr_Send && 1133 candidateSet->PacketOH(i) == _packetOH_Send) 1134 { 1135 // do not send the same tuple 1136 return 0; 1137 } 1138 } 1139 if(!tmmbrOwner) 1140 { 1141 // use received bounding set as candidate set 1142 // add current tuple 1143 candidateSet->SetEntry(lengthOfBoundingSet, 1144 _tmmbr_Send, 1145 _packetOH_Send, 1146 _SSRC); 1147 int numCandidates = lengthOfBoundingSet+ 1; 1148 1149 // find bounding set 1150 TMMBRSet* boundingSet = NULL; 1151 int numBoundingSet = _tmmbrHelp.FindTMMBRBoundingSet(boundingSet); 1152 if(numBoundingSet > 0 || numBoundingSet <= numCandidates) 1153 { 1154 tmmbrOwner = _tmmbrHelp.IsOwner(_SSRC, numBoundingSet); 1155 } 1156 if(!tmmbrOwner) 1157 { 1158 // did not enter bounding set, no meaning to send this request 1159 return 0; 1160 } 1161 } 1162 } 1163 1164 if(_tmmbr_Send) 1165 { 1166 // sanity 1167 if(pos + 20 >= IP_PACKET_SIZE) 1168 { 1169 return -2; 1170 } 1171 // add TMMBR indicator 1172 uint8_t FMT = 3; 1173 rtcpbuffer[pos++]=(uint8_t)0x80 + FMT; 1174 rtcpbuffer[pos++]=(uint8_t)205; 1175 1176 //Length of 4 1177 rtcpbuffer[pos++]=(uint8_t)0; 1178 rtcpbuffer[pos++]=(uint8_t)(4); 1179 1180 // Add our own SSRC 1181 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1182 pos += 4; 1183 1184 // RFC 5104 4.2.1.2. Semantics 1185 1186 // SSRC of media source 1187 rtcpbuffer[pos++]=(uint8_t)0; 1188 rtcpbuffer[pos++]=(uint8_t)0; 1189 rtcpbuffer[pos++]=(uint8_t)0; 1190 rtcpbuffer[pos++]=(uint8_t)0; 1191 1192 // Additional Feedback Control Information (FCI) 1193 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC); 1194 pos += 4; 1195 1196 uint32_t bitRate = _tmmbr_Send*1000; 1197 uint32_t mmbrExp = 0; 1198 for(uint32_t i=0;i<64;i++) 1199 { 1200 if(bitRate <= ((uint32_t)131071 << i)) 1201 { 1202 mmbrExp = i; 1203 break; 1204 } 1205 } 1206 uint32_t mmbrMantissa = (bitRate >> mmbrExp); 1207 1208 rtcpbuffer[pos++]=(uint8_t)((mmbrExp << 2) + ((mmbrMantissa >> 15) & 0x03)); 1209 rtcpbuffer[pos++]=(uint8_t)(mmbrMantissa >> 7); 1210 rtcpbuffer[pos++]=(uint8_t)((mmbrMantissa << 1) + ((_packetOH_Send >> 8)& 0x01)); 1211 rtcpbuffer[pos++]=(uint8_t)(_packetOH_Send); 1212 } 1213 return 0; 1214 } 1215 1216 int32_t 1217 RTCPSender::BuildTMMBN(uint8_t* rtcpbuffer, int& pos) 1218 { 1219 TMMBRSet* boundingSet = _tmmbrHelp.BoundingSetToSend(); 1220 if(boundingSet == NULL) 1221 { 1222 return -1; 1223 } 1224 // sanity 1225 if(pos + 12 + boundingSet->lengthOfSet()*8 >= IP_PACKET_SIZE) 1226 { 1227 LOG(LS_WARNING) << "Failed to build TMMBN."; 1228 return -2; 1229 } 1230 uint8_t FMT = 4; 1231 // add TMMBN indicator 1232 rtcpbuffer[pos++]=(uint8_t)0x80 + FMT; 1233 rtcpbuffer[pos++]=(uint8_t)205; 1234 1235 //Add length later 1236 int posLength = pos; 1237 pos++; 1238 pos++; 1239 1240 // Add our own SSRC 1241 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1242 pos += 4; 1243 1244 // RFC 5104 4.2.2.2. Semantics 1245 1246 // SSRC of media source 1247 rtcpbuffer[pos++]=(uint8_t)0; 1248 rtcpbuffer[pos++]=(uint8_t)0; 1249 rtcpbuffer[pos++]=(uint8_t)0; 1250 rtcpbuffer[pos++]=(uint8_t)0; 1251 1252 // Additional Feedback Control Information (FCI) 1253 int numBoundingSet = 0; 1254 for(uint32_t n=0; n< boundingSet->lengthOfSet(); n++) 1255 { 1256 if (boundingSet->Tmmbr(n) > 0) 1257 { 1258 uint32_t tmmbrSSRC = boundingSet->Ssrc(n); 1259 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, tmmbrSSRC); 1260 pos += 4; 1261 1262 uint32_t bitRate = boundingSet->Tmmbr(n) * 1000; 1263 uint32_t mmbrExp = 0; 1264 for(int i=0; i<64; i++) 1265 { 1266 if(bitRate <= ((uint32_t)131071 << i)) 1267 { 1268 mmbrExp = i; 1269 break; 1270 } 1271 } 1272 uint32_t mmbrMantissa = (bitRate >> mmbrExp); 1273 uint32_t measuredOH = boundingSet->PacketOH(n); 1274 1275 rtcpbuffer[pos++]=(uint8_t)((mmbrExp << 2) + ((mmbrMantissa >> 15) & 0x03)); 1276 rtcpbuffer[pos++]=(uint8_t)(mmbrMantissa >> 7); 1277 rtcpbuffer[pos++]=(uint8_t)((mmbrMantissa << 1) + ((measuredOH >> 8)& 0x01)); 1278 rtcpbuffer[pos++]=(uint8_t)(measuredOH); 1279 numBoundingSet++; 1280 } 1281 } 1282 uint16_t length= (uint16_t)(2+2*numBoundingSet); 1283 rtcpbuffer[posLength++]=(uint8_t)(length>>8); 1284 rtcpbuffer[posLength]=(uint8_t)(length); 1285 return 0; 1286 } 1287 1288 int32_t 1289 RTCPSender::BuildAPP(uint8_t* rtcpbuffer, int& pos) 1290 { 1291 // sanity 1292 if(_appData == NULL) 1293 { 1294 LOG(LS_WARNING) << "Failed to build app specific."; 1295 return -1; 1296 } 1297 if(pos + 12 + _appLength >= IP_PACKET_SIZE) 1298 { 1299 LOG(LS_WARNING) << "Failed to build app specific."; 1300 return -2; 1301 } 1302 rtcpbuffer[pos++]=(uint8_t)0x80 + _appSubType; 1303 1304 // Add APP ID 1305 rtcpbuffer[pos++]=(uint8_t)204; 1306 1307 uint16_t length = (_appLength>>2) + 2; // include SSRC and name 1308 rtcpbuffer[pos++]=(uint8_t)(length>>8); 1309 rtcpbuffer[pos++]=(uint8_t)(length); 1310 1311 // Add our own SSRC 1312 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1313 pos += 4; 1314 1315 // Add our application name 1316 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _appName); 1317 pos += 4; 1318 1319 // Add the data 1320 memcpy(rtcpbuffer +pos, _appData,_appLength); 1321 pos += _appLength; 1322 return 0; 1323 } 1324 1325 int32_t 1326 RTCPSender::BuildNACK(uint8_t* rtcpbuffer, 1327 int& pos, 1328 const int32_t nackSize, 1329 const uint16_t* nackList, 1330 std::string* nackString) 1331 { 1332 // sanity 1333 if(pos + 16 >= IP_PACKET_SIZE) 1334 { 1335 LOG(LS_WARNING) << "Failed to build NACK."; 1336 return -2; 1337 } 1338 1339 // int size, uint16_t* nackList 1340 // add nack list 1341 uint8_t FMT = 1; 1342 rtcpbuffer[pos++]=(uint8_t)0x80 + FMT; 1343 rtcpbuffer[pos++]=(uint8_t)205; 1344 1345 rtcpbuffer[pos++]=(uint8_t) 0; 1346 int nackSizePos = pos; 1347 rtcpbuffer[pos++]=(uint8_t)(3); //setting it to one kNACK signal as default 1348 1349 // Add our own SSRC 1350 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1351 pos += 4; 1352 1353 // Add the remote SSRC 1354 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC); 1355 pos += 4; 1356 1357 NACKStringBuilder stringBuilder; 1358 // Build NACK bitmasks and write them to the RTCP message. 1359 // The nack list should be sorted and not contain duplicates if one 1360 // wants to build the smallest rtcp nack packet. 1361 int numOfNackFields = 0; 1362 int maxNackFields = std::min<int>(kRtcpMaxNackFields, 1363 (IP_PACKET_SIZE - pos) / 4); 1364 int i = 0; 1365 while (i < nackSize && numOfNackFields < maxNackFields) { 1366 stringBuilder.PushNACK(nackList[i]); 1367 uint16_t nack = nackList[i++]; 1368 uint16_t bitmask = 0; 1369 while (i < nackSize) { 1370 int shift = static_cast<uint16_t>(nackList[i] - nack) - 1; 1371 if (shift >= 0 && shift <= 15) { 1372 stringBuilder.PushNACK(nackList[i]); 1373 bitmask |= (1 << shift); 1374 ++i; 1375 } else { 1376 break; 1377 } 1378 } 1379 // Write the sequence number and the bitmask to the packet. 1380 assert(pos + 4 < IP_PACKET_SIZE); 1381 RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + pos, nack); 1382 pos += 2; 1383 RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + pos, bitmask); 1384 pos += 2; 1385 numOfNackFields++; 1386 } 1387 if (i != nackSize) { 1388 LOG(LS_WARNING) << "Nack list to large for one packet."; 1389 } 1390 rtcpbuffer[nackSizePos] = static_cast<uint8_t>(2 + numOfNackFields); 1391 *nackString = stringBuilder.GetResult(); 1392 return 0; 1393 } 1394 1395 int32_t 1396 RTCPSender::BuildBYE(uint8_t* rtcpbuffer, int& pos) 1397 { 1398 // sanity 1399 if(pos + 8 >= IP_PACKET_SIZE) 1400 { 1401 return -2; 1402 } 1403 if(_includeCSRCs) 1404 { 1405 // Add a bye packet 1406 rtcpbuffer[pos++]=(uint8_t)0x80 + 1 + _CSRCs; // number of SSRC+CSRCs 1407 rtcpbuffer[pos++]=(uint8_t)203; 1408 1409 // length 1410 rtcpbuffer[pos++]=(uint8_t)0; 1411 rtcpbuffer[pos++]=(uint8_t)(1 + _CSRCs); 1412 1413 // Add our own SSRC 1414 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1415 pos += 4; 1416 1417 // add CSRCs 1418 for(int i = 0; i < _CSRCs; i++) 1419 { 1420 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _CSRC[i]); 1421 pos += 4; 1422 } 1423 } else 1424 { 1425 // Add a bye packet 1426 rtcpbuffer[pos++]=(uint8_t)0x80 + 1; // number of SSRC+CSRCs 1427 rtcpbuffer[pos++]=(uint8_t)203; 1428 1429 // length 1430 rtcpbuffer[pos++]=(uint8_t)0; 1431 rtcpbuffer[pos++]=(uint8_t)1; 1432 1433 // Add our own SSRC 1434 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1435 pos += 4; 1436 } 1437 return 0; 1438 } 1439 1440 int32_t RTCPSender::BuildReceiverReferenceTime(uint8_t* buffer, 1441 int& pos, 1442 uint32_t ntp_sec, 1443 uint32_t ntp_frac) { 1444 const int kRrTimeBlockLength = 20; 1445 if (pos + kRrTimeBlockLength >= IP_PACKET_SIZE) { 1446 return -2; 1447 } 1448 1449 if (last_xr_rr_.size() >= RTCP_NUMBER_OF_SR) { 1450 last_xr_rr_.erase(last_xr_rr_.begin()); 1451 } 1452 last_xr_rr_.insert(std::pair<uint32_t, int64_t>( 1453 RTCPUtility::MidNtp(ntp_sec, ntp_frac), 1454 Clock::NtpToMs(ntp_sec, ntp_frac))); 1455 1456 // Add XR header. 1457 buffer[pos++] = 0x80; 1458 buffer[pos++] = 207; 1459 buffer[pos++] = 0; // XR packet length. 1460 buffer[pos++] = 4; // XR packet length. 1461 1462 // Add our own SSRC. 1463 RtpUtility::AssignUWord32ToBuffer(buffer + pos, _SSRC); 1464 pos += 4; 1465 1466 // 0 1 2 3 1467 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1468 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1469 // | BT=4 | reserved | block length = 2 | 1470 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1471 // | NTP timestamp, most significant word | 1472 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1473 // | NTP timestamp, least significant word | 1474 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1475 1476 // Add Receiver Reference Time Report block. 1477 buffer[pos++] = 4; // BT. 1478 buffer[pos++] = 0; // Reserved. 1479 buffer[pos++] = 0; // Block length. 1480 buffer[pos++] = 2; // Block length. 1481 1482 // NTP timestamp. 1483 RtpUtility::AssignUWord32ToBuffer(buffer + pos, ntp_sec); 1484 pos += 4; 1485 RtpUtility::AssignUWord32ToBuffer(buffer + pos, ntp_frac); 1486 pos += 4; 1487 1488 return 0; 1489 } 1490 1491 int32_t RTCPSender::BuildDlrr(uint8_t* buffer, 1492 int& pos, 1493 const RtcpReceiveTimeInfo& info) { 1494 const int kDlrrBlockLength = 24; 1495 if (pos + kDlrrBlockLength >= IP_PACKET_SIZE) { 1496 return -2; 1497 } 1498 1499 // Add XR header. 1500 buffer[pos++] = 0x80; 1501 buffer[pos++] = 207; 1502 buffer[pos++] = 0; // XR packet length. 1503 buffer[pos++] = 5; // XR packet length. 1504 1505 // Add our own SSRC. 1506 RtpUtility::AssignUWord32ToBuffer(buffer + pos, _SSRC); 1507 pos += 4; 1508 1509 // 0 1 2 3 1510 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1511 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1512 // | BT=5 | reserved | block length | 1513 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 1514 // | SSRC_1 (SSRC of first receiver) | sub- 1515 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block 1516 // | last RR (LRR) | 1 1517 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1518 // | delay since last RR (DLRR) | 1519 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 1520 // | SSRC_2 (SSRC of second receiver) | sub- 1521 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block 1522 // : ... : 2 1523 1524 // Add DLRR sub block. 1525 buffer[pos++] = 5; // BT. 1526 buffer[pos++] = 0; // Reserved. 1527 buffer[pos++] = 0; // Block length. 1528 buffer[pos++] = 3; // Block length. 1529 1530 // NTP timestamp. 1531 RtpUtility::AssignUWord32ToBuffer(buffer + pos, info.sourceSSRC); 1532 pos += 4; 1533 RtpUtility::AssignUWord32ToBuffer(buffer + pos, info.lastRR); 1534 pos += 4; 1535 RtpUtility::AssignUWord32ToBuffer(buffer + pos, info.delaySinceLastRR); 1536 pos += 4; 1537 1538 return 0; 1539 } 1540 1541 int32_t 1542 RTCPSender::BuildVoIPMetric(uint8_t* rtcpbuffer, int& pos) 1543 { 1544 // sanity 1545 if(pos + 44 >= IP_PACKET_SIZE) 1546 { 1547 return -2; 1548 } 1549 1550 // Add XR header 1551 rtcpbuffer[pos++]=(uint8_t)0x80; 1552 rtcpbuffer[pos++]=(uint8_t)207; 1553 1554 uint32_t XRLengthPos = pos; 1555 1556 // handle length later on 1557 pos++; 1558 pos++; 1559 1560 // Add our own SSRC 1561 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC); 1562 pos += 4; 1563 1564 // Add a VoIP metrics block 1565 rtcpbuffer[pos++]=7; 1566 rtcpbuffer[pos++]=0; 1567 rtcpbuffer[pos++]=0; 1568 rtcpbuffer[pos++]=8; 1569 1570 // Add the remote SSRC 1571 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC); 1572 pos += 4; 1573 1574 rtcpbuffer[pos++] = _xrVoIPMetric.lossRate; 1575 rtcpbuffer[pos++] = _xrVoIPMetric.discardRate; 1576 rtcpbuffer[pos++] = _xrVoIPMetric.burstDensity; 1577 rtcpbuffer[pos++] = _xrVoIPMetric.gapDensity; 1578 1579 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.burstDuration >> 8); 1580 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.burstDuration); 1581 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.gapDuration >> 8); 1582 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.gapDuration); 1583 1584 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.roundTripDelay >> 8); 1585 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.roundTripDelay); 1586 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.endSystemDelay >> 8); 1587 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.endSystemDelay); 1588 1589 rtcpbuffer[pos++] = _xrVoIPMetric.signalLevel; 1590 rtcpbuffer[pos++] = _xrVoIPMetric.noiseLevel; 1591 rtcpbuffer[pos++] = _xrVoIPMetric.RERL; 1592 rtcpbuffer[pos++] = _xrVoIPMetric.Gmin; 1593 1594 rtcpbuffer[pos++] = _xrVoIPMetric.Rfactor; 1595 rtcpbuffer[pos++] = _xrVoIPMetric.extRfactor; 1596 rtcpbuffer[pos++] = _xrVoIPMetric.MOSLQ; 1597 rtcpbuffer[pos++] = _xrVoIPMetric.MOSCQ; 1598 1599 rtcpbuffer[pos++] = _xrVoIPMetric.RXconfig; 1600 rtcpbuffer[pos++] = 0; // reserved 1601 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.JBnominal >> 8); 1602 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.JBnominal); 1603 1604 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.JBmax >> 8); 1605 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.JBmax); 1606 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.JBabsMax >> 8); 1607 rtcpbuffer[pos++] = (uint8_t)(_xrVoIPMetric.JBabsMax); 1608 1609 rtcpbuffer[XRLengthPos]=(uint8_t)(0); 1610 rtcpbuffer[XRLengthPos+1]=(uint8_t)(10); 1611 return 0; 1612 } 1613 1614 int32_t RTCPSender::SendRTCP(const FeedbackState& feedback_state, 1615 uint32_t packetTypeFlags, 1616 int32_t nackSize, 1617 const uint16_t* nackList, 1618 bool repeat, 1619 uint64_t pictureID) { 1620 { 1621 CriticalSectionScoped lock(_criticalSectionRTCPSender); 1622 if(_method == kRtcpOff) 1623 { 1624 LOG(LS_WARNING) << "Can't send rtcp if it is disabled."; 1625 return -1; 1626 } 1627 } 1628 uint8_t rtcp_buffer[IP_PACKET_SIZE]; 1629 int rtcp_length = PrepareRTCP(feedback_state, 1630 packetTypeFlags, 1631 nackSize, 1632 nackList, 1633 repeat, 1634 pictureID, 1635 rtcp_buffer, 1636 IP_PACKET_SIZE); 1637 if (rtcp_length < 0) { 1638 return -1; 1639 } 1640 // Sanity don't send empty packets. 1641 if (rtcp_length == 0) 1642 { 1643 return -1; 1644 } 1645 return SendToNetwork(rtcp_buffer, static_cast<uint16_t>(rtcp_length)); 1646 } 1647 1648 int RTCPSender::PrepareRTCP(const FeedbackState& feedback_state, 1649 uint32_t packetTypeFlags, 1650 int32_t nackSize, 1651 const uint16_t* nackList, 1652 bool repeat, 1653 uint64_t pictureID, 1654 uint8_t* rtcp_buffer, 1655 int buffer_size) { 1656 uint32_t rtcpPacketTypeFlags = packetTypeFlags; 1657 // Collect the received information. 1658 uint32_t NTPsec = 0; 1659 uint32_t NTPfrac = 0; 1660 uint32_t jitterTransmissionOffset = 0; 1661 int position = 0; 1662 1663 CriticalSectionScoped lock(_criticalSectionRTCPSender); 1664 1665 if(_TMMBR ) // Attach TMMBR to send and receive reports. 1666 { 1667 rtcpPacketTypeFlags |= kRtcpTmmbr; 1668 } 1669 if(_appSend) 1670 { 1671 rtcpPacketTypeFlags |= kRtcpApp; 1672 _appSend = false; 1673 } 1674 if(_REMB && _sendREMB) 1675 { 1676 // Always attach REMB to SR if that is configured. Note that REMB is 1677 // only sent on one of the RTP modules in the REMB group. 1678 rtcpPacketTypeFlags |= kRtcpRemb; 1679 } 1680 if(_xrSendVoIPMetric) 1681 { 1682 rtcpPacketTypeFlags |= kRtcpXrVoipMetric; 1683 _xrSendVoIPMetric = false; 1684 } 1685 if(_sendTMMBN) // Set when having received a TMMBR. 1686 { 1687 rtcpPacketTypeFlags |= kRtcpTmmbn; 1688 _sendTMMBN = false; 1689 } 1690 if (rtcpPacketTypeFlags & kRtcpReport) 1691 { 1692 if (xrSendReceiverReferenceTimeEnabled_ && !_sending) 1693 { 1694 rtcpPacketTypeFlags |= kRtcpXrReceiverReferenceTime; 1695 } 1696 if (feedback_state.has_last_xr_rr) 1697 { 1698 rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; 1699 } 1700 } 1701 if(_method == kRtcpCompound) 1702 { 1703 if(_sending) 1704 { 1705 rtcpPacketTypeFlags |= kRtcpSr; 1706 } else 1707 { 1708 rtcpPacketTypeFlags |= kRtcpRr; 1709 } 1710 } else if(_method == kRtcpNonCompound) 1711 { 1712 if(rtcpPacketTypeFlags & kRtcpReport) 1713 { 1714 if(_sending) 1715 { 1716 rtcpPacketTypeFlags |= kRtcpSr; 1717 } else 1718 { 1719 rtcpPacketTypeFlags |= kRtcpRr; 1720 } 1721 } 1722 } 1723 if( rtcpPacketTypeFlags & kRtcpRr || 1724 rtcpPacketTypeFlags & kRtcpSr) 1725 { 1726 // generate next time to send a RTCP report 1727 // seeded from RTP constructor 1728 int32_t random = rand() % 1000; 1729 int32_t timeToNext = RTCP_INTERVAL_AUDIO_MS; 1730 1731 if(_audio) 1732 { 1733 timeToNext = (RTCP_INTERVAL_AUDIO_MS/2) + 1734 (RTCP_INTERVAL_AUDIO_MS*random/1000); 1735 }else 1736 { 1737 uint32_t minIntervalMs = RTCP_INTERVAL_AUDIO_MS; 1738 if(_sending) 1739 { 1740 // Calculate bandwidth for video; 360 / send bandwidth in kbit/s. 1741 uint32_t send_bitrate_kbit = feedback_state.send_bitrate / 1000; 1742 if (send_bitrate_kbit != 0) 1743 minIntervalMs = 360000 / send_bitrate_kbit; 1744 } 1745 if(minIntervalMs > RTCP_INTERVAL_VIDEO_MS) 1746 { 1747 minIntervalMs = RTCP_INTERVAL_VIDEO_MS; 1748 } 1749 timeToNext = (minIntervalMs/2) + (minIntervalMs*random/1000); 1750 } 1751 _nextTimeToSendRTCP = _clock->TimeInMilliseconds() + timeToNext; 1752 } 1753 1754 // If the data does not fit in the packet we fill it as much as possible. 1755 int32_t buildVal = 0; 1756 1757 // We need to send our NTP even if we haven't received any reports. 1758 _clock->CurrentNtp(NTPsec, NTPfrac); 1759 if (ShouldSendReportBlocks(rtcpPacketTypeFlags)) { 1760 StatisticianMap statisticians = 1761 receive_statistics_->GetActiveStatisticians(); 1762 if (!statisticians.empty()) { 1763 StatisticianMap::const_iterator it; 1764 int i; 1765 for (it = statisticians.begin(), i = 0; it != statisticians.end(); 1766 ++it, ++i) { 1767 RTCPReportBlock report_block; 1768 if (PrepareReport( 1769 feedback_state, it->second, &report_block, &NTPsec, &NTPfrac)) 1770 AddReportBlock(it->first, &internal_report_blocks_, &report_block); 1771 } 1772 if (_IJ && !statisticians.empty()) { 1773 rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; 1774 } 1775 } 1776 } 1777 1778 if(rtcpPacketTypeFlags & kRtcpSr) 1779 { 1780 buildVal = BuildSR(feedback_state, rtcp_buffer, position, NTPsec, NTPfrac); 1781 if (buildVal == -1) { 1782 return -1; 1783 } else if (buildVal == -2) { 1784 return position; 1785 } 1786 buildVal = BuildSDEC(rtcp_buffer, position); 1787 if (buildVal == -1) { 1788 return -1; 1789 } else if (buildVal == -2) { 1790 return position; 1791 } 1792 }else if(rtcpPacketTypeFlags & kRtcpRr) 1793 { 1794 buildVal = BuildRR(rtcp_buffer, position, NTPsec, NTPfrac); 1795 if (buildVal == -1) { 1796 return -1; 1797 } else if (buildVal == -2) { 1798 return position; 1799 } 1800 // only of set 1801 if(_CNAME[0] != 0) 1802 { 1803 buildVal = BuildSDEC(rtcp_buffer, position); 1804 if (buildVal == -1) { 1805 return -1; 1806 } 1807 } 1808 } 1809 if(rtcpPacketTypeFlags & kRtcpTransmissionTimeOffset) 1810 { 1811 // If present, this RTCP packet must be placed after a 1812 // receiver report. 1813 buildVal = BuildExtendedJitterReport(rtcp_buffer, 1814 position, 1815 jitterTransmissionOffset); 1816 if (buildVal == -1) { 1817 return -1; 1818 } else if (buildVal == -2) { 1819 return position; 1820 } 1821 } 1822 if(rtcpPacketTypeFlags & kRtcpPli) 1823 { 1824 buildVal = BuildPLI(rtcp_buffer, position); 1825 if (buildVal == -1) { 1826 return -1; 1827 } else if (buildVal == -2) { 1828 return position; 1829 } 1830 TRACE_EVENT_INSTANT0("webrtc_rtp", "RTCPSender::PLI"); 1831 ++packet_type_counter_.pli_packets; 1832 TRACE_COUNTER_ID1("webrtc_rtp", "RTCP_PLICount", _SSRC, 1833 packet_type_counter_.pli_packets); 1834 } 1835 if(rtcpPacketTypeFlags & kRtcpFir) 1836 { 1837 buildVal = BuildFIR(rtcp_buffer, position, repeat); 1838 if (buildVal == -1) { 1839 return -1; 1840 } else if (buildVal == -2) { 1841 return position; 1842 } 1843 TRACE_EVENT_INSTANT0("webrtc_rtp", "RTCPSender::FIR"); 1844 ++packet_type_counter_.fir_packets; 1845 TRACE_COUNTER_ID1("webrtc_rtp", "RTCP_FIRCount", _SSRC, 1846 packet_type_counter_.fir_packets); 1847 } 1848 if(rtcpPacketTypeFlags & kRtcpSli) 1849 { 1850 buildVal = BuildSLI(rtcp_buffer, position, (uint8_t)pictureID); 1851 if (buildVal == -1) { 1852 return -1; 1853 } else if (buildVal == -2) { 1854 return position; 1855 } 1856 } 1857 if(rtcpPacketTypeFlags & kRtcpRpsi) 1858 { 1859 const int8_t payloadType = feedback_state.send_payload_type; 1860 if (payloadType == -1) { 1861 return -1; 1862 } 1863 buildVal = BuildRPSI(rtcp_buffer, position, pictureID, 1864 (uint8_t)payloadType); 1865 if (buildVal == -1) { 1866 return -1; 1867 } else if (buildVal == -2) { 1868 return position; 1869 } 1870 } 1871 if(rtcpPacketTypeFlags & kRtcpRemb) 1872 { 1873 buildVal = BuildREMB(rtcp_buffer, position); 1874 if (buildVal == -1) { 1875 return -1; 1876 } else if (buildVal == -2) { 1877 return position; 1878 } 1879 TRACE_EVENT_INSTANT0("webrtc_rtp", "RTCPSender::REMB"); 1880 } 1881 if(rtcpPacketTypeFlags & kRtcpBye) 1882 { 1883 buildVal = BuildBYE(rtcp_buffer, position); 1884 if (buildVal == -1) { 1885 return -1; 1886 } else if (buildVal == -2) { 1887 return position; 1888 } 1889 } 1890 if(rtcpPacketTypeFlags & kRtcpApp) 1891 { 1892 buildVal = BuildAPP(rtcp_buffer, position); 1893 if (buildVal == -1) { 1894 return -1; 1895 } else if (buildVal == -2) { 1896 return position; 1897 } 1898 } 1899 if(rtcpPacketTypeFlags & kRtcpTmmbr) 1900 { 1901 buildVal = BuildTMMBR(feedback_state.module, rtcp_buffer, position); 1902 if (buildVal == -1) { 1903 return -1; 1904 } else if (buildVal == -2) { 1905 return position; 1906 } 1907 } 1908 if(rtcpPacketTypeFlags & kRtcpTmmbn) 1909 { 1910 buildVal = BuildTMMBN(rtcp_buffer, position); 1911 if (buildVal == -1) { 1912 return -1; 1913 } else if (buildVal == -2) { 1914 return position; 1915 } 1916 } 1917 if(rtcpPacketTypeFlags & kRtcpNack) 1918 { 1919 std::string nackString; 1920 buildVal = BuildNACK(rtcp_buffer, position, nackSize, nackList, 1921 &nackString); 1922 if (buildVal == -1) { 1923 return -1; 1924 } else if (buildVal == -2) { 1925 return position; 1926 } 1927 TRACE_EVENT_INSTANT1("webrtc_rtp", "RTCPSender::NACK", 1928 "nacks", TRACE_STR_COPY(nackString.c_str())); 1929 ++packet_type_counter_.nack_packets; 1930 TRACE_COUNTER_ID1("webrtc_rtp", "RTCP_NACKCount", _SSRC, 1931 packet_type_counter_.nack_packets); 1932 } 1933 if(rtcpPacketTypeFlags & kRtcpXrVoipMetric) 1934 { 1935 buildVal = BuildVoIPMetric(rtcp_buffer, position); 1936 if (buildVal == -1) { 1937 return -1; 1938 } else if (buildVal == -2) { 1939 return position; 1940 } 1941 } 1942 if (rtcpPacketTypeFlags & kRtcpXrReceiverReferenceTime) 1943 { 1944 buildVal = BuildReceiverReferenceTime(rtcp_buffer, 1945 position, 1946 NTPsec, 1947 NTPfrac); 1948 if (buildVal == -1) { 1949 return -1; 1950 } else if (buildVal == -2) { 1951 return position; 1952 } 1953 } 1954 if (rtcpPacketTypeFlags & kRtcpXrDlrrReportBlock) 1955 { 1956 buildVal = BuildDlrr(rtcp_buffer, position, feedback_state.last_xr_rr); 1957 if (buildVal == -1) { 1958 return -1; 1959 } else if (buildVal == -2) { 1960 return position; 1961 } 1962 } 1963 return position; 1964 } 1965 1966 bool RTCPSender::ShouldSendReportBlocks(uint32_t rtcp_packet_type) const { 1967 return Status() == kRtcpCompound || 1968 (rtcp_packet_type & kRtcpReport) || 1969 (rtcp_packet_type & kRtcpSr) || 1970 (rtcp_packet_type & kRtcpRr); 1971 } 1972 1973 bool RTCPSender::PrepareReport(const FeedbackState& feedback_state, 1974 StreamStatistician* statistician, 1975 RTCPReportBlock* report_block, 1976 uint32_t* ntp_secs, uint32_t* ntp_frac) { 1977 // Do we have receive statistics to send? 1978 RtcpStatistics stats; 1979 if (!statistician->GetStatistics(&stats, true)) 1980 return false; 1981 report_block->fractionLost = stats.fraction_lost; 1982 report_block->cumulativeLost = stats.cumulative_lost; 1983 report_block->extendedHighSeqNum = 1984 stats.extended_max_sequence_number; 1985 report_block->jitter = stats.jitter; 1986 1987 // get our NTP as late as possible to avoid a race 1988 _clock->CurrentNtp(*ntp_secs, *ntp_frac); 1989 1990 // Delay since last received report 1991 uint32_t delaySinceLastReceivedSR = 0; 1992 if ((feedback_state.last_rr_ntp_secs != 0) || 1993 (feedback_state.last_rr_ntp_frac != 0)) { 1994 // get the 16 lowest bits of seconds and the 16 higest bits of fractions 1995 uint32_t now=*ntp_secs&0x0000FFFF; 1996 now <<=16; 1997 now += (*ntp_frac&0xffff0000)>>16; 1998 1999 uint32_t receiveTime = feedback_state.last_rr_ntp_secs&0x0000FFFF; 2000 receiveTime <<=16; 2001 receiveTime += (feedback_state.last_rr_ntp_frac&0xffff0000)>>16; 2002 2003 delaySinceLastReceivedSR = now-receiveTime; 2004 } 2005 report_block->delaySinceLastSR = delaySinceLastReceivedSR; 2006 report_block->lastSR = feedback_state.remote_sr; 2007 return true; 2008 } 2009 2010 int32_t 2011 RTCPSender::SendToNetwork(const uint8_t* dataBuffer, 2012 const uint16_t length) 2013 { 2014 CriticalSectionScoped lock(_criticalSectionTransport); 2015 if(_cbTransport) 2016 { 2017 if(_cbTransport->SendRTCPPacket(_id, dataBuffer, length) > 0) 2018 { 2019 return 0; 2020 } 2021 } 2022 return -1; 2023 } 2024 2025 int32_t 2026 RTCPSender::SetCSRCStatus(const bool include) 2027 { 2028 CriticalSectionScoped lock(_criticalSectionRTCPSender); 2029 _includeCSRCs = include; 2030 return 0; 2031 } 2032 2033 int32_t 2034 RTCPSender::SetCSRCs(const uint32_t arrOfCSRC[kRtpCsrcSize], 2035 const uint8_t arrLength) 2036 { 2037 assert(arrLength <= kRtpCsrcSize); 2038 CriticalSectionScoped lock(_criticalSectionRTCPSender); 2039 2040 for(int i = 0; i < arrLength;i++) 2041 { 2042 _CSRC[i] = arrOfCSRC[i]; 2043 } 2044 _CSRCs = arrLength; 2045 return 0; 2046 } 2047 2048 int32_t 2049 RTCPSender::SetApplicationSpecificData(const uint8_t subType, 2050 const uint32_t name, 2051 const uint8_t* data, 2052 const uint16_t length) 2053 { 2054 if(length %4 != 0) 2055 { 2056 LOG(LS_ERROR) << "Failed to SetApplicationSpecificData."; 2057 return -1; 2058 } 2059 CriticalSectionScoped lock(_criticalSectionRTCPSender); 2060 2061 if(_appData) 2062 { 2063 delete [] _appData; 2064 } 2065 2066 _appSend = true; 2067 _appSubType = subType; 2068 _appName = name; 2069 _appData = new uint8_t[length]; 2070 _appLength = length; 2071 memcpy(_appData, data, length); 2072 return 0; 2073 } 2074 2075 int32_t 2076 RTCPSender::SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) 2077 { 2078 CriticalSectionScoped lock(_criticalSectionRTCPSender); 2079 memcpy(&_xrVoIPMetric, VoIPMetric, sizeof(RTCPVoIPMetric)); 2080 2081 _xrSendVoIPMetric = true; 2082 return 0; 2083 } 2084 2085 void RTCPSender::SendRtcpXrReceiverReferenceTime(bool enable) { 2086 CriticalSectionScoped lock(_criticalSectionRTCPSender); 2087 xrSendReceiverReferenceTimeEnabled_ = enable; 2088 } 2089 2090 bool RTCPSender::RtcpXrReceiverReferenceTime() const { 2091 CriticalSectionScoped lock(_criticalSectionRTCPSender); 2092 return xrSendReceiverReferenceTimeEnabled_; 2093 } 2094 2095 // called under critsect _criticalSectionRTCPSender 2096 int32_t RTCPSender::WriteAllReportBlocksToBuffer( 2097 uint8_t* rtcpbuffer, 2098 int pos, 2099 uint8_t& numberOfReportBlocks, 2100 const uint32_t NTPsec, 2101 const uint32_t NTPfrac) { 2102 numberOfReportBlocks = external_report_blocks_.size(); 2103 numberOfReportBlocks += internal_report_blocks_.size(); 2104 if ((pos + numberOfReportBlocks * 24) >= IP_PACKET_SIZE) { 2105 LOG(LS_WARNING) << "Can't fit all report blocks."; 2106 return -1; 2107 } 2108 pos = WriteReportBlocksToBuffer(rtcpbuffer, pos, internal_report_blocks_); 2109 while (!internal_report_blocks_.empty()) { 2110 delete internal_report_blocks_.begin()->second; 2111 internal_report_blocks_.erase(internal_report_blocks_.begin()); 2112 } 2113 pos = WriteReportBlocksToBuffer(rtcpbuffer, pos, external_report_blocks_); 2114 return pos; 2115 } 2116 2117 int32_t RTCPSender::WriteReportBlocksToBuffer( 2118 uint8_t* rtcpbuffer, 2119 int32_t position, 2120 const std::map<uint32_t, RTCPReportBlock*>& report_blocks) { 2121 std::map<uint32_t, RTCPReportBlock*>::const_iterator it = 2122 report_blocks.begin(); 2123 for (; it != report_blocks.end(); it++) { 2124 uint32_t remoteSSRC = it->first; 2125 RTCPReportBlock* reportBlock = it->second; 2126 if (reportBlock) { 2127 // Remote SSRC 2128 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position, remoteSSRC); 2129 position += 4; 2130 2131 // fraction lost 2132 rtcpbuffer[position++] = reportBlock->fractionLost; 2133 2134 // cumulative loss 2135 RtpUtility::AssignUWord24ToBuffer(rtcpbuffer + position, 2136 reportBlock->cumulativeLost); 2137 position += 3; 2138 2139 // extended highest seq_no, contain the highest sequence number received 2140 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position, 2141 reportBlock->extendedHighSeqNum); 2142 position += 4; 2143 2144 // Jitter 2145 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position, 2146 reportBlock->jitter); 2147 position += 4; 2148 2149 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position, 2150 reportBlock->lastSR); 2151 position += 4; 2152 2153 RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position, 2154 reportBlock->delaySinceLastSR); 2155 position += 4; 2156 } 2157 } 2158 return position; 2159 } 2160 2161 // no callbacks allowed inside this function 2162 int32_t 2163 RTCPSender::SetTMMBN(const TMMBRSet* boundingSet, 2164 const uint32_t maxBitrateKbit) 2165 { 2166 CriticalSectionScoped lock(_criticalSectionRTCPSender); 2167 2168 if (0 == _tmmbrHelp.SetTMMBRBoundingSetToSend(boundingSet, maxBitrateKbit)) 2169 { 2170 _sendTMMBN = true; 2171 return 0; 2172 } 2173 return -1; 2174 } 2175 } // namespace webrtc 2176