Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(298)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 2700413002: Revert of Delete class SSRCDatabase, and its global ssrc registry. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 rtp_stats_callback_(nullptr), 104 rtp_stats_callback_(nullptr),
105 total_bitrate_sent_(kBitrateStatisticsWindowMs, 105 total_bitrate_sent_(kBitrateStatisticsWindowMs,
106 RateStatistics::kBpsScale), 106 RateStatistics::kBpsScale),
107 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), 107 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale),
108 frame_count_observer_(frame_count_observer), 108 frame_count_observer_(frame_count_observer),
109 send_side_delay_observer_(send_side_delay_observer), 109 send_side_delay_observer_(send_side_delay_observer),
110 event_log_(event_log), 110 event_log_(event_log),
111 send_packet_observer_(send_packet_observer), 111 send_packet_observer_(send_packet_observer),
112 bitrate_callback_(bitrate_callback), 112 bitrate_callback_(bitrate_callback),
113 // RTP variables 113 // RTP variables
114 ssrc_db_(SSRCDatabase::GetSSRCDatabase()),
114 remote_ssrc_(0), 115 remote_ssrc_(0),
115 sequence_number_forced_(false), 116 sequence_number_forced_(false),
117 ssrc_forced_(false),
116 last_rtp_timestamp_(0), 118 last_rtp_timestamp_(0),
117 capture_time_ms_(0), 119 capture_time_ms_(0),
118 last_timestamp_time_ms_(0), 120 last_timestamp_time_ms_(0),
119 media_has_been_sent_(false), 121 media_has_been_sent_(false),
120 last_packet_marker_bit_(false), 122 last_packet_marker_bit_(false),
121 csrcs_(), 123 csrcs_(),
122 rtx_(kRtxOff), 124 rtx_(kRtxOff),
123 rtp_overhead_bytes_per_packet_(0), 125 rtp_overhead_bytes_per_packet_(0),
124 retransmission_rate_limiter_(retransmission_rate_limiter), 126 retransmission_rate_limiter_(retransmission_rate_limiter),
125 overhead_observer_(overhead_observer), 127 overhead_observer_(overhead_observer),
126 send_side_bwe_with_overhead_( 128 send_side_bwe_with_overhead_(
127 webrtc::field_trial::FindFullName( 129 webrtc::field_trial::FindFullName(
128 "WebRTC-SendSideBwe-WithOverhead") == "Enabled") { 130 "WebRTC-SendSideBwe-WithOverhead") == "Enabled") {
131 ssrc_ = ssrc_db_->CreateSSRC();
132 RTC_DCHECK(ssrc_ != 0);
133 ssrc_rtx_ = ssrc_db_->CreateSSRC();
134 RTC_DCHECK(ssrc_rtx_ != 0);
135
129 // This random initialization is not intended to be cryptographic strong. 136 // This random initialization is not intended to be cryptographic strong.
130 timestamp_offset_ = random_.Rand<uint32_t>(); 137 timestamp_offset_ = random_.Rand<uint32_t>();
131 // Random start, 16 bits. Can't be 0. 138 // Random start, 16 bits. Can't be 0.
132 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); 139 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
133 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 140 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
134 141
135 // Store FlexFEC packets in the packet history data structure, so they can 142 // Store FlexFEC packets in the packet history data structure, so they can
136 // be found when paced. 143 // be found when paced.
137 if (flexfec_sender) { 144 if (flexfec_sender) {
138 flexfec_packet_history_.SetStorePacketsStatus( 145 flexfec_packet_history_.SetStorePacketsStatus(
139 true, kMinFlexfecPacketsToStoreForPacing); 146 true, kMinFlexfecPacketsToStoreForPacing);
140 } 147 }
141 } 148 }
142 149
143 RTPSender::~RTPSender() { 150 RTPSender::~RTPSender() {
144 // TODO(tommi): Use a thread checker to ensure the object is created and 151 // TODO(tommi): Use a thread checker to ensure the object is created and
145 // deleted on the same thread. At the moment this isn't possible due to 152 // deleted on the same thread. At the moment this isn't possible due to
146 // voe::ChannelOwner in voice engine. To reproduce, run: 153 // voe::ChannelOwner in voice engine. To reproduce, run:
147 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus 154 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus
148 155
149 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member 156 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member
150 // variables but we grab them in all other methods. (what's the design?) 157 // variables but we grab them in all other methods. (what's the design?)
151 // Start documenting what thread we're on in what method so that it's easier 158 // Start documenting what thread we're on in what method so that it's easier
152 // to understand performance attributes and possibly remove locks. 159 // to understand performance attributes and possibly remove locks.
160 if (remote_ssrc_ != 0) {
161 ssrc_db_->ReturnSSRC(remote_ssrc_);
162 }
163 ssrc_db_->ReturnSSRC(ssrc_);
164
165 SSRCDatabase::ReturnSSRCDatabase();
153 while (!payload_type_map_.empty()) { 166 while (!payload_type_map_.empty()) {
154 std::map<int8_t, RtpUtility::Payload*>::iterator it = 167 std::map<int8_t, RtpUtility::Payload*>::iterator it =
155 payload_type_map_.begin(); 168 payload_type_map_.begin();
156 delete it->second; 169 delete it->second;
157 payload_type_map_.erase(it); 170 payload_type_map_.erase(it);
158 } 171 }
159 } 172 }
160 173
161 uint16_t RTPSender::ActualSendBitrateKbit() const { 174 uint16_t RTPSender::ActualSendBitrateKbit() const {
162 rtc::CritScope cs(&statistics_crit_); 175 rtc::CritScope cs(&statistics_crit_);
(...skipping 27 matching lines...) Expand all
190 switch (type) { 203 switch (type) {
191 case kRtpExtensionVideoRotation: 204 case kRtpExtensionVideoRotation:
192 case kRtpExtensionPlayoutDelay: 205 case kRtpExtensionPlayoutDelay:
193 case kRtpExtensionTransmissionTimeOffset: 206 case kRtpExtensionTransmissionTimeOffset:
194 case kRtpExtensionAbsoluteSendTime: 207 case kRtpExtensionAbsoluteSendTime:
195 case kRtpExtensionAudioLevel: 208 case kRtpExtensionAudioLevel:
196 case kRtpExtensionTransportSequenceNumber: 209 case kRtpExtensionTransportSequenceNumber:
197 return rtp_header_extension_map_.Register(type, id); 210 return rtp_header_extension_map_.Register(type, id);
198 case kRtpExtensionNone: 211 case kRtpExtensionNone:
199 case kRtpExtensionNumberOfExtensions: 212 case kRtpExtensionNumberOfExtensions:
200 LOG(LS_ERROR) << "Invalid RTP extension type for registration."; 213 LOG(LS_ERROR) << "Invalid RTP extension type for registration";
201 return -1; 214 return -1;
202 } 215 }
203 return -1; 216 return -1;
204 } 217 }
205 218
206 bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) const { 219 bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) const {
207 rtc::CritScope lock(&send_critsect_); 220 rtc::CritScope lock(&send_critsect_);
208 return rtp_header_extension_map_.IsRegistered(type); 221 return rtp_header_extension_map_.IsRegistered(type);
209 } 222 }
210 223
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 rtx_ = mode; 327 rtx_ = mode;
315 } 328 }
316 329
317 int RTPSender::RtxStatus() const { 330 int RTPSender::RtxStatus() const {
318 rtc::CritScope lock(&send_critsect_); 331 rtc::CritScope lock(&send_critsect_);
319 return rtx_; 332 return rtx_;
320 } 333 }
321 334
322 void RTPSender::SetRtxSsrc(uint32_t ssrc) { 335 void RTPSender::SetRtxSsrc(uint32_t ssrc) {
323 rtc::CritScope lock(&send_critsect_); 336 rtc::CritScope lock(&send_critsect_);
324 ssrc_rtx_.emplace(ssrc); 337 ssrc_rtx_ = ssrc;
325 } 338 }
326 339
327 uint32_t RTPSender::RtxSsrc() const { 340 uint32_t RTPSender::RtxSsrc() const {
328 rtc::CritScope lock(&send_critsect_); 341 rtc::CritScope lock(&send_critsect_);
329 RTC_DCHECK(ssrc_rtx_); 342 return ssrc_rtx_;
330 return *ssrc_rtx_;
331 } 343 }
332 344
333 void RTPSender::SetRtxPayloadType(int payload_type, 345 void RTPSender::SetRtxPayloadType(int payload_type,
334 int associated_payload_type) { 346 int associated_payload_type) {
335 rtc::CritScope lock(&send_critsect_); 347 rtc::CritScope lock(&send_critsect_);
336 RTC_DCHECK_LE(payload_type, 127); 348 RTC_DCHECK_LE(payload_type, 127);
337 RTC_DCHECK_LE(associated_payload_type, 127); 349 RTC_DCHECK_LE(associated_payload_type, 127);
338 if (payload_type < 0) { 350 if (payload_type < 0) {
339 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type << "."; 351 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type;
340 return; 352 return;
341 } 353 }
342 354
343 rtx_payload_type_map_[associated_payload_type] = payload_type; 355 rtx_payload_type_map_[associated_payload_type] = payload_type;
344 } 356 }
345 357
346 int32_t RTPSender::CheckPayloadType(int8_t payload_type, 358 int32_t RTPSender::CheckPayloadType(int8_t payload_type,
347 RtpVideoCodecTypes* video_type) { 359 RtpVideoCodecTypes* video_type) {
348 rtc::CritScope lock(&send_critsect_); 360 rtc::CritScope lock(&send_critsect_);
349 361
350 if (payload_type < 0) { 362 if (payload_type < 0) {
351 LOG(LS_ERROR) << "Invalid payload_type " << payload_type << "."; 363 LOG(LS_ERROR) << "Invalid payload_type " << payload_type;
352 return -1; 364 return -1;
353 } 365 }
354 if (payload_type_ == payload_type) { 366 if (payload_type_ == payload_type) {
355 if (!audio_configured_) { 367 if (!audio_configured_) {
356 *video_type = video_->VideoCodecType(); 368 *video_type = video_->VideoCodecType();
357 } 369 }
358 return 0; 370 return 0;
359 } 371 }
360 std::map<int8_t, RtpUtility::Payload*>::iterator it = 372 std::map<int8_t, RtpUtility::Payload*>::iterator it =
361 payload_type_map_.find(payload_type); 373 payload_type_map_.find(payload_type);
(...skipping 20 matching lines...) Expand all
382 size_t payload_size, 394 size_t payload_size,
383 const RTPFragmentationHeader* fragmentation, 395 const RTPFragmentationHeader* fragmentation,
384 const RTPVideoHeader* rtp_header, 396 const RTPVideoHeader* rtp_header,
385 uint32_t* transport_frame_id_out) { 397 uint32_t* transport_frame_id_out) {
386 uint32_t ssrc; 398 uint32_t ssrc;
387 uint16_t sequence_number; 399 uint16_t sequence_number;
388 uint32_t rtp_timestamp; 400 uint32_t rtp_timestamp;
389 { 401 {
390 // Drop this packet if we're not sending media packets. 402 // Drop this packet if we're not sending media packets.
391 rtc::CritScope lock(&send_critsect_); 403 rtc::CritScope lock(&send_critsect_);
392 RTC_DCHECK(ssrc_); 404 ssrc = ssrc_;
393
394 ssrc = *ssrc_;
395 sequence_number = sequence_number_; 405 sequence_number = sequence_number_;
396 rtp_timestamp = timestamp_offset_ + capture_timestamp; 406 rtp_timestamp = timestamp_offset_ + capture_timestamp;
397 if (transport_frame_id_out) 407 if (transport_frame_id_out)
398 *transport_frame_id_out = rtp_timestamp; 408 *transport_frame_id_out = rtp_timestamp;
399 if (!sending_media_) 409 if (!sending_media_)
400 return true; 410 return true;
401 } 411 }
402 RtpVideoCodecTypes video_type = kRtpVideoGeneric; 412 RtpVideoCodecTypes video_type = kRtpVideoGeneric;
403 if (CheckPayloadType(payload_type, &video_type) != 0) { 413 if (CheckPayloadType(payload_type, &video_type) != 0) {
404 LOG(LS_ERROR) << "Don't send data with unknown payload type: " 414 LOG(LS_ERROR) << "Don't send data with unknown payload type: "
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 if (rtx_ == kRtxOff) { 514 if (rtx_ == kRtxOff) {
505 if (payload_type_ == -1) 515 if (payload_type_ == -1)
506 break; 516 break;
507 // Without RTX we can't send padding in the middle of frames. 517 // Without RTX we can't send padding in the middle of frames.
508 // For audio marker bits doesn't mark the end of a frame and frames 518 // For audio marker bits doesn't mark the end of a frame and frames
509 // are usually a single packet, so for now we don't apply this rule 519 // are usually a single packet, so for now we don't apply this rule
510 // for audio. 520 // for audio.
511 if (!audio_configured_ && !last_packet_marker_bit_) { 521 if (!audio_configured_ && !last_packet_marker_bit_) {
512 break; 522 break;
513 } 523 }
514 if (!ssrc_) { 524 ssrc = ssrc_;
515 LOG(LS_ERROR) << "SSRC unset.";
516 return 0;
517 }
518
519 RTC_DCHECK(ssrc_);
520 ssrc = *ssrc_;
521
522 sequence_number = sequence_number_; 525 sequence_number = sequence_number_;
523 ++sequence_number_; 526 ++sequence_number_;
524 payload_type = payload_type_; 527 payload_type = payload_type_;
525 over_rtx = false; 528 over_rtx = false;
526 } else { 529 } else {
527 // Without abs-send-time or transport sequence number a media packet 530 // Without abs-send-time or transport sequence number a media packet
528 // must be sent before padding so that the timestamps used for 531 // must be sent before padding so that the timestamps used for
529 // estimation are correct. 532 // estimation are correct.
530 if (!media_has_been_sent_ && 533 if (!media_has_been_sent_ &&
531 !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) || 534 !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) ||
532 (rtp_header_extension_map_.IsRegistered( 535 (rtp_header_extension_map_.IsRegistered(
533 TransportSequenceNumber::kId) && 536 TransportSequenceNumber::kId) &&
534 transport_sequence_number_allocator_))) { 537 transport_sequence_number_allocator_))) {
535 break; 538 break;
536 } 539 }
537 // Only change change the timestamp of padding packets sent over RTX. 540 // Only change change the timestamp of padding packets sent over RTX.
538 // Padding only packets over RTP has to be sent as part of a media 541 // Padding only packets over RTP has to be sent as part of a media
539 // frame (and therefore the same timestamp). 542 // frame (and therefore the same timestamp).
540 if (last_timestamp_time_ms_ > 0) { 543 if (last_timestamp_time_ms_ > 0) {
541 timestamp += 544 timestamp +=
542 (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs; 545 (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs;
543 capture_time_ms += (now_ms - last_timestamp_time_ms_); 546 capture_time_ms += (now_ms - last_timestamp_time_ms_);
544 } 547 }
545 if (!ssrc_rtx_) { 548 ssrc = ssrc_rtx_;
546 LOG(LS_ERROR) << "RTX SSRC unset.";
547 return 0;
548 }
549 RTC_DCHECK(ssrc_rtx_);
550 ssrc = *ssrc_rtx_;
551 sequence_number = sequence_number_rtx_; 549 sequence_number = sequence_number_rtx_;
552 ++sequence_number_rtx_; 550 ++sequence_number_rtx_;
553 payload_type = rtx_payload_type_map_.begin()->second; 551 payload_type = rtx_payload_type_map_.begin()->second;
554 over_rtx = true; 552 over_rtx = true;
555 } 553 }
556 } 554 }
557 555
558 RtpPacketToSend padding_packet(&rtp_header_extension_map_); 556 RtpPacketToSend padding_packet(&rtp_header_extension_map_);
559 padding_packet.SetPayloadType(payload_type); 557 padding_packet.SetPayloadType(payload_type);
560 padding_packet.SetMarker(false); 558 padding_packet.SetMarker(false);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 if (event_log_ && bytes_sent > 0) { 638 if (event_log_ && bytes_sent > 0) {
641 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(), 639 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(),
642 packet.size()); 640 packet.size());
643 } 641 }
644 } 642 }
645 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 643 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
646 "RTPSender::SendPacketToNetwork", "size", packet.size(), 644 "RTPSender::SendPacketToNetwork", "size", packet.size(),
647 "sent", bytes_sent); 645 "sent", bytes_sent);
648 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. 646 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer.
649 if (bytes_sent <= 0) { 647 if (bytes_sent <= 0) {
650 LOG(LS_WARNING) << "Transport failed to send packet."; 648 LOG(LS_WARNING) << "Transport failed to send packet";
651 return false; 649 return false;
652 } 650 }
653 return true; 651 return true;
654 } 652 }
655 653
656 int RTPSender::SelectiveRetransmissions() const { 654 int RTPSender::SelectiveRetransmissions() const {
657 if (!video_) 655 if (!video_)
658 return -1; 656 return -1;
659 return video_->SelectiveRetransmissions(); 657 return video_->SelectiveRetransmissions();
660 } 658 }
661 659
662 int RTPSender::SetSelectiveRetransmissions(uint8_t settings) { 660 int RTPSender::SetSelectiveRetransmissions(uint8_t settings) {
663 if (!video_) 661 if (!video_)
664 return -1; 662 return -1;
665 video_->SetSelectiveRetransmissions(settings); 663 video_->SetSelectiveRetransmissions(settings);
666 return 0; 664 return 0;
667 } 665 }
668 666
669 void RTPSender::OnReceivedNack( 667 void RTPSender::OnReceivedNack(
670 const std::vector<uint16_t>& nack_sequence_numbers, 668 const std::vector<uint16_t>& nack_sequence_numbers,
671 int64_t avg_rtt) { 669 int64_t avg_rtt) {
672 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 670 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
673 "RTPSender::OnReceivedNACK", "num_seqnum", 671 "RTPSender::OnReceivedNACK", "num_seqnum",
674 nack_sequence_numbers.size(), "avg_rtt", avg_rtt); 672 nack_sequence_numbers.size(), "avg_rtt", avg_rtt);
675 for (uint16_t seq_no : nack_sequence_numbers) { 673 for (uint16_t seq_no : nack_sequence_numbers) {
676 const int32_t bytes_sent = ReSendPacket(seq_no, 5 + avg_rtt); 674 const int32_t bytes_sent = ReSendPacket(seq_no, 5 + avg_rtt);
677 if (bytes_sent < 0) { 675 if (bytes_sent < 0) {
678 // Failed to send one Sequence number. Give up the rest in this nack. 676 // Failed to send one Sequence number. Give up the rest in this nack.
679 LOG(LS_WARNING) << "Failed resending RTP packet " << seq_no 677 LOG(LS_WARNING) << "Failed resending RTP packet " << seq_no
680 << ", Discard rest of packets."; 678 << ", Discard rest of packets";
681 break; 679 break;
682 } 680 }
683 } 681 }
684 } 682 }
685 683
686 void RTPSender::OnReceivedRtcpReportBlocks( 684 void RTPSender::OnReceivedRtcpReportBlocks(
687 const ReportBlockList& report_blocks) { 685 const ReportBlockList& report_blocks) {
688 playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks); 686 playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks);
689 } 687 }
690 688
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
914 912
915 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 913 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
916 if (!send_side_delay_observer_ || capture_time_ms <= 0) 914 if (!send_side_delay_observer_ || capture_time_ms <= 0)
917 return; 915 return;
918 916
919 uint32_t ssrc; 917 uint32_t ssrc;
920 int avg_delay_ms = 0; 918 int avg_delay_ms = 0;
921 int max_delay_ms = 0; 919 int max_delay_ms = 0;
922 { 920 {
923 rtc::CritScope lock(&send_critsect_); 921 rtc::CritScope lock(&send_critsect_);
924 if (!ssrc_) 922 ssrc = ssrc_;
925 return;
926 ssrc = *ssrc_;
927 } 923 }
928 { 924 {
929 rtc::CritScope cs(&statistics_crit_); 925 rtc::CritScope cs(&statistics_crit_);
930 // TODO(holmer): Compute this iteratively instead. 926 // TODO(holmer): Compute this iteratively instead.
931 send_delays_[now_ms] = now_ms - capture_time_ms; 927 send_delays_[now_ms] = now_ms - capture_time_ms;
932 send_delays_.erase(send_delays_.begin(), 928 send_delays_.erase(send_delays_.begin(),
933 send_delays_.lower_bound(now_ms - 929 send_delays_.lower_bound(now_ms -
934 kSendSideDelayWindowMs)); 930 kSendSideDelayWindowMs));
935 int num_delays = 0; 931 int num_delays = 0;
936 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs); 932 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs);
(...skipping 19 matching lines...) Expand all
956 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc); 952 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc);
957 } 953 }
958 954
959 void RTPSender::ProcessBitrate() { 955 void RTPSender::ProcessBitrate() {
960 if (!bitrate_callback_) 956 if (!bitrate_callback_)
961 return; 957 return;
962 int64_t now_ms = clock_->TimeInMilliseconds(); 958 int64_t now_ms = clock_->TimeInMilliseconds();
963 uint32_t ssrc; 959 uint32_t ssrc;
964 { 960 {
965 rtc::CritScope lock(&send_critsect_); 961 rtc::CritScope lock(&send_critsect_);
966 if (!ssrc_) 962 ssrc = ssrc_;
967 return;
968 ssrc = *ssrc_;
969 } 963 }
970 964
971 rtc::CritScope lock(&statistics_crit_); 965 rtc::CritScope lock(&statistics_crit_);
972 bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0), 966 bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0),
973 nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc); 967 nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc);
974 } 968 }
975 969
976 size_t RTPSender::RtpHeaderLength() const { 970 size_t RTPSender::RtpHeaderLength() const {
977 rtc::CritScope lock(&send_critsect_); 971 rtc::CritScope lock(&send_critsect_);
978 size_t rtp_header_length = kRtpHeaderLength; 972 size_t rtp_header_length = kRtpHeaderLength;
(...skipping 13 matching lines...) Expand all
992 StreamDataCounters* rtx_stats) const { 986 StreamDataCounters* rtx_stats) const {
993 rtc::CritScope lock(&statistics_crit_); 987 rtc::CritScope lock(&statistics_crit_);
994 *rtp_stats = rtp_stats_; 988 *rtp_stats = rtp_stats_;
995 *rtx_stats = rtx_rtp_stats_; 989 *rtx_stats = rtx_rtp_stats_;
996 } 990 }
997 991
998 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { 992 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const {
999 rtc::CritScope lock(&send_critsect_); 993 rtc::CritScope lock(&send_critsect_);
1000 std::unique_ptr<RtpPacketToSend> packet( 994 std::unique_ptr<RtpPacketToSend> packet(
1001 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_)); 995 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_));
1002 RTC_DCHECK(ssrc_); 996 packet->SetSsrc(ssrc_);
1003 packet->SetSsrc(*ssrc_);
1004 packet->SetCsrcs(csrcs_); 997 packet->SetCsrcs(csrcs_);
1005 // Reserve extensions, if registered, RtpSender set in SendToNetwork. 998 // Reserve extensions, if registered, RtpSender set in SendToNetwork.
1006 packet->ReserveExtension<AbsoluteSendTime>(); 999 packet->ReserveExtension<AbsoluteSendTime>();
1007 packet->ReserveExtension<TransmissionOffset>(); 1000 packet->ReserveExtension<TransmissionOffset>();
1008 packet->ReserveExtension<TransportSequenceNumber>(); 1001 packet->ReserveExtension<TransportSequenceNumber>();
1009 if (playout_delay_oracle_.send_playout_delay()) { 1002 if (playout_delay_oracle_.send_playout_delay()) {
1010 packet->SetExtension<PlayoutDelayLimits>( 1003 packet->SetExtension<PlayoutDelayLimits>(
1011 playout_delay_oracle_.playout_delay()); 1004 playout_delay_oracle_.playout_delay());
1012 } 1005 }
1013 return packet; 1006 return packet;
1014 } 1007 }
1015 1008
1016 bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) { 1009 bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) {
1017 rtc::CritScope lock(&send_critsect_); 1010 rtc::CritScope lock(&send_critsect_);
1018 if (!sending_media_) 1011 if (!sending_media_)
1019 return false; 1012 return false;
1020 RTC_DCHECK(packet->Ssrc() == ssrc_); 1013 RTC_DCHECK_EQ(packet->Ssrc(), ssrc_);
1021 packet->SetSequenceNumber(sequence_number_++); 1014 packet->SetSequenceNumber(sequence_number_++);
1022 1015
1023 // Remember marker bit to determine if padding can be inserted with 1016 // Remember marker bit to determine if padding can be inserted with
1024 // sequence number following |packet|. 1017 // sequence number following |packet|.
1025 last_packet_marker_bit_ = packet->Marker(); 1018 last_packet_marker_bit_ = packet->Marker();
1026 // Save timestamps to generate timestamp field and extensions for the padding. 1019 // Save timestamps to generate timestamp field and extensions for the padding.
1027 last_rtp_timestamp_ = packet->Timestamp(); 1020 last_rtp_timestamp_ = packet->Timestamp();
1028 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); 1021 last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
1029 capture_time_ms_ = packet->capture_time_ms(); 1022 capture_time_ms_ = packet->capture_time_ms();
1030 return true; 1023 return true;
(...skipping 11 matching lines...) Expand all
1042 return false; 1035 return false;
1043 1036
1044 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1037 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1045 1038
1046 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id)) 1039 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id))
1047 return false; 1040 return false;
1048 1041
1049 return true; 1042 return true;
1050 } 1043 }
1051 1044
1045 void RTPSender::SetSendingStatus(bool enabled) {
1046 if (!enabled) {
1047 rtc::CritScope lock(&send_critsect_);
1048 if (!ssrc_forced_) {
1049 // Generate a new SSRC.
1050 ssrc_db_->ReturnSSRC(ssrc_);
1051 ssrc_ = ssrc_db_->CreateSSRC();
1052 RTC_DCHECK(ssrc_ != 0);
1053 }
1054 // Don't initialize seq number if SSRC passed externally.
1055 if (!sequence_number_forced_ && !ssrc_forced_) {
1056 // Generate a new sequence number.
1057 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1058 }
1059 }
1060 }
1061
1052 void RTPSender::SetSendingMediaStatus(bool enabled) { 1062 void RTPSender::SetSendingMediaStatus(bool enabled) {
1053 rtc::CritScope lock(&send_critsect_); 1063 rtc::CritScope lock(&send_critsect_);
1054 sending_media_ = enabled; 1064 sending_media_ = enabled;
1055 } 1065 }
1056 1066
1057 bool RTPSender::SendingMedia() const { 1067 bool RTPSender::SendingMedia() const {
1058 rtc::CritScope lock(&send_critsect_); 1068 rtc::CritScope lock(&send_critsect_);
1059 return sending_media_; 1069 return sending_media_;
1060 } 1070 }
1061 1071
1062 void RTPSender::SetTimestampOffset(uint32_t timestamp) { 1072 void RTPSender::SetTimestampOffset(uint32_t timestamp) {
1063 rtc::CritScope lock(&send_critsect_); 1073 rtc::CritScope lock(&send_critsect_);
1064 timestamp_offset_ = timestamp; 1074 timestamp_offset_ = timestamp;
1065 } 1075 }
1066 1076
1067 uint32_t RTPSender::TimestampOffset() const { 1077 uint32_t RTPSender::TimestampOffset() const {
1068 rtc::CritScope lock(&send_critsect_); 1078 rtc::CritScope lock(&send_critsect_);
1069 return timestamp_offset_; 1079 return timestamp_offset_;
1070 } 1080 }
1071 1081
1082 uint32_t RTPSender::GenerateNewSSRC() {
1083 // If configured via API, return 0.
1084 rtc::CritScope lock(&send_critsect_);
1085
1086 if (ssrc_forced_) {
1087 return 0;
1088 }
1089 ssrc_ = ssrc_db_->CreateSSRC();
1090 RTC_DCHECK(ssrc_ != 0);
1091 return ssrc_;
1092 }
1093
1072 void RTPSender::SetSSRC(uint32_t ssrc) { 1094 void RTPSender::SetSSRC(uint32_t ssrc) {
1073 // This is configured via the API. 1095 // This is configured via the API.
1074 rtc::CritScope lock(&send_critsect_); 1096 rtc::CritScope lock(&send_critsect_);
1075 1097
1076 if (ssrc_ == ssrc) { 1098 if (ssrc_ == ssrc && ssrc_forced_) {
1077 return; // Since it's same ssrc, don't reset anything. 1099 return; // Since it's same ssrc, don't reset anything.
1078 } 1100 }
1079 ssrc_.emplace(ssrc); 1101 ssrc_forced_ = true;
1102 ssrc_db_->ReturnSSRC(ssrc_);
1103 ssrc_db_->RegisterSSRC(ssrc);
1104 ssrc_ = ssrc;
1080 if (!sequence_number_forced_) { 1105 if (!sequence_number_forced_) {
1081 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 1106 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1082 } 1107 }
1083 } 1108 }
1084 1109
1085 uint32_t RTPSender::SSRC() const { 1110 uint32_t RTPSender::SSRC() const {
1086 rtc::CritScope lock(&send_critsect_); 1111 rtc::CritScope lock(&send_critsect_);
1087 RTC_DCHECK(ssrc_); 1112 return ssrc_;
1088 return *ssrc_;
1089 } 1113 }
1090 1114
1091 rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const { 1115 rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
1092 if (video_) { 1116 if (video_) {
1093 return video_->FlexfecSsrc(); 1117 return video_->FlexfecSsrc();
1094 } 1118 }
1095 return rtc::Optional<uint32_t>(); 1119 return rtc::Optional<uint32_t>();
1096 } 1120 }
1097 1121
1098 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { 1122 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 // when transport interface would be updated to take buffer class. 1182 // when transport interface would be updated to take buffer class.
1159 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend( 1183 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend(
1160 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize)); 1184 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize));
1161 // Add original RTP header. 1185 // Add original RTP header.
1162 rtx_packet->CopyHeaderFrom(packet); 1186 rtx_packet->CopyHeaderFrom(packet);
1163 { 1187 {
1164 rtc::CritScope lock(&send_critsect_); 1188 rtc::CritScope lock(&send_critsect_);
1165 if (!sending_media_) 1189 if (!sending_media_)
1166 return nullptr; 1190 return nullptr;
1167 1191
1168 RTC_DCHECK(ssrc_rtx_);
1169
1170 // Replace payload type. 1192 // Replace payload type.
1171 auto kv = rtx_payload_type_map_.find(packet.PayloadType()); 1193 auto kv = rtx_payload_type_map_.find(packet.PayloadType());
1172 if (kv == rtx_payload_type_map_.end()) 1194 if (kv == rtx_payload_type_map_.end())
1173 return nullptr; 1195 return nullptr;
1174 rtx_packet->SetPayloadType(kv->second); 1196 rtx_packet->SetPayloadType(kv->second);
1175 1197
1176 // Replace sequence number. 1198 // Replace sequence number.
1177 rtx_packet->SetSequenceNumber(sequence_number_rtx_++); 1199 rtx_packet->SetSequenceNumber(sequence_number_rtx_++);
1178 1200
1179 // Replace SSRC. 1201 // Replace SSRC.
1180 rtx_packet->SetSsrc(*ssrc_rtx_); 1202 rtx_packet->SetSsrc(ssrc_rtx_);
1181 } 1203 }
1182 1204
1183 uint8_t* rtx_payload = 1205 uint8_t* rtx_payload =
1184 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize); 1206 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize);
1185 RTC_DCHECK(rtx_payload); 1207 RTC_DCHECK(rtx_payload);
1186 // Add OSN (original sequence number). 1208 // Add OSN (original sequence number).
1187 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber()); 1209 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber());
1188 1210
1189 // Add original payload data. 1211 // Add original payload data.
1190 auto payload = packet.payload(); 1212 auto payload = packet.payload();
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { 1294 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) {
1273 return; 1295 return;
1274 } 1296 }
1275 rtp_overhead_bytes_per_packet_ = packet.headers_size(); 1297 rtp_overhead_bytes_per_packet_ = packet.headers_size();
1276 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_; 1298 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_;
1277 } 1299 }
1278 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); 1300 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet);
1279 } 1301 }
1280 1302
1281 } // namespace webrtc 1303 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.h ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698