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/rtp_sender.h" 12 13#include <stdlib.h> // srand 14#include <algorithm> 15#include <utility> 16 17#include "webrtc/base/checks.h" 18#include "webrtc/base/logging.h" 19#include "webrtc/base/trace_event.h" 20#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" 21#include "webrtc/modules/rtp_rtcp/source/byte_io.h" 22#include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" 23#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" 24#include "webrtc/modules/rtp_rtcp/source/time_util.h" 25#include "webrtc/system_wrappers/include/critical_section_wrapper.h" 26#include "webrtc/system_wrappers/include/tick_util.h" 27 28namespace webrtc { 29 30// Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. 31static const size_t kMaxPaddingLength = 224; 32static const int kSendSideDelayWindowMs = 1000; 33static const uint32_t kAbsSendTimeFraction = 18; 34 35namespace { 36 37const size_t kRtpHeaderLength = 12; 38const uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. 39 40const char* FrameTypeToString(FrameType frame_type) { 41 switch (frame_type) { 42 case kEmptyFrame: 43 return "empty"; 44 case kAudioFrameSpeech: return "audio_speech"; 45 case kAudioFrameCN: return "audio_cn"; 46 case kVideoFrameKey: return "video_key"; 47 case kVideoFrameDelta: return "video_delta"; 48 } 49 return ""; 50} 51 52// TODO(holmer): Merge this with the implementation in 53// remote_bitrate_estimator_abs_send_time.cc. 54uint32_t ConvertMsTo24Bits(int64_t time_ms) { 55 uint32_t time_24_bits = 56 static_cast<uint32_t>( 57 ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) / 58 1000) & 59 0x00FFFFFF; 60 return time_24_bits; 61} 62} // namespace 63 64class BitrateAggregator { 65 public: 66 explicit BitrateAggregator(BitrateStatisticsObserver* bitrate_callback) 67 : callback_(bitrate_callback), 68 total_bitrate_observer_(*this), 69 retransmit_bitrate_observer_(*this), 70 ssrc_(0) {} 71 72 void OnStatsUpdated() const { 73 if (callback_) 74 callback_->Notify(total_bitrate_observer_.statistics(), 75 retransmit_bitrate_observer_.statistics(), 76 ssrc_); 77 } 78 79 Bitrate::Observer* total_bitrate_observer() { 80 return &total_bitrate_observer_; 81 } 82 Bitrate::Observer* retransmit_bitrate_observer() { 83 return &retransmit_bitrate_observer_; 84 } 85 86 void set_ssrc(uint32_t ssrc) { ssrc_ = ssrc; } 87 88 private: 89 // We assume that these observers are called on the same thread, which is 90 // true for RtpSender as they are called on the Process thread. 91 class BitrateObserver : public Bitrate::Observer { 92 public: 93 explicit BitrateObserver(const BitrateAggregator& aggregator) 94 : aggregator_(aggregator) {} 95 96 // Implements Bitrate::Observer. 97 void BitrateUpdated(const BitrateStatistics& stats) override { 98 statistics_ = stats; 99 aggregator_.OnStatsUpdated(); 100 } 101 102 BitrateStatistics statistics() const { return statistics_; } 103 104 private: 105 BitrateStatistics statistics_; 106 const BitrateAggregator& aggregator_; 107 }; 108 109 BitrateStatisticsObserver* const callback_; 110 BitrateObserver total_bitrate_observer_; 111 BitrateObserver retransmit_bitrate_observer_; 112 uint32_t ssrc_; 113}; 114 115RTPSender::RTPSender( 116 bool audio, 117 Clock* clock, 118 Transport* transport, 119 RtpAudioFeedback* audio_feedback, 120 RtpPacketSender* paced_sender, 121 TransportSequenceNumberAllocator* sequence_number_allocator, 122 TransportFeedbackObserver* transport_feedback_observer, 123 BitrateStatisticsObserver* bitrate_callback, 124 FrameCountObserver* frame_count_observer, 125 SendSideDelayObserver* send_side_delay_observer) 126 : clock_(clock), 127 // TODO(holmer): Remove this conversion when we remove the use of 128 // TickTime. 129 clock_delta_ms_(clock_->TimeInMilliseconds() - 130 TickTime::MillisecondTimestamp()), 131 random_(clock_->TimeInMicroseconds()), 132 bitrates_(new BitrateAggregator(bitrate_callback)), 133 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), 134 audio_configured_(audio), 135 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), 136 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), 137 paced_sender_(paced_sender), 138 transport_sequence_number_allocator_(sequence_number_allocator), 139 transport_feedback_observer_(transport_feedback_observer), 140 last_capture_time_ms_sent_(0), 141 send_critsect_(CriticalSectionWrapper::CreateCriticalSection()), 142 transport_(transport), 143 sending_media_(true), // Default to sending media. 144 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. 145 packet_over_head_(28), 146 payload_type_(-1), 147 payload_type_map_(), 148 rtp_header_extension_map_(), 149 transmission_time_offset_(0), 150 absolute_send_time_(0), 151 rotation_(kVideoRotation_0), 152 cvo_mode_(kCVONone), 153 transport_sequence_number_(0), 154 // NACK. 155 nack_byte_count_times_(), 156 nack_byte_count_(), 157 nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()), 158 packet_history_(clock), 159 // Statistics 160 statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), 161 rtp_stats_callback_(NULL), 162 frame_count_observer_(frame_count_observer), 163 send_side_delay_observer_(send_side_delay_observer), 164 // RTP variables 165 start_timestamp_forced_(false), 166 start_timestamp_(0), 167 ssrc_db_(*SSRCDatabase::GetSSRCDatabase()), 168 remote_ssrc_(0), 169 sequence_number_forced_(false), 170 ssrc_forced_(false), 171 timestamp_(0), 172 capture_time_ms_(0), 173 last_timestamp_time_ms_(0), 174 media_has_been_sent_(false), 175 last_packet_marker_bit_(false), 176 csrcs_(), 177 rtx_(kRtxOff), 178 rtx_payload_type_(-1), 179 target_bitrate_critsect_(CriticalSectionWrapper::CreateCriticalSection()), 180 target_bitrate_(0) { 181 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_)); 182 memset(nack_byte_count_, 0, sizeof(nack_byte_count_)); 183 // We need to seed the random generator. 184 srand(static_cast<uint32_t>(clock_->TimeInMilliseconds())); 185 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. 186 ssrc_rtx_ = ssrc_db_.CreateSSRC(); // Can't be 0. 187 bitrates_->set_ssrc(ssrc_); 188 // Random start, 16 bits. Can't be 0. 189 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); 190 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 191} 192 193RTPSender::~RTPSender() { 194 if (remote_ssrc_ != 0) { 195 ssrc_db_.ReturnSSRC(remote_ssrc_); 196 } 197 ssrc_db_.ReturnSSRC(ssrc_); 198 199 SSRCDatabase::ReturnSSRCDatabase(); 200 while (!payload_type_map_.empty()) { 201 std::map<int8_t, RtpUtility::Payload*>::iterator it = 202 payload_type_map_.begin(); 203 delete it->second; 204 payload_type_map_.erase(it); 205 } 206} 207 208void RTPSender::SetTargetBitrate(uint32_t bitrate) { 209 CriticalSectionScoped cs(target_bitrate_critsect_.get()); 210 target_bitrate_ = bitrate; 211} 212 213uint32_t RTPSender::GetTargetBitrate() { 214 CriticalSectionScoped cs(target_bitrate_critsect_.get()); 215 return target_bitrate_; 216} 217 218uint16_t RTPSender::ActualSendBitrateKbit() const { 219 return (uint16_t)(total_bitrate_sent_.BitrateNow() / 1000); 220} 221 222uint32_t RTPSender::VideoBitrateSent() const { 223 if (video_) { 224 return video_->VideoBitrateSent(); 225 } 226 return 0; 227} 228 229uint32_t RTPSender::FecOverheadRate() const { 230 if (video_) { 231 return video_->FecOverheadRate(); 232 } 233 return 0; 234} 235 236uint32_t RTPSender::NackOverheadRate() const { 237 return nack_bitrate_.BitrateLast(); 238} 239 240int32_t RTPSender::SetTransmissionTimeOffset(int32_t transmission_time_offset) { 241 if (transmission_time_offset > (0x800000 - 1) || 242 transmission_time_offset < -(0x800000 - 1)) { // Word24. 243 return -1; 244 } 245 CriticalSectionScoped cs(send_critsect_.get()); 246 transmission_time_offset_ = transmission_time_offset; 247 return 0; 248} 249 250int32_t RTPSender::SetAbsoluteSendTime(uint32_t absolute_send_time) { 251 if (absolute_send_time > 0xffffff) { // UWord24. 252 return -1; 253 } 254 CriticalSectionScoped cs(send_critsect_.get()); 255 absolute_send_time_ = absolute_send_time; 256 return 0; 257} 258 259void RTPSender::SetVideoRotation(VideoRotation rotation) { 260 CriticalSectionScoped cs(send_critsect_.get()); 261 rotation_ = rotation; 262} 263 264int32_t RTPSender::SetTransportSequenceNumber(uint16_t sequence_number) { 265 CriticalSectionScoped cs(send_critsect_.get()); 266 transport_sequence_number_ = sequence_number; 267 return 0; 268} 269 270int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type, 271 uint8_t id) { 272 CriticalSectionScoped cs(send_critsect_.get()); 273 if (type == kRtpExtensionVideoRotation) { 274 cvo_mode_ = kCVOInactive; 275 return rtp_header_extension_map_.RegisterInactive(type, id); 276 } 277 return rtp_header_extension_map_.Register(type, id); 278} 279 280bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) { 281 CriticalSectionScoped cs(send_critsect_.get()); 282 return rtp_header_extension_map_.IsRegistered(type); 283} 284 285int32_t RTPSender::DeregisterRtpHeaderExtension(RTPExtensionType type) { 286 CriticalSectionScoped cs(send_critsect_.get()); 287 return rtp_header_extension_map_.Deregister(type); 288} 289 290size_t RTPSender::RtpHeaderExtensionTotalLength() const { 291 CriticalSectionScoped cs(send_critsect_.get()); 292 return rtp_header_extension_map_.GetTotalLengthInBytes(); 293} 294 295int32_t RTPSender::RegisterPayload( 296 const char payload_name[RTP_PAYLOAD_NAME_SIZE], 297 int8_t payload_number, 298 uint32_t frequency, 299 size_t channels, 300 uint32_t rate) { 301 assert(payload_name); 302 CriticalSectionScoped cs(send_critsect_.get()); 303 304 std::map<int8_t, RtpUtility::Payload*>::iterator it = 305 payload_type_map_.find(payload_number); 306 307 if (payload_type_map_.end() != it) { 308 // We already use this payload type. 309 RtpUtility::Payload* payload = it->second; 310 assert(payload); 311 312 // Check if it's the same as we already have. 313 if (RtpUtility::StringCompare( 314 payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1)) { 315 if (audio_configured_ && payload->audio && 316 payload->typeSpecific.Audio.frequency == frequency && 317 (payload->typeSpecific.Audio.rate == rate || 318 payload->typeSpecific.Audio.rate == 0 || rate == 0)) { 319 payload->typeSpecific.Audio.rate = rate; 320 // Ensure that we update the rate if new or old is zero. 321 return 0; 322 } 323 if (!audio_configured_ && !payload->audio) { 324 return 0; 325 } 326 } 327 return -1; 328 } 329 int32_t ret_val = 0; 330 RtpUtility::Payload* payload = nullptr; 331 if (audio_configured_) { 332 // TODO(mflodman): Change to CreateAudioPayload and make static. 333 ret_val = audio_->RegisterAudioPayload(payload_name, payload_number, 334 frequency, channels, rate, &payload); 335 } else { 336 payload = video_->CreateVideoPayload(payload_name, payload_number, rate); 337 } 338 if (payload) { 339 payload_type_map_[payload_number] = payload; 340 } 341 return ret_val; 342} 343 344int32_t RTPSender::DeRegisterSendPayload(int8_t payload_type) { 345 CriticalSectionScoped lock(send_critsect_.get()); 346 347 std::map<int8_t, RtpUtility::Payload*>::iterator it = 348 payload_type_map_.find(payload_type); 349 350 if (payload_type_map_.end() == it) { 351 return -1; 352 } 353 RtpUtility::Payload* payload = it->second; 354 delete payload; 355 payload_type_map_.erase(it); 356 return 0; 357} 358 359void RTPSender::SetSendPayloadType(int8_t payload_type) { 360 CriticalSectionScoped cs(send_critsect_.get()); 361 payload_type_ = payload_type; 362} 363 364int8_t RTPSender::SendPayloadType() const { 365 CriticalSectionScoped cs(send_critsect_.get()); 366 return payload_type_; 367} 368 369int RTPSender::SendPayloadFrequency() const { 370 return audio_ != NULL ? audio_->AudioFrequency() : kVideoPayloadTypeFrequency; 371} 372 373int32_t RTPSender::SetMaxPayloadLength(size_t max_payload_length, 374 uint16_t packet_over_head) { 375 // Sanity check. 376 RTC_DCHECK(max_payload_length >= 100 && max_payload_length <= IP_PACKET_SIZE) 377 << "Invalid max payload length: " << max_payload_length; 378 CriticalSectionScoped cs(send_critsect_.get()); 379 max_payload_length_ = max_payload_length; 380 packet_over_head_ = packet_over_head; 381 return 0; 382} 383 384size_t RTPSender::MaxDataPayloadLength() const { 385 int rtx; 386 { 387 CriticalSectionScoped rtx_lock(send_critsect_.get()); 388 rtx = rtx_; 389 } 390 if (audio_configured_) { 391 return max_payload_length_ - RTPHeaderLength(); 392 } else { 393 return max_payload_length_ - RTPHeaderLength() // RTP overhead. 394 - video_->FECPacketOverhead() // FEC/ULP/RED overhead. 395 - ((rtx) ? 2 : 0); // RTX overhead. 396 } 397} 398 399size_t RTPSender::MaxPayloadLength() const { 400 return max_payload_length_; 401} 402 403uint16_t RTPSender::PacketOverHead() const { return packet_over_head_; } 404 405void RTPSender::SetRtxStatus(int mode) { 406 CriticalSectionScoped cs(send_critsect_.get()); 407 rtx_ = mode; 408} 409 410int RTPSender::RtxStatus() const { 411 CriticalSectionScoped cs(send_critsect_.get()); 412 return rtx_; 413} 414 415void RTPSender::SetRtxSsrc(uint32_t ssrc) { 416 CriticalSectionScoped cs(send_critsect_.get()); 417 ssrc_rtx_ = ssrc; 418} 419 420uint32_t RTPSender::RtxSsrc() const { 421 CriticalSectionScoped cs(send_critsect_.get()); 422 return ssrc_rtx_; 423} 424 425void RTPSender::SetRtxPayloadType(int payload_type, 426 int associated_payload_type) { 427 CriticalSectionScoped cs(send_critsect_.get()); 428 RTC_DCHECK_LE(payload_type, 127); 429 RTC_DCHECK_LE(associated_payload_type, 127); 430 if (payload_type < 0) { 431 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type; 432 return; 433 } 434 435 rtx_payload_type_map_[associated_payload_type] = payload_type; 436 rtx_payload_type_ = payload_type; 437} 438 439std::pair<int, int> RTPSender::RtxPayloadType() const { 440 CriticalSectionScoped cs(send_critsect_.get()); 441 for (const auto& kv : rtx_payload_type_map_) { 442 if (kv.second == rtx_payload_type_) { 443 return std::make_pair(rtx_payload_type_, kv.first); 444 } 445 } 446 return std::make_pair(-1, -1); 447} 448 449int32_t RTPSender::CheckPayloadType(int8_t payload_type, 450 RtpVideoCodecTypes* video_type) { 451 CriticalSectionScoped cs(send_critsect_.get()); 452 453 if (payload_type < 0) { 454 LOG(LS_ERROR) << "Invalid payload_type " << payload_type; 455 return -1; 456 } 457 if (audio_configured_) { 458 int8_t red_pl_type = -1; 459 if (audio_->RED(&red_pl_type) == 0) { 460 // We have configured RED. 461 if (red_pl_type == payload_type) { 462 // And it's a match... 463 return 0; 464 } 465 } 466 } 467 if (payload_type_ == payload_type) { 468 if (!audio_configured_) { 469 *video_type = video_->VideoCodecType(); 470 } 471 return 0; 472 } 473 std::map<int8_t, RtpUtility::Payload*>::iterator it = 474 payload_type_map_.find(payload_type); 475 if (it == payload_type_map_.end()) { 476 LOG(LS_WARNING) << "Payload type " << static_cast<int>(payload_type) 477 << " not registered."; 478 return -1; 479 } 480 SetSendPayloadType(payload_type); 481 RtpUtility::Payload* payload = it->second; 482 assert(payload); 483 if (!payload->audio && !audio_configured_) { 484 video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType); 485 *video_type = payload->typeSpecific.Video.videoCodecType; 486 video_->SetMaxConfiguredBitrateVideo(payload->typeSpecific.Video.maxRate); 487 } 488 return 0; 489} 490 491RTPSenderInterface::CVOMode RTPSender::ActivateCVORtpHeaderExtension() { 492 if (cvo_mode_ == kCVOInactive) { 493 CriticalSectionScoped cs(send_critsect_.get()); 494 if (rtp_header_extension_map_.SetActive(kRtpExtensionVideoRotation, true)) { 495 cvo_mode_ = kCVOActivated; 496 } 497 } 498 return cvo_mode_; 499} 500 501int32_t RTPSender::SendOutgoingData(FrameType frame_type, 502 int8_t payload_type, 503 uint32_t capture_timestamp, 504 int64_t capture_time_ms, 505 const uint8_t* payload_data, 506 size_t payload_size, 507 const RTPFragmentationHeader* fragmentation, 508 const RTPVideoHeader* rtp_hdr) { 509 uint32_t ssrc; 510 { 511 // Drop this packet if we're not sending media packets. 512 CriticalSectionScoped cs(send_critsect_.get()); 513 ssrc = ssrc_; 514 if (!sending_media_) { 515 return 0; 516 } 517 } 518 RtpVideoCodecTypes video_type = kRtpVideoGeneric; 519 if (CheckPayloadType(payload_type, &video_type) != 0) { 520 LOG(LS_ERROR) << "Don't send data with unknown payload type: " 521 << static_cast<int>(payload_type) << "."; 522 return -1; 523 } 524 525 int32_t ret_val; 526 if (audio_configured_) { 527 TRACE_EVENT_ASYNC_STEP1("webrtc", "Audio", capture_timestamp, 528 "Send", "type", FrameTypeToString(frame_type)); 529 assert(frame_type == kAudioFrameSpeech || frame_type == kAudioFrameCN || 530 frame_type == kEmptyFrame); 531 532 ret_val = audio_->SendAudio(frame_type, payload_type, capture_timestamp, 533 payload_data, payload_size, fragmentation); 534 } else { 535 TRACE_EVENT_ASYNC_STEP1("webrtc", "Video", capture_time_ms, 536 "Send", "type", FrameTypeToString(frame_type)); 537 assert(frame_type != kAudioFrameSpeech && frame_type != kAudioFrameCN); 538 539 if (frame_type == kEmptyFrame) 540 return 0; 541 542 ret_val = 543 video_->SendVideo(video_type, frame_type, payload_type, 544 capture_timestamp, capture_time_ms, payload_data, 545 payload_size, fragmentation, rtp_hdr); 546 } 547 548 CriticalSectionScoped cs(statistics_crit_.get()); 549 // Note: This is currently only counting for video. 550 if (frame_type == kVideoFrameKey) { 551 ++frame_counts_.key_frames; 552 } else if (frame_type == kVideoFrameDelta) { 553 ++frame_counts_.delta_frames; 554 } 555 if (frame_count_observer_) { 556 frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc); 557 } 558 559 return ret_val; 560} 561 562size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { 563 { 564 CriticalSectionScoped cs(send_critsect_.get()); 565 if ((rtx_ & kRtxRedundantPayloads) == 0) 566 return 0; 567 } 568 569 uint8_t buffer[IP_PACKET_SIZE]; 570 int bytes_left = static_cast<int>(bytes_to_send); 571 while (bytes_left > 0) { 572 size_t length = bytes_left; 573 int64_t capture_time_ms; 574 if (!packet_history_.GetBestFittingPacket(buffer, &length, 575 &capture_time_ms)) { 576 break; 577 } 578 if (!PrepareAndSendPacket(buffer, length, capture_time_ms, true, false)) 579 break; 580 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); 581 RTPHeader rtp_header; 582 rtp_parser.Parse(&rtp_header); 583 bytes_left -= static_cast<int>(length - rtp_header.headerLength); 584 } 585 return bytes_to_send - bytes_left; 586} 587 588void RTPSender::BuildPaddingPacket(uint8_t* packet, 589 size_t header_length, 590 size_t padding_length) { 591 packet[0] |= 0x20; // Set padding bit. 592 int32_t* data = reinterpret_cast<int32_t*>(&(packet[header_length])); 593 594 // Fill data buffer with random data. 595 for (size_t j = 0; j < (padding_length >> 2); ++j) { 596 data[j] = rand(); // NOLINT 597 } 598 // Set number of padding bytes in the last byte of the packet. 599 packet[header_length + padding_length - 1] = 600 static_cast<uint8_t>(padding_length); 601} 602 603size_t RTPSender::SendPadData(size_t bytes, 604 bool timestamp_provided, 605 uint32_t timestamp, 606 int64_t capture_time_ms) { 607 // Always send full padding packets. This is accounted for by the 608 // RtpPacketSender, 609 // which will make sure we don't send too much padding even if a single packet 610 // is larger than requested. 611 size_t padding_bytes_in_packet = 612 std::min(MaxDataPayloadLength(), kMaxPaddingLength); 613 size_t bytes_sent = 0; 614 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( 615 kRtpExtensionTransportSequenceNumber) && 616 transport_sequence_number_allocator_; 617 for (; bytes > 0; bytes -= padding_bytes_in_packet) { 618 if (bytes < padding_bytes_in_packet) 619 bytes = padding_bytes_in_packet; 620 621 uint32_t ssrc; 622 uint16_t sequence_number; 623 int payload_type; 624 bool over_rtx; 625 { 626 CriticalSectionScoped cs(send_critsect_.get()); 627 if (!timestamp_provided) { 628 timestamp = timestamp_; 629 capture_time_ms = capture_time_ms_; 630 } 631 if (rtx_ == kRtxOff) { 632 // Without RTX we can't send padding in the middle of frames. 633 if (!last_packet_marker_bit_) 634 return 0; 635 ssrc = ssrc_; 636 sequence_number = sequence_number_; 637 ++sequence_number_; 638 payload_type = payload_type_; 639 over_rtx = false; 640 } else { 641 // Without abs-send-time a media packet must be sent before padding so 642 // that the timestamps used for estimation are correct. 643 if (!media_has_been_sent_ && !rtp_header_extension_map_.IsRegistered( 644 kRtpExtensionAbsoluteSendTime)) 645 return 0; 646 // Only change change the timestamp of padding packets sent over RTX. 647 // Padding only packets over RTP has to be sent as part of a media 648 // frame (and therefore the same timestamp). 649 if (last_timestamp_time_ms_ > 0) { 650 timestamp += 651 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_) * 90; 652 capture_time_ms += 653 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_); 654 } 655 ssrc = ssrc_rtx_; 656 sequence_number = sequence_number_rtx_; 657 ++sequence_number_rtx_; 658 payload_type = rtx_payload_type_; 659 over_rtx = true; 660 } 661 } 662 663 uint8_t padding_packet[IP_PACKET_SIZE]; 664 size_t header_length = 665 CreateRtpHeader(padding_packet, payload_type, ssrc, false, timestamp, 666 sequence_number, std::vector<uint32_t>()); 667 BuildPaddingPacket(padding_packet, header_length, padding_bytes_in_packet); 668 size_t length = padding_bytes_in_packet + header_length; 669 int64_t now_ms = clock_->TimeInMilliseconds(); 670 671 RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length); 672 RTPHeader rtp_header; 673 rtp_parser.Parse(&rtp_header); 674 675 if (capture_time_ms > 0) { 676 UpdateTransmissionTimeOffset( 677 padding_packet, length, rtp_header, now_ms - capture_time_ms); 678 } 679 680 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); 681 682 PacketOptions options; 683 if (using_transport_seq) { 684 options.packet_id = 685 UpdateTransportSequenceNumber(padding_packet, length, rtp_header); 686 } 687 688 if (using_transport_seq && transport_feedback_observer_) { 689 transport_feedback_observer_->AddPacket(options.packet_id, length, true); 690 } 691 692 if (!SendPacketToNetwork(padding_packet, length, options)) 693 break; 694 695 bytes_sent += padding_bytes_in_packet; 696 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); 697 } 698 699 return bytes_sent; 700} 701 702void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) { 703 packet_history_.SetStorePacketsStatus(enable, number_to_store); 704} 705 706bool RTPSender::StorePackets() const { 707 return packet_history_.StorePackets(); 708} 709 710int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) { 711 size_t length = IP_PACKET_SIZE; 712 uint8_t data_buffer[IP_PACKET_SIZE]; 713 int64_t capture_time_ms; 714 715 if (!packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true, 716 data_buffer, &length, 717 &capture_time_ms)) { 718 // Packet not found. 719 return 0; 720 } 721 722 if (paced_sender_) { 723 RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length); 724 RTPHeader header; 725 if (!rtp_parser.Parse(&header)) { 726 assert(false); 727 return -1; 728 } 729 // Convert from TickTime to Clock since capture_time_ms is based on 730 // TickTime. 731 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; 732 paced_sender_->InsertPacket( 733 RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber, 734 corrected_capture_tims_ms, length - header.headerLength, true); 735 736 return length; 737 } 738 int rtx = kRtxOff; 739 { 740 CriticalSectionScoped lock(send_critsect_.get()); 741 rtx = rtx_; 742 } 743 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, 744 (rtx & kRtxRetransmitted) > 0, true)) { 745 return -1; 746 } 747 return static_cast<int32_t>(length); 748} 749 750bool RTPSender::SendPacketToNetwork(const uint8_t* packet, 751 size_t size, 752 const PacketOptions& options) { 753 int bytes_sent = -1; 754 if (transport_) { 755 bytes_sent = transport_->SendRtp(packet, size, options) 756 ? static_cast<int>(size) 757 : -1; 758 } 759 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 760 "RTPSender::SendPacketToNetwork", "size", size, "sent", 761 bytes_sent); 762 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. 763 if (bytes_sent <= 0) { 764 LOG(LS_WARNING) << "Transport failed to send packet"; 765 return false; 766 } 767 return true; 768} 769 770int RTPSender::SelectiveRetransmissions() const { 771 if (!video_) 772 return -1; 773 return video_->SelectiveRetransmissions(); 774} 775 776int RTPSender::SetSelectiveRetransmissions(uint8_t settings) { 777 if (!video_) 778 return -1; 779 video_->SetSelectiveRetransmissions(settings); 780 return 0; 781} 782 783void RTPSender::OnReceivedNACK(const std::list<uint16_t>& nack_sequence_numbers, 784 int64_t avg_rtt) { 785 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 786 "RTPSender::OnReceivedNACK", "num_seqnum", 787 nack_sequence_numbers.size(), "avg_rtt", avg_rtt); 788 const int64_t now = clock_->TimeInMilliseconds(); 789 uint32_t bytes_re_sent = 0; 790 uint32_t target_bitrate = GetTargetBitrate(); 791 792 // Enough bandwidth to send NACK? 793 if (!ProcessNACKBitRate(now)) { 794 LOG(LS_INFO) << "NACK bitrate reached. Skip sending NACK response. Target " 795 << target_bitrate; 796 return; 797 } 798 799 for (std::list<uint16_t>::const_iterator it = nack_sequence_numbers.begin(); 800 it != nack_sequence_numbers.end(); ++it) { 801 const int32_t bytes_sent = ReSendPacket(*it, 5 + avg_rtt); 802 if (bytes_sent > 0) { 803 bytes_re_sent += bytes_sent; 804 } else if (bytes_sent == 0) { 805 // The packet has previously been resent. 806 // Try resending next packet in the list. 807 continue; 808 } else { 809 // Failed to send one Sequence number. Give up the rest in this nack. 810 LOG(LS_WARNING) << "Failed resending RTP packet " << *it 811 << ", Discard rest of packets"; 812 break; 813 } 814 // Delay bandwidth estimate (RTT * BW). 815 if (target_bitrate != 0 && avg_rtt) { 816 // kbits/s * ms = bits => bits/8 = bytes 817 size_t target_bytes = 818 (static_cast<size_t>(target_bitrate / 1000) * avg_rtt) >> 3; 819 if (bytes_re_sent > target_bytes) { 820 break; // Ignore the rest of the packets in the list. 821 } 822 } 823 } 824 if (bytes_re_sent > 0) { 825 UpdateNACKBitRate(bytes_re_sent, now); 826 } 827} 828 829bool RTPSender::ProcessNACKBitRate(uint32_t now) { 830 uint32_t num = 0; 831 size_t byte_count = 0; 832 const uint32_t kAvgIntervalMs = 1000; 833 uint32_t target_bitrate = GetTargetBitrate(); 834 835 CriticalSectionScoped cs(send_critsect_.get()); 836 837 if (target_bitrate == 0) { 838 return true; 839 } 840 for (num = 0; num < NACK_BYTECOUNT_SIZE; ++num) { 841 if ((now - nack_byte_count_times_[num]) > kAvgIntervalMs) { 842 // Don't use data older than 1sec. 843 break; 844 } else { 845 byte_count += nack_byte_count_[num]; 846 } 847 } 848 uint32_t time_interval = kAvgIntervalMs; 849 if (num == NACK_BYTECOUNT_SIZE) { 850 // More than NACK_BYTECOUNT_SIZE nack messages has been received 851 // during the last msg_interval. 852 if (nack_byte_count_times_[num - 1] <= now) { 853 time_interval = now - nack_byte_count_times_[num - 1]; 854 } 855 } 856 return (byte_count * 8) < (target_bitrate / 1000 * time_interval); 857} 858 859void RTPSender::UpdateNACKBitRate(uint32_t bytes, int64_t now) { 860 CriticalSectionScoped cs(send_critsect_.get()); 861 if (bytes == 0) 862 return; 863 nack_bitrate_.Update(bytes); 864 // Save bitrate statistics. 865 // Shift all but first time. 866 for (int i = NACK_BYTECOUNT_SIZE - 2; i >= 0; i--) { 867 nack_byte_count_[i + 1] = nack_byte_count_[i]; 868 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; 869 } 870 nack_byte_count_[0] = bytes; 871 nack_byte_count_times_[0] = now; 872} 873 874// Called from pacer when we can send the packet. 875bool RTPSender::TimeToSendPacket(uint16_t sequence_number, 876 int64_t capture_time_ms, 877 bool retransmission) { 878 size_t length = IP_PACKET_SIZE; 879 uint8_t data_buffer[IP_PACKET_SIZE]; 880 int64_t stored_time_ms; 881 882 if (!packet_history_.GetPacketAndSetSendTime(sequence_number, 883 0, 884 retransmission, 885 data_buffer, 886 &length, 887 &stored_time_ms)) { 888 // Packet cannot be found. Allow sending to continue. 889 return true; 890 } 891 if (!retransmission && capture_time_ms > 0) { 892 UpdateDelayStatistics(capture_time_ms, clock_->TimeInMilliseconds()); 893 } 894 int rtx; 895 { 896 CriticalSectionScoped lock(send_critsect_.get()); 897 rtx = rtx_; 898 } 899 return PrepareAndSendPacket(data_buffer, 900 length, 901 capture_time_ms, 902 retransmission && (rtx & kRtxRetransmitted) > 0, 903 retransmission); 904} 905 906bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, 907 size_t length, 908 int64_t capture_time_ms, 909 bool send_over_rtx, 910 bool is_retransmit) { 911 uint8_t* buffer_to_send_ptr = buffer; 912 913 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); 914 RTPHeader rtp_header; 915 rtp_parser.Parse(&rtp_header); 916 if (!is_retransmit && rtp_header.markerBit) { 917 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend", 918 capture_time_ms); 919 } 920 921 TRACE_EVENT_INSTANT2( 922 TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PrepareAndSendPacket", 923 "timestamp", rtp_header.timestamp, "seqnum", rtp_header.sequenceNumber); 924 925 uint8_t data_buffer_rtx[IP_PACKET_SIZE]; 926 if (send_over_rtx) { 927 BuildRtxPacket(buffer, &length, data_buffer_rtx); 928 buffer_to_send_ptr = data_buffer_rtx; 929 } 930 931 int64_t now_ms = clock_->TimeInMilliseconds(); 932 int64_t diff_ms = now_ms - capture_time_ms; 933 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, 934 diff_ms); 935 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); 936 937 // TODO(sprang): Potentially too much overhead in IsRegistered()? 938 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( 939 kRtpExtensionTransportSequenceNumber) && 940 transport_sequence_number_allocator_; 941 942 PacketOptions options; 943 if (using_transport_seq) { 944 options.packet_id = 945 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); 946 } 947 948 if (using_transport_seq && transport_feedback_observer_) { 949 transport_feedback_observer_->AddPacket(options.packet_id, length, true); 950 } 951 952 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); 953 if (ret) { 954 CriticalSectionScoped lock(send_critsect_.get()); 955 media_has_been_sent_ = true; 956 } 957 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, 958 is_retransmit); 959 return ret; 960} 961 962void RTPSender::UpdateRtpStats(const uint8_t* buffer, 963 size_t packet_length, 964 const RTPHeader& header, 965 bool is_rtx, 966 bool is_retransmit) { 967 StreamDataCounters* counters; 968 // Get ssrc before taking statistics_crit_ to avoid possible deadlock. 969 uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC(); 970 971 CriticalSectionScoped lock(statistics_crit_.get()); 972 if (is_rtx) { 973 counters = &rtx_rtp_stats_; 974 } else { 975 counters = &rtp_stats_; 976 } 977 978 total_bitrate_sent_.Update(packet_length); 979 980 if (counters->first_packet_time_ms == -1) { 981 counters->first_packet_time_ms = clock_->TimeInMilliseconds(); 982 } 983 if (IsFecPacket(buffer, header)) { 984 counters->fec.AddPacket(packet_length, header); 985 } 986 if (is_retransmit) { 987 counters->retransmitted.AddPacket(packet_length, header); 988 } 989 counters->transmitted.AddPacket(packet_length, header); 990 991 if (rtp_stats_callback_) { 992 rtp_stats_callback_->DataCountersUpdated(*counters, ssrc); 993 } 994} 995 996bool RTPSender::IsFecPacket(const uint8_t* buffer, 997 const RTPHeader& header) const { 998 if (!video_) { 999 return false; 1000 } 1001 bool fec_enabled; 1002 uint8_t pt_red; 1003 uint8_t pt_fec; 1004 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec); 1005 return fec_enabled && 1006 header.payloadType == pt_red && 1007 buffer[header.headerLength] == pt_fec; 1008} 1009 1010size_t RTPSender::TimeToSendPadding(size_t bytes) { 1011 if (audio_configured_ || bytes == 0) 1012 return 0; 1013 { 1014 CriticalSectionScoped cs(send_critsect_.get()); 1015 if (!sending_media_) 1016 return 0; 1017 } 1018 size_t bytes_sent = TrySendRedundantPayloads(bytes); 1019 if (bytes_sent < bytes) 1020 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); 1021 return bytes_sent; 1022} 1023 1024// TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. 1025int32_t RTPSender::SendToNetwork(uint8_t* buffer, 1026 size_t payload_length, 1027 size_t rtp_header_length, 1028 int64_t capture_time_ms, 1029 StorageType storage, 1030 RtpPacketSender::Priority priority) { 1031 RtpUtility::RtpHeaderParser rtp_parser(buffer, 1032 payload_length + rtp_header_length); 1033 RTPHeader rtp_header; 1034 rtp_parser.Parse(&rtp_header); 1035 1036 int64_t now_ms = clock_->TimeInMilliseconds(); 1037 1038 // |capture_time_ms| <= 0 is considered invalid. 1039 // TODO(holmer): This should be changed all over Video Engine so that negative 1040 // time is consider invalid, while 0 is considered a valid time. 1041 if (capture_time_ms > 0) { 1042 UpdateTransmissionTimeOffset(buffer, payload_length + rtp_header_length, 1043 rtp_header, now_ms - capture_time_ms); 1044 } 1045 1046 UpdateAbsoluteSendTime(buffer, payload_length + rtp_header_length, 1047 rtp_header, now_ms); 1048 1049 // Used for NACK and to spread out the transmission of packets. 1050 if (packet_history_.PutRTPPacket(buffer, rtp_header_length + payload_length, 1051 capture_time_ms, storage) != 0) { 1052 return -1; 1053 } 1054 1055 if (paced_sender_) { 1056 // Correct offset between implementations of millisecond time stamps in 1057 // TickTime and Clock. 1058 int64_t corrected_time_ms = capture_time_ms + clock_delta_ms_; 1059 paced_sender_->InsertPacket(priority, rtp_header.ssrc, 1060 rtp_header.sequenceNumber, corrected_time_ms, 1061 payload_length, false); 1062 if (last_capture_time_ms_sent_ == 0 || 1063 corrected_time_ms > last_capture_time_ms_sent_) { 1064 last_capture_time_ms_sent_ = corrected_time_ms; 1065 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 1066 "PacedSend", corrected_time_ms, 1067 "capture_time_ms", corrected_time_ms); 1068 } 1069 return 0; 1070 } 1071 if (capture_time_ms > 0) { 1072 UpdateDelayStatistics(capture_time_ms, now_ms); 1073 } 1074 1075 size_t length = payload_length + rtp_header_length; 1076 bool sent = SendPacketToNetwork(buffer, length, PacketOptions()); 1077 1078 // Mark the packet as sent in the history even if send failed. Dropping a 1079 // packet here should be treated as any other packet drop so we should be 1080 // ready for a retransmission. 1081 packet_history_.SetSent(rtp_header.sequenceNumber); 1082 1083 if (!sent) 1084 return -1; 1085 1086 { 1087 CriticalSectionScoped lock(send_critsect_.get()); 1088 media_has_been_sent_ = true; 1089 } 1090 UpdateRtpStats(buffer, length, rtp_header, false, false); 1091 return 0; 1092} 1093 1094void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 1095 if (!send_side_delay_observer_) 1096 return; 1097 1098 uint32_t ssrc; 1099 int avg_delay_ms = 0; 1100 int max_delay_ms = 0; 1101 { 1102 CriticalSectionScoped lock(send_critsect_.get()); 1103 ssrc = ssrc_; 1104 } 1105 { 1106 CriticalSectionScoped cs(statistics_crit_.get()); 1107 // TODO(holmer): Compute this iteratively instead. 1108 send_delays_[now_ms] = now_ms - capture_time_ms; 1109 send_delays_.erase(send_delays_.begin(), 1110 send_delays_.lower_bound(now_ms - 1111 kSendSideDelayWindowMs)); 1112 int num_delays = 0; 1113 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs); 1114 it != send_delays_.end(); ++it) { 1115 max_delay_ms = std::max(max_delay_ms, it->second); 1116 avg_delay_ms += it->second; 1117 ++num_delays; 1118 } 1119 if (num_delays == 0) 1120 return; 1121 avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays; 1122 } 1123 send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, 1124 ssrc); 1125} 1126 1127void RTPSender::ProcessBitrate() { 1128 CriticalSectionScoped cs(send_critsect_.get()); 1129 total_bitrate_sent_.Process(); 1130 nack_bitrate_.Process(); 1131 if (audio_configured_) { 1132 return; 1133 } 1134 video_->ProcessBitrate(); 1135} 1136 1137size_t RTPSender::RTPHeaderLength() const { 1138 CriticalSectionScoped lock(send_critsect_.get()); 1139 size_t rtp_header_length = kRtpHeaderLength; 1140 rtp_header_length += sizeof(uint32_t) * csrcs_.size(); 1141 rtp_header_length += RtpHeaderExtensionTotalLength(); 1142 return rtp_header_length; 1143} 1144 1145uint16_t RTPSender::AllocateSequenceNumber(uint16_t packets_to_send) { 1146 CriticalSectionScoped cs(send_critsect_.get()); 1147 uint16_t first_allocated_sequence_number = sequence_number_; 1148 sequence_number_ += packets_to_send; 1149 return first_allocated_sequence_number; 1150} 1151 1152void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats, 1153 StreamDataCounters* rtx_stats) const { 1154 CriticalSectionScoped lock(statistics_crit_.get()); 1155 *rtp_stats = rtp_stats_; 1156 *rtx_stats = rtx_rtp_stats_; 1157} 1158 1159size_t RTPSender::CreateRtpHeader(uint8_t* header, 1160 int8_t payload_type, 1161 uint32_t ssrc, 1162 bool marker_bit, 1163 uint32_t timestamp, 1164 uint16_t sequence_number, 1165 const std::vector<uint32_t>& csrcs) const { 1166 header[0] = 0x80; // version 2. 1167 header[1] = static_cast<uint8_t>(payload_type); 1168 if (marker_bit) { 1169 header[1] |= kRtpMarkerBitMask; // Marker bit is set. 1170 } 1171 ByteWriter<uint16_t>::WriteBigEndian(header + 2, sequence_number); 1172 ByteWriter<uint32_t>::WriteBigEndian(header + 4, timestamp); 1173 ByteWriter<uint32_t>::WriteBigEndian(header + 8, ssrc); 1174 int32_t rtp_header_length = kRtpHeaderLength; 1175 1176 if (csrcs.size() > 0) { 1177 uint8_t* ptr = &header[rtp_header_length]; 1178 for (size_t i = 0; i < csrcs.size(); ++i) { 1179 ByteWriter<uint32_t>::WriteBigEndian(ptr, csrcs[i]); 1180 ptr += 4; 1181 } 1182 header[0] = (header[0] & 0xf0) | csrcs.size(); 1183 1184 // Update length of header. 1185 rtp_header_length += sizeof(uint32_t) * csrcs.size(); 1186 } 1187 1188 uint16_t len = 1189 BuildRTPHeaderExtension(header + rtp_header_length, marker_bit); 1190 if (len > 0) { 1191 header[0] |= 0x10; // Set extension bit. 1192 rtp_header_length += len; 1193 } 1194 return rtp_header_length; 1195} 1196 1197int32_t RTPSender::BuildRTPheader(uint8_t* data_buffer, 1198 int8_t payload_type, 1199 bool marker_bit, 1200 uint32_t capture_timestamp, 1201 int64_t capture_time_ms, 1202 bool timestamp_provided, 1203 bool inc_sequence_number) { 1204 assert(payload_type >= 0); 1205 CriticalSectionScoped cs(send_critsect_.get()); 1206 1207 if (timestamp_provided) { 1208 timestamp_ = start_timestamp_ + capture_timestamp; 1209 } else { 1210 // Make a unique time stamp. 1211 // We can't inc by the actual time, since then we increase the risk of back 1212 // timing. 1213 timestamp_++; 1214 } 1215 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); 1216 uint32_t sequence_number = sequence_number_++; 1217 capture_time_ms_ = capture_time_ms; 1218 last_packet_marker_bit_ = marker_bit; 1219 return CreateRtpHeader(data_buffer, payload_type, ssrc_, marker_bit, 1220 timestamp_, sequence_number, csrcs_); 1221} 1222 1223uint16_t RTPSender::BuildRTPHeaderExtension(uint8_t* data_buffer, 1224 bool marker_bit) const { 1225 if (rtp_header_extension_map_.Size() <= 0) { 1226 return 0; 1227 } 1228 // RTP header extension, RFC 3550. 1229 // 0 1 2 3 1230 // 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 1231 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1232 // | defined by profile | length | 1233 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1234 // | header extension | 1235 // | .... | 1236 // 1237 const uint32_t kPosLength = 2; 1238 const uint32_t kHeaderLength = kRtpOneByteHeaderLength; 1239 1240 // Add extension ID (0xBEDE). 1241 ByteWriter<uint16_t>::WriteBigEndian(data_buffer, 1242 kRtpOneByteHeaderExtensionId); 1243 1244 // Add extensions. 1245 uint16_t total_block_length = 0; 1246 1247 RTPExtensionType type = rtp_header_extension_map_.First(); 1248 while (type != kRtpExtensionNone) { 1249 uint8_t block_length = 0; 1250 uint8_t* extension_data = &data_buffer[kHeaderLength + total_block_length]; 1251 switch (type) { 1252 case kRtpExtensionTransmissionTimeOffset: 1253 block_length = BuildTransmissionTimeOffsetExtension(extension_data); 1254 break; 1255 case kRtpExtensionAudioLevel: 1256 block_length = BuildAudioLevelExtension(extension_data); 1257 break; 1258 case kRtpExtensionAbsoluteSendTime: 1259 block_length = BuildAbsoluteSendTimeExtension(extension_data); 1260 break; 1261 case kRtpExtensionVideoRotation: 1262 block_length = BuildVideoRotationExtension(extension_data); 1263 break; 1264 case kRtpExtensionTransportSequenceNumber: 1265 block_length = BuildTransportSequenceNumberExtension( 1266 extension_data, transport_sequence_number_); 1267 break; 1268 default: 1269 assert(false); 1270 } 1271 total_block_length += block_length; 1272 type = rtp_header_extension_map_.Next(type); 1273 } 1274 if (total_block_length == 0) { 1275 // No extension added. 1276 return 0; 1277 } 1278 // Add padding elements until we've filled a 32 bit block. 1279 size_t padding_bytes = 1280 RtpUtility::Word32Align(total_block_length) - total_block_length; 1281 if (padding_bytes > 0) { 1282 memset(&data_buffer[kHeaderLength + total_block_length], 0, padding_bytes); 1283 total_block_length += padding_bytes; 1284 } 1285 // Set header length (in number of Word32, header excluded). 1286 ByteWriter<uint16_t>::WriteBigEndian(data_buffer + kPosLength, 1287 total_block_length / 4); 1288 // Total added length. 1289 return kHeaderLength + total_block_length; 1290} 1291 1292uint8_t RTPSender::BuildTransmissionTimeOffsetExtension( 1293 uint8_t* data_buffer) const { 1294 // From RFC 5450: Transmission Time Offsets in RTP Streams. 1295 // 1296 // The transmission time is signaled to the receiver in-band using the 1297 // general mechanism for RTP header extensions [RFC5285]. The payload 1298 // of this extension (the transmitted value) is a 24-bit signed integer. 1299 // When added to the RTP timestamp of the packet, it represents the 1300 // "effective" RTP transmission time of the packet, on the RTP 1301 // timescale. 1302 // 1303 // The form of the transmission offset extension block: 1304 // 1305 // 0 1 2 3 1306 // 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 1307 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1308 // | ID | len=2 | transmission offset | 1309 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1310 1311 // Get id defined by user. 1312 uint8_t id; 1313 if (rtp_header_extension_map_.GetId(kRtpExtensionTransmissionTimeOffset, 1314 &id) != 0) { 1315 // Not registered. 1316 return 0; 1317 } 1318 size_t pos = 0; 1319 const uint8_t len = 2; 1320 data_buffer[pos++] = (id << 4) + len; 1321 ByteWriter<int32_t, 3>::WriteBigEndian(data_buffer + pos, 1322 transmission_time_offset_); 1323 pos += 3; 1324 assert(pos == kTransmissionTimeOffsetLength); 1325 return kTransmissionTimeOffsetLength; 1326} 1327 1328uint8_t RTPSender::BuildAudioLevelExtension(uint8_t* data_buffer) const { 1329 // An RTP Header Extension for Client-to-Mixer Audio Level Indication 1330 // 1331 // https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/ 1332 // 1333 // The form of the audio level extension block: 1334 // 1335 // 0 1 1336 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 1337 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1338 // | ID | len=0 |V| level | 1339 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1340 // 1341 1342 // Get id defined by user. 1343 uint8_t id; 1344 if (rtp_header_extension_map_.GetId(kRtpExtensionAudioLevel, &id) != 0) { 1345 // Not registered. 1346 return 0; 1347 } 1348 size_t pos = 0; 1349 const uint8_t len = 0; 1350 data_buffer[pos++] = (id << 4) + len; 1351 data_buffer[pos++] = (1 << 7) + 0; // Voice, 0 dBov. 1352 assert(pos == kAudioLevelLength); 1353 return kAudioLevelLength; 1354} 1355 1356uint8_t RTPSender::BuildAbsoluteSendTimeExtension(uint8_t* data_buffer) const { 1357 // Absolute send time in RTP streams. 1358 // 1359 // The absolute send time is signaled to the receiver in-band using the 1360 // general mechanism for RTP header extensions [RFC5285]. The payload 1361 // of this extension (the transmitted value) is a 24-bit unsigned integer 1362 // containing the sender's current time in seconds as a fixed point number 1363 // with 18 bits fractional part. 1364 // 1365 // The form of the absolute send time extension block: 1366 // 1367 // 0 1 2 3 1368 // 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 1369 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1370 // | ID | len=2 | absolute send time | 1371 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1372 1373 // Get id defined by user. 1374 uint8_t id; 1375 if (rtp_header_extension_map_.GetId(kRtpExtensionAbsoluteSendTime, 1376 &id) != 0) { 1377 // Not registered. 1378 return 0; 1379 } 1380 size_t pos = 0; 1381 const uint8_t len = 2; 1382 data_buffer[pos++] = (id << 4) + len; 1383 ByteWriter<uint32_t, 3>::WriteBigEndian(data_buffer + pos, 1384 absolute_send_time_); 1385 pos += 3; 1386 assert(pos == kAbsoluteSendTimeLength); 1387 return kAbsoluteSendTimeLength; 1388} 1389 1390uint8_t RTPSender::BuildVideoRotationExtension(uint8_t* data_buffer) const { 1391 // Coordination of Video Orientation in RTP streams. 1392 // 1393 // Coordination of Video Orientation consists in signaling of the current 1394 // orientation of the image captured on the sender side to the receiver for 1395 // appropriate rendering and displaying. 1396 // 1397 // 0 1 1398 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 1399 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1400 // | ID | len=0 |0 0 0 0 C F R R| 1401 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1402 // 1403 1404 // Get id defined by user. 1405 uint8_t id; 1406 if (rtp_header_extension_map_.GetId(kRtpExtensionVideoRotation, &id) != 0) { 1407 // Not registered. 1408 return 0; 1409 } 1410 size_t pos = 0; 1411 const uint8_t len = 0; 1412 data_buffer[pos++] = (id << 4) + len; 1413 data_buffer[pos++] = ConvertVideoRotationToCVOByte(rotation_); 1414 assert(pos == kVideoRotationLength); 1415 return kVideoRotationLength; 1416} 1417 1418uint8_t RTPSender::BuildTransportSequenceNumberExtension( 1419 uint8_t* data_buffer, 1420 uint16_t sequence_number) const { 1421 // 0 1 2 1422 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 1423 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1424 // | ID | L=1 |transport wide sequence number | 1425 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1426 1427 // Get id defined by user. 1428 uint8_t id; 1429 if (rtp_header_extension_map_.GetId(kRtpExtensionTransportSequenceNumber, 1430 &id) != 0) { 1431 // Not registered. 1432 return 0; 1433 } 1434 size_t pos = 0; 1435 const uint8_t len = 1; 1436 data_buffer[pos++] = (id << 4) + len; 1437 ByteWriter<uint16_t>::WriteBigEndian(data_buffer + pos, sequence_number); 1438 pos += 2; 1439 assert(pos == kTransportSequenceNumberLength); 1440 return kTransportSequenceNumberLength; 1441} 1442 1443bool RTPSender::FindHeaderExtensionPosition(RTPExtensionType type, 1444 const uint8_t* rtp_packet, 1445 size_t rtp_packet_length, 1446 const RTPHeader& rtp_header, 1447 size_t* position) const { 1448 // Get length until start of header extension block. 1449 int extension_block_pos = 1450 rtp_header_extension_map_.GetLengthUntilBlockStartInBytes(type); 1451 if (extension_block_pos < 0) { 1452 LOG(LS_WARNING) << "Failed to find extension position for " << type 1453 << " as it is not registered."; 1454 return false; 1455 } 1456 1457 HeaderExtension header_extension(type); 1458 1459 size_t block_pos = 1460 kRtpHeaderLength + rtp_header.numCSRCs + extension_block_pos; 1461 if (rtp_packet_length < block_pos + header_extension.length || 1462 rtp_header.headerLength < block_pos + header_extension.length) { 1463 LOG(LS_WARNING) << "Failed to find extension position for " << type 1464 << " as the length is invalid."; 1465 return false; 1466 } 1467 1468 // Verify that header contains extension. 1469 if (!((rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs] == 0xBE) && 1470 (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) { 1471 LOG(LS_WARNING) << "Failed to find extension position for " << type 1472 << "as hdr extension not found."; 1473 return false; 1474 } 1475 1476 *position = block_pos; 1477 return true; 1478} 1479 1480RTPSender::ExtensionStatus RTPSender::VerifyExtension( 1481 RTPExtensionType extension_type, 1482 uint8_t* rtp_packet, 1483 size_t rtp_packet_length, 1484 const RTPHeader& rtp_header, 1485 size_t extension_length_bytes, 1486 size_t* extension_offset) const { 1487 // Get id. 1488 uint8_t id = 0; 1489 if (rtp_header_extension_map_.GetId(extension_type, &id) != 0) 1490 return ExtensionStatus::kNotRegistered; 1491 1492 size_t block_pos = 0; 1493 if (!FindHeaderExtensionPosition(extension_type, rtp_packet, 1494 rtp_packet_length, rtp_header, &block_pos)) 1495 return ExtensionStatus::kError; 1496 1497 // Verify that header contains extension. 1498 if (!((rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs] == 0xBE) && 1499 (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) { 1500 LOG(LS_WARNING) 1501 << "Failed to update absolute send time, hdr extension not found."; 1502 return ExtensionStatus::kError; 1503 } 1504 1505 // Verify first byte in block. 1506 const uint8_t first_block_byte = (id << 4) + (extension_length_bytes - 2); 1507 if (rtp_packet[block_pos] != first_block_byte) 1508 return ExtensionStatus::kError; 1509 1510 *extension_offset = block_pos; 1511 return ExtensionStatus::kOk; 1512} 1513 1514void RTPSender::UpdateTransmissionTimeOffset(uint8_t* rtp_packet, 1515 size_t rtp_packet_length, 1516 const RTPHeader& rtp_header, 1517 int64_t time_diff_ms) const { 1518 size_t offset; 1519 CriticalSectionScoped cs(send_critsect_.get()); 1520 switch (VerifyExtension(kRtpExtensionTransmissionTimeOffset, rtp_packet, 1521 rtp_packet_length, rtp_header, 1522 kTransmissionTimeOffsetLength, &offset)) { 1523 case ExtensionStatus::kNotRegistered: 1524 return; 1525 case ExtensionStatus::kError: 1526 LOG(LS_WARNING) << "Failed to update transmission time offset."; 1527 return; 1528 case ExtensionStatus::kOk: 1529 break; 1530 default: 1531 RTC_NOTREACHED(); 1532 } 1533 1534 // Update transmission offset field (converting to a 90 kHz timestamp). 1535 ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, 1536 time_diff_ms * 90); // RTP timestamp. 1537} 1538 1539bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, 1540 size_t rtp_packet_length, 1541 const RTPHeader& rtp_header, 1542 bool is_voiced, 1543 uint8_t dBov) const { 1544 size_t offset; 1545 CriticalSectionScoped cs(send_critsect_.get()); 1546 1547 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet, 1548 rtp_packet_length, rtp_header, kAudioLevelLength, 1549 &offset)) { 1550 case ExtensionStatus::kNotRegistered: 1551 return false; 1552 case ExtensionStatus::kError: 1553 LOG(LS_WARNING) << "Failed to update audio level."; 1554 return false; 1555 case ExtensionStatus::kOk: 1556 break; 1557 default: 1558 RTC_NOTREACHED(); 1559 } 1560 1561 rtp_packet[offset + 1] = (is_voiced ? 0x80 : 0x00) + (dBov & 0x7f); 1562 return true; 1563} 1564 1565bool RTPSender::UpdateVideoRotation(uint8_t* rtp_packet, 1566 size_t rtp_packet_length, 1567 const RTPHeader& rtp_header, 1568 VideoRotation rotation) const { 1569 size_t offset; 1570 CriticalSectionScoped cs(send_critsect_.get()); 1571 1572 switch (VerifyExtension(kRtpExtensionVideoRotation, rtp_packet, 1573 rtp_packet_length, rtp_header, kVideoRotationLength, 1574 &offset)) { 1575 case ExtensionStatus::kNotRegistered: 1576 return false; 1577 case ExtensionStatus::kError: 1578 LOG(LS_WARNING) << "Failed to update CVO."; 1579 return false; 1580 case ExtensionStatus::kOk: 1581 break; 1582 default: 1583 RTC_NOTREACHED(); 1584 } 1585 1586 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation); 1587 return true; 1588} 1589 1590void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet, 1591 size_t rtp_packet_length, 1592 const RTPHeader& rtp_header, 1593 int64_t now_ms) const { 1594 size_t offset; 1595 CriticalSectionScoped cs(send_critsect_.get()); 1596 1597 switch (VerifyExtension(kRtpExtensionAbsoluteSendTime, rtp_packet, 1598 rtp_packet_length, rtp_header, 1599 kAbsoluteSendTimeLength, &offset)) { 1600 case ExtensionStatus::kNotRegistered: 1601 return; 1602 case ExtensionStatus::kError: 1603 LOG(LS_WARNING) << "Failed to update absolute send time"; 1604 return; 1605 case ExtensionStatus::kOk: 1606 break; 1607 default: 1608 RTC_NOTREACHED(); 1609 } 1610 1611 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit 1612 // fractional part). 1613 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, 1614 ConvertMsTo24Bits(now_ms)); 1615} 1616 1617uint16_t RTPSender::UpdateTransportSequenceNumber( 1618 uint8_t* rtp_packet, 1619 size_t rtp_packet_length, 1620 const RTPHeader& rtp_header) const { 1621 size_t offset; 1622 CriticalSectionScoped cs(send_critsect_.get()); 1623 1624 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet, 1625 rtp_packet_length, rtp_header, 1626 kTransportSequenceNumberLength, &offset)) { 1627 case ExtensionStatus::kNotRegistered: 1628 return 0; 1629 case ExtensionStatus::kError: 1630 LOG(LS_WARNING) << "Failed to update transport sequence number"; 1631 return 0; 1632 case ExtensionStatus::kOk: 1633 break; 1634 default: 1635 RTC_NOTREACHED(); 1636 } 1637 1638 uint16_t seq = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1639 BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); 1640 return seq; 1641} 1642 1643void RTPSender::SetSendingStatus(bool enabled) { 1644 if (enabled) { 1645 uint32_t frequency_hz = SendPayloadFrequency(); 1646 uint32_t RTPtime = CurrentRtp(*clock_, frequency_hz); 1647 1648 // Will be ignored if it's already configured via API. 1649 SetStartTimestamp(RTPtime, false); 1650 } else { 1651 CriticalSectionScoped lock(send_critsect_.get()); 1652 if (!ssrc_forced_) { 1653 // Generate a new SSRC. 1654 ssrc_db_.ReturnSSRC(ssrc_); 1655 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. 1656 bitrates_->set_ssrc(ssrc_); 1657 } 1658 // Don't initialize seq number if SSRC passed externally. 1659 if (!sequence_number_forced_ && !ssrc_forced_) { 1660 // Generate a new sequence number. 1661 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 1662 } 1663 } 1664} 1665 1666void RTPSender::SetSendingMediaStatus(bool enabled) { 1667 CriticalSectionScoped cs(send_critsect_.get()); 1668 sending_media_ = enabled; 1669} 1670 1671bool RTPSender::SendingMedia() const { 1672 CriticalSectionScoped cs(send_critsect_.get()); 1673 return sending_media_; 1674} 1675 1676uint32_t RTPSender::Timestamp() const { 1677 CriticalSectionScoped cs(send_critsect_.get()); 1678 return timestamp_; 1679} 1680 1681void RTPSender::SetStartTimestamp(uint32_t timestamp, bool force) { 1682 CriticalSectionScoped cs(send_critsect_.get()); 1683 if (force) { 1684 start_timestamp_forced_ = true; 1685 start_timestamp_ = timestamp; 1686 } else { 1687 if (!start_timestamp_forced_) { 1688 start_timestamp_ = timestamp; 1689 } 1690 } 1691} 1692 1693uint32_t RTPSender::StartTimestamp() const { 1694 CriticalSectionScoped cs(send_critsect_.get()); 1695 return start_timestamp_; 1696} 1697 1698uint32_t RTPSender::GenerateNewSSRC() { 1699 // If configured via API, return 0. 1700 CriticalSectionScoped cs(send_critsect_.get()); 1701 1702 if (ssrc_forced_) { 1703 return 0; 1704 } 1705 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. 1706 bitrates_->set_ssrc(ssrc_); 1707 return ssrc_; 1708} 1709 1710void RTPSender::SetSSRC(uint32_t ssrc) { 1711 // This is configured via the API. 1712 CriticalSectionScoped cs(send_critsect_.get()); 1713 1714 if (ssrc_ == ssrc && ssrc_forced_) { 1715 return; // Since it's same ssrc, don't reset anything. 1716 } 1717 ssrc_forced_ = true; 1718 ssrc_db_.ReturnSSRC(ssrc_); 1719 ssrc_db_.RegisterSSRC(ssrc); 1720 ssrc_ = ssrc; 1721 bitrates_->set_ssrc(ssrc_); 1722 if (!sequence_number_forced_) { 1723 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 1724 } 1725} 1726 1727uint32_t RTPSender::SSRC() const { 1728 CriticalSectionScoped cs(send_critsect_.get()); 1729 return ssrc_; 1730} 1731 1732void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { 1733 assert(csrcs.size() <= kRtpCsrcSize); 1734 CriticalSectionScoped cs(send_critsect_.get()); 1735 csrcs_ = csrcs; 1736} 1737 1738void RTPSender::SetSequenceNumber(uint16_t seq) { 1739 CriticalSectionScoped cs(send_critsect_.get()); 1740 sequence_number_forced_ = true; 1741 sequence_number_ = seq; 1742} 1743 1744uint16_t RTPSender::SequenceNumber() const { 1745 CriticalSectionScoped cs(send_critsect_.get()); 1746 return sequence_number_; 1747} 1748 1749// Audio. 1750int32_t RTPSender::SendTelephoneEvent(uint8_t key, 1751 uint16_t time_ms, 1752 uint8_t level) { 1753 if (!audio_configured_) { 1754 return -1; 1755 } 1756 return audio_->SendTelephoneEvent(key, time_ms, level); 1757} 1758 1759int32_t RTPSender::SetAudioPacketSize(uint16_t packet_size_samples) { 1760 if (!audio_configured_) { 1761 return -1; 1762 } 1763 return audio_->SetAudioPacketSize(packet_size_samples); 1764} 1765 1766int32_t RTPSender::SetAudioLevel(uint8_t level_d_bov) { 1767 return audio_->SetAudioLevel(level_d_bov); 1768} 1769 1770int32_t RTPSender::SetRED(int8_t payload_type) { 1771 if (!audio_configured_) { 1772 return -1; 1773 } 1774 return audio_->SetRED(payload_type); 1775} 1776 1777int32_t RTPSender::RED(int8_t *payload_type) const { 1778 if (!audio_configured_) { 1779 return -1; 1780 } 1781 return audio_->RED(payload_type); 1782} 1783 1784RtpVideoCodecTypes RTPSender::VideoCodecType() const { 1785 assert(!audio_configured_ && "Sender is an audio stream!"); 1786 return video_->VideoCodecType(); 1787} 1788 1789uint32_t RTPSender::MaxConfiguredBitrateVideo() const { 1790 if (audio_configured_) { 1791 return 0; 1792 } 1793 return video_->MaxConfiguredBitrateVideo(); 1794} 1795 1796void RTPSender::SetGenericFECStatus(bool enable, 1797 uint8_t payload_type_red, 1798 uint8_t payload_type_fec) { 1799 RTC_DCHECK(!audio_configured_); 1800 video_->SetGenericFECStatus(enable, payload_type_red, payload_type_fec); 1801} 1802 1803void RTPSender::GenericFECStatus(bool* enable, 1804 uint8_t* payload_type_red, 1805 uint8_t* payload_type_fec) const { 1806 RTC_DCHECK(!audio_configured_); 1807 video_->GenericFECStatus(enable, payload_type_red, payload_type_fec); 1808} 1809 1810int32_t RTPSender::SetFecParameters( 1811 const FecProtectionParams *delta_params, 1812 const FecProtectionParams *key_params) { 1813 if (audio_configured_) { 1814 return -1; 1815 } 1816 video_->SetFecParameters(delta_params, key_params); 1817 return 0; 1818} 1819 1820void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length, 1821 uint8_t* buffer_rtx) { 1822 CriticalSectionScoped cs(send_critsect_.get()); 1823 uint8_t* data_buffer_rtx = buffer_rtx; 1824 // Add RTX header. 1825 RtpUtility::RtpHeaderParser rtp_parser( 1826 reinterpret_cast<const uint8_t*>(buffer), *length); 1827 1828 RTPHeader rtp_header; 1829 rtp_parser.Parse(&rtp_header); 1830 1831 // Add original RTP header. 1832 memcpy(data_buffer_rtx, buffer, rtp_header.headerLength); 1833 1834 // Replace payload type, if a specific type is set for RTX. 1835 if (rtx_payload_type_ != -1) { 1836 data_buffer_rtx[1] = static_cast<uint8_t>(rtx_payload_type_); 1837 if (rtp_header.markerBit) 1838 data_buffer_rtx[1] |= kRtpMarkerBitMask; 1839 } 1840 1841 // Replace sequence number. 1842 uint8_t* ptr = data_buffer_rtx + 2; 1843 ByteWriter<uint16_t>::WriteBigEndian(ptr, sequence_number_rtx_++); 1844 1845 // Replace SSRC. 1846 ptr += 6; 1847 ByteWriter<uint32_t>::WriteBigEndian(ptr, ssrc_rtx_); 1848 1849 // Add OSN (original sequence number). 1850 ptr = data_buffer_rtx + rtp_header.headerLength; 1851 ByteWriter<uint16_t>::WriteBigEndian(ptr, rtp_header.sequenceNumber); 1852 ptr += 2; 1853 1854 // Add original payload data. 1855 memcpy(ptr, buffer + rtp_header.headerLength, 1856 *length - rtp_header.headerLength); 1857 *length += 2; 1858} 1859 1860void RTPSender::RegisterRtpStatisticsCallback( 1861 StreamDataCountersCallback* callback) { 1862 CriticalSectionScoped cs(statistics_crit_.get()); 1863 rtp_stats_callback_ = callback; 1864} 1865 1866StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { 1867 CriticalSectionScoped cs(statistics_crit_.get()); 1868 return rtp_stats_callback_; 1869} 1870 1871uint32_t RTPSender::BitrateSent() const { 1872 return total_bitrate_sent_.BitrateLast(); 1873} 1874 1875void RTPSender::SetRtpState(const RtpState& rtp_state) { 1876 SetStartTimestamp(rtp_state.start_timestamp, true); 1877 CriticalSectionScoped lock(send_critsect_.get()); 1878 sequence_number_ = rtp_state.sequence_number; 1879 sequence_number_forced_ = true; 1880 timestamp_ = rtp_state.timestamp; 1881 capture_time_ms_ = rtp_state.capture_time_ms; 1882 last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms; 1883 media_has_been_sent_ = rtp_state.media_has_been_sent; 1884} 1885 1886RtpState RTPSender::GetRtpState() const { 1887 CriticalSectionScoped lock(send_critsect_.get()); 1888 1889 RtpState state; 1890 state.sequence_number = sequence_number_; 1891 state.start_timestamp = start_timestamp_; 1892 state.timestamp = timestamp_; 1893 state.capture_time_ms = capture_time_ms_; 1894 state.last_timestamp_time_ms = last_timestamp_time_ms_; 1895 state.media_has_been_sent = media_has_been_sent_; 1896 1897 return state; 1898} 1899 1900void RTPSender::SetRtxRtpState(const RtpState& rtp_state) { 1901 CriticalSectionScoped lock(send_critsect_.get()); 1902 sequence_number_rtx_ = rtp_state.sequence_number; 1903} 1904 1905RtpState RTPSender::GetRtxRtpState() const { 1906 CriticalSectionScoped lock(send_critsect_.get()); 1907 1908 RtpState state; 1909 state.sequence_number = sequence_number_rtx_; 1910 state.start_timestamp = start_timestamp_; 1911 1912 return state; 1913} 1914 1915} // namespace webrtc 1916