| 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..5f6fecb2948f41538f3d5b0ab94ba807f666da98 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_ = rtc::Optional<uint32_t>(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?
|
| + 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_.value_or(0));
|
| packet->SetCsrcs(csrcs_);
|
| // Reserve extensions, if registered, RtpSender set in SendToNetwork.
|
| packet->ReserveExtension<AbsoluteSendTime>();
|
| @@ -991,7 +999,9 @@ bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) {
|
| rtc::CritScope lock(&send_critsect_);
|
| if (!sending_media_)
|
| return false;
|
| - RTC_DCHECK_EQ(packet->Ssrc(), ssrc_);
|
| + if (!ssrc_)
|
| + return false;
|
| + RTC_DCHECK_EQ(packet->Ssrc(), *ssrc_);
|
| packet->SetSequenceNumber(sequence_number_++);
|
|
|
| // Remember marker bit to determine if padding can be inserted with
|
| @@ -1023,22 +1033,9 @@ 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);
|
| - }
|
| - }
|
| -}
|
| +// TODO(nisse): This function used to generate a new ssrc and sequence
|
| +// number when |enabled| was false. Does anything rely on that?
|
| +void RTPSender::SetSendingStatus(bool enabled) {}
|
|
|
| void RTPSender::SetSendingMediaStatus(bool enabled) {
|
| rtc::CritScope lock(&send_critsect_);
|
| @@ -1060,29 +1057,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_== 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_ = rtc::Optional<uint32_t>(ssrc);
|
| if (!sequence_number_forced_) {
|
| sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
|
| }
|
| @@ -1090,7 +1072,8 @@ void RTPSender::SetSSRC(uint32_t ssrc) {
|
|
|
| uint32_t RTPSender::SSRC() const {
|
| rtc::CritScope lock(&send_critsect_);
|
| - return ssrc_;
|
| + // TODO(nisse): Is it better to crash if ssrc_ is unset?
|
| + return ssrc_.value_or(0);
|
| }
|
|
|
| rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
|
| @@ -1169,7 +1152,8 @@ std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket(
|
| rtc::CritScope lock(&send_critsect_);
|
| if (!sending_media_)
|
| return nullptr;
|
| -
|
| + if (!ssrc_rtx_)
|
| + return nullptr;
|
| // Replace payload type.
|
| auto kv = rtx_payload_type_map_.find(packet.PayloadType());
|
| if (kv == rtx_payload_type_map_.end())
|
| @@ -1180,7 +1164,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 =
|
|
|