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

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

Issue 2644303002: Delete class SSRCDatabase, and its global ssrc registry. (Closed)
Patch Set: Fix comment typo. 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()),
115 remote_ssrc_(0), 114 remote_ssrc_(0),
116 sequence_number_forced_(false), 115 sequence_number_forced_(false),
117 ssrc_forced_(false),
118 last_rtp_timestamp_(0), 116 last_rtp_timestamp_(0),
119 capture_time_ms_(0), 117 capture_time_ms_(0),
120 last_timestamp_time_ms_(0), 118 last_timestamp_time_ms_(0),
121 media_has_been_sent_(false), 119 media_has_been_sent_(false),
122 last_packet_marker_bit_(false), 120 last_packet_marker_bit_(false),
123 csrcs_(), 121 csrcs_(),
124 rtx_(kRtxOff), 122 rtx_(kRtxOff),
125 rtp_overhead_bytes_per_packet_(0), 123 rtp_overhead_bytes_per_packet_(0),
126 retransmission_rate_limiter_(retransmission_rate_limiter), 124 retransmission_rate_limiter_(retransmission_rate_limiter),
127 overhead_observer_(overhead_observer), 125 overhead_observer_(overhead_observer),
128 send_side_bwe_with_overhead_( 126 send_side_bwe_with_overhead_(
129 webrtc::field_trial::FindFullName( 127 webrtc::field_trial::FindFullName(
130 "WebRTC-SendSideBwe-WithOverhead") == "Enabled") { 128 "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
136 // This random initialization is not intended to be cryptographic strong. 129 // This random initialization is not intended to be cryptographic strong.
137 timestamp_offset_ = random_.Rand<uint32_t>(); 130 timestamp_offset_ = random_.Rand<uint32_t>();
138 // Random start, 16 bits. Can't be 0. 131 // Random start, 16 bits. Can't be 0.
139 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); 132 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
140 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 133 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
141 134
142 // Store FlexFEC packets in the packet history data structure, so they can 135 // Store FlexFEC packets in the packet history data structure, so they can
143 // be found when paced. 136 // be found when paced.
144 if (flexfec_sender) { 137 if (flexfec_sender) {
145 flexfec_packet_history_.SetStorePacketsStatus( 138 flexfec_packet_history_.SetStorePacketsStatus(
146 true, kMinFlexfecPacketsToStoreForPacing); 139 true, kMinFlexfecPacketsToStoreForPacing);
147 } 140 }
148 } 141 }
149 142
150 RTPSender::~RTPSender() { 143 RTPSender::~RTPSender() {
151 // TODO(tommi): Use a thread checker to ensure the object is created and 144 // TODO(tommi): Use a thread checker to ensure the object is created and
152 // deleted on the same thread. At the moment this isn't possible due to 145 // deleted on the same thread. At the moment this isn't possible due to
153 // voe::ChannelOwner in voice engine. To reproduce, run: 146 // voe::ChannelOwner in voice engine. To reproduce, run:
154 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus 147 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus
155 148
156 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member 149 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member
157 // variables but we grab them in all other methods. (what's the design?) 150 // variables but we grab them in all other methods. (what's the design?)
158 // Start documenting what thread we're on in what method so that it's easier 151 // Start documenting what thread we're on in what method so that it's easier
159 // to understand performance attributes and possibly remove locks. 152 // 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();
166 while (!payload_type_map_.empty()) { 153 while (!payload_type_map_.empty()) {
167 std::map<int8_t, RtpUtility::Payload*>::iterator it = 154 std::map<int8_t, RtpUtility::Payload*>::iterator it =
168 payload_type_map_.begin(); 155 payload_type_map_.begin();
169 delete it->second; 156 delete it->second;
170 payload_type_map_.erase(it); 157 payload_type_map_.erase(it);
171 } 158 }
172 } 159 }
173 160
174 uint16_t RTPSender::ActualSendBitrateKbit() const { 161 uint16_t RTPSender::ActualSendBitrateKbit() const {
175 rtc::CritScope cs(&statistics_crit_); 162 rtc::CritScope cs(&statistics_crit_);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 rtx_ = mode; 314 rtx_ = mode;
328 } 315 }
329 316
330 int RTPSender::RtxStatus() const { 317 int RTPSender::RtxStatus() const {
331 rtc::CritScope lock(&send_critsect_); 318 rtc::CritScope lock(&send_critsect_);
332 return rtx_; 319 return rtx_;
333 } 320 }
334 321
335 void RTPSender::SetRtxSsrc(uint32_t ssrc) { 322 void RTPSender::SetRtxSsrc(uint32_t ssrc) {
336 rtc::CritScope lock(&send_critsect_); 323 rtc::CritScope lock(&send_critsect_);
337 ssrc_rtx_ = ssrc; 324 ssrc_rtx_.emplace(ssrc);
338 } 325 }
339 326
340 uint32_t RTPSender::RtxSsrc() const { 327 uint32_t RTPSender::RtxSsrc() const {
341 rtc::CritScope lock(&send_critsect_); 328 rtc::CritScope lock(&send_critsect_);
342 return ssrc_rtx_; 329 RTC_DCHECK(ssrc_rtx_);
330 return ssrc_rtx_.value_or(0);
danilchap 2017/02/14 13:23:05 there is a DCHECK above, so no need to handle empt
nisse-webrtc 2017/02/14 13:44:20 Done. (Then the DCHECK is a bit redundant too, we'
343 } 331 }
344 332
345 void RTPSender::SetRtxPayloadType(int payload_type, 333 void RTPSender::SetRtxPayloadType(int payload_type,
346 int associated_payload_type) { 334 int associated_payload_type) {
347 rtc::CritScope lock(&send_critsect_); 335 rtc::CritScope lock(&send_critsect_);
348 RTC_DCHECK_LE(payload_type, 127); 336 RTC_DCHECK_LE(payload_type, 127);
349 RTC_DCHECK_LE(associated_payload_type, 127); 337 RTC_DCHECK_LE(associated_payload_type, 127);
350 if (payload_type < 0) { 338 if (payload_type < 0) {
351 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type; 339 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type;
352 return; 340 return;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 size_t payload_size, 382 size_t payload_size,
395 const RTPFragmentationHeader* fragmentation, 383 const RTPFragmentationHeader* fragmentation,
396 const RTPVideoHeader* rtp_header, 384 const RTPVideoHeader* rtp_header,
397 uint32_t* transport_frame_id_out) { 385 uint32_t* transport_frame_id_out) {
398 uint32_t ssrc; 386 uint32_t ssrc;
399 uint16_t sequence_number; 387 uint16_t sequence_number;
400 uint32_t rtp_timestamp; 388 uint32_t rtp_timestamp;
401 { 389 {
402 // Drop this packet if we're not sending media packets. 390 // Drop this packet if we're not sending media packets.
403 rtc::CritScope lock(&send_critsect_); 391 rtc::CritScope lock(&send_critsect_);
404 ssrc = ssrc_; 392 if (!ssrc_) {
393 LOG(LS_ERROR) << "SSRC unset";
394 return false;
395 }
396
397 ssrc = *ssrc_;
405 sequence_number = sequence_number_; 398 sequence_number = sequence_number_;
406 rtp_timestamp = timestamp_offset_ + capture_timestamp; 399 rtp_timestamp = timestamp_offset_ + capture_timestamp;
407 if (transport_frame_id_out) 400 if (transport_frame_id_out)
408 *transport_frame_id_out = rtp_timestamp; 401 *transport_frame_id_out = rtp_timestamp;
409 if (!sending_media_) 402 if (!sending_media_)
410 return true; 403 return true;
411 } 404 }
412 RtpVideoCodecTypes video_type = kRtpVideoGeneric; 405 RtpVideoCodecTypes video_type = kRtpVideoGeneric;
413 if (CheckPayloadType(payload_type, &video_type) != 0) { 406 if (CheckPayloadType(payload_type, &video_type) != 0) {
414 LOG(LS_ERROR) << "Don't send data with unknown payload type: " 407 LOG(LS_ERROR) << "Don't send data with unknown payload type: "
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 if (rtx_ == kRtxOff) { 507 if (rtx_ == kRtxOff) {
515 if (payload_type_ == -1) 508 if (payload_type_ == -1)
516 break; 509 break;
517 // Without RTX we can't send padding in the middle of frames. 510 // Without RTX we can't send padding in the middle of frames.
518 // For audio marker bits doesn't mark the end of a frame and frames 511 // For audio marker bits doesn't mark the end of a frame and frames
519 // are usually a single packet, so for now we don't apply this rule 512 // are usually a single packet, so for now we don't apply this rule
520 // for audio. 513 // for audio.
521 if (!audio_configured_ && !last_packet_marker_bit_) { 514 if (!audio_configured_ && !last_packet_marker_bit_) {
522 break; 515 break;
523 } 516 }
524 ssrc = ssrc_; 517 if (!ssrc_) {
518 LOG(LS_ERROR) << "SSRC unset";
519 return 0;
520 }
521
522 ssrc = *ssrc_;
523
525 sequence_number = sequence_number_; 524 sequence_number = sequence_number_;
526 ++sequence_number_; 525 ++sequence_number_;
527 payload_type = payload_type_; 526 payload_type = payload_type_;
528 over_rtx = false; 527 over_rtx = false;
529 } else { 528 } else {
530 // Without abs-send-time or transport sequence number a media packet 529 // Without abs-send-time or transport sequence number a media packet
531 // must be sent before padding so that the timestamps used for 530 // must be sent before padding so that the timestamps used for
532 // estimation are correct. 531 // estimation are correct.
533 if (!media_has_been_sent_ && 532 if (!media_has_been_sent_ &&
534 !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) || 533 !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) ||
535 (rtp_header_extension_map_.IsRegistered( 534 (rtp_header_extension_map_.IsRegistered(
536 TransportSequenceNumber::kId) && 535 TransportSequenceNumber::kId) &&
537 transport_sequence_number_allocator_))) { 536 transport_sequence_number_allocator_))) {
538 break; 537 break;
539 } 538 }
540 // Only change change the timestamp of padding packets sent over RTX. 539 // Only change change the timestamp of padding packets sent over RTX.
541 // Padding only packets over RTP has to be sent as part of a media 540 // Padding only packets over RTP has to be sent as part of a media
542 // frame (and therefore the same timestamp). 541 // frame (and therefore the same timestamp).
543 if (last_timestamp_time_ms_ > 0) { 542 if (last_timestamp_time_ms_ > 0) {
544 timestamp += 543 timestamp +=
545 (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs; 544 (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs;
546 capture_time_ms += (now_ms - last_timestamp_time_ms_); 545 capture_time_ms += (now_ms - last_timestamp_time_ms_);
547 } 546 }
548 ssrc = ssrc_rtx_; 547 if (!ssrc_rtx_) {
548 LOG(LS_ERROR) << "RTX SSRC unset";
549 return 0;
550 }
551 ssrc = *ssrc_rtx_;
549 sequence_number = sequence_number_rtx_; 552 sequence_number = sequence_number_rtx_;
550 ++sequence_number_rtx_; 553 ++sequence_number_rtx_;
551 payload_type = rtx_payload_type_map_.begin()->second; 554 payload_type = rtx_payload_type_map_.begin()->second;
552 over_rtx = true; 555 over_rtx = true;
553 } 556 }
554 } 557 }
555 558
556 RtpPacketToSend padding_packet(&rtp_header_extension_map_); 559 RtpPacketToSend padding_packet(&rtp_header_extension_map_);
557 padding_packet.SetPayloadType(payload_type); 560 padding_packet.SetPayloadType(payload_type);
558 padding_packet.SetMarker(false); 561 padding_packet.SetMarker(false);
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 915
913 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 916 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
914 if (!send_side_delay_observer_ || capture_time_ms <= 0) 917 if (!send_side_delay_observer_ || capture_time_ms <= 0)
915 return; 918 return;
916 919
917 uint32_t ssrc; 920 uint32_t ssrc;
918 int avg_delay_ms = 0; 921 int avg_delay_ms = 0;
919 int max_delay_ms = 0; 922 int max_delay_ms = 0;
920 { 923 {
921 rtc::CritScope lock(&send_critsect_); 924 rtc::CritScope lock(&send_critsect_);
922 ssrc = ssrc_; 925 if (!ssrc_)
926 return;
927 ssrc = *ssrc_;
923 } 928 }
924 { 929 {
925 rtc::CritScope cs(&statistics_crit_); 930 rtc::CritScope cs(&statistics_crit_);
926 // TODO(holmer): Compute this iteratively instead. 931 // TODO(holmer): Compute this iteratively instead.
927 send_delays_[now_ms] = now_ms - capture_time_ms; 932 send_delays_[now_ms] = now_ms - capture_time_ms;
928 send_delays_.erase(send_delays_.begin(), 933 send_delays_.erase(send_delays_.begin(),
929 send_delays_.lower_bound(now_ms - 934 send_delays_.lower_bound(now_ms -
930 kSendSideDelayWindowMs)); 935 kSendSideDelayWindowMs));
931 int num_delays = 0; 936 int num_delays = 0;
932 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs); 937 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs);
(...skipping 19 matching lines...) Expand all
952 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc); 957 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc);
953 } 958 }
954 959
955 void RTPSender::ProcessBitrate() { 960 void RTPSender::ProcessBitrate() {
956 if (!bitrate_callback_) 961 if (!bitrate_callback_)
957 return; 962 return;
958 int64_t now_ms = clock_->TimeInMilliseconds(); 963 int64_t now_ms = clock_->TimeInMilliseconds();
959 uint32_t ssrc; 964 uint32_t ssrc;
960 { 965 {
961 rtc::CritScope lock(&send_critsect_); 966 rtc::CritScope lock(&send_critsect_);
962 ssrc = ssrc_; 967 if (!ssrc_)
968 return;
969 ssrc = *ssrc_;
963 } 970 }
964 971
965 rtc::CritScope lock(&statistics_crit_); 972 rtc::CritScope lock(&statistics_crit_);
966 bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0), 973 bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0),
967 nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc); 974 nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc);
968 } 975 }
969 976
970 size_t RTPSender::RtpHeaderLength() const { 977 size_t RTPSender::RtpHeaderLength() const {
971 rtc::CritScope lock(&send_critsect_); 978 rtc::CritScope lock(&send_critsect_);
972 size_t rtp_header_length = kRtpHeaderLength; 979 size_t rtp_header_length = kRtpHeaderLength;
(...skipping 13 matching lines...) Expand all
986 StreamDataCounters* rtx_stats) const { 993 StreamDataCounters* rtx_stats) const {
987 rtc::CritScope lock(&statistics_crit_); 994 rtc::CritScope lock(&statistics_crit_);
988 *rtp_stats = rtp_stats_; 995 *rtp_stats = rtp_stats_;
989 *rtx_stats = rtx_rtp_stats_; 996 *rtx_stats = rtx_rtp_stats_;
990 } 997 }
991 998
992 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { 999 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const {
993 rtc::CritScope lock(&send_critsect_); 1000 rtc::CritScope lock(&send_critsect_);
994 std::unique_ptr<RtpPacketToSend> packet( 1001 std::unique_ptr<RtpPacketToSend> packet(
995 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_)); 1002 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_));
996 packet->SetSsrc(ssrc_); 1003 RTC_DCHECK(ssrc_);
1004 packet->SetSsrc(*ssrc_);
997 packet->SetCsrcs(csrcs_); 1005 packet->SetCsrcs(csrcs_);
998 // Reserve extensions, if registered, RtpSender set in SendToNetwork. 1006 // Reserve extensions, if registered, RtpSender set in SendToNetwork.
999 packet->ReserveExtension<AbsoluteSendTime>(); 1007 packet->ReserveExtension<AbsoluteSendTime>();
1000 packet->ReserveExtension<TransmissionOffset>(); 1008 packet->ReserveExtension<TransmissionOffset>();
1001 packet->ReserveExtension<TransportSequenceNumber>(); 1009 packet->ReserveExtension<TransportSequenceNumber>();
1002 if (playout_delay_oracle_.send_playout_delay()) { 1010 if (playout_delay_oracle_.send_playout_delay()) {
1003 packet->SetExtension<PlayoutDelayLimits>( 1011 packet->SetExtension<PlayoutDelayLimits>(
1004 playout_delay_oracle_.playout_delay()); 1012 playout_delay_oracle_.playout_delay());
1005 } 1013 }
1006 return packet; 1014 return packet;
1007 } 1015 }
1008 1016
1009 bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) { 1017 bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) {
1010 rtc::CritScope lock(&send_critsect_); 1018 rtc::CritScope lock(&send_critsect_);
1011 if (!sending_media_) 1019 if (!sending_media_)
1012 return false; 1020 return false;
1013 RTC_DCHECK_EQ(packet->Ssrc(), ssrc_); 1021 RTC_DCHECK(packet->Ssrc() == ssrc_);
1014 packet->SetSequenceNumber(sequence_number_++); 1022 packet->SetSequenceNumber(sequence_number_++);
1015 1023
1016 // Remember marker bit to determine if padding can be inserted with 1024 // Remember marker bit to determine if padding can be inserted with
1017 // sequence number following |packet|. 1025 // sequence number following |packet|.
1018 last_packet_marker_bit_ = packet->Marker(); 1026 last_packet_marker_bit_ = packet->Marker();
1019 // Save timestamps to generate timestamp field and extensions for the padding. 1027 // Save timestamps to generate timestamp field and extensions for the padding.
1020 last_rtp_timestamp_ = packet->Timestamp(); 1028 last_rtp_timestamp_ = packet->Timestamp();
1021 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); 1029 last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
1022 capture_time_ms_ = packet->capture_time_ms(); 1030 capture_time_ms_ = packet->capture_time_ms();
1023 return true; 1031 return true;
(...skipping 11 matching lines...) Expand all
1035 return false; 1043 return false;
1036 1044
1037 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1045 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1038 1046
1039 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id)) 1047 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id))
1040 return false; 1048 return false;
1041 1049
1042 return true; 1050 return true;
1043 } 1051 }
1044 1052
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
1062 void RTPSender::SetSendingMediaStatus(bool enabled) { 1053 void RTPSender::SetSendingMediaStatus(bool enabled) {
1063 rtc::CritScope lock(&send_critsect_); 1054 rtc::CritScope lock(&send_critsect_);
1064 sending_media_ = enabled; 1055 sending_media_ = enabled;
1065 } 1056 }
1066 1057
1067 bool RTPSender::SendingMedia() const { 1058 bool RTPSender::SendingMedia() const {
1068 rtc::CritScope lock(&send_critsect_); 1059 rtc::CritScope lock(&send_critsect_);
1069 return sending_media_; 1060 return sending_media_;
1070 } 1061 }
1071 1062
1072 void RTPSender::SetTimestampOffset(uint32_t timestamp) { 1063 void RTPSender::SetTimestampOffset(uint32_t timestamp) {
1073 rtc::CritScope lock(&send_critsect_); 1064 rtc::CritScope lock(&send_critsect_);
1074 timestamp_offset_ = timestamp; 1065 timestamp_offset_ = timestamp;
1075 } 1066 }
1076 1067
1077 uint32_t RTPSender::TimestampOffset() const { 1068 uint32_t RTPSender::TimestampOffset() const {
1078 rtc::CritScope lock(&send_critsect_); 1069 rtc::CritScope lock(&send_critsect_);
1079 return timestamp_offset_; 1070 return timestamp_offset_;
1080 } 1071 }
1081 1072
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
1094 void RTPSender::SetSSRC(uint32_t ssrc) { 1073 void RTPSender::SetSSRC(uint32_t ssrc) {
1095 // This is configured via the API. 1074 // This is configured via the API.
1096 rtc::CritScope lock(&send_critsect_); 1075 rtc::CritScope lock(&send_critsect_);
1097 1076
1098 if (ssrc_ == ssrc && ssrc_forced_) { 1077 if (ssrc_ == ssrc) {
1099 return; // Since it's same ssrc, don't reset anything. 1078 return; // Since it's same ssrc, don't reset anything.
1100 } 1079 }
1101 ssrc_forced_ = true; 1080 ssrc_.emplace(ssrc);
1102 ssrc_db_->ReturnSSRC(ssrc_);
1103 ssrc_db_->RegisterSSRC(ssrc);
1104 ssrc_ = ssrc;
1105 if (!sequence_number_forced_) { 1081 if (!sequence_number_forced_) {
1106 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 1082 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1107 } 1083 }
1108 } 1084 }
1109 1085
1110 uint32_t RTPSender::SSRC() const { 1086 uint32_t RTPSender::SSRC() const {
1111 rtc::CritScope lock(&send_critsect_); 1087 rtc::CritScope lock(&send_critsect_);
1112 return ssrc_; 1088 return *ssrc_;
1113 } 1089 }
1114 1090
1115 rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const { 1091 rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
1116 if (video_) { 1092 if (video_) {
1117 return video_->FlexfecSsrc(); 1093 return video_->FlexfecSsrc();
1118 } 1094 }
1119 return rtc::Optional<uint32_t>(); 1095 return rtc::Optional<uint32_t>();
1120 } 1096 }
1121 1097
1122 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { 1098 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 // when transport interface would be updated to take buffer class. 1158 // when transport interface would be updated to take buffer class.
1183 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend( 1159 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend(
1184 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize)); 1160 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize));
1185 // Add original RTP header. 1161 // Add original RTP header.
1186 rtx_packet->CopyHeaderFrom(packet); 1162 rtx_packet->CopyHeaderFrom(packet);
1187 { 1163 {
1188 rtc::CritScope lock(&send_critsect_); 1164 rtc::CritScope lock(&send_critsect_);
1189 if (!sending_media_) 1165 if (!sending_media_)
1190 return nullptr; 1166 return nullptr;
1191 1167
1168 RTC_DCHECK(ssrc_rtx_);
1169
1192 // Replace payload type. 1170 // Replace payload type.
1193 auto kv = rtx_payload_type_map_.find(packet.PayloadType()); 1171 auto kv = rtx_payload_type_map_.find(packet.PayloadType());
1194 if (kv == rtx_payload_type_map_.end()) 1172 if (kv == rtx_payload_type_map_.end())
1195 return nullptr; 1173 return nullptr;
1196 rtx_packet->SetPayloadType(kv->second); 1174 rtx_packet->SetPayloadType(kv->second);
1197 1175
1198 // Replace sequence number. 1176 // Replace sequence number.
1199 rtx_packet->SetSequenceNumber(sequence_number_rtx_++); 1177 rtx_packet->SetSequenceNumber(sequence_number_rtx_++);
1200 1178
1201 // Replace SSRC. 1179 // Replace SSRC.
1202 rtx_packet->SetSsrc(ssrc_rtx_); 1180 rtx_packet->SetSsrc(*ssrc_rtx_);
1203 } 1181 }
1204 1182
1205 uint8_t* rtx_payload = 1183 uint8_t* rtx_payload =
1206 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize); 1184 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize);
1207 RTC_DCHECK(rtx_payload); 1185 RTC_DCHECK(rtx_payload);
1208 // Add OSN (original sequence number). 1186 // Add OSN (original sequence number).
1209 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber()); 1187 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber());
1210 1188
1211 // Add original payload data. 1189 // Add original payload data.
1212 auto payload = packet.payload(); 1190 auto payload = packet.payload();
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1294 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { 1272 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) {
1295 return; 1273 return;
1296 } 1274 }
1297 rtp_overhead_bytes_per_packet_ = packet.headers_size(); 1275 rtp_overhead_bytes_per_packet_ = packet.headers_size();
1298 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_; 1276 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_;
1299 } 1277 }
1300 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); 1278 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet);
1301 } 1279 }
1302 1280
1303 } // namespace webrtc 1281 } // 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