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..de97f4c32b355bbed01f42b4ff3b34c330b422de 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)); |
danilchap
2016/11/09 16:27:42
shouldn't media_seq_num == kSeqNum? becuase of lin
brandtr
2016/11/10 08:34:41
Yep, that is the case. But in the followup CL, whe
|
+ 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(); |
+ EXPECT_EQ(2, transport_.packets_sent()); |
danilchap
2016/11/09 16:27:42
EXPECT_EQ -> ASSERT_EQ (to avoid crash if test wil
brandtr
2016/11/10 08:34:41
Done.
|
+ 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); |
} |
}; |