diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc index bd96f63583..b33dcd9605 100644 --- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc @@ -393,7 +393,7 @@ class RtpSenderTest : public ::testing::TestWithParam { for (auto& packet : rtp_sender()->GeneratePadding(target_size_bytes, true)) { generated_bytes += packet->payload_size() + packet->padding_size(); - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); + rtp_sender()->SendToNetwork(std::move(packet)); } return generated_bytes; } @@ -498,14 +498,23 @@ TEST_P(RtpSenderTest, PaddingAlwaysAllowedOnAudio) { rtp_sender()->AssignSequenceNumber(audio_packet.get()); const size_t kPaddingSize = 59; - EXPECT_CALL(transport, SendRtp(_, kPaddingSize + kRtpHeaderSize, _)) - .WillOnce(Return(true)); + + EXPECT_CALL( + mock_paced_sender_, + EnqueuePackets(ElementsAre(AllOf( + Pointee(Property(&RtpPacketToSend::packet_type, + RtpPacketMediaType::kPadding)), + Pointee(Property(&RtpPacketToSend::padding_size, kPaddingSize)))))); EXPECT_EQ(kPaddingSize, GenerateAndSendPadding(kPaddingSize)); // Requested padding size is too small, will send a larger one. const size_t kMinPaddingSize = 50; - EXPECT_CALL(transport, SendRtp(_, kMinPaddingSize + kRtpHeaderSize, _)) - .WillOnce(Return(true)); + EXPECT_CALL(mock_paced_sender_, + EnqueuePackets(ElementsAre( + AllOf(Pointee(Property(&RtpPacketToSend::packet_type, + RtpPacketMediaType::kPadding)), + Pointee(Property(&RtpPacketToSend::padding_size, + kMinPaddingSize)))))); EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5)); } @@ -515,7 +524,7 @@ TEST_P(RtpSenderTest, SendToNetworkForwardsPacketsToPacer) { EXPECT_CALL( mock_paced_sender_, - EnqueuePackets(Contains(AllOf( + EnqueuePackets(ElementsAre(AllOf( Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)), Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)), Pointee(Property(&RtpPacketToSend::capture_time_ms, now_ms)))))); @@ -533,7 +542,7 @@ TEST_P(RtpSenderTest, ReSendPacketForwardsPacketsToPacer) { rtp_sender_context_->packet_history_.PutRtpPacket(std::move(packet), now_ms); EXPECT_CALL(mock_paced_sender_, - EnqueuePackets(Contains(AllOf( + EnqueuePackets(ElementsAre(AllOf( Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)), Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)), Pointee(Property(&RtpPacketToSend::capture_time_ms, now_ms)), @@ -560,7 +569,7 @@ TEST_P(RtpSenderTest, SendPadding) { // number range. Size will be forced to full pack size and the timestamp // shall be that of the last media packet. EXPECT_CALL(mock_paced_sender_, - EnqueuePackets(Contains(AllOf( + EnqueuePackets(ElementsAre(AllOf( Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)), Pointee(Property(&RtpPacketToSend::SequenceNumber, media_packet->SequenceNumber() + i + 1)), @@ -577,7 +586,7 @@ TEST_P(RtpSenderTest, SendPadding) { // Send a regular video packet again. EXPECT_CALL(mock_paced_sender_, - EnqueuePackets(Contains(AllOf( + EnqueuePackets(ElementsAre(AllOf( Pointee(Property( &RtpPacketToSend::SequenceNumber, media_packet->SequenceNumber() + kNumPaddingPackets + 1)), @@ -644,7 +653,7 @@ TEST_P(RtpSenderTest, UpdatesTimestampsOnPlainRtxPadding) { // Start by sending one media packet. EXPECT_CALL( mock_paced_sender_, - EnqueuePackets(Contains(AllOf( + EnqueuePackets(ElementsAre(AllOf( Pointee(Property(&RtpPacketToSend::padding_size, 0u)), Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)), Pointee(Property(&RtpPacketToSend::capture_time_ms, start_time)))))); @@ -681,7 +690,7 @@ TEST_P(RtpSenderTest, KeepsTimestampsOnPayloadPadding) { // Start by sending one media packet and putting in the packet history. EXPECT_CALL( mock_paced_sender_, - EnqueuePackets(Contains(AllOf( + EnqueuePackets(ElementsAre(AllOf( Pointee(Property(&RtpPacketToSend::padding_size, 0u)), Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)), Pointee(Property(&RtpPacketToSend::capture_time_ms, start_time)))))); @@ -981,7 +990,7 @@ TEST_P(RtpSenderTest, MidAndRridNotIncludedOnRtxPacketsAfterRtpStateRestored) { ASSERT_LT(0, rtp_sender()->ReSendPacket(built_packet->SequenceNumber())); } -TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) { +TEST_P(RtpSenderTest, RespectsNackBitrateLimit) { const int32_t kPacketSize = 1400; const int32_t kNumPackets = 30; @@ -994,24 +1003,38 @@ TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) { for (int32_t i = 0; i < kNumPackets; ++i) { sequence_numbers.push_back(kStartSequenceNumber + i); time_controller_.AdvanceTime(TimeDelta::Millis(1)); + EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1))) + .WillOnce([&](std::vector> packets) { + rtp_sender_context_->packet_history_.PutRtpPacket( + std::move(packets[0]), clock_->TimeInMilliseconds()); + }); SendPacket(clock_->TimeInMilliseconds(), kPacketSize); } - EXPECT_EQ(kNumPackets, transport_.packets_sent()); time_controller_.AdvanceTime(TimeDelta::Millis(1000 - kNumPackets)); // Resending should work - brings the bandwidth up to the limit. // NACK bitrate is capped to the same bitrate as the encoder, since the max // protection overhead is 50% (see MediaOptimization::SetTargetRates). + EXPECT_CALL(mock_paced_sender_, EnqueuePackets(ElementsAre(Pointee(Property( + &RtpPacketToSend::packet_type, + RtpPacketMediaType::kRetransmission))))) + .Times(kNumPackets) + .WillRepeatedly( + [&](std::vector> packets) { + for (const auto& packet : packets) { + rtp_sender_context_->packet_history_.MarkPacketAsSent( + *packet->retransmitted_sequence_number()); + } + }); rtp_sender()->OnReceivedNack(sequence_numbers, 0); - EXPECT_EQ(kNumPackets * 2, transport_.packets_sent()); // Must be at least 5ms in between retransmission attempts. time_controller_.AdvanceTime(TimeDelta::Millis(5)); // Resending should not work, bandwidth exceeded. + EXPECT_CALL(mock_paced_sender_, EnqueuePackets).Times(0); rtp_sender()->OnReceivedNack(sequence_numbers, 0); - EXPECT_EQ(kNumPackets * 2, transport_.packets_sent()); } TEST_P(RtpSenderTest, UpdatingCsrcsUpdatedOverhead) { @@ -1163,11 +1186,7 @@ TEST_P(RtpSenderTest, MarksRetransmittedPackets) { TEST_P(RtpSenderTest, GeneratedPaddingHasBweExtensions) { // Min requested size in order to use RTX payload. const size_t kMinPaddingSize = 50; - - rtp_sender()->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); - rtp_sender()->SetRtxPayloadType(kRtxPayload, kPayload); - rtp_sender_context_->packet_history_.SetStorePacketsStatus( - RtpPacketHistory::StorageMode::kStoreAndCull, 1); + EnableRtx(); ASSERT_TRUE(rtp_sender()->RegisterRtpHeaderExtension( TransmissionOffset::kUri, kTransmissionTimeOffsetExtensionId)); @@ -1176,15 +1195,14 @@ TEST_P(RtpSenderTest, GeneratedPaddingHasBweExtensions) { ASSERT_TRUE(rtp_sender()->RegisterRtpHeaderExtension( TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId)); - // Send a payload packet first, to enable padding and populate the packet - // history. + // Put a packet in the history, in order to facilitate payload padding. std::unique_ptr packet = BuildRtpPacket(kPayload, true, 0, clock_->TimeInMilliseconds()); packet->set_allow_retransmission(true); packet->SetPayloadSize(kMinPaddingSize); packet->set_packet_type(RtpPacketMediaType::kVideo); - EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1); - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); + rtp_sender_context_->packet_history_.PutRtpPacket( + std::move(packet), clock_->TimeInMilliseconds()); // Generate a plain padding packet, check that extensions are registered. std::vector> generated_packets = @@ -1195,19 +1213,7 @@ TEST_P(RtpSenderTest, GeneratedPaddingHasBweExtensions) { EXPECT_TRUE(plain_padding->HasExtension()); EXPECT_TRUE(plain_padding->HasExtension()); EXPECT_TRUE(plain_padding->HasExtension()); - - // Verify all header extensions have been written. - rtp_sender_context_->InjectPacket(std::move(plain_padding), - PacedPacketInfo()); - const auto& sent_plain_padding = transport_.last_sent_packet(); - EXPECT_TRUE(sent_plain_padding.HasExtension()); - EXPECT_TRUE(sent_plain_padding.HasExtension()); - EXPECT_TRUE(sent_plain_padding.HasExtension()); - webrtc::RTPHeader rtp_header; - sent_plain_padding.GetHeader(&rtp_header); - EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); - EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); - EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); + EXPECT_GT(plain_padding->padding_size(), 0u); // Generate a payload padding packets, check that extensions are registered. generated_packets = rtp_sender()->GeneratePadding(kMinPaddingSize, true); @@ -1217,18 +1223,7 @@ TEST_P(RtpSenderTest, GeneratedPaddingHasBweExtensions) { EXPECT_TRUE(payload_padding->HasExtension()); EXPECT_TRUE(payload_padding->HasExtension()); EXPECT_TRUE(payload_padding->HasExtension()); - - // Verify all header extensions have been written. - rtp_sender_context_->InjectPacket(std::move(payload_padding), - PacedPacketInfo()); - const auto& sent_payload_padding = transport_.last_sent_packet(); - EXPECT_TRUE(sent_payload_padding.HasExtension()); - EXPECT_TRUE(sent_payload_padding.HasExtension()); - EXPECT_TRUE(sent_payload_padding.HasExtension()); - sent_payload_padding.GetHeader(&rtp_header); - EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); - EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); - EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); + EXPECT_GT(payload_padding->payload_size(), 0u); } TEST_P(RtpSenderTest, GeneratePaddingResendsOldPacketsWithRtx) { @@ -1249,10 +1244,8 @@ TEST_P(RtpSenderTest, GeneratePaddingResendsOldPacketsWithRtx) { packet->set_allow_retransmission(true); packet->SetPayloadSize(kPayloadPacketSize); packet->set_packet_type(RtpPacketMediaType::kVideo); - - // Send a dummy video packet so it ends up in the packet history. - EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1); - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); + rtp_sender_context_->packet_history_.PutRtpPacket( + std::move(packet), clock_->TimeInMilliseconds()); // Generated padding has large enough budget that the video packet should be // retransmitted as padding. @@ -1303,8 +1296,8 @@ TEST_P(RtpSenderTest, LimitsPayloadPaddingSize) { packet->set_allow_retransmission(true); packet->SetPayloadSize(kPayloadPacketSize); packet->set_packet_type(RtpPacketMediaType::kVideo); - EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1); - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); + rtp_sender_context_->packet_history_.PutRtpPacket( + std::move(packet), clock_->TimeInMilliseconds()); // Smallest target size that will result in the sent packet being returned as // padding. @@ -1344,8 +1337,8 @@ TEST_P(RtpSenderTest, GeneratePaddingCreatesPurePaddingWithoutRtx) { packet->set_allow_retransmission(true); packet->SetPayloadSize(kPayloadPacketSize); packet->set_packet_type(RtpPacketMediaType::kVideo); - EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1); - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); + rtp_sender_context_->packet_history_.PutRtpPacket( + std::move(packet), clock_->TimeInMilliseconds()); // Payload padding not available without RTX, only generate plain padding on // the media SSRC. @@ -1368,14 +1361,6 @@ TEST_P(RtpSenderTest, GeneratePaddingCreatesPurePaddingWithoutRtx) { EXPECT_TRUE(packet->HasExtension()); EXPECT_TRUE(packet->HasExtension()); EXPECT_TRUE(packet->HasExtension()); - - // Verify all header extensions are received. - rtp_sender_context_->InjectPacket(std::move(packet), PacedPacketInfo()); - webrtc::RTPHeader rtp_header; - transport_.last_sent_packet().GetHeader(&rtp_header); - EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); - EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); - EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); } EXPECT_EQ(padding_bytes_generated,