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