Chromium Code Reviews| 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..b3816c61aa50f52ed8b31ff5af895c2582412c97 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,80 @@ TEST_F(RtpSenderTestWithoutPacer, SendGenericVideo) { |
| EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); |
| } |
| +TEST_F(RtpSenderTest, SendFlexfecPackets) { |
| + 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(kPayload); |
| + 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); |
| + |
| + EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority, |
| + kMediaSsrc, _, _, _, false)); |
| + EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority, |
| + kFlexfecSsrc, _, _, _, false)); |
| + SendGenericPayload(); |
| + // TODO(brandtr): Update this code when the FlexFEC packets are no longer |
|
danilchap
2016/11/08 14:52:49
does it mean flexfec packets will not be sent with
brandtr
2016/11/09 10:40:05
Yes :( My next CL will address this issue, using t
|
| + // lost between PacedSender and RTPSender. |
| + constexpr int kNumPacketsExpected = 1; |
| + EXPECT_CALL(mock_rtc_event_log_, |
| + LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)) |
| + .Times(kNumPacketsExpected); |
| + EXPECT_TRUE(rtp_sender_->TimeToSendPacket( |
| + kSeqNum, fake_clock_.TimeInMilliseconds(), false, 0)); |
| + EXPECT_EQ(kNumPacketsExpected, transport_.packets_sent()); |
| +} |
| + |
| +TEST_F(RtpSenderTestWithoutPacer, SendFlexfecPackets) { |
| + 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(kPayload); |
| + |
| + // 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()); |
| +} |
| + |
| TEST_F(RtpSenderTest, FrameCountCallbacks) { |
| class TestCallback : public FrameCountObserver { |
| public: |
| @@ -920,8 +993,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 +1053,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 +1111,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); |
| } |
| }; |
| @@ -1390,4 +1465,44 @@ TEST_F(RtpSenderVideoTest, SendVideoWithCameraAndFlipCVO) { |
| ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3)); |
| } |
| +TEST_F(RtpSenderVideoTest, SendFlexfecPackets) { |
|
danilchap
2016/11/08 14:52:49
this test is likely not needed: the use case alrea
brandtr
2016/11/09 10:40:05
Removed!
|
| + constexpr size_t kPayloadLength = 500; |
| + uint8_t kFrameData[kPayloadLength]; |
| + 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 pacer. |
| + rtp_sender_.reset( |
| + new RTPSender(false, &fake_clock_, &transport_, &mock_paced_sender_, |
| + nullptr, &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(kPayload); |
| + // Create specific RTPSenderVideo to test. |
| + rtp_sender_video_.reset( |
| + new RTPSenderVideo(&fake_clock_, rtp_sender_.get(), &flexfec_sender)); |
| + |
| + // 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_video_->SetFecParameters(params, params); |
| + |
| + // Send a single key frame, and intercept calls to PacedSender. |
| + EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority, |
| + kMediaSsrc, _, _, _, false)); |
| + EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority, |
| + kFlexfecSsrc, _, _, _, false)); |
| + rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, |
| + kTimestamp, 0, kFrameData, kPayloadLength, |
| + nullptr, nullptr); |
| +} |
| + |
| } // namespace webrtc |