Chromium Code Reviews| 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 ae491209b7f22edf1ff3d063a66ded37dfeff200..9970ba8ca99455a6cd1f7e4af03f30a9d2097ee9 100644 |
| --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
| @@ -110,10 +110,8 @@ RTPSender::RTPSender( |
| 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), |
| @@ -124,11 +122,6 @@ RTPSender::RTPSender( |
| rtp_overhead_bytes_per_packet_(0), |
| retransmission_rate_limiter_(retransmission_rate_limiter), |
| overhead_observer_(overhead_observer) { |
| - 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. |
| @@ -153,12 +146,6 @@ RTPSender::~RTPSender() { |
| // 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(); |
| @@ -330,12 +317,13 @@ int RTPSender::RtxStatus() const { |
| void RTPSender::SetRtxSsrc(uint32_t ssrc) { |
| rtc::CritScope lock(&send_critsect_); |
| - ssrc_rtx_ = ssrc; |
| + ssrc_rtx_.emplace(ssrc); |
| } |
| uint32_t RTPSender::RtxSsrc() const { |
| rtc::CritScope lock(&send_critsect_); |
| - return ssrc_rtx_; |
| + // 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.
|
| + return ssrc_rtx_.value_or(0); |
| } |
| void RTPSender::SetRtxPayloadType(int payload_type, |
| @@ -397,7 +385,12 @@ bool RTPSender::SendOutgoingData(FrameType frame_type, |
| { |
| // Drop this packet if we're not sending media packets. |
| rtc::CritScope lock(&send_critsect_); |
| - ssrc = ssrc_; |
| + if (!ssrc_) { |
| + LOG(LS_ERROR) << "SSRC unset"; |
| + return false; |
| + } |
| + |
| + ssrc = *ssrc_; |
| sequence_number = sequence_number_; |
| rtp_timestamp = timestamp_offset_ + capture_timestamp; |
| if (transport_frame_id_out) |
| @@ -502,7 +495,13 @@ size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { |
| // Without RTX we can't send padding in the middle of frames. |
| if (!last_packet_marker_bit_) |
| break; |
| - ssrc = ssrc_; |
| + if (!ssrc_) { |
| + LOG(LS_ERROR) << "SSRC unset"; |
| + return 0; |
| + } |
| + |
| + ssrc = *ssrc_; |
| + |
| sequence_number = sequence_number_; |
| ++sequence_number_; |
| payload_type = payload_type_; |
| @@ -526,7 +525,11 @@ size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { |
| (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs; |
| capture_time_ms += (now_ms - last_timestamp_time_ms_); |
| } |
| - ssrc = ssrc_rtx_; |
| + if (!ssrc_rtx_) { |
| + LOG(LS_ERROR) << "RTX SSRC unset"; |
| + return 0; |
| + } |
| + ssrc = *ssrc_rtx_; |
| sequence_number = sequence_number_rtx_; |
| ++sequence_number_rtx_; |
| payload_type = rtx_payload_type_map_.begin()->second; |
| @@ -900,7 +903,9 @@ void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { |
| int max_delay_ms = 0; |
| { |
| rtc::CritScope lock(&send_critsect_); |
| - ssrc = ssrc_; |
| + if (!ssrc_) |
| + return; |
| + ssrc = *ssrc_; |
| } |
| { |
| rtc::CritScope cs(&statistics_crit_); |
| @@ -940,7 +945,9 @@ void RTPSender::ProcessBitrate() { |
| uint32_t ssrc; |
| { |
| rtc::CritScope lock(&send_critsect_); |
| - ssrc = ssrc_; |
| + if (!ssrc_) |
| + return; |
| + ssrc = *ssrc_; |
| } |
| rtc::CritScope lock(&statistics_crit_); |
| @@ -974,7 +981,8 @@ std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const { |
| rtc::CritScope lock(&send_critsect_); |
| std::unique_ptr<RtpPacketToSend> packet( |
| new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_)); |
| - packet->SetSsrc(ssrc_); |
| + RTC_DCHECK(ssrc_); |
| + packet->SetSsrc(*ssrc_); |
| packet->SetCsrcs(csrcs_); |
| // Reserve extensions, if registered, RtpSender set in SendToNetwork. |
| packet->ReserveExtension<AbsoluteSendTime>(); |
| @@ -991,7 +999,7 @@ bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) { |
| rtc::CritScope lock(&send_critsect_); |
| if (!sending_media_) |
| return false; |
| - RTC_DCHECK_EQ(packet->Ssrc(), ssrc_); |
| + RTC_DCHECK(packet->Ssrc() == ssrc_); |
| packet->SetSequenceNumber(sequence_number_++); |
| // Remember marker bit to determine if padding can be inserted with |
| @@ -1023,23 +1031,6 @@ bool RTPSender::UpdateTransportSequenceNumber(RtpPacketToSend* packet, |
| 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; |
| @@ -1060,29 +1051,14 @@ uint32_t RTPSender::TimestampOffset() const { |
| 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 && ssrc_forced_) { |
| + if (ssrc_ == ssrc) { |
| return; // Since it's same ssrc, don't reset anything. |
| } |
| - ssrc_forced_ = true; |
| - ssrc_db_->ReturnSSRC(ssrc_); |
| - ssrc_db_->RegisterSSRC(ssrc); |
| - ssrc_ = ssrc; |
| + ssrc_.emplace(ssrc); |
| if (!sequence_number_forced_) { |
| sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
| } |
| @@ -1090,7 +1066,7 @@ void RTPSender::SetSSRC(uint32_t ssrc) { |
| uint32_t RTPSender::SSRC() const { |
| rtc::CritScope lock(&send_critsect_); |
| - return ssrc_; |
| + return *ssrc_; |
| } |
| rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const { |
| @@ -1170,6 +1146,8 @@ std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket( |
| 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()) |
| @@ -1180,7 +1158,7 @@ std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket( |
| rtx_packet->SetSequenceNumber(sequence_number_rtx_++); |
| // Replace SSRC. |
| - rtx_packet->SetSsrc(ssrc_rtx_); |
| + rtx_packet->SetSsrc(*ssrc_rtx_); |
| } |
| uint8_t* rtx_payload = |