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

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: Addressed comments. 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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 rtp_stats_callback_(nullptr), 103 rtp_stats_callback_(nullptr),
104 total_bitrate_sent_(kBitrateStatisticsWindowMs, 104 total_bitrate_sent_(kBitrateStatisticsWindowMs,
105 RateStatistics::kBpsScale), 105 RateStatistics::kBpsScale),
106 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), 106 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale),
107 frame_count_observer_(frame_count_observer), 107 frame_count_observer_(frame_count_observer),
108 send_side_delay_observer_(send_side_delay_observer), 108 send_side_delay_observer_(send_side_delay_observer),
109 event_log_(event_log), 109 event_log_(event_log),
110 send_packet_observer_(send_packet_observer), 110 send_packet_observer_(send_packet_observer),
111 bitrate_callback_(bitrate_callback), 111 bitrate_callback_(bitrate_callback),
112 // RTP variables 112 // RTP variables
113 ssrc_db_(SSRCDatabase::GetSSRCDatabase()),
114 remote_ssrc_(0), 113 remote_ssrc_(0),
115 sequence_number_forced_(false), 114 sequence_number_forced_(false),
116 ssrc_forced_(false),
117 last_rtp_timestamp_(0), 115 last_rtp_timestamp_(0),
118 capture_time_ms_(0), 116 capture_time_ms_(0),
119 last_timestamp_time_ms_(0), 117 last_timestamp_time_ms_(0),
120 media_has_been_sent_(false), 118 media_has_been_sent_(false),
121 last_packet_marker_bit_(false), 119 last_packet_marker_bit_(false),
122 csrcs_(), 120 csrcs_(),
123 rtx_(kRtxOff), 121 rtx_(kRtxOff),
124 rtp_overhead_bytes_per_packet_(0), 122 rtp_overhead_bytes_per_packet_(0),
125 retransmission_rate_limiter_(retransmission_rate_limiter), 123 retransmission_rate_limiter_(retransmission_rate_limiter),
126 overhead_observer_(overhead_observer) { 124 overhead_observer_(overhead_observer) {
127 ssrc_ = ssrc_db_->CreateSSRC();
128 RTC_DCHECK(ssrc_ != 0);
129 ssrc_rtx_ = ssrc_db_->CreateSSRC();
130 RTC_DCHECK(ssrc_rtx_ != 0);
131
132 // This random initialization is not intended to be cryptographic strong. 125 // This random initialization is not intended to be cryptographic strong.
133 timestamp_offset_ = random_.Rand<uint32_t>(); 126 timestamp_offset_ = random_.Rand<uint32_t>();
134 // Random start, 16 bits. Can't be 0. 127 // Random start, 16 bits. Can't be 0.
135 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); 128 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
136 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 129 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
137 130
138 // Store FlexFEC packets in the packet history data structure, so they can 131 // Store FlexFEC packets in the packet history data structure, so they can
139 // be found when paced. 132 // be found when paced.
140 if (flexfec_sender) { 133 if (flexfec_sender) {
141 flexfec_packet_history_.SetStorePacketsStatus( 134 flexfec_packet_history_.SetStorePacketsStatus(
142 true, kMinFlexfecPacketsToStoreForPacing); 135 true, kMinFlexfecPacketsToStoreForPacing);
143 } 136 }
144 } 137 }
145 138
146 RTPSender::~RTPSender() { 139 RTPSender::~RTPSender() {
147 // TODO(tommi): Use a thread checker to ensure the object is created and 140 // TODO(tommi): Use a thread checker to ensure the object is created and
148 // deleted on the same thread. At the moment this isn't possible due to 141 // deleted on the same thread. At the moment this isn't possible due to
149 // voe::ChannelOwner in voice engine. To reproduce, run: 142 // voe::ChannelOwner in voice engine. To reproduce, run:
150 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus 143 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus
151 144
152 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member 145 // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member
153 // variables but we grab them in all other methods. (what's the design?) 146 // variables but we grab them in all other methods. (what's the design?)
154 // Start documenting what thread we're on in what method so that it's easier 147 // Start documenting what thread we're on in what method so that it's easier
155 // to understand performance attributes and possibly remove locks. 148 // to understand performance attributes and possibly remove locks.
156 if (remote_ssrc_ != 0) {
157 ssrc_db_->ReturnSSRC(remote_ssrc_);
158 }
159 ssrc_db_->ReturnSSRC(ssrc_);
160
161 SSRCDatabase::ReturnSSRCDatabase();
162 while (!payload_type_map_.empty()) { 149 while (!payload_type_map_.empty()) {
163 std::map<int8_t, RtpUtility::Payload*>::iterator it = 150 std::map<int8_t, RtpUtility::Payload*>::iterator it =
164 payload_type_map_.begin(); 151 payload_type_map_.begin();
165 delete it->second; 152 delete it->second;
166 payload_type_map_.erase(it); 153 payload_type_map_.erase(it);
167 } 154 }
168 } 155 }
169 156
170 uint16_t RTPSender::ActualSendBitrateKbit() const { 157 uint16_t RTPSender::ActualSendBitrateKbit() const {
171 rtc::CritScope cs(&statistics_crit_); 158 rtc::CritScope cs(&statistics_crit_);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 rtx_ = mode; 310 rtx_ = mode;
324 } 311 }
325 312
326 int RTPSender::RtxStatus() const { 313 int RTPSender::RtxStatus() const {
327 rtc::CritScope lock(&send_critsect_); 314 rtc::CritScope lock(&send_critsect_);
328 return rtx_; 315 return rtx_;
329 } 316 }
330 317
331 void RTPSender::SetRtxSsrc(uint32_t ssrc) { 318 void RTPSender::SetRtxSsrc(uint32_t ssrc) {
332 rtc::CritScope lock(&send_critsect_); 319 rtc::CritScope lock(&send_critsect_);
333 ssrc_rtx_ = ssrc; 320 ssrc_rtx_.emplace(ssrc);
334 } 321 }
335 322
336 uint32_t RTPSender::RtxSsrc() const { 323 uint32_t RTPSender::RtxSsrc() const {
337 rtc::CritScope lock(&send_critsect_); 324 rtc::CritScope lock(&send_critsect_);
338 return ssrc_rtx_; 325 // TODO(nisse): Is it better to crash if ssrc_rtx_ is unset?
the sun 2017/02/01 14:15:20 You could at least add a DCHECK.
326 return ssrc_rtx_.value_or(0);
339 } 327 }
340 328
341 void RTPSender::SetRtxPayloadType(int payload_type, 329 void RTPSender::SetRtxPayloadType(int payload_type,
342 int associated_payload_type) { 330 int associated_payload_type) {
343 rtc::CritScope lock(&send_critsect_); 331 rtc::CritScope lock(&send_critsect_);
344 RTC_DCHECK_LE(payload_type, 127); 332 RTC_DCHECK_LE(payload_type, 127);
345 RTC_DCHECK_LE(associated_payload_type, 127); 333 RTC_DCHECK_LE(associated_payload_type, 127);
346 if (payload_type < 0) { 334 if (payload_type < 0) {
347 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type; 335 LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type;
348 return; 336 return;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 size_t payload_size, 378 size_t payload_size,
391 const RTPFragmentationHeader* fragmentation, 379 const RTPFragmentationHeader* fragmentation,
392 const RTPVideoHeader* rtp_header, 380 const RTPVideoHeader* rtp_header,
393 uint32_t* transport_frame_id_out) { 381 uint32_t* transport_frame_id_out) {
394 uint32_t ssrc; 382 uint32_t ssrc;
395 uint16_t sequence_number; 383 uint16_t sequence_number;
396 uint32_t rtp_timestamp; 384 uint32_t rtp_timestamp;
397 { 385 {
398 // Drop this packet if we're not sending media packets. 386 // Drop this packet if we're not sending media packets.
399 rtc::CritScope lock(&send_critsect_); 387 rtc::CritScope lock(&send_critsect_);
400 ssrc = ssrc_; 388 if (!ssrc_) {
389 LOG(LS_ERROR) << "SSRC unset";
390 return false;
391 }
392
393 ssrc = *ssrc_;
401 sequence_number = sequence_number_; 394 sequence_number = sequence_number_;
402 rtp_timestamp = timestamp_offset_ + capture_timestamp; 395 rtp_timestamp = timestamp_offset_ + capture_timestamp;
403 if (transport_frame_id_out) 396 if (transport_frame_id_out)
404 *transport_frame_id_out = rtp_timestamp; 397 *transport_frame_id_out = rtp_timestamp;
405 if (!sending_media_) 398 if (!sending_media_)
406 return true; 399 return true;
407 } 400 }
408 RtpVideoCodecTypes video_type = kRtpVideoGeneric; 401 RtpVideoCodecTypes video_type = kRtpVideoGeneric;
409 if (CheckPayloadType(payload_type, &video_type) != 0) { 402 if (CheckPayloadType(payload_type, &video_type) != 0) {
410 LOG(LS_ERROR) << "Don't send data with unknown payload type: " 403 LOG(LS_ERROR) << "Don't send data with unknown payload type: "
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 { 488 {
496 rtc::CritScope lock(&send_critsect_); 489 rtc::CritScope lock(&send_critsect_);
497 if (!sending_media_) 490 if (!sending_media_)
498 break; 491 break;
499 timestamp = last_rtp_timestamp_; 492 timestamp = last_rtp_timestamp_;
500 capture_time_ms = capture_time_ms_; 493 capture_time_ms = capture_time_ms_;
501 if (rtx_ == kRtxOff) { 494 if (rtx_ == kRtxOff) {
502 // Without RTX we can't send padding in the middle of frames. 495 // Without RTX we can't send padding in the middle of frames.
503 if (!last_packet_marker_bit_) 496 if (!last_packet_marker_bit_)
504 break; 497 break;
505 ssrc = ssrc_; 498 if (!ssrc_) {
499 LOG(LS_ERROR) << "SSRC unset";
500 return 0;
501 }
502
503 ssrc = *ssrc_;
504
506 sequence_number = sequence_number_; 505 sequence_number = sequence_number_;
507 ++sequence_number_; 506 ++sequence_number_;
508 payload_type = payload_type_; 507 payload_type = payload_type_;
509 over_rtx = false; 508 over_rtx = false;
510 } else { 509 } else {
511 // Without abs-send-time or transport sequence number a media packet 510 // Without abs-send-time or transport sequence number a media packet
512 // must be sent before padding so that the timestamps used for 511 // must be sent before padding so that the timestamps used for
513 // estimation are correct. 512 // estimation are correct.
514 if (!media_has_been_sent_ && 513 if (!media_has_been_sent_ &&
515 !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) || 514 !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) ||
516 (rtp_header_extension_map_.IsRegistered( 515 (rtp_header_extension_map_.IsRegistered(
517 TransportSequenceNumber::kId) && 516 TransportSequenceNumber::kId) &&
518 transport_sequence_number_allocator_))) { 517 transport_sequence_number_allocator_))) {
519 break; 518 break;
520 } 519 }
521 // Only change change the timestamp of padding packets sent over RTX. 520 // Only change change the timestamp of padding packets sent over RTX.
522 // Padding only packets over RTP has to be sent as part of a media 521 // Padding only packets over RTP has to be sent as part of a media
523 // frame (and therefore the same timestamp). 522 // frame (and therefore the same timestamp).
524 if (last_timestamp_time_ms_ > 0) { 523 if (last_timestamp_time_ms_ > 0) {
525 timestamp += 524 timestamp +=
526 (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs; 525 (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs;
527 capture_time_ms += (now_ms - last_timestamp_time_ms_); 526 capture_time_ms += (now_ms - last_timestamp_time_ms_);
528 } 527 }
529 ssrc = ssrc_rtx_; 528 if (!ssrc_rtx_) {
529 LOG(LS_ERROR) << "RTX SSRC unset";
530 return 0;
531 }
532 ssrc = *ssrc_rtx_;
530 sequence_number = sequence_number_rtx_; 533 sequence_number = sequence_number_rtx_;
531 ++sequence_number_rtx_; 534 ++sequence_number_rtx_;
532 payload_type = rtx_payload_type_map_.begin()->second; 535 payload_type = rtx_payload_type_map_.begin()->second;
533 over_rtx = true; 536 over_rtx = true;
534 } 537 }
535 } 538 }
536 539
537 RtpPacketToSend padding_packet(&rtp_header_extension_map_); 540 RtpPacketToSend padding_packet(&rtp_header_extension_map_);
538 padding_packet.SetPayloadType(payload_type); 541 padding_packet.SetPayloadType(payload_type);
539 padding_packet.SetMarker(false); 542 padding_packet.SetMarker(false);
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 896
894 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { 897 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
895 if (!send_side_delay_observer_ || capture_time_ms <= 0) 898 if (!send_side_delay_observer_ || capture_time_ms <= 0)
896 return; 899 return;
897 900
898 uint32_t ssrc; 901 uint32_t ssrc;
899 int avg_delay_ms = 0; 902 int avg_delay_ms = 0;
900 int max_delay_ms = 0; 903 int max_delay_ms = 0;
901 { 904 {
902 rtc::CritScope lock(&send_critsect_); 905 rtc::CritScope lock(&send_critsect_);
903 ssrc = ssrc_; 906 if (!ssrc_)
907 return;
908 ssrc = *ssrc_;
904 } 909 }
905 { 910 {
906 rtc::CritScope cs(&statistics_crit_); 911 rtc::CritScope cs(&statistics_crit_);
907 // TODO(holmer): Compute this iteratively instead. 912 // TODO(holmer): Compute this iteratively instead.
908 send_delays_[now_ms] = now_ms - capture_time_ms; 913 send_delays_[now_ms] = now_ms - capture_time_ms;
909 send_delays_.erase(send_delays_.begin(), 914 send_delays_.erase(send_delays_.begin(),
910 send_delays_.lower_bound(now_ms - 915 send_delays_.lower_bound(now_ms -
911 kSendSideDelayWindowMs)); 916 kSendSideDelayWindowMs));
912 int num_delays = 0; 917 int num_delays = 0;
913 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs); 918 for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs);
(...skipping 19 matching lines...) Expand all
933 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc); 938 send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc);
934 } 939 }
935 940
936 void RTPSender::ProcessBitrate() { 941 void RTPSender::ProcessBitrate() {
937 if (!bitrate_callback_) 942 if (!bitrate_callback_)
938 return; 943 return;
939 int64_t now_ms = clock_->TimeInMilliseconds(); 944 int64_t now_ms = clock_->TimeInMilliseconds();
940 uint32_t ssrc; 945 uint32_t ssrc;
941 { 946 {
942 rtc::CritScope lock(&send_critsect_); 947 rtc::CritScope lock(&send_critsect_);
943 ssrc = ssrc_; 948 if (!ssrc_)
949 return;
950 ssrc = *ssrc_;
944 } 951 }
945 952
946 rtc::CritScope lock(&statistics_crit_); 953 rtc::CritScope lock(&statistics_crit_);
947 bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0), 954 bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0),
948 nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc); 955 nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc);
949 } 956 }
950 957
951 size_t RTPSender::RtpHeaderLength() const { 958 size_t RTPSender::RtpHeaderLength() const {
952 rtc::CritScope lock(&send_critsect_); 959 rtc::CritScope lock(&send_critsect_);
953 size_t rtp_header_length = kRtpHeaderLength; 960 size_t rtp_header_length = kRtpHeaderLength;
(...skipping 13 matching lines...) Expand all
967 StreamDataCounters* rtx_stats) const { 974 StreamDataCounters* rtx_stats) const {
968 rtc::CritScope lock(&statistics_crit_); 975 rtc::CritScope lock(&statistics_crit_);
969 *rtp_stats = rtp_stats_; 976 *rtp_stats = rtp_stats_;
970 *rtx_stats = rtx_rtp_stats_; 977 *rtx_stats = rtx_rtp_stats_;
971 } 978 }
972 979
973 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { 980 std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const {
974 rtc::CritScope lock(&send_critsect_); 981 rtc::CritScope lock(&send_critsect_);
975 std::unique_ptr<RtpPacketToSend> packet( 982 std::unique_ptr<RtpPacketToSend> packet(
976 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_)); 983 new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_));
977 packet->SetSsrc(ssrc_); 984 RTC_DCHECK(ssrc_);
985 packet->SetSsrc(*ssrc_);
978 packet->SetCsrcs(csrcs_); 986 packet->SetCsrcs(csrcs_);
979 // Reserve extensions, if registered, RtpSender set in SendToNetwork. 987 // Reserve extensions, if registered, RtpSender set in SendToNetwork.
980 packet->ReserveExtension<AbsoluteSendTime>(); 988 packet->ReserveExtension<AbsoluteSendTime>();
981 packet->ReserveExtension<TransmissionOffset>(); 989 packet->ReserveExtension<TransmissionOffset>();
982 packet->ReserveExtension<TransportSequenceNumber>(); 990 packet->ReserveExtension<TransportSequenceNumber>();
983 if (playout_delay_oracle_.send_playout_delay()) { 991 if (playout_delay_oracle_.send_playout_delay()) {
984 packet->SetExtension<PlayoutDelayLimits>( 992 packet->SetExtension<PlayoutDelayLimits>(
985 playout_delay_oracle_.playout_delay()); 993 playout_delay_oracle_.playout_delay());
986 } 994 }
987 return packet; 995 return packet;
988 } 996 }
989 997
990 bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) { 998 bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) {
991 rtc::CritScope lock(&send_critsect_); 999 rtc::CritScope lock(&send_critsect_);
992 if (!sending_media_) 1000 if (!sending_media_)
993 return false; 1001 return false;
994 RTC_DCHECK_EQ(packet->Ssrc(), ssrc_); 1002 RTC_DCHECK(packet->Ssrc() == ssrc_);
995 packet->SetSequenceNumber(sequence_number_++); 1003 packet->SetSequenceNumber(sequence_number_++);
996 1004
997 // Remember marker bit to determine if padding can be inserted with 1005 // Remember marker bit to determine if padding can be inserted with
998 // sequence number following |packet|. 1006 // sequence number following |packet|.
999 last_packet_marker_bit_ = packet->Marker(); 1007 last_packet_marker_bit_ = packet->Marker();
1000 // Save timestamps to generate timestamp field and extensions for the padding. 1008 // Save timestamps to generate timestamp field and extensions for the padding.
1001 last_rtp_timestamp_ = packet->Timestamp(); 1009 last_rtp_timestamp_ = packet->Timestamp();
1002 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); 1010 last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
1003 capture_time_ms_ = packet->capture_time_ms(); 1011 capture_time_ms_ = packet->capture_time_ms();
1004 return true; 1012 return true;
(...skipping 11 matching lines...) Expand all
1016 return false; 1024 return false;
1017 1025
1018 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1026 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1019 1027
1020 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id)) 1028 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id))
1021 return false; 1029 return false;
1022 1030
1023 return true; 1031 return true;
1024 } 1032 }
1025 1033
1026 void RTPSender::SetSendingStatus(bool enabled) {
1027 if (!enabled) {
1028 rtc::CritScope lock(&send_critsect_);
1029 if (!ssrc_forced_) {
1030 // Generate a new SSRC.
1031 ssrc_db_->ReturnSSRC(ssrc_);
1032 ssrc_ = ssrc_db_->CreateSSRC();
1033 RTC_DCHECK(ssrc_ != 0);
1034 }
1035 // Don't initialize seq number if SSRC passed externally.
1036 if (!sequence_number_forced_ && !ssrc_forced_) {
1037 // Generate a new sequence number.
1038 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1039 }
1040 }
1041 }
1042
1043 void RTPSender::SetSendingMediaStatus(bool enabled) { 1034 void RTPSender::SetSendingMediaStatus(bool enabled) {
1044 rtc::CritScope lock(&send_critsect_); 1035 rtc::CritScope lock(&send_critsect_);
1045 sending_media_ = enabled; 1036 sending_media_ = enabled;
1046 } 1037 }
1047 1038
1048 bool RTPSender::SendingMedia() const { 1039 bool RTPSender::SendingMedia() const {
1049 rtc::CritScope lock(&send_critsect_); 1040 rtc::CritScope lock(&send_critsect_);
1050 return sending_media_; 1041 return sending_media_;
1051 } 1042 }
1052 1043
1053 void RTPSender::SetTimestampOffset(uint32_t timestamp) { 1044 void RTPSender::SetTimestampOffset(uint32_t timestamp) {
1054 rtc::CritScope lock(&send_critsect_); 1045 rtc::CritScope lock(&send_critsect_);
1055 timestamp_offset_ = timestamp; 1046 timestamp_offset_ = timestamp;
1056 } 1047 }
1057 1048
1058 uint32_t RTPSender::TimestampOffset() const { 1049 uint32_t RTPSender::TimestampOffset() const {
1059 rtc::CritScope lock(&send_critsect_); 1050 rtc::CritScope lock(&send_critsect_);
1060 return timestamp_offset_; 1051 return timestamp_offset_;
1061 } 1052 }
1062 1053
1063 uint32_t RTPSender::GenerateNewSSRC() {
1064 // If configured via API, return 0.
1065 rtc::CritScope lock(&send_critsect_);
1066
1067 if (ssrc_forced_) {
1068 return 0;
1069 }
1070 ssrc_ = ssrc_db_->CreateSSRC();
1071 RTC_DCHECK(ssrc_ != 0);
1072 return ssrc_;
1073 }
1074
1075 void RTPSender::SetSSRC(uint32_t ssrc) { 1054 void RTPSender::SetSSRC(uint32_t ssrc) {
1076 // This is configured via the API. 1055 // This is configured via the API.
1077 rtc::CritScope lock(&send_critsect_); 1056 rtc::CritScope lock(&send_critsect_);
1078 1057
1079 if (ssrc_ == ssrc && ssrc_forced_) { 1058 if (ssrc_ == ssrc) {
1080 return; // Since it's same ssrc, don't reset anything. 1059 return; // Since it's same ssrc, don't reset anything.
1081 } 1060 }
1082 ssrc_forced_ = true; 1061 ssrc_.emplace(ssrc);
1083 ssrc_db_->ReturnSSRC(ssrc_);
1084 ssrc_db_->RegisterSSRC(ssrc);
1085 ssrc_ = ssrc;
1086 if (!sequence_number_forced_) { 1062 if (!sequence_number_forced_) {
1087 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 1063 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1088 } 1064 }
1089 } 1065 }
1090 1066
1091 uint32_t RTPSender::SSRC() const { 1067 uint32_t RTPSender::SSRC() const {
1092 rtc::CritScope lock(&send_critsect_); 1068 rtc::CritScope lock(&send_critsect_);
1093 return ssrc_; 1069 return *ssrc_;
1094 } 1070 }
1095 1071
1096 rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const { 1072 rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
1097 if (video_) { 1073 if (video_) {
1098 return video_->FlexfecSsrc(); 1074 return video_->FlexfecSsrc();
1099 } 1075 }
1100 return rtc::Optional<uint32_t>(); 1076 return rtc::Optional<uint32_t>();
1101 } 1077 }
1102 1078
1103 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { 1079 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1163 // when transport interface would be updated to take buffer class. 1139 // when transport interface would be updated to take buffer class.
1164 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend( 1140 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend(
1165 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize)); 1141 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize));
1166 // Add original RTP header. 1142 // Add original RTP header.
1167 rtx_packet->CopyHeaderFrom(packet); 1143 rtx_packet->CopyHeaderFrom(packet);
1168 { 1144 {
1169 rtc::CritScope lock(&send_critsect_); 1145 rtc::CritScope lock(&send_critsect_);
1170 if (!sending_media_) 1146 if (!sending_media_)
1171 return nullptr; 1147 return nullptr;
1172 1148
1149 RTC_DCHECK(ssrc_rtx_);
1150
1173 // Replace payload type. 1151 // Replace payload type.
1174 auto kv = rtx_payload_type_map_.find(packet.PayloadType()); 1152 auto kv = rtx_payload_type_map_.find(packet.PayloadType());
1175 if (kv == rtx_payload_type_map_.end()) 1153 if (kv == rtx_payload_type_map_.end())
1176 return nullptr; 1154 return nullptr;
1177 rtx_packet->SetPayloadType(kv->second); 1155 rtx_packet->SetPayloadType(kv->second);
1178 1156
1179 // Replace sequence number. 1157 // Replace sequence number.
1180 rtx_packet->SetSequenceNumber(sequence_number_rtx_++); 1158 rtx_packet->SetSequenceNumber(sequence_number_rtx_++);
1181 1159
1182 // Replace SSRC. 1160 // Replace SSRC.
1183 rtx_packet->SetSsrc(ssrc_rtx_); 1161 rtx_packet->SetSsrc(*ssrc_rtx_);
1184 } 1162 }
1185 1163
1186 uint8_t* rtx_payload = 1164 uint8_t* rtx_payload =
1187 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize); 1165 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize);
1188 RTC_DCHECK(rtx_payload); 1166 RTC_DCHECK(rtx_payload);
1189 // Add OSN (original sequence number). 1167 // Add OSN (original sequence number).
1190 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber()); 1168 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber());
1191 1169
1192 // Add original payload data. 1170 // Add original payload data.
1193 auto payload = packet.payload(); 1171 auto payload = packet.payload();
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { 1254 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) {
1277 return; 1255 return;
1278 } 1256 }
1279 rtp_overhead_bytes_per_packet_ = packet.headers_size(); 1257 rtp_overhead_bytes_per_packet_ = packet.headers_size();
1280 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_; 1258 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_;
1281 } 1259 }
1282 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); 1260 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet);
1283 } 1261 }
1284 1262
1285 } // namespace webrtc 1263 } // 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