tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rtp_sender_unittest.cc (57553B)


      1 /*
      2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "modules/rtp_rtcp/source/rtp_sender.h"
     12 
     13 #include <cstddef>
     14 #include <cstdint>
     15 #include <memory>
     16 #include <optional>
     17 #include <string>
     18 #include <utility>
     19 #include <vector>
     20 
     21 #include "absl/strings/string_view.h"
     22 #include "api/environment/environment.h"
     23 #include "api/environment/environment_factory.h"
     24 #include "api/rtp_packet_sender.h"
     25 #include "api/rtp_parameters.h"
     26 #include "api/units/frequency.h"
     27 #include "api/units/time_delta.h"
     28 #include "api/units/timestamp.h"
     29 #include "api/video/video_codec_type.h"
     30 #include "api/video/video_frame_type.h"
     31 #include "modules/rtp_rtcp/include/flexfec_sender.h"
     32 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
     33 #include "modules/rtp_rtcp/source/packet_sequencer.h"
     34 #include "modules/rtp_rtcp/source/rtp_format_video_generic.h"
     35 #include "modules/rtp_rtcp/source/rtp_header_extension_size.h"
     36 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
     37 #include "modules/rtp_rtcp/source/rtp_packet_history.h"
     38 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
     39 #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
     40 #include "modules/rtp_rtcp/source/rtp_sender_video.h"
     41 #include "modules/rtp_rtcp/source/video_fec_generator.h"
     42 #include "rtc_base/rate_limiter.h"
     43 #include "test/gmock.h"
     44 #include "test/gtest.h"
     45 #include "test/time_controller/simulated_time_controller.h"
     46 
     47 namespace webrtc {
     48 
     49 namespace {
     50 enum : int {  // The first valid value is 1.
     51  kAbsoluteSendTimeExtensionId = 1,
     52  kAudioLevelExtensionId,
     53  kGenericDescriptorId,
     54  kMidExtensionId,
     55  kRepairedRidExtensionId,
     56  kRidExtensionId,
     57  kTransmissionTimeOffsetExtensionId,
     58  kTransportSequenceNumberExtensionId,
     59  kVideoRotationExtensionId,
     60  kVideoTimingExtensionId,
     61 };
     62 
     63 constexpr int kPayload = 100;
     64 constexpr int kRtxPayload = 98;
     65 constexpr uint32_t kTimestamp = 10;
     66 constexpr uint16_t kSeqNum = 33;
     67 constexpr uint32_t kSsrc = 725242;
     68 constexpr uint32_t kRtxSsrc = 12345;
     69 constexpr uint32_t kFlexFecSsrc = 45678;
     70 constexpr uint64_t kStartTime = 123456789;
     71 constexpr uint8_t kPayloadData[] = {47, 11, 32, 93, 89};
     72 constexpr TimeDelta kDefaultExpectedRetransmissionTime = TimeDelta::Millis(125);
     73 constexpr Frequency kRtpClockRate = Frequency::Hertz(90'000);
     74 constexpr absl::string_view kMid = "mid";
     75 constexpr absl::string_view kRid = "f";
     76 constexpr bool kMarkerBit = true;
     77 
     78 using ::testing::AllOf;
     79 using ::testing::AtLeast;
     80 using ::testing::Each;
     81 using ::testing::ElementsAre;
     82 using ::testing::ElementsAreArray;
     83 using ::testing::Eq;
     84 using ::testing::Gt;
     85 using ::testing::IsEmpty;
     86 using ::testing::Not;
     87 using ::testing::Pointee;
     88 using ::testing::Property;
     89 using ::testing::Return;
     90 using ::testing::SizeIs;
     91 
     92 class MockRtpPacketPacer : public RtpPacketSender {
     93 public:
     94  MockRtpPacketPacer() {}
     95  ~MockRtpPacketPacer() override {}
     96 
     97  MOCK_METHOD(void,
     98              EnqueuePackets,
     99              (std::vector<std::unique_ptr<RtpPacketToSend>>),
    100              (override));
    101  MOCK_METHOD(void, RemovePacketsForSsrc, (uint32_t), (override));
    102 };
    103 
    104 uint32_t ToRtpTimestamp(Timestamp time) {
    105  return static_cast<int64_t>((time - Timestamp::Zero()) * kRtpClockRate) &
    106         0xFFFF'FFFF;
    107 }
    108 
    109 }  // namespace
    110 
    111 class RtpSenderTest : public ::testing::Test {
    112 protected:
    113  RtpSenderTest()
    114      : time_controller_(Timestamp::Millis(kStartTime)),
    115        env_(CreateEnvironment(time_controller_.GetClock())),
    116        retransmission_rate_limiter_(&env_.clock(), 1000),
    117        flexfec_sender_(env_,
    118                        0,
    119                        kFlexFecSsrc,
    120                        kSsrc,
    121                        "",
    122                        std::vector<RtpExtension>(),
    123                        std::vector<RtpExtensionSize>(),
    124                        nullptr) {}
    125 
    126  void SetUp() override { SetUpRtpSender(true, false, nullptr); }
    127 
    128  void SetUpRtpSender(bool populate_network2,
    129                      bool always_send_mid_and_rid,
    130                      VideoFecGenerator* fec_generator) {
    131    RtpRtcpInterface::Configuration config = GetDefaultConfig();
    132    config.fec_generator = fec_generator;
    133    config.populate_network2_timestamp = populate_network2;
    134    config.always_send_mid_and_rid = always_send_mid_and_rid;
    135    CreateSender(config);
    136  }
    137 
    138  RtpRtcpInterface::Configuration GetDefaultConfig() {
    139    RtpRtcpInterface::Configuration config;
    140    config.local_media_ssrc = kSsrc;
    141    config.rtx_send_ssrc = kRtxSsrc;
    142    config.retransmission_rate_limiter = &retransmission_rate_limiter_;
    143    config.paced_sender = &mock_paced_sender_;
    144    // Configure rid unconditionally, it has effect only if
    145    // corresponding header extension is enabled.
    146    config.rid = std::string(kRid);
    147    return config;
    148  }
    149 
    150  void CreateSender(const RtpRtcpInterface::Configuration& config) {
    151    packet_history_ = std::make_unique<RtpPacketHistory>(
    152        env_, RtpPacketHistory::PaddingMode::kRecentLargePacket);
    153    sequencer_.emplace(kSsrc, kRtxSsrc,
    154                       /*require_marker_before_media_padding=*/!config.audio,
    155                       &env_.clock());
    156    rtp_sender_ = std::make_unique<RTPSender>(
    157        env_, config, packet_history_.get(), config.paced_sender);
    158    sequencer_->set_media_sequence_number(kSeqNum);
    159    rtp_sender_->SetTimestampOffset(0);
    160  }
    161 
    162  GlobalSimulatedTimeController time_controller_;
    163  const Environment env_;
    164  MockRtpPacketPacer mock_paced_sender_;
    165  RateLimiter retransmission_rate_limiter_;
    166  FlexfecSender flexfec_sender_;
    167 
    168  std::optional<PacketSequencer> sequencer_;
    169  std::unique_ptr<RtpPacketHistory> packet_history_;
    170  std::unique_ptr<RTPSender> rtp_sender_;
    171 
    172  std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
    173                                                  bool marker_bit,
    174                                                  uint32_t rtp_timestamp,
    175                                                  Timestamp capture_time) {
    176    auto packet = rtp_sender_->AllocatePacket();
    177    packet->SetPayloadType(payload_type);
    178    packet->set_packet_type(RtpPacketMediaType::kVideo);
    179    packet->SetMarker(marker_bit);
    180    packet->SetTimestamp(rtp_timestamp);
    181    packet->set_capture_time(capture_time);
    182    return packet;
    183  }
    184 
    185  std::unique_ptr<RtpPacketToSend> SendPacket(Timestamp capture_time,
    186                                              int payload_length) {
    187    uint32_t rtp_timestamp = ToRtpTimestamp(capture_time);
    188    auto packet =
    189        BuildRtpPacket(kPayload, kMarkerBit, rtp_timestamp, capture_time);
    190    packet->AllocatePayload(payload_length);
    191    packet->set_allow_retransmission(true);
    192 
    193    // Packet should be stored in a send bucket.
    194    std::vector<std::unique_ptr<RtpPacketToSend>> packets(1);
    195    packets[0] = std::make_unique<RtpPacketToSend>(*packet);
    196    rtp_sender_->EnqueuePackets(std::move(packets));
    197    return packet;
    198  }
    199 
    200  std::unique_ptr<RtpPacketToSend> SendGenericPacket() {
    201    // Use maximum allowed size to catch corner cases when packet is dropped
    202    // because of lack of capacity for the media packet, or for an rtx packet
    203    // containing the media packet.
    204    return SendPacket(/*capture_time=*/env_.clock().CurrentTime(),
    205                      /*payload_length=*/rtp_sender_->MaxRtpPacketSize() -
    206                          rtp_sender_->ExpectedPerPacketOverhead());
    207  }
    208 
    209  std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
    210      size_t target_size_bytes) {
    211    return rtp_sender_->GeneratePadding(
    212        target_size_bytes, /*media_has_been_sent=*/true,
    213        sequencer_->CanSendPaddingOnMediaSsrc());
    214  }
    215 
    216  std::vector<std::unique_ptr<RtpPacketToSend>> Sequence(
    217      std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    218    for (auto& packet : packets) {
    219      sequencer_->Sequence(*packet);
    220    }
    221    return packets;
    222  }
    223 
    224  size_t GenerateAndSendPadding(size_t target_size_bytes) {
    225    size_t generated_bytes = 0;
    226    std::vector<std::unique_ptr<RtpPacketToSend>> packets;
    227    for (auto& packet : GeneratePadding(target_size_bytes)) {
    228      generated_bytes += packet->payload_size() + packet->padding_size();
    229      packets.push_back(std::move(packet));
    230    }
    231    rtp_sender_->EnqueuePackets(std::move(packets));
    232    return generated_bytes;
    233  }
    234 
    235  // The following are helpers for configuring the RTPSender. They must be
    236  // called before sending any packets.
    237 
    238  // Enable the retransmission stream with sizable packet storage.
    239  void EnableRtx() {
    240    // RTX needs to be able to read the source packets from the packet store.
    241    // Pick a number of packets to store big enough for any unit test.
    242    constexpr uint16_t kNumberOfPacketsToStore = 100;
    243    packet_history_->SetStorePacketsStatus(
    244        RtpPacketHistory::StorageMode::kStoreAndCull, kNumberOfPacketsToStore);
    245    rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
    246    rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
    247  }
    248 
    249  // Enable sending of the MID header extension for both the primary SSRC and
    250  // the RTX SSRC.
    251  void EnableMidSending(absl::string_view mid) {
    252    rtp_sender_->RegisterRtpHeaderExtension(RtpMid::Uri(), kMidExtensionId);
    253    rtp_sender_->SetMid(mid);
    254  }
    255 
    256  // Enable sending of the RSID header extension for the primary SSRC and the
    257  // RRSID header extension for the RTX SSRC.
    258  void EnableRidSending() {
    259    rtp_sender_->RegisterRtpHeaderExtension(RtpStreamId::Uri(),
    260                                            kRidExtensionId);
    261    rtp_sender_->RegisterRtpHeaderExtension(RepairedRtpStreamId::Uri(),
    262                                            kRepairedRidExtensionId);
    263  }
    264 };
    265 
    266 TEST_F(RtpSenderTest, AllocatePacketSetCsrcs) {
    267  // Configure rtp_sender with csrc.
    268  uint32_t csrcs[] = {0x23456789};
    269 
    270  auto packet = rtp_sender_->AllocatePacket(csrcs);
    271 
    272  ASSERT_TRUE(packet);
    273  EXPECT_EQ(rtp_sender_->SSRC(), packet->Ssrc());
    274  EXPECT_THAT(packet->Csrcs(), ElementsAreArray(csrcs));
    275 }
    276 
    277 TEST_F(RtpSenderTest, AllocatePacketReserveExtensions) {
    278  // Configure rtp_sender with extensions.
    279  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    280      TransmissionOffset::Uri(), kTransmissionTimeOffsetExtensionId));
    281  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    282      AbsoluteSendTime::Uri(), kAbsoluteSendTimeExtensionId));
    283  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    284      AudioLevelExtension::Uri(), kAudioLevelExtensionId));
    285  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    286      TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
    287  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    288      VideoOrientation::Uri(), kVideoRotationExtensionId));
    289 
    290  auto packet = rtp_sender_->AllocatePacket();
    291 
    292  ASSERT_TRUE(packet);
    293  // Preallocate BWE extensions RtpSender set itself.
    294  EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
    295  EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
    296  EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
    297  // Do not allocate media specific extensions.
    298  EXPECT_FALSE(packet->HasExtension<AudioLevelExtension>());
    299  EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
    300 }
    301 
    302 TEST_F(RtpSenderTest, PaddingAlwaysAllowedOnAudio) {
    303  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    304  config.audio = true;
    305  CreateSender(config);
    306 
    307  std::unique_ptr<RtpPacketToSend> audio_packet = rtp_sender_->AllocatePacket();
    308  // Padding on audio stream allowed regardless of marker in the last packet.
    309  audio_packet->SetMarker(false);
    310  audio_packet->SetPayloadType(kPayload);
    311  sequencer_->Sequence(*audio_packet);
    312 
    313  const size_t kPaddingSize = 59;
    314 
    315  EXPECT_CALL(
    316      mock_paced_sender_,
    317      EnqueuePackets(ElementsAre(AllOf(
    318          Pointee(Property(&RtpPacketToSend::packet_type,
    319                           RtpPacketMediaType::kPadding)),
    320          Pointee(Property(&RtpPacketToSend::padding_size, kPaddingSize))))));
    321  EXPECT_EQ(kPaddingSize, GenerateAndSendPadding(kPaddingSize));
    322 
    323  // Requested padding size is too small, will send a larger one.
    324  const size_t kMinPaddingSize = 50;
    325  EXPECT_CALL(mock_paced_sender_,
    326              EnqueuePackets(ElementsAre(
    327                  AllOf(Pointee(Property(&RtpPacketToSend::packet_type,
    328                                         RtpPacketMediaType::kPadding)),
    329                        Pointee(Property(&RtpPacketToSend::padding_size,
    330                                         kMinPaddingSize))))));
    331  EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5));
    332 }
    333 
    334 TEST_F(RtpSenderTest, SendToNetworkForwardsPacketsToPacer) {
    335  std::vector<std::unique_ptr<RtpPacketToSend>> packets(1);
    336  packets[0] =
    337      BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, Timestamp::Zero());
    338  Timestamp now = env_.clock().CurrentTime();
    339 
    340  EXPECT_CALL(mock_paced_sender_,
    341              EnqueuePackets(ElementsAre(AllOf(
    342                  Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
    343                  Pointee(Property(&RtpPacketToSend::capture_time, now))))));
    344 
    345  rtp_sender_->EnqueuePackets(std::move(packets));
    346 }
    347 
    348 TEST_F(RtpSenderTest, ReSendPacketForwardsPacketsToPacer) {
    349  packet_history_->SetStorePacketsStatus(
    350      RtpPacketHistory::StorageMode::kStoreAndCull, 10);
    351  Timestamp now = env_.clock().CurrentTime();
    352  auto packet = BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, now);
    353  packet->SetSequenceNumber(kSeqNum);
    354  packet->set_allow_retransmission(true);
    355  packet_history_->PutRtpPacket(std::move(packet), now);
    356 
    357  EXPECT_CALL(mock_paced_sender_,
    358              EnqueuePackets(ElementsAre(AllOf(
    359                  Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
    360                  Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)),
    361                  Pointee(Property(&RtpPacketToSend::capture_time, now)),
    362                  Pointee(Property(&RtpPacketToSend::packet_type,
    363                                   RtpPacketMediaType::kRetransmission))))));
    364  EXPECT_TRUE(rtp_sender_->ReSendPacket(kSeqNum));
    365 }
    366 
    367 // This test sends 1 regular video packet, then 4 padding packets, and then
    368 // 1 more regular packet.
    369 TEST_F(RtpSenderTest, SendPadding) {
    370  constexpr int kNumPaddingPackets = 4;
    371  EXPECT_CALL(mock_paced_sender_, EnqueuePackets);
    372  std::unique_ptr<RtpPacketToSend> media_packet =
    373      SendPacket(/*capture_time=*/env_.clock().CurrentTime(),
    374                 /*payload_length=*/100);
    375  sequencer_->Sequence(*media_packet);
    376 
    377  // Wait 50 ms before generating each padding packet.
    378  for (int i = 0; i < kNumPaddingPackets; ++i) {
    379    time_controller_.AdvanceTime(TimeDelta::Millis(50));
    380    const size_t kPaddingTargetBytes = 100;  // Request 100 bytes of padding.
    381 
    382    // Padding should be sent on the media ssrc, with a continous sequence
    383    // number range. Size will be forced to full pack size and the timestamp
    384    // shall be that of the last media packet.
    385    EXPECT_CALL(mock_paced_sender_,
    386                EnqueuePackets(ElementsAre(Pointee(AllOf(
    387                    Property(&RtpPacketToSend::Ssrc, kSsrc),
    388                    Property(&RtpPacketToSend::padding_size, kMaxPaddingLength),
    389                    Property(&RtpPacketToSend::SequenceNumber,
    390                             media_packet->SequenceNumber() + i + 1),
    391                    Property(&RtpPacketToSend::Timestamp,
    392                             media_packet->Timestamp()))))));
    393    std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
    394        Sequence(GeneratePadding(kPaddingTargetBytes));
    395    ASSERT_THAT(padding_packets, SizeIs(1));
    396    rtp_sender_->EnqueuePackets(std::move(padding_packets));
    397  }
    398 
    399  // Send a regular video packet again.
    400  EXPECT_CALL(
    401      mock_paced_sender_,
    402      EnqueuePackets(ElementsAre(Pointee(Property(
    403          &RtpPacketToSend::Timestamp, Gt(media_packet->Timestamp()))))));
    404 
    405  std::unique_ptr<RtpPacketToSend> next_media_packet =
    406      SendPacket(/*capture_time=*/env_.clock().CurrentTime(),
    407                 /*payload_length=*/100);
    408 }
    409 
    410 TEST_F(RtpSenderTest, NoPaddingAsFirstPacketWithoutBweExtensions) {
    411  EXPECT_THAT(rtp_sender_->GeneratePadding(
    412                  /*target_size_bytes=*/100,
    413                  /*media_has_been_sent=*/false,
    414                  /*can_send_padding_on_media_ssrc=*/false),
    415              IsEmpty());
    416 
    417  // Don't send padding before media even with RTX.
    418  EnableRtx();
    419  EXPECT_THAT(rtp_sender_->GeneratePadding(
    420                  /*target_size_bytes=*/100,
    421                  /*media_has_been_sent=*/false,
    422                  /*can_send_padding_on_media_ssrc=*/false),
    423              IsEmpty());
    424 }
    425 
    426 TEST_F(RtpSenderTest, RequiresRtxSsrcToEnableRtx) {
    427  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    428  config.rtx_send_ssrc = std::nullopt;
    429  RTPSender rtp_sender(env_, config, packet_history_.get(),
    430                       config.paced_sender);
    431  rtp_sender.SetRtxPayloadType(kRtxPayload, kPayload);
    432 
    433  rtp_sender.SetRtxStatus(kRtxRetransmitted);
    434 
    435  EXPECT_EQ(rtp_sender.RtxStatus(), kRtxOff);
    436 }
    437 
    438 TEST_F(RtpSenderTest, RequiresRtxPayloadTypesToEnableRtx) {
    439  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    440  config.rtx_send_ssrc = kRtxSsrc;
    441  RTPSender rtp_sender(env_, config, packet_history_.get(),
    442                       config.paced_sender);
    443 
    444  rtp_sender.SetRtxStatus(kRtxRetransmitted);
    445 
    446  EXPECT_EQ(rtp_sender.RtxStatus(), kRtxOff);
    447 }
    448 
    449 TEST_F(RtpSenderTest, CanEnableRtxWhenRtxSsrcAndPayloadTypeAreConfigured) {
    450  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    451  config.rtx_send_ssrc = kRtxSsrc;
    452  RTPSender rtp_sender(env_, config, packet_history_.get(),
    453                       config.paced_sender);
    454  rtp_sender.SetRtxPayloadType(kRtxPayload, kPayload);
    455 
    456  ASSERT_EQ(rtp_sender.RtxStatus(), kRtxOff);
    457  rtp_sender.SetRtxStatus(kRtxRetransmitted);
    458 
    459  EXPECT_EQ(rtp_sender.RtxStatus(), kRtxRetransmitted);
    460 }
    461 
    462 TEST_F(RtpSenderTest, AllowPaddingAsFirstPacketOnRtxWithTransportCc) {
    463  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    464      TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
    465 
    466  // Padding can't be sent as first packet on media SSRC since we don't know
    467  // what payload type to assign.
    468  EXPECT_THAT(rtp_sender_->GeneratePadding(
    469                  /*target_size_bytes=*/100,
    470                  /*media_has_been_sent=*/false,
    471                  /*can_send_padding_on_media_ssrc=*/false),
    472              IsEmpty());
    473 
    474  // With transportcc padding can be sent as first packet on the RTX SSRC.
    475  EnableRtx();
    476  EXPECT_THAT(rtp_sender_->GeneratePadding(
    477                  /*target_size_bytes=*/100,
    478                  /*media_has_been_sent=*/false,
    479                  /*can_send_padding_on_media_ssrc=*/false),
    480              Not(IsEmpty()));
    481 }
    482 
    483 TEST_F(RtpSenderTest, AllowPaddingAsFirstPacketOnRtxWithAbsSendTime) {
    484  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    485      AbsoluteSendTime::Uri(), kAbsoluteSendTimeExtensionId));
    486 
    487  // Padding can't be sent as first packet on media SSRC since we don't know
    488  // what payload type to assign.
    489  EXPECT_THAT(rtp_sender_->GeneratePadding(
    490                  /*target_size_bytes=*/100,
    491                  /*media_has_been_sent=*/false,
    492                  /*can_send_padding_on_media_ssrc=*/false),
    493              IsEmpty());
    494 
    495  // With abs send time, padding can be sent as first packet on the RTX SSRC.
    496  EnableRtx();
    497  EXPECT_THAT(rtp_sender_->GeneratePadding(
    498                  /*target_size_bytes=*/100,
    499                  /*media_has_been_sent=*/false,
    500                  /*can_send_padding_on_media_ssrc=*/false),
    501              Not(IsEmpty()));
    502 }
    503 
    504 TEST_F(RtpSenderTest, UpdatesTimestampsOnPlainRtxPadding) {
    505  EnableRtx();
    506  // Timestamps as set based on capture time in RtpSenderTest.
    507  const Timestamp start_time = env_.clock().CurrentTime();
    508  const uint32_t start_timestamp = ToRtpTimestamp(start_time);
    509 
    510  // Start by sending one media packet.
    511  EXPECT_CALL(
    512      mock_paced_sender_,
    513      EnqueuePackets(ElementsAre(AllOf(
    514          Pointee(Property(&RtpPacketToSend::padding_size, 0u)),
    515          Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)),
    516          Pointee(Property(&RtpPacketToSend::capture_time, start_time))))));
    517  std::unique_ptr<RtpPacketToSend> media_packet =
    518      SendPacket(start_time, /*payload_length=*/600);
    519  sequencer_->Sequence(*media_packet);
    520 
    521  // Advance time before sending padding.
    522  const TimeDelta kTimeDiff = TimeDelta::Millis(17);
    523  time_controller_.AdvanceTime(kTimeDiff);
    524 
    525  // Timestamps on padding should be offset from the sent media.
    526  EXPECT_THAT(
    527      Sequence(GeneratePadding(/*target_size_bytes=*/100)),
    528      Each(Pointee(AllOf(
    529          Property(&RtpPacketToSend::padding_size, kMaxPaddingLength),
    530          Property(&RtpPacketToSend::Timestamp,
    531                   start_timestamp + kRtpClockRate * kTimeDiff),
    532          Property(&RtpPacketToSend::capture_time, start_time + kTimeDiff)))));
    533 }
    534 
    535 TEST_F(RtpSenderTest, KeepsTimestampsOnPayloadPadding) {
    536  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
    537      TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
    538  EnableRtx();
    539  // Timestamps as set based on capture time in RtpSenderTest.
    540  const Timestamp start_time = env_.clock().CurrentTime();
    541  const uint32_t start_timestamp = ToRtpTimestamp(start_time);
    542  const size_t kPayloadSize = 200;
    543 
    544  // Start by sending one media packet and putting in the packet history.
    545  EXPECT_CALL(
    546      mock_paced_sender_,
    547      EnqueuePackets(ElementsAre(AllOf(
    548          Pointee(Property(&RtpPacketToSend::padding_size, 0u)),
    549          Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)),
    550          Pointee(Property(&RtpPacketToSend::capture_time, start_time))))));
    551  std::unique_ptr<RtpPacketToSend> media_packet =
    552      SendPacket(start_time, kPayloadSize);
    553  packet_history_->PutRtpPacket(std::move(media_packet), start_time);
    554 
    555  // Advance time before sending padding.
    556  const TimeDelta kTimeDiff = TimeDelta::Millis(17);
    557  time_controller_.AdvanceTime(kTimeDiff);
    558 
    559  // Timestamps on payload padding should be set to original.
    560  EXPECT_THAT(
    561      GeneratePadding(/*target_size_bytes=*/100),
    562      Each(AllOf(
    563          Pointee(Property(&RtpPacketToSend::padding_size, 0u)),
    564          Pointee(Property(&RtpPacketToSend::payload_size,
    565                           kPayloadSize + kRtxHeaderSize)),
    566          Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)),
    567          Pointee(Property(&RtpPacketToSend::capture_time, start_time)))));
    568 }
    569 
    570 // Test that the MID header extension is included on sent packets when
    571 // configured.
    572 TEST_F(RtpSenderTest, MidIncludedOnSentPackets) {
    573  EnableMidSending(kMid);
    574 
    575  // Send a couple packets, expect both packets to have the MID set.
    576  EXPECT_CALL(mock_paced_sender_,
    577              EnqueuePackets(ElementsAre(Pointee(
    578                  Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid)))))
    579      .Times(2);
    580  SendGenericPacket();
    581  SendGenericPacket();
    582 }
    583 
    584 TEST_F(RtpSenderTest, RidIncludedOnSentPackets) {
    585  EnableRidSending();
    586 
    587  EXPECT_CALL(mock_paced_sender_,
    588              EnqueuePackets(ElementsAre(Pointee(Property(
    589                  &RtpPacketToSend::GetExtension<RtpStreamId>, kRid)))));
    590  SendGenericPacket();
    591 }
    592 
    593 TEST_F(RtpSenderTest, RidIncludedOnRtxSentPackets) {
    594  EnableRtx();
    595  EnableRidSending();
    596 
    597  EXPECT_CALL(mock_paced_sender_,
    598              EnqueuePackets(ElementsAre(Pointee(AllOf(
    599                  Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid),
    600                  Property(&RtpPacketToSend::HasExtension<RepairedRtpStreamId>,
    601                           false))))))
    602      .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    603        sequencer_->Sequence(*packets[0]);
    604        packet_history_->PutRtpPacket(std::move(packets[0]),
    605                                      env_.clock().CurrentTime());
    606      });
    607  SendGenericPacket();
    608 
    609  EXPECT_CALL(
    610      mock_paced_sender_,
    611      EnqueuePackets(ElementsAre(Pointee(AllOf(
    612          Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>, kRid),
    613          Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
    614  rtp_sender_->ReSendPacket(kSeqNum);
    615 }
    616 
    617 TEST_F(RtpSenderTest, MidAndRidNotIncludedOnSentPacketsAfterAck) {
    618  EnableMidSending(kMid);
    619  EnableRidSending();
    620 
    621  // This first packet should include both MID and RID.
    622  EXPECT_CALL(
    623      mock_paced_sender_,
    624      EnqueuePackets(ElementsAre(Pointee(AllOf(
    625          Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
    626          Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))));
    627  auto first_built_packet = SendGenericPacket();
    628  rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
    629 
    630  // The second packet should include neither since an ack was received.
    631  EXPECT_CALL(
    632      mock_paced_sender_,
    633      EnqueuePackets(ElementsAre(Pointee(AllOf(
    634          Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
    635          Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
    636  SendGenericPacket();
    637 }
    638 
    639 TEST_F(RtpSenderTest, MidAndRidAlwaysIncludedOnSentPacketsWhenConfigured) {
    640  SetUpRtpSender(false, /*always_send_mid_and_rid=*/true, nullptr);
    641  EnableMidSending(kMid);
    642  EnableRidSending();
    643 
    644  // Send two media packets: one before and one after the ack.
    645  // Due to the configuration, both sent packets should contain MID and RID.
    646  EXPECT_CALL(
    647      mock_paced_sender_,
    648      EnqueuePackets(ElementsAre(Pointee(
    649          AllOf(Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
    650                Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))))
    651      .Times(2);
    652  auto first_built_packet = SendGenericPacket();
    653  rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
    654  SendGenericPacket();
    655 }
    656 
    657 // Test that the first RTX packet includes both MID and RRID even if the packet
    658 // being retransmitted did not have MID or RID. The MID and RID are needed on
    659 // the first packets for a given SSRC, and RTX packets are sent on a separate
    660 // SSRC.
    661 TEST_F(RtpSenderTest, MidAndRidIncludedOnFirstRtxPacket) {
    662  EnableRtx();
    663  EnableMidSending(kMid);
    664  EnableRidSending();
    665 
    666  // This first packet will include both MID and RID.
    667  EXPECT_CALL(mock_paced_sender_, EnqueuePackets);
    668  auto first_built_packet = SendGenericPacket();
    669  rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
    670 
    671  // The second packet will include neither since an ack was received, put
    672  // it in the packet history for retransmission.
    673  EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
    674      .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    675        packet_history_->PutRtpPacket(std::move(packets[0]),
    676                                      env_.clock().CurrentTime());
    677      });
    678  auto second_built_packet = SendGenericPacket();
    679 
    680  // The first RTX packet should include MID and RRID.
    681  EXPECT_CALL(mock_paced_sender_,
    682              EnqueuePackets(ElementsAre(Pointee(AllOf(
    683                  Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
    684                  Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>,
    685                           kRid))))));
    686  rtp_sender_->ReSendPacket(second_built_packet->SequenceNumber());
    687 }
    688 
    689 // Test that the RTX packets sent after receving an ACK on the RTX SSRC does
    690 // not include either MID or RRID even if the packet being retransmitted did
    691 // had a MID or RID.
    692 TEST_F(RtpSenderTest, MidAndRidNotIncludedOnRtxPacketsAfterAck) {
    693  EnableRtx();
    694  EnableMidSending(kMid);
    695  EnableRidSending();
    696 
    697  // This first packet will include both MID and RID.
    698  auto first_built_packet = SendGenericPacket();
    699  sequencer_->Sequence(*first_built_packet);
    700  packet_history_->PutRtpPacket(
    701      std::make_unique<RtpPacketToSend>(*first_built_packet),
    702      /*send_time=*/env_.clock().CurrentTime());
    703  rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
    704 
    705  // The second packet will include neither since an ack was received.
    706  auto second_built_packet = SendGenericPacket();
    707  sequencer_->Sequence(*second_built_packet);
    708  packet_history_->PutRtpPacket(
    709      std::make_unique<RtpPacketToSend>(*second_built_packet),
    710      /*send_time=*/env_.clock().CurrentTime());
    711 
    712  // The first RTX packet will include MID and RRID.
    713  EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
    714      .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    715        rtp_sender_->OnReceivedAckOnRtxSsrc(packets[0]->SequenceNumber());
    716        packet_history_->MarkPacketAsSent(
    717            *packets[0]->retransmitted_sequence_number());
    718      });
    719  rtp_sender_->ReSendPacket(second_built_packet->SequenceNumber());
    720 
    721  // The second and third RTX packets should not include MID nor RRID.
    722  EXPECT_CALL(mock_paced_sender_,
    723              EnqueuePackets(ElementsAre(Pointee(AllOf(
    724                  Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
    725                  Property(&RtpPacketToSend::HasExtension<RepairedRtpStreamId>,
    726                           false))))))
    727      .Times(2);
    728  rtp_sender_->ReSendPacket(first_built_packet->SequenceNumber());
    729  rtp_sender_->ReSendPacket(second_built_packet->SequenceNumber());
    730 }
    731 
    732 TEST_F(RtpSenderTest, MidAndRidAlwaysIncludedOnRtxPacketsWhenConfigured) {
    733  SetUpRtpSender(false, /*always_send_mid_and_rid=*/true, nullptr);
    734  EnableRtx();
    735  EnableMidSending(kMid);
    736  EnableRidSending();
    737 
    738  // Send two media packets: one before and one after the ack.
    739  EXPECT_CALL(
    740      mock_paced_sender_,
    741      EnqueuePackets(ElementsAre(Pointee(
    742          AllOf(Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
    743                Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))))
    744      .Times(2)
    745      .WillRepeatedly(
    746          [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    747            packet_history_->PutRtpPacket(std::move(packets[0]),
    748                                          env_.clock().CurrentTime());
    749          });
    750  auto media_packet1 = SendGenericPacket();
    751  rtp_sender_->OnReceivedAckOnSsrc(media_packet1->SequenceNumber());
    752  auto media_packet2 = SendGenericPacket();
    753 
    754  // Send three RTX packets with different combinations of orders w.r.t. the
    755  // media and RTX acks.
    756  // Due to the configuration, all sent packets should contain MID
    757  // and either RID (media) or RRID (RTX).
    758  EXPECT_CALL(mock_paced_sender_,
    759              EnqueuePackets(ElementsAre(Pointee(AllOf(
    760                  Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
    761                  Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>,
    762                           kRid))))))
    763      .Times(3)
    764      .WillRepeatedly(
    765          [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    766            rtp_sender_->OnReceivedAckOnRtxSsrc(packets[0]->SequenceNumber());
    767            packet_history_->MarkPacketAsSent(
    768                *packets[0]->retransmitted_sequence_number());
    769          });
    770  rtp_sender_->ReSendPacket(media_packet2->SequenceNumber());
    771  rtp_sender_->ReSendPacket(media_packet1->SequenceNumber());
    772  rtp_sender_->ReSendPacket(media_packet2->SequenceNumber());
    773 }
    774 
    775 // Test that if the RtpState indicates an ACK has been received on that SSRC
    776 // then neither the MID nor RID header extensions will be sent.
    777 TEST_F(RtpSenderTest, MidAndRidNotIncludedOnSentPacketsAfterRtpStateRestored) {
    778  EnableMidSending(kMid);
    779  EnableRidSending();
    780 
    781  RtpState state = rtp_sender_->GetRtpState();
    782  EXPECT_FALSE(state.ssrc_has_acked);
    783  state.ssrc_has_acked = true;
    784  rtp_sender_->SetRtpState(state);
    785 
    786  EXPECT_CALL(
    787      mock_paced_sender_,
    788      EnqueuePackets(ElementsAre(Pointee(AllOf(
    789          Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
    790          Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
    791  SendGenericPacket();
    792 }
    793 
    794 // Test that if the RTX RtpState indicates an ACK has been received on that
    795 // RTX SSRC then neither the MID nor RRID header extensions will be sent on
    796 // RTX packets.
    797 TEST_F(RtpSenderTest, MidAndRridNotIncludedOnRtxPacketsAfterRtpStateRestored) {
    798  EnableRtx();
    799  EnableMidSending(kMid);
    800  EnableRidSending();
    801 
    802  RtpState rtx_state = rtp_sender_->GetRtxRtpState();
    803  EXPECT_FALSE(rtx_state.ssrc_has_acked);
    804  rtx_state.ssrc_has_acked = true;
    805  rtp_sender_->SetRtxRtpState(rtx_state);
    806 
    807  EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
    808      .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    809        packet_history_->PutRtpPacket(std::move(packets[0]),
    810                                      env_.clock().CurrentTime());
    811      });
    812  auto built_packet = SendGenericPacket();
    813 
    814  EXPECT_CALL(
    815      mock_paced_sender_,
    816      EnqueuePackets(ElementsAre(Pointee(AllOf(
    817          Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
    818          Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
    819  ASSERT_LT(0, rtp_sender_->ReSendPacket(built_packet->SequenceNumber()));
    820 }
    821 
    822 TEST_F(RtpSenderTest, RespectsNackBitrateLimit) {
    823  const int32_t kPacketSize = 1400;
    824  const int32_t kNumPackets = 30;
    825  retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8);
    826  EnableRtx();
    827 
    828  std::vector<uint16_t> sequence_numbers;
    829  for (int32_t i = 0; i < kNumPackets; ++i) {
    830    std::unique_ptr<RtpPacketToSend> packet =
    831        BuildRtpPacket(kPayload, /*marker_bit=*/true, /*rtp_timestamp=*/0,
    832                       /*capture_time=*/env_.clock().CurrentTime());
    833    packet->set_allow_retransmission(true);
    834    sequencer_->Sequence(*packet);
    835    sequence_numbers.push_back(packet->SequenceNumber());
    836    packet_history_->PutRtpPacket(std::move(packet),
    837                                  /*send_time=*/env_.clock().CurrentTime());
    838    time_controller_.AdvanceTime(TimeDelta::Millis(1));
    839  }
    840 
    841  time_controller_.AdvanceTime(TimeDelta::Millis(1000 - kNumPackets));
    842 
    843  // Resending should work - brings the bandwidth up to the limit.
    844  // NACK bitrate is capped to the same bitrate as the encoder, since the max
    845  // protection overhead is 50% (see MediaOptimization::SetTargetRates).
    846  EXPECT_CALL(mock_paced_sender_, EnqueuePackets(ElementsAre(Pointee(Property(
    847                                      &RtpPacketToSend::packet_type,
    848                                      RtpPacketMediaType::kRetransmission)))))
    849      .Times(kNumPackets)
    850      .WillRepeatedly(
    851          [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
    852            for (const auto& packet : packets) {
    853              packet_history_->MarkPacketAsSent(
    854                  *packet->retransmitted_sequence_number());
    855            }
    856          });
    857  rtp_sender_->OnReceivedNack(sequence_numbers, 0);
    858 
    859  // Must be at least 5ms in between retransmission attempts.
    860  time_controller_.AdvanceTime(TimeDelta::Millis(5));
    861 
    862  // Resending should not work, bandwidth exceeded.
    863  EXPECT_CALL(mock_paced_sender_, EnqueuePackets).Times(0);
    864  rtp_sender_->OnReceivedNack(sequence_numbers, 0);
    865 }
    866 
    867 TEST_F(RtpSenderTest, UpdatingCsrcsUpdatedOverhead) {
    868  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    869  config.rtx_send_ssrc = {};
    870  CreateSender(config);
    871 
    872  // Base RTP overhead is 12B.
    873  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
    874 
    875  // Using packet with two csrcs adds 2*4 bytes to the header.
    876  uint32_t csrcs[] = {1, 2};
    877  rtp_sender_->AllocatePacket(csrcs);
    878  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 20u);
    879 }
    880 
    881 TEST_F(RtpSenderTest, OnOverheadChanged) {
    882  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    883  config.rtx_send_ssrc = {};
    884  CreateSender(config);
    885 
    886  // Base RTP overhead is 12B.
    887  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
    888 
    889  rtp_sender_->RegisterRtpHeaderExtension(TransmissionOffset::Uri(),
    890                                          kTransmissionTimeOffsetExtensionId);
    891 
    892  // TransmissionTimeOffset extension has a size of 3B, but with the addition
    893  // of header index and rounding to 4 byte boundary we end up with 20B total.
    894  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 20u);
    895 }
    896 
    897 TEST_F(RtpSenderTest, CountMidOnlyUntilAcked) {
    898  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    899  config.rtx_send_ssrc = {};
    900  CreateSender(config);
    901 
    902  // Base RTP overhead is 12B.
    903  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
    904 
    905  rtp_sender_->RegisterRtpHeaderExtension(RtpMid::Uri(), kMidExtensionId);
    906 
    907  // Counted only if set.
    908  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
    909  rtp_sender_->SetMid("foo");
    910  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 36u);
    911  rtp_sender_->RegisterRtpHeaderExtension(RtpStreamId::Uri(), kRidExtensionId);
    912  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 52u);
    913 
    914  // Ack received, mid/rid no longer sent.
    915  rtp_sender_->OnReceivedAckOnSsrc(0);
    916  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
    917 }
    918 
    919 TEST_F(RtpSenderTest, CountMidRidRridUntilAcked) {
    920  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    921  CreateSender(config);
    922 
    923  // Base RTP overhead is 12B and we use RTX which has an additional 2 bytes
    924  // overhead.
    925  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 14u);
    926 
    927  rtp_sender_->RegisterRtpHeaderExtension(RtpMid::Uri(), kMidExtensionId);
    928 
    929  // Counted only if set.
    930  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 14u);
    931  rtp_sender_->SetMid("foo");
    932  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 38u);
    933 
    934  rtp_sender_->RegisterRtpHeaderExtension(RtpStreamId::Uri(), kRidExtensionId);
    935  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 54u);
    936 
    937  // mid/rrid may be shared with mid/rid when both are active.
    938  rtp_sender_->RegisterRtpHeaderExtension(RepairedRtpStreamId::Uri(),
    939                                          kRepairedRidExtensionId);
    940  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 54u);
    941 
    942  // Ack received, mid/rid no longer sent but we still need space for
    943  // mid/rrid which can no longer be shared with mid/rid.
    944  rtp_sender_->OnReceivedAckOnSsrc(0);
    945  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 54u);
    946 
    947  // Ack received for RTX, no need to send RRID anymore.
    948  rtp_sender_->OnReceivedAckOnRtxSsrc(0);
    949  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 14u);
    950 }
    951 
    952 TEST_F(RtpSenderTest, DontCountVolatileExtensionsIntoOverhead) {
    953  RtpRtcpInterface::Configuration config = GetDefaultConfig();
    954  config.rtx_send_ssrc = {};
    955  CreateSender(config);
    956 
    957  // Base RTP overhead is 12B.
    958  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
    959 
    960  rtp_sender_->RegisterRtpHeaderExtension(InbandComfortNoiseExtension::Uri(),
    961                                          1);
    962  rtp_sender_->RegisterRtpHeaderExtension(AbsoluteCaptureTimeExtension::Uri(),
    963                                          2);
    964  rtp_sender_->RegisterRtpHeaderExtension(VideoOrientation::Uri(), 3);
    965  rtp_sender_->RegisterRtpHeaderExtension(PlayoutDelayLimits::Uri(), 4);
    966  rtp_sender_->RegisterRtpHeaderExtension(VideoContentTypeExtension::Uri(), 5);
    967  rtp_sender_->RegisterRtpHeaderExtension(VideoTimingExtension::Uri(), 6);
    968  rtp_sender_->RegisterRtpHeaderExtension(RepairedRtpStreamId::Uri(), 7);
    969  rtp_sender_->RegisterRtpHeaderExtension(ColorSpaceExtension::Uri(), 8);
    970 
    971  // Still only 12B counted since can't count on above being sent.
    972  EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
    973 }
    974 
    975 TEST_F(RtpSenderTest, SendPacketHandlesRetransmissionHistory) {
    976  packet_history_->SetStorePacketsStatus(
    977      RtpPacketHistory::StorageMode::kStoreAndCull, 10);
    978 
    979  // Ignore calls to EnqueuePackets() for this test.
    980  EXPECT_CALL(mock_paced_sender_, EnqueuePackets).WillRepeatedly(Return());
    981 
    982  // Build a media packet and put in the packet history.
    983  std::unique_ptr<RtpPacketToSend> packet =
    984      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
    985  const uint16_t media_sequence_number = packet->SequenceNumber();
    986  packet->set_allow_retransmission(true);
    987  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
    988 
    989  // Simulate successful retransmission request.
    990  time_controller_.AdvanceTime(TimeDelta::Millis(30));
    991  EXPECT_THAT(rtp_sender_->ReSendPacket(media_sequence_number), Gt(0));
    992 
    993  // Packet already pending, retransmission not allowed.
    994  time_controller_.AdvanceTime(TimeDelta::Millis(30));
    995  EXPECT_THAT(rtp_sender_->ReSendPacket(media_sequence_number), Eq(0));
    996 
    997  // Simulate packet exiting pacer, mark as not longer pending.
    998  packet_history_->MarkPacketAsSent(media_sequence_number);
    999 
   1000  // Retransmissions allowed again.
   1001  time_controller_.AdvanceTime(TimeDelta::Millis(30));
   1002  EXPECT_THAT(rtp_sender_->ReSendPacket(media_sequence_number), Gt(0));
   1003 }
   1004 
   1005 TEST_F(RtpSenderTest, MarksRetransmittedPackets) {
   1006  packet_history_->SetStorePacketsStatus(
   1007      RtpPacketHistory::StorageMode::kStoreAndCull, 10);
   1008 
   1009  // Build a media packet and put in the packet history.
   1010  std::unique_ptr<RtpPacketToSend> packet =
   1011      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   1012  const uint32_t kMediaSsrc = 567;
   1013  const uint16_t kMediaSequenceNumber = 123;
   1014  packet->SetSsrc(kMediaSsrc);
   1015  packet->SetSequenceNumber(kMediaSequenceNumber);
   1016  packet->set_allow_retransmission(true);
   1017  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
   1018 
   1019  // Expect a retransmission packet marked with which packet it is a
   1020  // retransmit of.
   1021  EXPECT_CALL(
   1022      mock_paced_sender_,
   1023      EnqueuePackets(ElementsAre(AllOf(
   1024          Pointee(Property(&RtpPacketToSend::packet_type,
   1025                           RtpPacketMediaType::kRetransmission)),
   1026          Pointee(Property(&RtpPacketToSend::original_ssrc, kMediaSsrc)),
   1027          Pointee(Property(&RtpPacketToSend::retransmitted_sequence_number,
   1028                           Eq(kMediaSequenceNumber)))))));
   1029  EXPECT_THAT(rtp_sender_->ReSendPacket(kMediaSequenceNumber), Gt(0));
   1030 }
   1031 
   1032 TEST_F(RtpSenderTest, GeneratedPaddingHasBweExtensions) {
   1033  // Min requested size in order to use RTX payload.
   1034  const size_t kMinPaddingSize = 50;
   1035  EnableRtx();
   1036 
   1037  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1038      TransmissionOffset::Uri(), kTransmissionTimeOffsetExtensionId));
   1039  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1040      AbsoluteSendTime::Uri(), kAbsoluteSendTimeExtensionId));
   1041  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1042      TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
   1043 
   1044  // Put a packet in the history, in order to facilitate payload padding.
   1045  std::unique_ptr<RtpPacketToSend> packet =
   1046      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   1047  packet->set_allow_retransmission(true);
   1048  packet->SetPayloadSize(kMinPaddingSize);
   1049  packet->set_packet_type(RtpPacketMediaType::kVideo);
   1050  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
   1051 
   1052  // Generate a plain padding packet, check that extensions are registered.
   1053  std::vector<std::unique_ptr<RtpPacketToSend>> generated_packets =
   1054      GeneratePadding(/*target_size_bytes=*/1);
   1055  ASSERT_THAT(generated_packets, SizeIs(1));
   1056  auto& plain_padding = generated_packets.front();
   1057  EXPECT_GT(plain_padding->padding_size(), 0u);
   1058  EXPECT_TRUE(plain_padding->HasExtension<TransportSequenceNumber>());
   1059  EXPECT_TRUE(plain_padding->HasExtension<AbsoluteSendTime>());
   1060  EXPECT_TRUE(plain_padding->HasExtension<TransmissionOffset>());
   1061  EXPECT_GT(plain_padding->padding_size(), 0u);
   1062 
   1063  // Generate a payload padding packets, check that extensions are registered.
   1064  generated_packets = GeneratePadding(kMinPaddingSize);
   1065  ASSERT_EQ(generated_packets.size(), 1u);
   1066  auto& payload_padding = generated_packets.front();
   1067  EXPECT_EQ(payload_padding->padding_size(), 0u);
   1068  EXPECT_TRUE(payload_padding->HasExtension<TransportSequenceNumber>());
   1069  EXPECT_TRUE(payload_padding->HasExtension<AbsoluteSendTime>());
   1070  EXPECT_TRUE(payload_padding->HasExtension<TransmissionOffset>());
   1071  EXPECT_GT(payload_padding->payload_size(), 0u);
   1072 }
   1073 
   1074 TEST_F(RtpSenderTest, GeneratedPaddingHasMidRidExtensions) {
   1075  EnableMidSending("mid");
   1076  EnableRidSending();
   1077 
   1078  // Send a dummy video packet so it ends up in the packet history. Since we
   1079  // are not using RTX, it should never be used as padding.
   1080  packet_history_->SetStorePacketsStatus(
   1081      RtpPacketHistory::StorageMode::kStoreAndCull, 1);
   1082  std::unique_ptr<RtpPacketToSend> packet =
   1083      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   1084  packet->set_allow_retransmission(true);
   1085  packet->SetPayloadSize(1234);
   1086  packet->set_packet_type(RtpPacketMediaType::kVideo);
   1087  sequencer_->Sequence(*packet);
   1088  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
   1089 
   1090  std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
   1091      GeneratePadding(/*target_size_bytes=*/1);
   1092  ASSERT_THAT(padding_packets, SizeIs(1));
   1093 
   1094  EXPECT_TRUE(padding_packets[0]->HasExtension<RtpMid>());
   1095  EXPECT_TRUE(padding_packets[0]->HasExtension<RtpStreamId>());
   1096 }
   1097 
   1098 TEST_F(RtpSenderTest, GeneratedPaddingOnRtxHasMidRidExtensions) {
   1099  EnableRtx();
   1100  EnableMidSending("mid");
   1101  EnableRidSending();
   1102 
   1103  std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
   1104      GeneratePadding(/*target_size_bytes=*/1);
   1105  ASSERT_THAT(padding_packets, SizeIs(1));
   1106 
   1107  EXPECT_TRUE(padding_packets[0]->HasExtension<RtpMid>());
   1108  EXPECT_TRUE(padding_packets[0]->HasExtension<RepairedRtpStreamId>());
   1109 }
   1110 
   1111 TEST_F(RtpSenderTest, GeneratePaddingResendsOldPacketsWithRtx) {
   1112  // Min requested size in order to use RTX payload.
   1113  const size_t kMinPaddingSize = 50;
   1114 
   1115  rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
   1116  rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
   1117  packet_history_->SetStorePacketsStatus(
   1118      RtpPacketHistory::StorageMode::kStoreAndCull, 1);
   1119 
   1120  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1121      TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
   1122 
   1123  const size_t kPayloadPacketSize = kMinPaddingSize;
   1124  std::unique_ptr<RtpPacketToSend> packet =
   1125      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   1126  packet->set_allow_retransmission(true);
   1127  packet->SetPayloadSize(kPayloadPacketSize);
   1128  packet->set_packet_type(RtpPacketMediaType::kVideo);
   1129  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
   1130 
   1131  // Generated padding has large enough budget that the video packet should be
   1132  // retransmitted as padding.
   1133  std::vector<std::unique_ptr<RtpPacketToSend>> generated_packets =
   1134      GeneratePadding(kMinPaddingSize);
   1135  ASSERT_EQ(generated_packets.size(), 1u);
   1136  auto& padding_packet = generated_packets.front();
   1137  EXPECT_EQ(padding_packet->packet_type(), RtpPacketMediaType::kPadding);
   1138  EXPECT_EQ(padding_packet->Ssrc(), kRtxSsrc);
   1139  EXPECT_EQ(padding_packet->payload_size(),
   1140            kPayloadPacketSize + kRtxHeaderSize);
   1141 
   1142  // Not enough budged for payload padding, use plain padding instead.
   1143  const size_t kPaddingBytesRequested = kMinPaddingSize - 1;
   1144 
   1145  size_t padding_bytes_generated = 0;
   1146  generated_packets = GeneratePadding(kPaddingBytesRequested);
   1147  EXPECT_EQ(generated_packets.size(), 1u);
   1148  for (auto& generated_packet : generated_packets) {
   1149    EXPECT_EQ(generated_packet->packet_type(), RtpPacketMediaType::kPadding);
   1150    EXPECT_EQ(generated_packet->Ssrc(), kRtxSsrc);
   1151    EXPECT_EQ(generated_packet->payload_size(), 0u);
   1152    EXPECT_GT(generated_packet->padding_size(), 0u);
   1153    padding_bytes_generated += generated_packet->padding_size();
   1154  }
   1155 
   1156  EXPECT_EQ(padding_bytes_generated, kMaxPaddingLength);
   1157 }
   1158 
   1159 TEST_F(RtpSenderTest, LimitsPayloadPaddingSize) {
   1160  // RTX payload padding is limited to 3x target size.
   1161  const double kFactor = 3.0;
   1162  SetUpRtpSender(false, false, nullptr);
   1163  rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
   1164  rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
   1165  packet_history_->SetStorePacketsStatus(
   1166      RtpPacketHistory::StorageMode::kStoreAndCull, 1);
   1167 
   1168  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1169      TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
   1170 
   1171  // Send a dummy video packet so it ends up in the packet history.
   1172  const size_t kPayloadPacketSize = 1234u;
   1173  std::unique_ptr<RtpPacketToSend> packet =
   1174      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   1175  packet->set_allow_retransmission(true);
   1176  packet->SetPayloadSize(kPayloadPacketSize);
   1177  packet->set_packet_type(RtpPacketMediaType::kVideo);
   1178  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
   1179 
   1180  // Smallest target size that will result in the sent packet being returned as
   1181  // padding.
   1182  const size_t kMinTargerSizeForPayload =
   1183      (kPayloadPacketSize + kRtxHeaderSize) / kFactor;
   1184 
   1185  // Generated padding has large enough budget that the video packet should be
   1186  // retransmitted as padding.
   1187  EXPECT_THAT(
   1188      GeneratePadding(kMinTargerSizeForPayload),
   1189      AllOf(Not(IsEmpty()),
   1190            Each(Pointee(Property(&RtpPacketToSend::padding_size, Eq(0u))))));
   1191 
   1192  // If payload padding is > 2x requested size, plain padding is returned
   1193  // instead.
   1194  EXPECT_THAT(
   1195      GeneratePadding(kMinTargerSizeForPayload - 1),
   1196      AllOf(Not(IsEmpty()),
   1197            Each(Pointee(Property(&RtpPacketToSend::padding_size, Gt(0u))))));
   1198 }
   1199 
   1200 TEST_F(RtpSenderTest, GeneratePaddingCreatesPurePaddingWithoutRtx) {
   1201  packet_history_->SetStorePacketsStatus(
   1202      RtpPacketHistory::StorageMode::kStoreAndCull, 1);
   1203  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1204      TransmissionOffset::Uri(), kTransmissionTimeOffsetExtensionId));
   1205  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1206      AbsoluteSendTime::Uri(), kAbsoluteSendTimeExtensionId));
   1207  ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
   1208      TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
   1209 
   1210  const size_t kPayloadPacketSize = 1234;
   1211  // Send a dummy video packet so it ends up in the packet history. Since we
   1212  // are not using RTX, it should never be used as padding.
   1213  std::unique_ptr<RtpPacketToSend> packet =
   1214      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   1215  packet->set_allow_retransmission(true);
   1216  packet->SetPayloadSize(kPayloadPacketSize);
   1217  packet->set_packet_type(RtpPacketMediaType::kVideo);
   1218  sequencer_->Sequence(*packet);
   1219  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
   1220 
   1221  // Payload padding not available without RTX, only generate plain padding on
   1222  // the media SSRC.
   1223  // Number of padding packets is the requested padding size divided by max
   1224  // padding packet size, rounded up. Pure padding packets are always of the
   1225  // maximum size.
   1226  const size_t kPaddingBytesRequested = kPayloadPacketSize + kRtxHeaderSize;
   1227  const size_t kExpectedNumPaddingPackets =
   1228      (kPaddingBytesRequested + kMaxPaddingLength - 1) / kMaxPaddingLength;
   1229  size_t padding_bytes_generated = 0;
   1230  std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
   1231      GeneratePadding(kPaddingBytesRequested);
   1232  EXPECT_EQ(padding_packets.size(), kExpectedNumPaddingPackets);
   1233  for (auto& generated_packet : padding_packets) {
   1234    EXPECT_EQ(generated_packet->packet_type(), RtpPacketMediaType::kPadding);
   1235    EXPECT_EQ(generated_packet->Ssrc(), kSsrc);
   1236    EXPECT_EQ(generated_packet->payload_size(), 0u);
   1237    EXPECT_GT(generated_packet->padding_size(), 0u);
   1238    padding_bytes_generated += generated_packet->padding_size();
   1239    EXPECT_TRUE(generated_packet->HasExtension<TransportSequenceNumber>());
   1240    EXPECT_TRUE(generated_packet->HasExtension<AbsoluteSendTime>());
   1241    EXPECT_TRUE(generated_packet->HasExtension<TransmissionOffset>());
   1242  }
   1243 
   1244  EXPECT_EQ(padding_bytes_generated,
   1245            kExpectedNumPaddingPackets * kMaxPaddingLength);
   1246 }
   1247 
   1248 TEST_F(RtpSenderTest, SupportsPadding) {
   1249  bool kSendingMediaStats[] = {true, false};
   1250  bool kEnableRedundantPayloads[] = {true, false};
   1251  absl::string_view kBweExtensionUris[] = {
   1252      TransportSequenceNumber::Uri(), TransportSequenceNumberV2::Uri(),
   1253      AbsoluteSendTime::Uri(), TransmissionOffset::Uri()};
   1254  const int kExtensionsId = 7;
   1255 
   1256  for (bool sending_media : kSendingMediaStats) {
   1257    rtp_sender_->SetSendingMediaStatus(sending_media);
   1258    for (bool redundant_payloads : kEnableRedundantPayloads) {
   1259      int rtx_mode = kRtxRetransmitted;
   1260      if (redundant_payloads) {
   1261        rtx_mode |= kRtxRedundantPayloads;
   1262      }
   1263      rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
   1264      rtp_sender_->SetRtxStatus(rtx_mode);
   1265 
   1266      for (auto extension_uri : kBweExtensionUris) {
   1267        EXPECT_FALSE(rtp_sender_->SupportsPadding());
   1268        rtp_sender_->RegisterRtpHeaderExtension(extension_uri, kExtensionsId);
   1269        if (!sending_media) {
   1270          EXPECT_FALSE(rtp_sender_->SupportsPadding());
   1271        } else {
   1272          EXPECT_TRUE(rtp_sender_->SupportsPadding());
   1273          if (redundant_payloads) {
   1274            EXPECT_TRUE(rtp_sender_->SupportsRtxPayloadPadding());
   1275          } else {
   1276            EXPECT_FALSE(rtp_sender_->SupportsRtxPayloadPadding());
   1277          }
   1278        }
   1279        rtp_sender_->DeregisterRtpHeaderExtension(extension_uri);
   1280        EXPECT_FALSE(rtp_sender_->SupportsPadding());
   1281      }
   1282    }
   1283  }
   1284 }
   1285 
   1286 TEST_F(RtpSenderTest, SetsCaptureTimeOnRtxRetransmissions) {
   1287  EnableRtx();
   1288 
   1289  // Put a packet in the packet history, with current time as capture time.
   1290  const Timestamp start_time = env_.clock().CurrentTime();
   1291  std::unique_ptr<RtpPacketToSend> packet =
   1292      BuildRtpPacket(kPayload, kMarkerBit, /*rtp_timestamp=*/0,
   1293                     /*capture_time=*/start_time);
   1294  packet->set_allow_retransmission(true);
   1295  sequencer_->Sequence(*packet);
   1296  packet_history_->PutRtpPacket(std::move(packet), start_time);
   1297 
   1298  // Advance time, request an RTX retransmission. Capture timestamp should be
   1299  // preserved.
   1300  time_controller_.AdvanceTime(TimeDelta::Millis(10));
   1301 
   1302  EXPECT_CALL(mock_paced_sender_,
   1303              EnqueuePackets(ElementsAre(Pointee(
   1304                  Property(&RtpPacketToSend::capture_time, start_time)))));
   1305  EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
   1306 }
   1307 
   1308 TEST_F(RtpSenderTest, IgnoresNackAfterDisablingMedia) {
   1309  const TimeDelta kRtt = TimeDelta::Millis(10);
   1310 
   1311  EnableRtx();
   1312  packet_history_->SetRtt(kRtt);
   1313 
   1314  // Put a packet in the history.
   1315  const Timestamp start_time = env_.clock().CurrentTime();
   1316  std::unique_ptr<RtpPacketToSend> packet =
   1317      BuildRtpPacket(kPayload, kMarkerBit, 0, /*capture_time=*/start_time);
   1318  packet->set_allow_retransmission(true);
   1319  sequencer_->Sequence(*packet);
   1320  packet_history_->PutRtpPacket(std::move(packet), start_time);
   1321 
   1322  // Disable media sending and try to retransmit the packet, it should fail.
   1323  rtp_sender_->SetSendingMediaStatus(false);
   1324  time_controller_.AdvanceTime(kRtt);
   1325  EXPECT_LT(rtp_sender_->ReSendPacket(kSeqNum), 0);
   1326 }
   1327 
   1328 TEST_F(RtpSenderTest, DoesntFecProtectRetransmissions) {
   1329  // Set up retranmission without RTX, so that a plain copy of the old packet is
   1330  // re-sent instead.
   1331  const TimeDelta kRtt = TimeDelta::Millis(10);
   1332  rtp_sender_->SetSendingMediaStatus(true);
   1333  rtp_sender_->SetRtxStatus(kRtxOff);
   1334  packet_history_->SetStorePacketsStatus(
   1335      RtpPacketHistory::StorageMode::kStoreAndCull, 10);
   1336  packet_history_->SetRtt(kRtt);
   1337 
   1338  // Put a fec protected packet in the history.
   1339  const Timestamp start_time = env_.clock().CurrentTime();
   1340  std::unique_ptr<RtpPacketToSend> packet =
   1341      BuildRtpPacket(kPayload, kMarkerBit, 0, start_time);
   1342  packet->set_allow_retransmission(true);
   1343  packet->set_fec_protect_packet(true);
   1344  sequencer_->Sequence(*packet);
   1345  packet_history_->PutRtpPacket(std::move(packet), start_time);
   1346 
   1347  // Re-send packet, the retransmitted packet should not have the FEC protection
   1348  // flag set.
   1349  EXPECT_CALL(mock_paced_sender_,
   1350              EnqueuePackets(ElementsAre(Pointee(
   1351                  Property(&RtpPacketToSend::fec_protect_packet, false)))));
   1352 
   1353  time_controller_.AdvanceTime(kRtt);
   1354  EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
   1355 }
   1356 
   1357 TEST_F(RtpSenderTest, MarksPacketsWithKeyframeStatus) {
   1358  RTPSenderVideo::Config video_config;
   1359  video_config.clock = &env_.clock();
   1360  video_config.rtp_sender = rtp_sender_.get();
   1361  video_config.field_trials = &env_.field_trials();
   1362  RTPSenderVideo rtp_sender_video(video_config);
   1363 
   1364  const uint8_t kPayloadType = 127;
   1365  const std::optional<VideoCodecType> kCodecType =
   1366      VideoCodecType::kVideoCodecGeneric;
   1367 
   1368  const uint32_t kCaptureTimeMsToRtpTimestamp = 90;  // 90 kHz clock
   1369 
   1370  {
   1371    EXPECT_CALL(mock_paced_sender_,
   1372                EnqueuePackets(Each(
   1373                    Pointee(Property(&RtpPacketToSend::is_key_frame, true)))))
   1374        .Times(AtLeast(1));
   1375    RTPVideoHeader video_header;
   1376    video_header.frame_type = VideoFrameType::kVideoFrameKey;
   1377    Timestamp capture_time = env_.clock().CurrentTime();
   1378    EXPECT_TRUE(rtp_sender_video.SendVideo(
   1379        kPayloadType, kCodecType,
   1380        capture_time.ms() * kCaptureTimeMsToRtpTimestamp, capture_time,
   1381        kPayloadData, sizeof(kPayloadData), video_header,
   1382        kDefaultExpectedRetransmissionTime, {}));
   1383 
   1384    time_controller_.AdvanceTime(TimeDelta::Millis(33));
   1385  }
   1386 
   1387  {
   1388    EXPECT_CALL(mock_paced_sender_,
   1389                EnqueuePackets(Each(
   1390                    Pointee(Property(&RtpPacketToSend::is_key_frame, false)))))
   1391        .Times(AtLeast(1));
   1392    RTPVideoHeader video_header;
   1393    video_header.frame_type = VideoFrameType::kVideoFrameDelta;
   1394    Timestamp capture_time = env_.clock().CurrentTime();
   1395    EXPECT_TRUE(rtp_sender_video.SendVideo(
   1396        kPayloadType, kCodecType,
   1397        capture_time.ms() * kCaptureTimeMsToRtpTimestamp, capture_time,
   1398        kPayloadData, sizeof(kPayloadData), video_header,
   1399        kDefaultExpectedRetransmissionTime, {}));
   1400 
   1401    time_controller_.AdvanceTime(TimeDelta::Millis(33));
   1402  }
   1403 }
   1404 
   1405 }  // namespace webrtc