Make rtcp sender use max transfer unit.
Remove packet overhead from rtp sender as unused.
R=philipel, åsapersson
Review URL: https://codereview.webrtc.org/1827953002
Cr-Commit-Position: refs/heads/master@{#12165}
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
index a5fcceb..440bd50 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
@@ -99,8 +99,10 @@
}
}
- size_t SendPackets() {
- rtcp::CompoundPacket::Build(this);
+ size_t SendPackets(size_t max_payload_length) {
+ RTC_DCHECK_LE(max_payload_length, static_cast<size_t>(IP_PACKET_SIZE));
+ uint8_t buffer[IP_PACKET_SIZE];
+ BuildExternalBuffer(buffer, max_payload_length, this);
return bytes_sent_;
}
@@ -169,6 +171,7 @@
tmmbr_help_(),
tmmbr_send_(0),
packet_oh_send_(0),
+ max_payload_length_(IP_PACKET_SIZE - 28), // IPv4 + UDP by default.
app_sub_type_(0),
app_name_(0),
@@ -277,6 +280,10 @@
}
}
+void RTCPSender::SetMaxPayloadLength(size_t max_payload_length) {
+ max_payload_length_ = max_payload_length;
+}
+
void RTCPSender::SetStartTimestamp(uint32_t start_timestamp) {
rtc::CritScope lock(&critical_section_rtcp_sender_);
start_timestamp_ = start_timestamp;
@@ -809,7 +816,7 @@
RTC_DCHECK(AllVolatileFlagsConsumed());
}
- size_t bytes_sent = container.SendPackets();
+ size_t bytes_sent = container.SendPackets(max_payload_length_);
return bytes_sent == 0 ? -1 : 0;
}
@@ -1030,8 +1037,9 @@
// but we can't because of an incorrect warning (C4822) in MVS 2013.
} sender(transport_, event_log_);
+ RTC_DCHECK_LE(max_payload_length_, static_cast<size_t>(IP_PACKET_SIZE));
uint8_t buffer[IP_PACKET_SIZE];
- return packet.BuildExternalBuffer(buffer, IP_PACKET_SIZE, &sender) &&
+ return packet.BuildExternalBuffer(buffer, max_payload_length_, &sender) &&
!sender.send_failure_;
}
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.h b/webrtc/modules/rtp_rtcp/source/rtcp_sender.h
index 5183b56..ba6fb70 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.h
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.h
@@ -132,6 +132,8 @@
void SetTMMBRStatus(bool enable);
+ void SetMaxPayloadLength(size_t max_payload_length);
+
int32_t SetTMMBN(const TMMBRSet* boundingSet);
int32_t SetApplicationSpecificData(uint8_t subType,
@@ -240,6 +242,7 @@
TMMBRHelp tmmbr_help_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t tmmbr_send_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t packet_oh_send_ GUARDED_BY(critical_section_rtcp_sender_);
+ size_t max_payload_length_;
// APP
uint8_t app_sub_type_ GUARDED_BY(critical_section_rtcp_sender_);
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index 581aa51..5875529 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -118,6 +118,7 @@
uint32_t SSRC = rtp_sender_.SSRC();
rtcp_sender_.SetSSRC(SSRC);
SetRtcpReceiverSsrcs(SSRC);
+ SetMaxTransferUnit(IP_PACKET_SIZE);
}
// Returns the number of milliseconds until the module want a worker thread
@@ -479,21 +480,22 @@
// Ok same as before.
return 0;
}
- // Calc diff.
- int16_t packet_over_head_diff = packet_overhead - packet_overhead_;
- // Store new.
+ size_t mtu = rtp_sender_.MaxPayloadLength() + packet_overhead_;
+ size_t max_payload_length = mtu - packet_overhead;
packet_overhead_ = packet_overhead;
-
- uint16_t length =
- rtp_sender_.MaxPayloadLength() - packet_over_head_diff;
- return rtp_sender_.SetMaxPayloadLength(length, packet_overhead_);
+ rtcp_sender_.SetMaxPayloadLength(max_payload_length);
+ rtp_sender_.SetMaxPayloadLength(max_payload_length);
+ return 0;
}
-int32_t ModuleRtpRtcpImpl::SetMaxTransferUnit(const uint16_t mtu) {
- RTC_DCHECK_LE(mtu, IP_PACKET_SIZE) << "Invalid mtu: " << mtu;
- return rtp_sender_.SetMaxPayloadLength(mtu - packet_overhead_,
- packet_overhead_);
+int32_t ModuleRtpRtcpImpl::SetMaxTransferUnit(uint16_t mtu) {
+ RTC_DCHECK_LE(mtu, IP_PACKET_SIZE) << "MTU too large: " << mtu;
+ RTC_DCHECK_GT(mtu, packet_overhead_) << "MTU too small: " << mtu;
+ size_t max_payload_length = mtu - packet_overhead_;
+ rtcp_sender_.SetMaxPayloadLength(max_payload_length);
+ rtp_sender_.SetMaxPayloadLength(max_payload_length);
+ return 0;
}
RtcpMode ModuleRtpRtcpImpl::RTCP() const {
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
index 36d7eb5..3fbca7b 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
@@ -133,7 +133,6 @@
transport_(transport),
sending_media_(true), // Default to sending media.
max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP.
- packet_over_head_(28),
payload_type_(-1),
payload_type_map_(),
rtp_header_extension_map_(),
@@ -375,15 +374,12 @@
return audio_ != NULL ? audio_->AudioFrequency() : kVideoPayloadTypeFrequency;
}
-int32_t RTPSender::SetMaxPayloadLength(size_t max_payload_length,
- uint16_t packet_over_head) {
+void RTPSender::SetMaxPayloadLength(size_t max_payload_length) {
// Sanity check.
RTC_DCHECK(max_payload_length >= 100 && max_payload_length <= IP_PACKET_SIZE)
<< "Invalid max payload length: " << max_payload_length;
rtc::CritScope lock(&send_critsect_);
max_payload_length_ = max_payload_length;
- packet_over_head_ = packet_over_head;
- return 0;
}
size_t RTPSender::MaxDataPayloadLength() const {
@@ -405,8 +401,6 @@
return max_payload_length_;
}
-uint16_t RTPSender::PacketOverHead() const { return packet_over_head_; }
-
void RTPSender::SetRtxStatus(int mode) {
rtc::CritScope lock(&send_critsect_);
rtx_ = mode;
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.h b/webrtc/modules/rtp_rtcp/source/rtp_sender.h
index b376c38..4344df6 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender.h
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.h
@@ -67,7 +67,6 @@
virtual uint16_t SequenceNumber() const = 0;
virtual size_t MaxPayloadLength() const = 0;
virtual size_t MaxDataPayloadLength() const = 0;
- virtual uint16_t PacketOverHead() const = 0;
virtual uint16_t ActualSendBitrateKbit() const = 0;
virtual int32_t SendToNetwork(uint8_t* data_buffer,
@@ -146,7 +145,7 @@
void SetCsrcs(const std::vector<uint32_t>& csrcs);
- int32_t SetMaxPayloadLength(size_t length, uint16_t packet_over_head);
+ void SetMaxPayloadLength(size_t max_payload_length);
int32_t SendOutgoingData(FrameType frame_type,
int8_t payload_type,
@@ -247,7 +246,6 @@
size_t RTPHeaderLength() const override;
uint16_t AllocateSequenceNumber(uint16_t packets_to_send) override;
size_t MaxPayloadLength() const override;
- uint16_t PacketOverHead() const override;
// Current timestamp.
uint32_t Timestamp() const override;
@@ -437,7 +435,6 @@
bool sending_media_ GUARDED_BY(send_critsect_);
size_t max_payload_length_;
- uint16_t packet_over_head_;
int8_t payload_type_ GUARDED_BY(send_critsect_);
std::map<int8_t, RtpUtility::Payload*> payload_type_map_;