From fc78aaceea0afd6c29036694ff573f81b7b25586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Thu, 24 Oct 2019 12:55:30 +0200 Subject: [PATCH] Batches video frame packets when posting to pacer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All plumbing was landed a while ago, but this call site was not updated. This change aims to reduce contention/overhead when posting large number of packets to the paced sender. Bug: webrtc:10809 Change-Id: I5486131b980e55331a38151bceee1cb96e35a942 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158203 Reviewed-by: Ilya Nikolaevskiy Commit-Queue: Erik Språng Cr-Commit-Position: refs/heads/master@{#29599} --- .../rtp_rtcp/source/rtp_sender_unittest.cc | 63 +++++++++---------- modules/rtp_rtcp/source/rtp_sender_video.cc | 5 +- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc index a411b79a33..af4ae15cd2 100644 --- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc @@ -1228,22 +1228,20 @@ TEST_P(RtpSenderTest, SendFlexfecPackets) { std::unique_ptr fec_packet; EXPECT_CALL(mock_paced_sender_, EnqueuePackets) - .Times(2) - .WillRepeatedly( - [&](std::vector> packets) { - for (auto& packet : packets) { - if (packet->packet_type() == RtpPacketToSend::Type::kVideo) { - EXPECT_EQ(packet->Ssrc(), kSsrc); - EXPECT_EQ(packet->SequenceNumber(), kSeqNum); - media_packet = std::move(packet); - } else { - EXPECT_EQ(packet->packet_type(), - RtpPacketToSend::Type::kForwardErrorCorrection); - EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc); - fec_packet = std::move(packet); - } - } - }); + .WillOnce([&](std::vector> packets) { + for (auto& packet : packets) { + if (packet->packet_type() == RtpPacketToSend::Type::kVideo) { + EXPECT_EQ(packet->Ssrc(), kSsrc); + EXPECT_EQ(packet->SequenceNumber(), kSeqNum); + media_packet = std::move(packet); + } else { + EXPECT_EQ(packet->packet_type(), + RtpPacketToSend::Type::kForwardErrorCorrection); + EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc); + fec_packet = std::move(packet); + } + } + }); video_header.frame_type = VideoFrameType::kVideoFrameKey; EXPECT_TRUE(rtp_sender_video.SendVideo( @@ -1365,22 +1363,20 @@ TEST_P(RtpSenderTest, NoFlexfecForTimingFrames) { std::unique_ptr fec_packet; EXPECT_CALL(mock_paced_sender_, EnqueuePackets) - .Times(2) - .WillRepeatedly( - [&](std::vector> packets) { - for (auto& packet : packets) { - if (packet->packet_type() == RtpPacketToSend::Type::kVideo) { - EXPECT_EQ(packet->Ssrc(), kSsrc); - EXPECT_EQ(packet->SequenceNumber(), kSeqNum + 1); - media_packet2 = std::move(packet); - } else { - EXPECT_EQ(packet->packet_type(), - RtpPacketToSend::Type::kForwardErrorCorrection); - EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc); - fec_packet = std::move(packet); - } - } - }); + .WillOnce([&](std::vector> packets) { + for (auto& packet : packets) { + if (packet->packet_type() == RtpPacketToSend::Type::kVideo) { + EXPECT_EQ(packet->Ssrc(), kSsrc); + EXPECT_EQ(packet->SequenceNumber(), kSeqNum + 1); + media_packet2 = std::move(packet); + } else { + EXPECT_EQ(packet->packet_type(), + RtpPacketToSend::Type::kForwardErrorCorrection); + EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc); + fec_packet = std::move(packet); + } + } + }); video_header.video_timing.flags = VideoSendTiming::kInvalid; video_header.frame_type = VideoFrameType::kVideoFrameKey; @@ -1723,8 +1719,7 @@ TEST_P(RtpSenderTest, FecOverheadRate) { constexpr size_t kNumMediaPackets = 10; constexpr size_t kNumFecPackets = kNumMediaPackets; constexpr int64_t kTimeBetweenPacketsMs = 10; - EXPECT_CALL(mock_paced_sender_, EnqueuePackets) - .Times(kNumMediaPackets + kNumFecPackets); + EXPECT_CALL(mock_paced_sender_, EnqueuePackets).Times(kNumMediaPackets); for (size_t i = 0; i < kNumMediaPackets; ++i) { RTPVideoHeader video_header; diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc index e6fca7c6bb..c0cda4be78 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video.cc @@ -372,10 +372,7 @@ void RTPSenderVideo::LogAndSendToNetwork( clock_->TimeInMilliseconds()); } - // TODO(sprang): Replace with bulk send method. - for (auto& packet : packets) { - rtp_sender_->SendToNetwork(std::move(packet)); - } + rtp_sender_->EnqueuePackets(std::move(packets)); } size_t RTPSenderVideo::FecPacketOverhead() const {