Refactor some RtpSender-level tests into RtpRtcp-level tests

This prepares for ability to defer sequence number assignment to after
the pacing stage - a scenario where the RtpRtcp module rather than than
RTPSender class has responsibility for sequence numbering.

Bug: webrtc:11340
Change-Id: Ife88f60258b9b7cfd9dbd3326f02ac34da8f7603
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214967
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33702}
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
index 193889f..40a002a 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
@@ -23,6 +23,7 @@
 #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
 #include "modules/rtp_rtcp/source/rtp_sender_video.h"
 #include "rtc_base/rate_limiter.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/rtcp_packet_parser.h"
@@ -36,6 +37,7 @@
 using ::testing::Gt;
 using ::testing::Not;
 using ::testing::Optional;
+using ::testing::SizeIs;
 
 namespace webrtc {
 namespace {
@@ -108,10 +110,50 @@
   std::vector<uint16_t> last_nack_list_;
 };
 
+struct TestConfig {
+  explicit TestConfig(bool with_overhead) : with_overhead(with_overhead) {}
+
+  bool with_overhead = false;
+};
+
+class FieldTrialConfig : public WebRtcKeyValueConfig {
+ public:
+  static FieldTrialConfig GetFromTestConfig(const TestConfig& config) {
+    FieldTrialConfig trials;
+    trials.overhead_enabled_ = config.with_overhead;
+    return trials;
+  }
+
+  FieldTrialConfig() : overhead_enabled_(false), max_padding_factor_(1200) {}
+  ~FieldTrialConfig() override {}
+
+  void SetOverHeadEnabled(bool enabled) { overhead_enabled_ = enabled; }
+  void SetMaxPaddingFactor(double factor) { max_padding_factor_ = factor; }
+
+  std::string Lookup(absl::string_view key) const override {
+    if (key == "WebRTC-LimitPaddingSize") {
+      char string_buf[32];
+      rtc::SimpleStringBuilder ssb(string_buf);
+      ssb << "factor:" << max_padding_factor_;
+      return ssb.str();
+    } else if (key == "WebRTC-SendSideBwe-WithOverhead") {
+      return overhead_enabled_ ? "Enabled" : "Disabled";
+    }
+    return "";
+  }
+
+ private:
+  bool overhead_enabled_;
+  double max_padding_factor_;
+};
+
 class RtpRtcpModule : public RtcpPacketTypeCounterObserver {
  public:
-  RtpRtcpModule(TimeController* time_controller, bool is_sender)
+  RtpRtcpModule(TimeController* time_controller,
+                bool is_sender,
+                const FieldTrialConfig& trials)
       : is_sender_(is_sender),
+        trials_(trials),
         receive_statistics_(
             ReceiveStatistics::Create(time_controller->GetClock())),
         time_controller_(time_controller) {
@@ -120,6 +162,7 @@
   }
 
   const bool is_sender_;
+  const FieldTrialConfig& trials_;
   RtcpPacketTypeCounter packets_sent_;
   RtcpPacketTypeCounter packets_received_;
   std::unique_ptr<ReceiveStatistics> receive_statistics_;
@@ -168,6 +211,7 @@
     config.local_media_ssrc = is_sender_ ? kSenderSsrc : kReceiverSsrc;
     config.need_rtp_packet_infos = true;
     config.non_sender_rtt_measurement = true;
+    config.field_trials = &trials_;
 
     impl_.reset(new ModuleRtpRtcpImpl2(config));
     impl_->SetRemoteSSRC(is_sender_ ? kReceiverSsrc : kSenderSsrc);
@@ -179,12 +223,17 @@
 };
 }  // namespace
 
-class RtpRtcpImpl2Test : public ::testing::Test {
+class RtpRtcpImpl2Test : public ::testing::TestWithParam<TestConfig> {
  protected:
   RtpRtcpImpl2Test()
       : time_controller_(Timestamp::Micros(133590000000000)),
-        sender_(&time_controller_, /*is_sender=*/true),
-        receiver_(&time_controller_, /*is_sender=*/false) {}
+        field_trials_(FieldTrialConfig::GetFromTestConfig(GetParam())),
+        sender_(&time_controller_,
+                /*is_sender=*/true,
+                field_trials_),
+        receiver_(&time_controller_,
+                  /*is_sender=*/false,
+                  field_trials_) {}
 
   void SetUp() override {
     // Send module.
@@ -193,11 +242,10 @@
     sender_.impl_->SetSequenceNumber(kSequenceNumber);
     sender_.impl_->SetStorePacketsStatus(true, 100);
 
-    FieldTrialBasedConfig field_trials;
     RTPSenderVideo::Config video_config;
     video_config.clock = time_controller_.GetClock();
     video_config.rtp_sender = sender_.impl_->RtpSender();
-    video_config.field_trials = &field_trials;
+    video_config.field_trials = &field_trials_;
     sender_video_ = std::make_unique<RTPSenderVideo>(video_config);
 
     // Receive module.
@@ -213,15 +261,15 @@
   }
 
   GlobalSimulatedTimeController time_controller_;
-  // test::RunLoop loop_;
-  // SimulatedClock clock_;
+  FieldTrialConfig field_trials_;
   RtpRtcpModule sender_;
   std::unique_ptr<RTPSenderVideo> sender_video_;
   RtpRtcpModule receiver_;
 
-  void SendFrame(const RtpRtcpModule* module,
+  bool SendFrame(const RtpRtcpModule* module,
                  RTPSenderVideo* sender,
-                 uint8_t tid) {
+                 uint8_t tid,
+                 uint32_t rtp_timestamp) {
     RTPVideoHeaderVP8 vp8_header = {};
     vp8_header.temporalIdx = tid;
     RTPVideoHeader rtp_video_header;
@@ -238,9 +286,12 @@
     rtp_video_header.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
 
     const uint8_t payload[100] = {0};
-    EXPECT_TRUE(module->impl_->OnSendingRtpFrame(0, 0, kPayloadType, true));
-    EXPECT_TRUE(sender->SendVideo(kPayloadType, VideoCodecType::kVideoCodecVP8,
-                                  0, 0, payload, rtp_video_header, 0));
+    bool success = module->impl_->OnSendingRtpFrame(0, 0, kPayloadType, true);
+
+    success &=
+        sender->SendVideo(kPayloadType, VideoCodecType::kVideoCodecVP8,
+                          rtp_timestamp, 0, payload, rtp_video_header, 0);
+    return success;
   }
 
   void IncomingRtcpNack(const RtpRtcpModule* module, uint16_t sequence_number) {
@@ -257,14 +308,15 @@
   }
 };
 
-TEST_F(RtpRtcpImpl2Test, RetransmitsAllLayers) {
+TEST_P(RtpRtcpImpl2Test, RetransmitsAllLayers) {
   // Send frames.
   EXPECT_EQ(0, sender_.RtpSent());
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);  // kSequenceNumber
-  SendFrame(&sender_, sender_video_.get(),
-            kHigherLayerTid);  // kSequenceNumber + 1
-  SendFrame(&sender_, sender_video_.get(),
-            kNoTemporalIdx);  // kSequenceNumber + 2
+  EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid,
+                        /*timestamp=*/0));  // kSequenceNumber
+  EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kHigherLayerTid,
+                        /*timestamp=*/0));  // kSequenceNumber + 1
+  EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kNoTemporalIdx,
+                        /*timestamp=*/0));  // kSequenceNumber + 2
   EXPECT_EQ(3, sender_.RtpSent());
   EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
 
@@ -285,7 +337,7 @@
   EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
 }
 
-TEST_F(RtpRtcpImpl2Test, Rtt) {
+TEST_P(RtpRtcpImpl2Test, Rtt) {
   RtpPacketReceived packet;
   packet.SetTimestamp(1);
   packet.SetSequenceNumber(123);
@@ -294,7 +346,8 @@
   receiver_.receive_statistics_->OnRtpPacket(packet);
 
   // Send Frame before sending an SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   // Sender module should send an SR.
   EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
 
@@ -328,14 +381,15 @@
   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, sender_.impl_->rtt_ms(), 1);
 }
 
-TEST_F(RtpRtcpImpl2Test, RttForReceiverOnly) {
+TEST_P(RtpRtcpImpl2Test, RttForReceiverOnly) {
   // Receiver module should send a Receiver time reference report (RTRR).
   EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
 
   // Sender module should send a response to the last received RTRR (DLRR).
   AdvanceTimeMs(1000);
   // Send Frame before sending a SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
 
   // Verify RTT.
@@ -347,7 +401,7 @@
   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, receiver_.impl_->rtt_ms(), 1);
 }
 
-TEST_F(RtpRtcpImpl2Test, NoSrBeforeMedia) {
+TEST_P(RtpRtcpImpl2Test, NoSrBeforeMedia) {
   // Ignore fake transport delays in this test.
   sender_.transport_.SimulateNetworkDelay(0, &time_controller_);
   receiver_.transport_.SimulateNetworkDelay(0, &time_controller_);
@@ -364,11 +418,12 @@
   EXPECT_EQ(-1, sender_.RtcpSent().first_packet_time_ms);
   EXPECT_EQ(receiver_.RtcpSent().first_packet_time_ms, current_time);
 
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   EXPECT_EQ(sender_.RtcpSent().first_packet_time_ms, current_time);
 }
 
-TEST_F(RtpRtcpImpl2Test, RtcpPacketTypeCounter_Nack) {
+TEST_P(RtpRtcpImpl2Test, RtcpPacketTypeCounter_Nack) {
   EXPECT_EQ(-1, receiver_.RtcpSent().first_packet_time_ms);
   EXPECT_EQ(-1, sender_.RtcpReceived().first_packet_time_ms);
   EXPECT_EQ(0U, sender_.RtcpReceived().nack_packets);
@@ -386,7 +441,7 @@
   EXPECT_GT(sender_.RtcpReceived().first_packet_time_ms, -1);
 }
 
-TEST_F(RtpRtcpImpl2Test, AddStreamDataCounters) {
+TEST_P(RtpRtcpImpl2Test, AddStreamDataCounters) {
   StreamDataCounters rtp;
   const int64_t kStartTimeMs = 1;
   rtp.first_packet_time_ms = kStartTimeMs;
@@ -429,25 +484,27 @@
   EXPECT_EQ(kStartTimeMs, sum.first_packet_time_ms);  // Holds oldest time.
 }
 
-TEST_F(RtpRtcpImpl2Test, SendsInitialNackList) {
+TEST_P(RtpRtcpImpl2Test, SendsInitialNackList) {
   // Send module sends a NACK.
   const uint16_t kNackLength = 1;
   uint16_t nack_list[kNackLength] = {123};
   EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
   // Send Frame before sending a compound RTCP that starts with SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
 }
 
-TEST_F(RtpRtcpImpl2Test, SendsExtendedNackList) {
+TEST_P(RtpRtcpImpl2Test, SendsExtendedNackList) {
   // Send module sends a NACK.
   const uint16_t kNackLength = 1;
   uint16_t nack_list[kNackLength] = {123};
   EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
   // Send Frame before sending a compound RTCP that starts with SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
@@ -465,14 +522,15 @@
   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(124));
 }
 
-TEST_F(RtpRtcpImpl2Test, ReSendsNackListAfterRttMs) {
+TEST_P(RtpRtcpImpl2Test, ReSendsNackListAfterRttMs) {
   sender_.transport_.SimulateNetworkDelay(0, &time_controller_);
   // Send module sends a NACK.
   const uint16_t kNackLength = 2;
   uint16_t nack_list[kNackLength] = {123, 125};
   EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
   // Send Frame before sending a compound RTCP that starts with SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
@@ -490,7 +548,7 @@
   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
 }
 
-TEST_F(RtpRtcpImpl2Test, UniqueNackRequests) {
+TEST_P(RtpRtcpImpl2Test, UniqueNackRequests) {
   receiver_.transport_.SimulateNetworkDelay(0, &time_controller_);
   EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
   EXPECT_EQ(0U, receiver_.RtcpSent().nack_requests);
@@ -530,14 +588,15 @@
   EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent());
 }
 
-TEST_F(RtpRtcpImpl2Test, ConfigurableRtcpReportInterval) {
+TEST_P(RtpRtcpImpl2Test, ConfigurableRtcpReportInterval) {
   const int kVideoReportInterval = 3000;
 
   // Recreate sender impl with new configuration, and redo setup.
   sender_.SetRtcpReportIntervalAndReset(kVideoReportInterval);
   SetUp();
 
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
 
   // Initial state
   sender_.impl_->Process();
@@ -556,7 +615,8 @@
   EXPECT_GT(sender_.RtcpSent().first_packet_time_ms, -1);
   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u);
 
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
 
   // Move ahead to the last possible second before second rtcp is expected.
   AdvanceTimeMs(kVideoReportInterval * 1 / 2 - 1);
@@ -578,11 +638,13 @@
   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 2u);
 }
 
-TEST_F(RtpRtcpImpl2Test, StoresPacketInfoForSentPackets) {
+TEST_P(RtpRtcpImpl2Test, StoresPacketInfoForSentPackets) {
   const uint32_t kStartTimestamp = 1u;
   SetUp();
   sender_.impl_->SetStartTimestamp(kStartTimestamp);
 
+  sender_.impl_->SetSequenceNumber(1);
+
   PacedPacketInfo pacing_info;
   RtpPacketToSend packet(nullptr);
   packet.set_packet_type(RtpPacketToSend::Type::kVideo);
@@ -639,14 +701,15 @@
 }
 
 // Checks that the sender report stats are not available if no RTCP SR was sent.
-TEST_F(RtpRtcpImpl2Test, SenderReportStatsNotAvailable) {
+TEST_P(RtpRtcpImpl2Test, SenderReportStatsNotAvailable) {
   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Eq(absl::nullopt));
 }
 
 // Checks that the sender report stats are available if an RTCP SR was sent.
-TEST_F(RtpRtcpImpl2Test, SenderReportStatsAvailable) {
+TEST_P(RtpRtcpImpl2Test, SenderReportStatsAvailable) {
   // Send a frame in order to send an SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   // Send an SR.
   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Not(Eq(absl::nullopt)));
@@ -654,7 +717,7 @@
 
 // Checks that the sender report stats are not available if an RTCP SR with an
 // unexpected SSRC is received.
-TEST_F(RtpRtcpImpl2Test, SenderReportStatsNotUpdatedWithUnexpectedSsrc) {
+TEST_P(RtpRtcpImpl2Test, SenderReportStatsNotUpdatedWithUnexpectedSsrc) {
   constexpr uint32_t kUnexpectedSenderSsrc = 0x87654321;
   static_assert(kUnexpectedSenderSsrc != kSenderSsrc, "");
   // Forge a sender report and pass it to the receiver as if an RTCP SR were
@@ -670,7 +733,7 @@
 }
 
 // Checks the stats derived from the last received RTCP SR are set correctly.
-TEST_F(RtpRtcpImpl2Test, SenderReportStatsCheckStatsFromLastReport) {
+TEST_P(RtpRtcpImpl2Test, SenderReportStatsCheckStatsFromLastReport) {
   using SenderReportStats = RtpRtcpInterface::SenderReportStats;
   const NtpTime ntp(/*seconds=*/1u, /*fractions=*/1u << 31);
   constexpr uint32_t kPacketCount = 123u;
@@ -693,10 +756,11 @@
 }
 
 // Checks that the sender report stats count equals the number of sent RTCP SRs.
-TEST_F(RtpRtcpImpl2Test, SenderReportStatsCount) {
+TEST_P(RtpRtcpImpl2Test, SenderReportStatsCount) {
   using SenderReportStats = RtpRtcpInterface::SenderReportStats;
   // Send a frame in order to send an SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   // Send the first SR.
   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(),
@@ -709,9 +773,10 @@
 
 // Checks that the sender report stats include a valid arrival time if an RTCP
 // SR was sent.
-TEST_F(RtpRtcpImpl2Test, SenderReportStatsArrivalTimestampSet) {
+TEST_P(RtpRtcpImpl2Test, SenderReportStatsArrivalTimestampSet) {
   // Send a frame in order to send an SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   // Send an SR.
   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
   auto stats = receiver_.impl_->GetSenderReportStats();
@@ -721,10 +786,11 @@
 
 // Checks that the packet and byte counters from an RTCP SR are not zero once
 // a frame is sent.
-TEST_F(RtpRtcpImpl2Test, SenderReportStatsPacketByteCounters) {
+TEST_P(RtpRtcpImpl2Test, SenderReportStatsPacketByteCounters) {
   using SenderReportStats = RtpRtcpInterface::SenderReportStats;
   // Send a frame in order to send an SR.
-  SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
   ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Gt(0));
   // Advance time otherwise the RTCP SR report will not include any packets
   // generated by `SendFrame()`.
@@ -736,4 +802,85 @@
                              Field(&SenderReportStats::bytes_sent, Gt(0u)))));
 }
 
+TEST_P(RtpRtcpImpl2Test, SendingVideoAdvancesSequenceNumber) {
+  const uint16_t sequence_number = sender_.impl_->SequenceNumber();
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
+  ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Gt(0));
+  EXPECT_EQ(sequence_number + 1, sender_.impl_->SequenceNumber());
+}
+
+TEST_P(RtpRtcpImpl2Test, SequenceNumberNotAdvancedWhenNotSending) {
+  const uint16_t sequence_number = sender_.impl_->SequenceNumber();
+  sender_.impl_->SetSendingMediaStatus(false);
+  EXPECT_FALSE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
+  ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Eq(0));
+  EXPECT_EQ(sequence_number, sender_.impl_->SequenceNumber());
+}
+
+TEST_P(RtpRtcpImpl2Test, PaddingNotAllowedInMiddleOfFrame) {
+  constexpr size_t kPaddingSize = 100;
+
+  // Can't send padding before media.
+  EXPECT_THAT(sender_.impl_->GeneratePadding(kPaddingSize), SizeIs(0u));
+
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
+
+  // Padding is now ok.
+  EXPECT_THAT(sender_.impl_->GeneratePadding(kPaddingSize), SizeIs(Gt(0u)));
+
+  // Send half a video frame.
+  PacedPacketInfo pacing_info;
+  std::unique_ptr<RtpPacketToSend> packet =
+      sender_.impl_->RtpSender()->AllocatePacket();
+  packet->set_packet_type(RtpPacketToSend::Type::kVideo);
+  packet->set_first_packet_of_frame(true);
+  packet->SetMarker(false);  // Marker false - not last packet of frame.
+  sender_.impl_->RtpSender()->AssignSequenceNumber(packet.get());
+
+  EXPECT_TRUE(sender_.impl_->TrySendPacket(packet.get(), pacing_info));
+
+  // Padding not allowed in middle of frame.
+  EXPECT_THAT(sender_.impl_->GeneratePadding(kPaddingSize), SizeIs(0u));
+
+  packet = sender_.impl_->RtpSender()->AllocatePacket();
+  packet->set_packet_type(RtpPacketToSend::Type::kVideo);
+  packet->set_first_packet_of_frame(true);
+  packet->SetMarker(true);
+  sender_.impl_->RtpSender()->AssignSequenceNumber(packet.get());
+
+  EXPECT_TRUE(sender_.impl_->TrySendPacket(packet.get(), pacing_info));
+
+  // Padding is OK again.
+  EXPECT_THAT(sender_.impl_->GeneratePadding(kPaddingSize), SizeIs(Gt(0u)));
+}
+
+TEST_P(RtpRtcpImpl2Test, PaddingTimestampMatchesMedia) {
+  constexpr size_t kPaddingSize = 100;
+  uint32_t kTimestamp = 123;
+
+  EXPECT_TRUE(
+      SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, kTimestamp));
+  EXPECT_EQ(sender_.transport_.last_rtp_header_.timestamp, kTimestamp);
+  uint16_t media_seq = sender_.transport_.last_rtp_header_.sequenceNumber;
+
+  // Generate and send padding.
+  auto padding = sender_.impl_->GeneratePadding(kPaddingSize);
+  ASSERT_FALSE(padding.empty());
+  for (auto& packet : padding) {
+    sender_.impl_->TrySendPacket(packet.get(), PacedPacketInfo());
+  }
+
+  // Verify we sent a new packet, but with the same timestamp.
+  EXPECT_NE(sender_.transport_.last_rtp_header_.sequenceNumber, media_seq);
+  EXPECT_EQ(sender_.transport_.last_rtp_header_.timestamp, kTimestamp);
+}
+
+INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
+                         RtpRtcpImpl2Test,
+                         ::testing::Values(TestConfig{false},
+                                           TestConfig{true}));
+
 }  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index cb4350d..709f961 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -511,43 +511,7 @@
   EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
 }
 
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberAdvanceSequenceNumber) {
-  auto packet = rtp_sender()->AllocatePacket();
-  ASSERT_TRUE(packet);
-  const uint16_t sequence_number = rtp_sender()->SequenceNumber();
-
-  EXPECT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
-
-  EXPECT_EQ(sequence_number, packet->SequenceNumber());
-  EXPECT_EQ(sequence_number + 1, rtp_sender()->SequenceNumber());
-}
-
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberFailsOnNotSending) {
-  auto packet = rtp_sender()->AllocatePacket();
-  ASSERT_TRUE(packet);
-
-  rtp_sender()->SetSendingMediaStatus(false);
-  EXPECT_FALSE(rtp_sender()->AssignSequenceNumber(packet.get()));
-}
-
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberMayAllowPaddingOnVideo) {
-  constexpr size_t kPaddingSize = 100;
-  auto packet = rtp_sender()->AllocatePacket();
-  ASSERT_TRUE(packet);
-
-  ASSERT_TRUE(rtp_sender()->GeneratePadding(kPaddingSize, true).empty());
-  packet->SetMarker(false);
-  ASSERT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
-  // Packet without marker bit doesn't allow padding on video stream.
-  ASSERT_TRUE(rtp_sender()->GeneratePadding(kPaddingSize, true).empty());
-
-  packet->SetMarker(true);
-  ASSERT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
-  // Packet with marker bit allows send padding.
-  ASSERT_FALSE(rtp_sender()->GeneratePadding(kPaddingSize, true).empty());
-}
-
-TEST_P(RtpSenderTest, AssignSequenceNumberAllowsPaddingOnAudio) {
+TEST_P(RtpSenderTest, PaddingAlwaysAllowedOnAudio) {
   MockTransport transport;
   RtpRtcpInterface::Configuration config;
   config.audio = true;
@@ -581,21 +545,6 @@
   EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5));
 }
 
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberSetPaddingTimestamps) {
-  constexpr size_t kPaddingSize = 100;
-  auto packet = rtp_sender()->AllocatePacket();
-  ASSERT_TRUE(packet);
-  packet->SetMarker(true);
-  packet->SetTimestamp(kTimestamp);
-
-  ASSERT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
-  auto padding_packets = rtp_sender()->GeneratePadding(kPaddingSize, true);
-
-  ASSERT_EQ(1u, padding_packets.size());
-  // Verify padding packet timestamp.
-  EXPECT_EQ(kTimestamp, padding_packets[0]->Timestamp());
-}
-
 TEST_P(RtpSenderTestWithoutPacer,
        TransportFeedbackObserverGetsCorrectByteCount) {
   constexpr size_t kRtpOverheadBytesPerPacket = 12 + 8;