| 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);
 | 
|    }
 | 
|  };
 | 
| 
 |