| 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 47ec31b9187584c11939ab5cba3e1a8e5bc7daf2..7283663529b2b0949253242e826f70e6f27fdaf8 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
|
| @@ -111,10 +111,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),
|
| @@ -128,11 +126,6 @@ RTPSender::RTPSender(
|
| 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.
|
| @@ -157,12 +150,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();
|
| @@ -210,7 +197,7 @@ int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type,
|
| 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;
|
| @@ -334,12 +321,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_;
|
| + RTC_DCHECK(ssrc_rtx_);
|
| + return *ssrc_rtx_;
|
| }
|
|
|
| void RTPSender::SetRtxPayloadType(int payload_type,
|
| @@ -348,7 +336,7 @@ void RTPSender::SetRtxPayloadType(int payload_type,
|
| 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;
|
| }
|
|
|
| @@ -360,7 +348,7 @@ int32_t RTPSender::CheckPayloadType(int8_t payload_type,
|
| 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) {
|
| @@ -401,7 +389,9 @@ bool RTPSender::SendOutgoingData(FrameType frame_type,
|
| {
|
| // Drop this packet if we're not sending media packets.
|
| rtc::CritScope lock(&send_critsect_);
|
| - ssrc = ssrc_;
|
| + RTC_DCHECK(ssrc_);
|
| +
|
| + ssrc = *ssrc_;
|
| sequence_number = sequence_number_;
|
| rtp_timestamp = timestamp_offset_ + capture_timestamp;
|
| if (transport_frame_id_out)
|
| @@ -521,7 +511,14 @@ size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) {
|
| if (!audio_configured_ && !last_packet_marker_bit_) {
|
| break;
|
| }
|
| - ssrc = ssrc_;
|
| + if (!ssrc_) {
|
| + LOG(LS_ERROR) << "SSRC unset.";
|
| + return 0;
|
| + }
|
| +
|
| + RTC_DCHECK(ssrc_);
|
| + ssrc = *ssrc_;
|
| +
|
| sequence_number = sequence_number_;
|
| ++sequence_number_;
|
| payload_type = payload_type_;
|
| @@ -545,7 +542,12 @@ 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;
|
| + }
|
| + RTC_DCHECK(ssrc_rtx_);
|
| + ssrc = *ssrc_rtx_;
|
| sequence_number = sequence_number_rtx_;
|
| ++sequence_number_rtx_;
|
| payload_type = rtx_payload_type_map_.begin()->second;
|
| @@ -645,7 +647,7 @@ bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet,
|
| "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;
|
| @@ -675,7 +677,7 @@ void RTPSender::OnReceivedNack(
|
| 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;
|
| }
|
| }
|
| @@ -919,7 +921,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_);
|
| @@ -959,7 +963,9 @@ void RTPSender::ProcessBitrate() {
|
| uint32_t ssrc;
|
| {
|
| rtc::CritScope lock(&send_critsect_);
|
| - ssrc = ssrc_;
|
| + if (!ssrc_)
|
| + return;
|
| + ssrc = *ssrc_;
|
| }
|
|
|
| rtc::CritScope lock(&statistics_crit_);
|
| @@ -993,7 +999,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>();
|
| @@ -1010,7 +1017,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
|
| @@ -1042,23 +1049,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;
|
| @@ -1079,29 +1069,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);
|
| }
|
| @@ -1109,7 +1084,8 @@ void RTPSender::SetSSRC(uint32_t ssrc) {
|
|
|
| uint32_t RTPSender::SSRC() const {
|
| rtc::CritScope lock(&send_critsect_);
|
| - return ssrc_;
|
| + RTC_DCHECK(ssrc_);
|
| + return *ssrc_;
|
| }
|
|
|
| rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
|
| @@ -1189,6 +1165,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())
|
| @@ -1199,7 +1177,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 =
|
|
|