Move towards always using packet type instead of priority in RTPSender
Bug: webrtc:10633
Change-Id: I835686f58f9edcf0c7cec8f0b3d54eb93f2920df
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/143176
Commit-Queue: Erik Språng <sprang@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28349}
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index 68a8e21..ae811a2 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -87,6 +87,42 @@
RtpGenericFrameDescriptorExtension01::kMaxSizeBytes},
};
+// TODO(bugs.webrtc.org/10633): Remove when downstream code stops using
+// priority. At the time of writing, the priority can be directly mapped to a
+// packet type. This is only for a transition period.
+RtpPacketToSend::Type PacketPriorityToType(RtpPacketSender::Priority priority) {
+ switch (priority) {
+ case RtpPacketSender::Priority::kLowPriority:
+ return RtpPacketToSend::Type::kVideo;
+ case RtpPacketSender::Priority::kNormalPriority:
+ return RtpPacketToSend::Type::kRetransmission;
+ case RtpPacketSender::Priority::kHighPriority:
+ return RtpPacketToSend::Type::kAudio;
+ default:
+ RTC_NOTREACHED() << "Unexpected priority: " << priority;
+ return RtpPacketToSend::Type::kVideo;
+ }
+}
+
+// TODO(bugs.webrtc.org/10633): Remove when packets are always owned by pacer.
+RtpPacketSender::Priority PacketTypeToPriority(RtpPacketToSend::Type type) {
+ switch (type) {
+ case RtpPacketToSend::Type::kAudio:
+ return RtpPacketSender::Priority::kHighPriority;
+ case RtpPacketToSend::Type::kVideo:
+ return RtpPacketSender::Priority::kLowPriority;
+ case RtpPacketToSend::Type::kRetransmission:
+ return RtpPacketSender::Priority::kNormalPriority;
+ case RtpPacketToSend::Type::kForwardErrorCorrection:
+ return RtpPacketSender::Priority::kLowPriority;
+ break;
+ case RtpPacketToSend::Type::kPadding:
+ RTC_NOTREACHED() << "Unexpected type for legacy path: kPadding";
+ break;
+ }
+ return RtpPacketSender::Priority::kLowPriority;
+}
+
} // namespace
RTPSender::RTPSender(
@@ -802,8 +838,7 @@
}
bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
- StorageType storage,
- RtpPacketSender::Priority priority) {
+ StorageType storage) {
RTC_DCHECK(packet);
int64_t now_ms = clock_->TimeInMilliseconds();
@@ -813,6 +848,8 @@
int64_t capture_time_ms = packet->capture_time_ms();
size_t packet_size =
send_side_bwe_with_overhead_ ? packet->size() : packet->payload_size();
+ auto packet_type = packet->packet_type();
+ RTC_DCHECK(packet_type.has_value());
if (ssrc == FlexfecSsrc()) {
// Store FlexFEC packets in the history here, so they can be found
// when the pacer calls TimeToSendPacket.
@@ -822,8 +859,8 @@
packet_history_.PutRtpPacket(std::move(packet), storage, absl::nullopt);
}
- paced_sender_->InsertPacket(priority, ssrc, seq_no, capture_time_ms,
- packet_size, false);
+ paced_sender_->InsertPacket(PacketTypeToPriority(*packet_type), ssrc,
+ seq_no, capture_time_ms, packet_size, false);
return true;
}
@@ -884,6 +921,13 @@
return sent;
}
+bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
+ StorageType storage,
+ RtpPacketSender::Priority priority) {
+ packet->set_packet_type(PacketPriorityToType(priority));
+ return SendToNetwork(std::move(packet), storage);
+}
+
void RTPSender::RecomputeMaxSendDelay() {
max_delay_it_ = send_delays_.begin();
for (auto it = send_delays_.begin(); it != send_delays_.end(); ++it) {
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
index 94ef809..5e86742 100644
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ b/modules/rtp_rtcp/source/rtp_sender.h
@@ -159,6 +159,10 @@
// Sends packet to |transport_| or to the pacer, depending on configuration.
bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
+ StorageType storage);
+
+ // Fallback that infers PacketType from Priority.
+ bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
StorageType storage,
RtpPacketSender::Priority priority);
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio.cc b/modules/rtp_rtcp/source/rtp_sender_audio.cc
index c54cb91..9e5e71c 100644
--- a/modules/rtp_rtcp/source/rtp_sender_audio.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_audio.cc
@@ -255,8 +255,9 @@
TRACE_EVENT_ASYNC_END2("webrtc", "Audio", rtp_timestamp, "timestamp",
packet->Timestamp(), "seqnum",
packet->SequenceNumber());
- bool send_result = LogAndSendToNetwork(
- std::move(packet), kAllowRetransmission, RtpPacketSender::kHighPriority);
+ packet->set_packet_type(RtpPacketToSend::Type::kAudio);
+ bool send_result =
+ LogAndSendToNetwork(std::move(packet), kAllowRetransmission);
if (first_packet_sent_()) {
RTC_LOG(LS_INFO) << "First audio RTP packet sent to pacer";
}
@@ -339,8 +340,8 @@
dtmfbuffer[1] = E | R | volume;
ByteWriter<uint16_t>::WriteBigEndian(dtmfbuffer + 2, duration);
- result = LogAndSendToNetwork(std::move(packet), kAllowRetransmission,
- RtpPacketSender::kHighPriority);
+ packet->set_packet_type(RtpPacketToSend::Type::kAudio);
+ result = LogAndSendToNetwork(std::move(packet), kAllowRetransmission);
send_count--;
} while (send_count > 0 && result);
@@ -349,8 +350,7 @@
bool RTPSenderAudio::LogAndSendToNetwork(
std::unique_ptr<RtpPacketToSend> packet,
- StorageType storage,
- RtpPacketSender::Priority priority) {
+ StorageType storage) {
#if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
int64_t now_ms = clock_->TimeInMilliseconds();
BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioTotBitrate_kbps", now_ms,
@@ -360,8 +360,7 @@
rtp_sender_->NackOverheadRate() / 1000,
packet->Ssrc());
#endif
-
- return rtp_sender_->SendToNetwork(std::move(packet), storage, priority);
+ return rtp_sender_->SendToNetwork(std::move(packet), storage);
}
} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio.h b/modules/rtp_rtcp/source/rtp_sender_audio.h
index 1c78e92..d8a61fd 100644
--- a/modules/rtp_rtcp/source/rtp_sender_audio.h
+++ b/modules/rtp_rtcp/source/rtp_sender_audio.h
@@ -64,8 +64,7 @@
private:
bool LogAndSendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
- StorageType storage,
- RtpPacketSender::Priority priority);
+ StorageType storage);
Clock* const clock_ = nullptr;
RTPSender* const rtp_sender_ = nullptr;
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc
index 419e938..bbadda8 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -251,8 +251,8 @@
// Remember some values about the packet before sending it away.
size_t packet_size = packet->size();
uint16_t seq_num = packet->SequenceNumber();
- if (!LogAndSendToNetwork(std::move(packet), storage,
- RtpPacketSender::kLowPriority)) {
+ packet->set_packet_type(RtpPacketToSend::Type::kVideo);
+ if (!LogAndSendToNetwork(std::move(packet), storage)) {
RTC_LOG(LS_WARNING) << "Failed to send video packet " << seq_num;
return;
}
@@ -293,8 +293,8 @@
}
// Send |red_packet| instead of |packet| for allocated sequence number.
size_t red_packet_size = red_packet->size();
- if (LogAndSendToNetwork(std::move(red_packet), media_packet_storage,
- RtpPacketSender::kLowPriority)) {
+ red_packet->set_packet_type(RtpPacketToSend::Type::kVideo);
+ if (LogAndSendToNetwork(std::move(red_packet), media_packet_storage)) {
rtc::CritScope cs(&stats_crit_);
video_bitrate_.Update(red_packet_size, clock_->TimeInMilliseconds());
} else {
@@ -309,8 +309,7 @@
rtp_packet->set_capture_time_ms(media_packet->capture_time_ms());
rtp_packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
uint16_t fec_sequence_number = rtp_packet->SequenceNumber();
- if (LogAndSendToNetwork(std::move(rtp_packet), kDontRetransmit,
- RtpPacketSender::kLowPriority)) {
+ if (LogAndSendToNetwork(std::move(rtp_packet), kDontRetransmit)) {
rtc::CritScope cs(&stats_crit_);
fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds());
} else {
@@ -337,8 +336,9 @@
for (auto& fec_packet : fec_packets) {
size_t packet_length = fec_packet->size();
uint16_t seq_num = fec_packet->SequenceNumber();
- if (LogAndSendToNetwork(std::move(fec_packet), kDontRetransmit,
- RtpPacketSender::kLowPriority)) {
+ fec_packet->set_packet_type(
+ RtpPacketToSend::Type::kForwardErrorCorrection);
+ if (LogAndSendToNetwork(std::move(fec_packet), kDontRetransmit)) {
rtc::CritScope cs(&stats_crit_);
fec_bitrate_.Update(packet_length, clock_->TimeInMilliseconds());
} else {
@@ -350,8 +350,7 @@
bool RTPSenderVideo::LogAndSendToNetwork(
std::unique_ptr<RtpPacketToSend> packet,
- StorageType storage,
- RtpPacketSender::Priority priority) {
+ StorageType storage) {
#if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
int64_t now_ms = clock_->TimeInMilliseconds();
BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoTotBitrate_kbps", now_ms,
@@ -363,7 +362,7 @@
rtp_sender_->NackOverheadRate() / 1000,
packet->Ssrc());
#endif
- return rtp_sender_->SendToNetwork(std::move(packet), storage, priority);
+ return rtp_sender_->SendToNetwork(std::move(packet), storage);
}
void RTPSenderVideo::SetUlpfecConfig(int red_payload_type,
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.h b/modules/rtp_rtcp/source/rtp_sender_video.h
index 94377bf..3555958 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.h
+++ b/modules/rtp_rtcp/source/rtp_sender_video.h
@@ -143,8 +143,7 @@
bool protect_media_packet);
bool LogAndSendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
- StorageType storage,
- RtpPacketSender::Priority priority);
+ StorageType storage);
bool red_enabled() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
return red_payload_type_ >= 0;