From 726b0e824ba8b0f8d1b1381561da9027208f7c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Mon, 17 May 2021 15:29:29 +0200 Subject: [PATCH] Refactor RtpSenderTest.TrafficSmoothingW* tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduce to testing what RTPSender is actually interested in: that packets are actually forwarded to the pacer. Partially the old test was verifying TransmissionOffset header extension, add an explicit test for that at RtpRtcp-level instead. Bug: webrtc:11340 Change-Id: I62be39e1d9d8c214c3277f4f1326db05b937674a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/218845 Commit-Queue: Erik Språng Reviewed-by: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#34023} --- .../source/rtp_rtcp_impl2_unittest.cc | 112 ++++++++++-------- .../rtp_rtcp/source/rtp_sender_unittest.cc | 112 +++--------------- 2 files changed, 78 insertions(+), 146 deletions(-) diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc index 8ea87c5d88..d38a7ffe18 100644 --- a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc @@ -51,11 +51,13 @@ const uint16_t kSequenceNumber = 100; const uint8_t kPayloadType = 100; const int kWidth = 320; const int kHeight = 100; +const int kCaptureTimeMsToRtpTimestamp = 90; // 90 kHz clock. // RTP header extension ids. enum : int { kAbsoluteSendTimeExtensionId = 1, kTransportSequenceNumberExtensionId, + kTransmissionOffsetExtensionId, }; class RtcpRttStatsTestImpl : public RtcpRttStats { @@ -297,10 +299,20 @@ class RtpRtcpImpl2Test : public ::testing::TestWithParam { std::unique_ptr sender_video_; RtpRtcpModule receiver_; + bool SendFrame(const RtpRtcpModule* module, + RTPSenderVideo* sender, + uint8_t tid) { + int64_t now_ms = time_controller_.GetClock()->TimeInMilliseconds(); + return SendFrame( + module, sender, tid, + static_cast(now_ms * kCaptureTimeMsToRtpTimestamp), now_ms); + } + bool SendFrame(const RtpRtcpModule* module, RTPSenderVideo* sender, uint8_t tid, - uint32_t rtp_timestamp) { + uint32_t rtp_timestamp, + int64_t capture_time_ms) { RTPVideoHeaderVP8 vp8_header = {}; vp8_header.temporalIdx = tid; RTPVideoHeader rtp_video_header; @@ -319,9 +331,9 @@ class RtpRtcpImpl2Test : public ::testing::TestWithParam { const uint8_t payload[100] = {0}; bool success = module->impl_->OnSendingRtpFrame(0, 0, kPayloadType, true); - success &= - sender->SendVideo(kPayloadType, VideoCodecType::kVideoCodecVP8, - rtp_timestamp, 0, payload, rtp_video_header, 0); + success &= sender->SendVideo(kPayloadType, VideoCodecType::kVideoCodecVP8, + rtp_timestamp, capture_time_ms, payload, + rtp_video_header, 0); return success; } @@ -342,12 +354,12 @@ class RtpRtcpImpl2Test : public ::testing::TestWithParam { TEST_P(RtpRtcpImpl2Test, RetransmitsAllLayers) { // Send frames. EXPECT_EQ(0, sender_.RtpSent()); - 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_TRUE(SendFrame(&sender_, sender_video_.get(), + kBaseLayerTid)); // kSequenceNumber + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), + kHigherLayerTid)); // kSequenceNumber + 1 + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), + kNoTemporalIdx)); // kSequenceNumber + 2 EXPECT_EQ(3, sender_.RtpSent()); EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber()); @@ -377,8 +389,7 @@ TEST_P(RtpRtcpImpl2Test, Rtt) { receiver_.receive_statistics_->OnRtpPacket(packet); // Send Frame before sending an SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); // Sender module should send an SR. EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport)); @@ -419,8 +430,7 @@ TEST_P(RtpRtcpImpl2Test, RttForReceiverOnly) { // Sender module should send a response to the last received RTRR (DLRR). AdvanceTimeMs(1000); // Send Frame before sending a SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport)); // Verify RTT. @@ -449,8 +459,7 @@ TEST_P(RtpRtcpImpl2Test, NoSrBeforeMedia) { EXPECT_EQ(-1, sender_.RtcpSent().first_packet_time_ms); EXPECT_EQ(receiver_.RtcpSent().first_packet_time_ms, current_time); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); EXPECT_EQ(sender_.RtcpSent().first_packet_time_ms, current_time); } @@ -521,8 +530,7 @@ TEST_P(RtpRtcpImpl2Test, SendsInitialNackList) { uint16_t nack_list[kNackLength] = {123}; EXPECT_EQ(0U, sender_.RtcpSent().nack_packets); // Send Frame before sending a compound RTCP that starts with SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123)); @@ -534,8 +542,7 @@ TEST_P(RtpRtcpImpl2Test, SendsExtendedNackList) { uint16_t nack_list[kNackLength] = {123}; EXPECT_EQ(0U, sender_.RtcpSent().nack_packets); // Send Frame before sending a compound RTCP that starts with SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123)); @@ -560,8 +567,7 @@ TEST_P(RtpRtcpImpl2Test, ReSendsNackListAfterRttMs) { 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. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125)); @@ -626,8 +632,7 @@ TEST_P(RtpRtcpImpl2Test, ConfigurableRtcpReportInterval) { sender_.SetRtcpReportIntervalAndReset(kVideoReportInterval); SetUp(); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); // Initial state sender_.impl_->Process(); @@ -646,8 +651,7 @@ TEST_P(RtpRtcpImpl2Test, ConfigurableRtcpReportInterval) { EXPECT_GT(sender_.RtcpSent().first_packet_time_ms, -1); EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); // Move ahead to the last possible second before second rtcp is expected. AdvanceTimeMs(kVideoReportInterval * 1 / 2 - 1); @@ -739,8 +743,7 @@ TEST_P(RtpRtcpImpl2Test, SenderReportStatsNotAvailable) { // Checks that the sender report stats are available if an RTCP SR was sent. TEST_P(RtpRtcpImpl2Test, SenderReportStatsAvailable) { // Send a frame in order to send an SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); // Send an SR. ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0)); EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Not(Eq(absl::nullopt))); @@ -790,8 +793,7 @@ TEST_P(RtpRtcpImpl2Test, SenderReportStatsCheckStatsFromLastReport) { TEST_P(RtpRtcpImpl2Test, SenderReportStatsCount) { using SenderReportStats = RtpRtcpInterface::SenderReportStats; // Send a frame in order to send an SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); // Send the first SR. ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0)); EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), @@ -806,8 +808,7 @@ TEST_P(RtpRtcpImpl2Test, SenderReportStatsCount) { // SR was sent. TEST_P(RtpRtcpImpl2Test, SenderReportStatsArrivalTimestampSet) { // Send a frame in order to send an SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); // Send an SR. ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0)); auto stats = receiver_.impl_->GetSenderReportStats(); @@ -820,8 +821,7 @@ TEST_P(RtpRtcpImpl2Test, SenderReportStatsArrivalTimestampSet) { TEST_P(RtpRtcpImpl2Test, SenderReportStatsPacketByteCounters) { using SenderReportStats = RtpRtcpInterface::SenderReportStats; // Send a frame in order to send an SR. - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Gt(0)); // Advance time otherwise the RTCP SR report will not include any packets // generated by `SendFrame()`. @@ -835,8 +835,7 @@ TEST_P(RtpRtcpImpl2Test, SenderReportStatsPacketByteCounters) { TEST_P(RtpRtcpImpl2Test, SendingVideoAdvancesSequenceNumber) { const uint16_t sequence_number = sender_.impl_->SequenceNumber(); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Gt(0)); EXPECT_EQ(sequence_number + 1, sender_.impl_->SequenceNumber()); } @@ -844,8 +843,7 @@ TEST_P(RtpRtcpImpl2Test, SendingVideoAdvancesSequenceNumber) { 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)); + EXPECT_FALSE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Eq(0)); EXPECT_EQ(sequence_number, sender_.impl_->SequenceNumber()); } @@ -856,8 +854,7 @@ TEST_P(RtpRtcpImpl2Test, PaddingNotAllowedInMiddleOfFrame) { // Can't send padding before media. EXPECT_THAT(sender_.impl_->GeneratePadding(kPaddingSize), SizeIs(0u)); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); // Padding is now ok. EXPECT_THAT(sender_.impl_->GeneratePadding(kPaddingSize), SizeIs(Gt(0u))); @@ -890,10 +887,10 @@ TEST_P(RtpRtcpImpl2Test, PaddingNotAllowedInMiddleOfFrame) { TEST_P(RtpRtcpImpl2Test, PaddingTimestampMatchesMedia) { constexpr size_t kPaddingSize = 100; - uint32_t kTimestamp = 123; + const uint32_t kTimestamp = 123; - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, kTimestamp)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, + kTimestamp, /*capture_time_ms=*/0)); EXPECT_EQ(sender_.last_packet().Timestamp(), kTimestamp); uint16_t media_seq = sender_.last_packet().SequenceNumber(); @@ -913,14 +910,12 @@ TEST_P(RtpRtcpImpl2Test, AssignsTransportSequenceNumber) { sender_.RegisterHeaderExtension(TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); uint16_t first_transport_seq = 0; EXPECT_TRUE(sender_.last_packet().GetExtension( &first_transport_seq)); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); uint16_t second_transport_seq = 0; EXPECT_TRUE(sender_.last_packet().GetExtension( &second_transport_seq)); @@ -932,18 +927,31 @@ TEST_P(RtpRtcpImpl2Test, AssignsAbsoluteSendTime) { sender_.RegisterHeaderExtension(AbsoluteSendTime::kUri, kAbsoluteSendTimeExtensionId); - EXPECT_TRUE( - SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); EXPECT_NE(sender_.last_packet().GetExtension(), 0u); } +TEST_P(RtpRtcpImpl2Test, AssignsTransmissionTimeOffset) { + sender_.RegisterHeaderExtension(TransmissionOffset::kUri, + kTransmissionOffsetExtensionId); + + constexpr int kOffsetMs = 100; + // Transmission offset is calculated from difference between capture time + // and send time. + int64_t capture_time_ms = time_controller_.GetClock()->TimeInMilliseconds(); + time_controller_.AdvanceTime(TimeDelta::Millis(kOffsetMs)); + + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, + /*timestamp=*/0, capture_time_ms)); + EXPECT_EQ(sender_.last_packet().GetExtension(), + kOffsetMs * kCaptureTimeMsToRtpTimestamp); +} + TEST_P(RtpRtcpImpl2Test, PropagatesSentPacketInfo) { sender_.RegisterHeaderExtension(TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId); int64_t now_ms = time_controller_.GetClock()->TimeInMilliseconds(); - const int kCaptureTimeMsToRtpTimestamp = 90; // 90 kHz clock - EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, - /*timestamp=*/kCaptureTimeMsToRtpTimestamp * now_ms)); + EXPECT_TRUE(SendFrame(&sender_, sender_video_.get(), kBaseLayerTid)); EXPECT_THAT( sender_.last_sent_packet(), Optional( diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc index ae4836851a..085f07e764 100644 --- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc @@ -93,10 +93,6 @@ using ::testing::Return; using ::testing::SizeIs; using ::testing::StrictMock; -uint64_t ConvertMsToAbsSendTime(int64_t time_ms) { - return (((time_ms << 18) + 500) / 1000) & 0x00ffffff; -} - class LoopbackTransportTest : public webrtc::Transport { public: LoopbackTransportTest() : total_bytes_sent_(0) { @@ -544,109 +540,37 @@ TEST_P(RtpSenderTest, PaddingAlwaysAllowedOnAudio) { EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5)); } -TEST_P(RtpSenderTest, TrafficSmoothingWithExtensions) { - EXPECT_CALL(mock_rtc_event_log_, - LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing))); +TEST_P(RtpSenderTest, SendToNetworkForwardsPacketsToPacer) { + auto packet = BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, 0); + int64_t now_ms = clock_->TimeInMilliseconds(); - rtp_sender_context_->packet_history_.SetStorePacketsStatus( - RtpPacketHistory::StorageMode::kStoreAndCull, 10); - EXPECT_TRUE(rtp_sender()->RegisterRtpHeaderExtension( - TransmissionOffset::kUri, kTransmissionTimeOffsetExtensionId)); - EXPECT_TRUE(rtp_sender()->RegisterRtpHeaderExtension( - AbsoluteSendTime::kUri, kAbsoluteSendTimeExtensionId)); - int64_t capture_time_ms = clock_->TimeInMilliseconds(); - auto packet = - BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); - size_t packet_size = packet->size(); - - const int kStoredTimeInMs = 100; EXPECT_CALL( mock_paced_sender_, EnqueuePackets(Contains(AllOf( Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)), - Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))))); - packet->set_packet_type(RtpPacketMediaType::kVideo); - packet->set_allow_retransmission(true); + Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)), + Pointee(Property(&RtpPacketToSend::capture_time_ms, now_ms)))))); EXPECT_TRUE( rtp_sender()->SendToNetwork(std::make_unique(*packet))); - EXPECT_EQ(0, transport_.packets_sent()); - time_controller_.AdvanceTime(TimeDelta::Millis(kStoredTimeInMs)); - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); - - // Process send bucket. Packet should now be sent. - EXPECT_EQ(1, transport_.packets_sent()); - EXPECT_EQ(packet_size, transport_.last_sent_packet().size()); - - webrtc::RTPHeader rtp_header; - transport_.last_sent_packet().GetHeader(&rtp_header); - - // Verify transmission time offset. - EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); - uint64_t expected_send_time = - ConvertMsToAbsSendTime(clock_->TimeInMilliseconds()); - EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); } -TEST_P(RtpSenderTest, TrafficSmoothingRetransmits) { - EXPECT_CALL(mock_rtc_event_log_, - LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing))); - +TEST_P(RtpSenderTest, ReSendPacketForwardsPacketsToPacer) { rtp_sender_context_->packet_history_.SetStorePacketsStatus( RtpPacketHistory::StorageMode::kStoreAndCull, 10); - EXPECT_TRUE(rtp_sender()->RegisterRtpHeaderExtension( - TransmissionOffset::kUri, kTransmissionTimeOffsetExtensionId)); - EXPECT_TRUE(rtp_sender()->RegisterRtpHeaderExtension( - AbsoluteSendTime::kUri, kAbsoluteSendTimeExtensionId)); - int64_t capture_time_ms = clock_->TimeInMilliseconds(); - auto packet = - BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); - size_t packet_size = packet->size(); - - // Packet should be stored in a send bucket. - EXPECT_CALL( - mock_paced_sender_, - EnqueuePackets(Contains(AllOf( - Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)), - Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))))); - packet->set_packet_type(RtpPacketMediaType::kVideo); + int64_t now_ms = clock_->TimeInMilliseconds(); + auto packet = BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, now_ms); + uint16_t seq_no = packet->SequenceNumber(); packet->set_allow_retransmission(true); - EXPECT_TRUE( - rtp_sender()->SendToNetwork(std::make_unique(*packet))); - // Immediately process send bucket and send packet. - rtp_sender_context_->InjectPacket(std::make_unique(*packet), - PacedPacketInfo()); + rtp_sender_context_->packet_history_.PutRtpPacket(std::move(packet), now_ms); - EXPECT_EQ(1, transport_.packets_sent()); - - // Retransmit packet. - const int kStoredTimeInMs = 100; - time_controller_.AdvanceTime(TimeDelta::Millis(kStoredTimeInMs)); - - EXPECT_CALL(mock_rtc_event_log_, - LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing))); - packet->set_packet_type(RtpPacketMediaType::kRetransmission); - packet->set_retransmitted_sequence_number(kSeqNum); - EXPECT_CALL( - mock_paced_sender_, - EnqueuePackets(Contains(AllOf( - Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)), - Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))))); - EXPECT_EQ(static_cast(packet_size), rtp_sender()->ReSendPacket(kSeqNum)); - EXPECT_EQ(1, transport_.packets_sent()); - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); - - // Process send bucket. Packet should now be sent. - EXPECT_EQ(2, transport_.packets_sent()); - EXPECT_EQ(packet_size, transport_.last_sent_packet().size()); - - webrtc::RTPHeader rtp_header; - transport_.last_sent_packet().GetHeader(&rtp_header); - - // Verify transmission time offset. - EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); - uint64_t expected_send_time = - ConvertMsToAbsSendTime(clock_->TimeInMilliseconds()); - EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); + EXPECT_CALL(mock_paced_sender_, + EnqueuePackets(Contains(AllOf( + Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)), + Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)), + Pointee(Property(&RtpPacketToSend::capture_time_ms, now_ms)), + Pointee(Property(&RtpPacketToSend::packet_type, + RtpPacketMediaType::kRetransmission)))))); + EXPECT_TRUE(rtp_sender()->ReSendPacket(seq_no)); } // This test sends 1 regular video packet, then 4 padding packets, and then