Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc

Issue 2484143002: Wire up FlexfecSender in RTPSender and add unit tests. (Closed)
Patch Set: Rebase. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.cc ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender_video.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index d02d25eb2134166e0ec4a6dc1c362a5982f2c934..d6796e788008971b6015f1e0a24759f4a3ea3dca 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -147,7 +147,7 @@ class RtpSenderTest : public ::testing::Test {
void SetUpRtpSender(bool pacer) {
rtp_sender_.reset(new RTPSender(
false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr,
- &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr,
+ nullptr, &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr,
&mock_rtc_event_log_, &send_packet_observer_,
&retransmission_rate_limiter_));
rtp_sender_->SetSequenceNumber(kSeqNum);
@@ -239,7 +239,7 @@ class RtpSenderVideoTest : public RtpSenderTest {
// TODO(pbos): Set up to use pacer.
SetUpRtpSender(false);
rtp_sender_video_.reset(
- new RTPSenderVideo(&fake_clock_, rtp_sender_.get()));
+ new RTPSenderVideo(&fake_clock_, rtp_sender_.get(), nullptr));
}
std::unique_ptr<RTPSenderVideo> rtp_sender_video_;
};
@@ -440,10 +440,9 @@ TEST_F(RtpSenderTestWithoutPacer, AssignSequenceNumberSetPaddingTimestamps) {
TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
rtp_sender_.reset(new RTPSender(
- false, &fake_clock_, &transport_, nullptr,
- &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr,
- &mock_rtc_event_log_, &send_packet_observer_,
- &retransmission_rate_limiter_));
+ false, &fake_clock_, &transport_, nullptr, nullptr, &seq_num_allocator_,
+ &feedback_observer_, nullptr, nullptr, nullptr, &mock_rtc_event_log_,
+ &send_packet_observer_, &retransmission_rate_limiter_));
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
kRtpExtensionTransportSequenceNumber,
kTransportSequenceNumberExtensionId));
@@ -486,11 +485,11 @@ TEST_F(RtpSenderTestWithoutPacer, OnSendPacketUpdated) {
}
TEST_F(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) {
- rtp_sender_.reset(new RTPSender(
- false, &fake_clock_, &transport_, &mock_paced_sender_,
- &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr,
- &mock_rtc_event_log_, &send_packet_observer_,
- &retransmission_rate_limiter_));
+ rtp_sender_.reset(
+ new RTPSender(false, &fake_clock_, &transport_, &mock_paced_sender_,
+ nullptr, &seq_num_allocator_, &feedback_observer_, nullptr,
+ nullptr, nullptr, &mock_rtc_event_log_,
+ &send_packet_observer_, &retransmission_rate_limiter_));
rtp_sender_->SetStorePacketsStatus(true, 10);
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
kRtpExtensionTransportSequenceNumber,
@@ -768,7 +767,7 @@ TEST_F(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) {
TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) {
rtp_sender_.reset(new RTPSender(
- false, &fake_clock_, &transport_, &mock_paced_sender_,
+ false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr,
nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr,
nullptr, nullptr, &send_packet_observer_, &retransmission_rate_limiter_));
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
@@ -791,7 +790,7 @@ TEST_F(RtpSenderTest, SendRedundantPayloads) {
MockTransport transport;
rtp_sender_.reset(new RTPSender(
false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr,
- nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr,
+ nullptr, nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr,
&retransmission_rate_limiter_));
rtp_sender_->SetSequenceNumber(kSeqNum);
@@ -900,6 +899,93 @@ TEST_F(RtpSenderTestWithoutPacer, SendGenericVideo) {
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
}
+TEST_F(RtpSenderTest, SendFlexfecPackets) {
+ constexpr int kMediaPayloadType = 127;
+ constexpr int kFlexfecPayloadType = 118;
+ constexpr uint32_t kMediaSsrc = 1234;
+ constexpr uint32_t kFlexfecSsrc = 5678;
+ const std::vector<RtpExtension> kNoRtpExtensions;
+ FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+ kNoRtpExtensions, &fake_clock_);
+
+ // Reset |rtp_sender_| to use FlexFEC.
+ rtp_sender_.reset(
+ new RTPSender(false, &fake_clock_, &transport_, &mock_paced_sender_,
+ &flexfec_sender, &seq_num_allocator_, nullptr, nullptr,
+ nullptr, nullptr, &mock_rtc_event_log_,
+ &send_packet_observer_, &retransmission_rate_limiter_));
+ rtp_sender_->SetSSRC(kMediaSsrc);
+ rtp_sender_->SetSequenceNumber(kSeqNum);
+ rtp_sender_->SetSendPayloadType(kMediaPayloadType);
+ rtp_sender_->SetStorePacketsStatus(true, 10);
+
+ // Parameters selected to generate a single FEC packet per media packet.
+ FecProtectionParams params;
+ params.fec_rate = 15;
+ params.max_fec_frames = 1;
+ params.fec_mask_type = kFecMaskRandom;
+ rtp_sender_->SetFecParameters(params, params);
+
+ uint16_t media_seq_num;
+ EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
+ kMediaSsrc, _, _, _, false))
+ .WillOnce(testing::SaveArg<2>(&media_seq_num));
+ EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
+ kFlexfecSsrc, _, _, _, false));
+ SendGenericPayload();
+ // TODO(brandtr): Make these tests stricter when the FlexFEC packets are no
+ // longer lost between PacedSender and RTPSender.
+ EXPECT_CALL(mock_rtc_event_log_,
+ LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
+ .Times(testing::AtLeast(1));
+ EXPECT_TRUE(rtp_sender_->TimeToSendPacket(
+ media_seq_num, fake_clock_.TimeInMilliseconds(), false, 0));
+ EXPECT_LE(1, transport_.packets_sent());
+ const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
+ EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
+ EXPECT_EQ(media_seq_num, media_packet.SequenceNumber());
+ EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
+}
+
+TEST_F(RtpSenderTestWithoutPacer, SendFlexfecPackets) {
+ constexpr int kMediaPayloadType = 127;
+ constexpr int kFlexfecPayloadType = 118;
+ constexpr uint32_t kMediaSsrc = 1234;
+ constexpr uint32_t kFlexfecSsrc = 5678;
+ const std::vector<RtpExtension> kNoRtpExtensions;
+ FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+ kNoRtpExtensions, &fake_clock_);
+
+ // Reset |rtp_sender_| to use FlexFEC.
+ rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr,
+ &flexfec_sender, &seq_num_allocator_, nullptr,
+ nullptr, nullptr, nullptr,
+ &mock_rtc_event_log_, &send_packet_observer_,
+ &retransmission_rate_limiter_));
+ rtp_sender_->SetSSRC(kMediaSsrc);
+ rtp_sender_->SetSequenceNumber(kSeqNum);
+ rtp_sender_->SetSendPayloadType(kMediaPayloadType);
+
+ // Parameters selected to generate a single FEC packet per media packet.
+ FecProtectionParams params;
+ params.fec_rate = 15;
+ params.max_fec_frames = 1;
+ params.fec_mask_type = kFecMaskRandom;
+ rtp_sender_->SetFecParameters(params, params);
+
+ EXPECT_CALL(mock_rtc_event_log_,
+ LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
+ .Times(2);
+ SendGenericPayload();
+ ASSERT_EQ(2, transport_.packets_sent());
+ const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
+ EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
+ EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
+ const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
+ EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
+ EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
+}
+
TEST_F(RtpSenderTest, FrameCountCallbacks) {
class TestCallback : public FrameCountObserver {
public:
@@ -920,8 +1006,8 @@ TEST_F(RtpSenderTest, FrameCountCallbacks) {
rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_,
&mock_paced_sender_, nullptr, nullptr,
- nullptr, &callback, nullptr, nullptr, nullptr,
- &retransmission_rate_limiter_));
+ nullptr, nullptr, &callback, nullptr, nullptr,
+ nullptr, &retransmission_rate_limiter_));
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
const uint8_t payload_type = 127;
@@ -980,9 +1066,10 @@ TEST_F(RtpSenderTest, BitrateCallbacks) {
uint32_t total_bitrate_;
uint32_t retransmit_bitrate_;
} callback;
- rtp_sender_.reset(new RTPSender(
- false, &fake_clock_, &transport_, nullptr, nullptr, nullptr, &callback,
- nullptr, nullptr, nullptr, nullptr, &retransmission_rate_limiter_));
+ rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr,
+ nullptr, nullptr, nullptr, &callback, nullptr,
+ nullptr, nullptr, nullptr,
+ &retransmission_rate_limiter_));
// Simulate kNumPackets sent with kPacketInterval ms intervals, with the
// number of packets selected so that we fill (but don't overflow) the one
@@ -1037,9 +1124,10 @@ class RtpSenderAudioTest : public RtpSenderTest {
void SetUp() override {
payload_ = kAudioPayload;
- rtp_sender_.reset(new RTPSender(
- true, &fake_clock_, &transport_, nullptr, nullptr, nullptr, nullptr,
- nullptr, nullptr, nullptr, nullptr, &retransmission_rate_limiter_));
+ rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr,
+ &retransmission_rate_limiter_));
rtp_sender_->SetSequenceNumber(kSeqNum);
}
};
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.cc ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender_video.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698