Index: webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
index 7283663529b2b0949253242e826f70e6f27fdaf8..47ec31b9187584c11939ab5cba3e1a8e5bc7daf2 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
@@ -111,8 +111,10 @@ |
send_packet_observer_(send_packet_observer), |
bitrate_callback_(bitrate_callback), |
// RTP variables |
+ ssrc_db_(SSRCDatabase::GetSSRCDatabase()), |
remote_ssrc_(0), |
sequence_number_forced_(false), |
+ ssrc_forced_(false), |
last_rtp_timestamp_(0), |
capture_time_ms_(0), |
last_timestamp_time_ms_(0), |
@@ -126,6 +128,11 @@ |
send_side_bwe_with_overhead_( |
webrtc::field_trial::FindFullName( |
"WebRTC-SendSideBwe-WithOverhead") == "Enabled") { |
+ ssrc_ = ssrc_db_->CreateSSRC(); |
+ RTC_DCHECK(ssrc_ != 0); |
+ ssrc_rtx_ = ssrc_db_->CreateSSRC(); |
+ RTC_DCHECK(ssrc_rtx_ != 0); |
+ |
// This random initialization is not intended to be cryptographic strong. |
timestamp_offset_ = random_.Rand<uint32_t>(); |
// Random start, 16 bits. Can't be 0. |
@@ -150,6 +157,12 @@ |
// variables but we grab them in all other methods. (what's the design?) |
// Start documenting what thread we're on in what method so that it's easier |
// to understand performance attributes and possibly remove locks. |
+ if (remote_ssrc_ != 0) { |
+ ssrc_db_->ReturnSSRC(remote_ssrc_); |
+ } |
+ ssrc_db_->ReturnSSRC(ssrc_); |
+ |
+ SSRCDatabase::ReturnSSRCDatabase(); |
while (!payload_type_map_.empty()) { |
std::map<int8_t, RtpUtility::Payload*>::iterator it = |
payload_type_map_.begin(); |
@@ -197,7 +210,7 @@ |
return rtp_header_extension_map_.Register(type, id); |
case kRtpExtensionNone: |
case kRtpExtensionNumberOfExtensions: |
- LOG(LS_ERROR) << "Invalid RTP extension type for registration."; |
+ LOG(LS_ERROR) << "Invalid RTP extension type for registration"; |
return -1; |
} |
return -1; |
@@ -321,13 +334,12 @@ |
void RTPSender::SetRtxSsrc(uint32_t ssrc) { |
rtc::CritScope lock(&send_critsect_); |
- ssrc_rtx_.emplace(ssrc); |
+ ssrc_rtx_ = ssrc; |
} |
uint32_t RTPSender::RtxSsrc() const { |
rtc::CritScope lock(&send_critsect_); |
- RTC_DCHECK(ssrc_rtx_); |
- return *ssrc_rtx_; |
+ return ssrc_rtx_; |
} |
void RTPSender::SetRtxPayloadType(int payload_type, |
@@ -336,7 +348,7 @@ |
RTC_DCHECK_LE(payload_type, 127); |
RTC_DCHECK_LE(associated_payload_type, 127); |
if (payload_type < 0) { |
- LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type << "."; |
+ LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type; |
return; |
} |
@@ -348,7 +360,7 @@ |
rtc::CritScope lock(&send_critsect_); |
if (payload_type < 0) { |
- LOG(LS_ERROR) << "Invalid payload_type " << payload_type << "."; |
+ LOG(LS_ERROR) << "Invalid payload_type " << payload_type; |
return -1; |
} |
if (payload_type_ == payload_type) { |
@@ -389,9 +401,7 @@ |
{ |
// Drop this packet if we're not sending media packets. |
rtc::CritScope lock(&send_critsect_); |
- RTC_DCHECK(ssrc_); |
- |
- ssrc = *ssrc_; |
+ ssrc = ssrc_; |
sequence_number = sequence_number_; |
rtp_timestamp = timestamp_offset_ + capture_timestamp; |
if (transport_frame_id_out) |
@@ -511,14 +521,7 @@ |
if (!audio_configured_ && !last_packet_marker_bit_) { |
break; |
} |
- if (!ssrc_) { |
- LOG(LS_ERROR) << "SSRC unset."; |
- return 0; |
- } |
- |
- RTC_DCHECK(ssrc_); |
- ssrc = *ssrc_; |
- |
+ ssrc = ssrc_; |
sequence_number = sequence_number_; |
++sequence_number_; |
payload_type = payload_type_; |
@@ -542,12 +545,7 @@ |
(now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs; |
capture_time_ms += (now_ms - last_timestamp_time_ms_); |
} |
- if (!ssrc_rtx_) { |
- LOG(LS_ERROR) << "RTX SSRC unset."; |
- return 0; |
- } |
- RTC_DCHECK(ssrc_rtx_); |
- ssrc = *ssrc_rtx_; |
+ ssrc = ssrc_rtx_; |
sequence_number = sequence_number_rtx_; |
++sequence_number_rtx_; |
payload_type = rtx_payload_type_map_.begin()->second; |
@@ -647,7 +645,7 @@ |
"sent", bytes_sent); |
// TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. |
if (bytes_sent <= 0) { |
- LOG(LS_WARNING) << "Transport failed to send packet."; |
+ LOG(LS_WARNING) << "Transport failed to send packet"; |
return false; |
} |
return true; |
@@ -677,7 +675,7 @@ |
if (bytes_sent < 0) { |
// Failed to send one Sequence number. Give up the rest in this nack. |
LOG(LS_WARNING) << "Failed resending RTP packet " << seq_no |
- << ", Discard rest of packets."; |
+ << ", Discard rest of packets"; |
break; |
} |
} |
@@ -921,9 +919,7 @@ |
int max_delay_ms = 0; |
{ |
rtc::CritScope lock(&send_critsect_); |
- if (!ssrc_) |
- return; |
- ssrc = *ssrc_; |
+ ssrc = ssrc_; |
} |
{ |
rtc::CritScope cs(&statistics_crit_); |
@@ -963,9 +959,7 @@ |
uint32_t ssrc; |
{ |
rtc::CritScope lock(&send_critsect_); |
- if (!ssrc_) |
- return; |
- ssrc = *ssrc_; |
+ ssrc = ssrc_; |
} |
rtc::CritScope lock(&statistics_crit_); |
@@ -999,8 +993,7 @@ |
rtc::CritScope lock(&send_critsect_); |
std::unique_ptr<RtpPacketToSend> packet( |
new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_)); |
- RTC_DCHECK(ssrc_); |
- packet->SetSsrc(*ssrc_); |
+ packet->SetSsrc(ssrc_); |
packet->SetCsrcs(csrcs_); |
// Reserve extensions, if registered, RtpSender set in SendToNetwork. |
packet->ReserveExtension<AbsoluteSendTime>(); |
@@ -1017,7 +1010,7 @@ |
rtc::CritScope lock(&send_critsect_); |
if (!sending_media_) |
return false; |
- RTC_DCHECK(packet->Ssrc() == ssrc_); |
+ RTC_DCHECK_EQ(packet->Ssrc(), ssrc_); |
packet->SetSequenceNumber(sequence_number_++); |
// Remember marker bit to determine if padding can be inserted with |
@@ -1049,6 +1042,23 @@ |
return true; |
} |
+void RTPSender::SetSendingStatus(bool enabled) { |
+ if (!enabled) { |
+ rtc::CritScope lock(&send_critsect_); |
+ if (!ssrc_forced_) { |
+ // Generate a new SSRC. |
+ ssrc_db_->ReturnSSRC(ssrc_); |
+ ssrc_ = ssrc_db_->CreateSSRC(); |
+ RTC_DCHECK(ssrc_ != 0); |
+ } |
+ // Don't initialize seq number if SSRC passed externally. |
+ if (!sequence_number_forced_ && !ssrc_forced_) { |
+ // Generate a new sequence number. |
+ sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
+ } |
+ } |
+} |
+ |
void RTPSender::SetSendingMediaStatus(bool enabled) { |
rtc::CritScope lock(&send_critsect_); |
sending_media_ = enabled; |
@@ -1067,16 +1077,31 @@ |
uint32_t RTPSender::TimestampOffset() const { |
rtc::CritScope lock(&send_critsect_); |
return timestamp_offset_; |
+} |
+ |
+uint32_t RTPSender::GenerateNewSSRC() { |
+ // If configured via API, return 0. |
+ rtc::CritScope lock(&send_critsect_); |
+ |
+ if (ssrc_forced_) { |
+ return 0; |
+ } |
+ ssrc_ = ssrc_db_->CreateSSRC(); |
+ RTC_DCHECK(ssrc_ != 0); |
+ return ssrc_; |
} |
void RTPSender::SetSSRC(uint32_t ssrc) { |
// This is configured via the API. |
rtc::CritScope lock(&send_critsect_); |
- if (ssrc_ == ssrc) { |
+ if (ssrc_ == ssrc && ssrc_forced_) { |
return; // Since it's same ssrc, don't reset anything. |
} |
- ssrc_.emplace(ssrc); |
+ ssrc_forced_ = true; |
+ ssrc_db_->ReturnSSRC(ssrc_); |
+ ssrc_db_->RegisterSSRC(ssrc); |
+ ssrc_ = ssrc; |
if (!sequence_number_forced_) { |
sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
} |
@@ -1084,8 +1109,7 @@ |
uint32_t RTPSender::SSRC() const { |
rtc::CritScope lock(&send_critsect_); |
- RTC_DCHECK(ssrc_); |
- return *ssrc_; |
+ return ssrc_; |
} |
rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const { |
@@ -1165,8 +1189,6 @@ |
if (!sending_media_) |
return nullptr; |
- RTC_DCHECK(ssrc_rtx_); |
- |
// Replace payload type. |
auto kv = rtx_payload_type_map_.find(packet.PayloadType()); |
if (kv == rtx_payload_type_map_.end()) |
@@ -1177,7 +1199,7 @@ |
rtx_packet->SetSequenceNumber(sequence_number_rtx_++); |
// Replace SSRC. |
- rtx_packet->SetSsrc(*ssrc_rtx_); |
+ rtx_packet->SetSsrc(ssrc_rtx_); |
} |
uint8_t* rtx_payload = |