RtpSender: remove lock recursions.

This change removes lock recursions and adds thread annotations.

Bug: webrtc:11567
Change-Id: I4d5a8b361b140c24f4bcd2dcb83706ca0b3927d2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/176222
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31370}
This commit is contained in:
Markus Handell 2020-05-27 17:21:03 +02:00 committed by Commit Bot
parent 3eac111115
commit 0ee4ee85dd
2 changed files with 75 additions and 47 deletions

View File

@ -431,7 +431,7 @@ std::vector<std::unique_ptr<RtpPacketToSend>> RTPSender::GeneratePadding(
size_t padding_bytes_in_packet;
const size_t max_payload_size =
max_packet_size_ - FecOrPaddingPacketMaxRtpHeaderLength();
max_packet_size_ - max_padding_fec_packet_header_;
if (audio_configured_) {
// Allow smaller padding packets for audio.
padding_bytes_in_packet = rtc::SafeClamp<size_t>(

View File

@ -51,99 +51,127 @@ class RTPSender {
~RTPSender();
void SetSendingMediaStatus(bool enabled);
bool SendingMedia() const;
bool IsAudioConfigured() const;
void SetSendingMediaStatus(bool enabled) RTC_LOCKS_EXCLUDED(send_critsect_);
bool SendingMedia() const RTC_LOCKS_EXCLUDED(send_critsect_);
bool IsAudioConfigured() const RTC_LOCKS_EXCLUDED(send_critsect_);
uint32_t TimestampOffset() const;
void SetTimestampOffset(uint32_t timestamp);
uint32_t TimestampOffset() const RTC_LOCKS_EXCLUDED(send_critsect_);
void SetTimestampOffset(uint32_t timestamp)
RTC_LOCKS_EXCLUDED(send_critsect_);
void SetRid(const std::string& rid);
void SetRid(const std::string& rid) RTC_LOCKS_EXCLUDED(send_critsect_);
void SetMid(const std::string& mid);
void SetMid(const std::string& mid) RTC_LOCKS_EXCLUDED(send_critsect_);
uint16_t SequenceNumber() const;
void SetSequenceNumber(uint16_t seq);
uint16_t SequenceNumber() const RTC_LOCKS_EXCLUDED(send_critsect_);
void SetSequenceNumber(uint16_t seq) RTC_LOCKS_EXCLUDED(send_critsect_);
void SetCsrcs(const std::vector<uint32_t>& csrcs);
void SetCsrcs(const std::vector<uint32_t>& csrcs)
RTC_LOCKS_EXCLUDED(send_critsect_);
void SetMaxRtpPacketSize(size_t max_packet_size);
void SetMaxRtpPacketSize(size_t max_packet_size)
RTC_LOCKS_EXCLUDED(send_critsect_);
void SetExtmapAllowMixed(bool extmap_allow_mixed);
void SetExtmapAllowMixed(bool extmap_allow_mixed)
RTC_LOCKS_EXCLUDED(send_critsect_);
// RTP header extension
int32_t RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id);
bool RegisterRtpHeaderExtension(absl::string_view uri, int id);
bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) const;
int32_t DeregisterRtpHeaderExtension(RTPExtensionType type);
void DeregisterRtpHeaderExtension(absl::string_view uri);
int32_t RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id)
RTC_LOCKS_EXCLUDED(send_critsect_);
bool RegisterRtpHeaderExtension(absl::string_view uri, int id)
RTC_LOCKS_EXCLUDED(send_critsect_);
bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) const
RTC_LOCKS_EXCLUDED(send_critsect_);
int32_t DeregisterRtpHeaderExtension(RTPExtensionType type)
RTC_LOCKS_EXCLUDED(send_critsect_);
void DeregisterRtpHeaderExtension(absl::string_view uri)
RTC_LOCKS_EXCLUDED(send_critsect_);
bool SupportsPadding() const;
bool SupportsRtxPayloadPadding() const;
bool SupportsPadding() const RTC_LOCKS_EXCLUDED(send_critsect_);
bool SupportsRtxPayloadPadding() const RTC_LOCKS_EXCLUDED(send_critsect_);
std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
size_t target_size_bytes,
bool media_has_been_sent);
bool media_has_been_sent) RTC_LOCKS_EXCLUDED(send_critsect_);
// NACK.
void OnReceivedNack(const std::vector<uint16_t>& nack_sequence_numbers,
int64_t avg_rtt);
int64_t avg_rtt) RTC_LOCKS_EXCLUDED(send_critsect_);
int32_t ReSendPacket(uint16_t packet_id);
int32_t ReSendPacket(uint16_t packet_id) RTC_LOCKS_EXCLUDED(send_critsect_);
// ACK.
void OnReceivedAckOnSsrc(int64_t extended_highest_sequence_number);
void OnReceivedAckOnRtxSsrc(int64_t extended_highest_sequence_number);
void OnReceivedAckOnSsrc(int64_t extended_highest_sequence_number)
RTC_LOCKS_EXCLUDED(send_critsect_);
void OnReceivedAckOnRtxSsrc(int64_t extended_highest_sequence_number)
RTC_LOCKS_EXCLUDED(send_critsect_);
// RTX.
void SetRtxStatus(int mode);
int RtxStatus() const;
absl::optional<uint32_t> RtxSsrc() const { return rtx_ssrc_; }
void SetRtxStatus(int mode) RTC_LOCKS_EXCLUDED(send_critsect_);
int RtxStatus() const RTC_LOCKS_EXCLUDED(send_critsect_);
absl::optional<uint32_t> RtxSsrc() const RTC_LOCKS_EXCLUDED(send_critsect_) {
return rtx_ssrc_;
}
void SetRtxPayloadType(int payload_type, int associated_payload_type);
void SetRtxPayloadType(int payload_type, int associated_payload_type)
RTC_LOCKS_EXCLUDED(send_critsect_);
// Size info for header extensions used by FEC packets.
static rtc::ArrayView<const RtpExtensionSize> FecExtensionSizes();
static rtc::ArrayView<const RtpExtensionSize> FecExtensionSizes()
RTC_LOCKS_EXCLUDED(send_critsect_);
// Size info for header extensions used by video packets.
static rtc::ArrayView<const RtpExtensionSize> VideoExtensionSizes();
static rtc::ArrayView<const RtpExtensionSize> VideoExtensionSizes()
RTC_LOCKS_EXCLUDED(send_critsect_);
// Size info for header extensions used by audio packets.
static rtc::ArrayView<const RtpExtensionSize> AudioExtensionSizes();
static rtc::ArrayView<const RtpExtensionSize> AudioExtensionSizes()
RTC_LOCKS_EXCLUDED(send_critsect_);
// Create empty packet, fills ssrc, csrcs and reserve place for header
// extensions RtpSender updates before sending.
std::unique_ptr<RtpPacketToSend> AllocatePacket() const;
std::unique_ptr<RtpPacketToSend> AllocatePacket() const
RTC_LOCKS_EXCLUDED(send_critsect_);
// Allocate sequence number for provided packet.
// Save packet's fields to generate padding that doesn't break media stream.
// Return false if sending was turned off.
bool AssignSequenceNumber(RtpPacketToSend* packet);
bool AssignSequenceNumber(RtpPacketToSend* packet)
RTC_LOCKS_EXCLUDED(send_critsect_);
// Maximum header overhead per fec/padding packet.
size_t FecOrPaddingPacketMaxRtpHeaderLength() const;
size_t FecOrPaddingPacketMaxRtpHeaderLength() const
RTC_LOCKS_EXCLUDED(send_critsect_);
// Expected header overhead per media packet.
size_t ExpectedPerPacketOverhead() const;
uint16_t AllocateSequenceNumber(uint16_t packets_to_send);
size_t ExpectedPerPacketOverhead() const RTC_LOCKS_EXCLUDED(send_critsect_);
uint16_t AllocateSequenceNumber(uint16_t packets_to_send)
RTC_LOCKS_EXCLUDED(send_critsect_);
// Including RTP headers.
size_t MaxRtpPacketSize() const;
size_t MaxRtpPacketSize() const RTC_LOCKS_EXCLUDED(send_critsect_);
uint32_t SSRC() const { return ssrc_; }
uint32_t SSRC() const RTC_LOCKS_EXCLUDED(send_critsect_) { return ssrc_; }
absl::optional<uint32_t> FlexfecSsrc() const { return flexfec_ssrc_; }
absl::optional<uint32_t> FlexfecSsrc() const
RTC_LOCKS_EXCLUDED(send_critsect_) {
return flexfec_ssrc_;
}
// Sends packet to |transport_| or to the pacer, depending on configuration.
// TODO(bugs.webrtc.org/XXX): Remove in favor of EnqueuePackets().
bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet);
bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet)
RTC_LOCKS_EXCLUDED(send_critsect_);
// Pass a set of packets to RtpPacketSender instance, for paced or immediate
// sending to the network.
void EnqueuePackets(std::vector<std::unique_ptr<RtpPacketToSend>> packets);
void EnqueuePackets(std::vector<std::unique_ptr<RtpPacketToSend>> packets)
RTC_LOCKS_EXCLUDED(send_critsect_);
void SetRtpState(const RtpState& rtp_state);
RtpState GetRtpState() const;
void SetRtxRtpState(const RtpState& rtp_state);
RtpState GetRtxRtpState() const;
void SetRtpState(const RtpState& rtp_state)
RTC_LOCKS_EXCLUDED(send_critsect_);
RtpState GetRtpState() const RTC_LOCKS_EXCLUDED(send_critsect_);
void SetRtxRtpState(const RtpState& rtp_state)
RTC_LOCKS_EXCLUDED(send_critsect_);
RtpState GetRtxRtpState() const RTC_LOCKS_EXCLUDED(send_critsect_);
int64_t LastTimestampTimeMs() const;
int64_t LastTimestampTimeMs() const RTC_LOCKS_EXCLUDED(send_critsect_);
private:
std::unique_ptr<RtpPacketToSend> BuildRtxPacket(