| Index: webrtc/modules/pacing/packet_router_unittest.cc
|
| diff --git a/webrtc/modules/pacing/packet_router_unittest.cc b/webrtc/modules/pacing/packet_router_unittest.cc
|
| index be28bf1dbe65bb705036d96a25a5eb6a7058832b..28fea1ddc4b9ffb3a4c2ed23ddb40755a47c254f 100644
|
| --- a/webrtc/modules/pacing/packet_router_unittest.cc
|
| +++ b/webrtc/modules/pacing/packet_router_unittest.cc
|
| @@ -12,6 +12,7 @@
|
| #include <memory>
|
|
|
| #include "webrtc/base/checks.h"
|
| +#include "webrtc/base/fakeclock.h"
|
| #include "webrtc/modules/pacing/packet_router.h"
|
| #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
|
| #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
|
| @@ -242,18 +243,237 @@ TEST_F(PacketRouterTest, AllocateSequenceNumbers) {
|
| }
|
| }
|
|
|
| -TEST_F(PacketRouterTest, SendFeedback) {
|
| +TEST_F(PacketRouterTest, SendTransportFeedback) {
|
| MockRtpRtcp rtp_1;
|
| MockRtpRtcp rtp_2;
|
| packet_router_->AddSendRtpModule(&rtp_1);
|
| packet_router_->AddReceiveRtpModule(&rtp_2);
|
|
|
| rtcp::TransportFeedback feedback;
|
| - EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1);
|
| - packet_router_->SendFeedback(&feedback);
|
| + EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
|
| + packet_router_->SendTransportFeedback(&feedback);
|
| packet_router_->RemoveSendRtpModule(&rtp_1);
|
| - EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1);
|
| - packet_router_->SendFeedback(&feedback);
|
| + EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
|
| + packet_router_->SendTransportFeedback(&feedback);
|
| packet_router_->RemoveReceiveRtpModule(&rtp_2);
|
| }
|
| +
|
| +TEST(PacketRouterRembTest, PreferSendModuleOverReceiveModule) {
|
| + rtc::ScopedFakeClock clock;
|
| + MockRtpRtcp rtp_recv;
|
| + MockRtpRtcp rtp_send;
|
| + PacketRouter packet_router;
|
| +
|
| + EXPECT_CALL(rtp_recv, SetREMBStatus(true)).Times(1);
|
| + packet_router.AddReceiveRtpModule(&rtp_recv);
|
| +
|
| + const uint32_t bitrate_estimate = 456;
|
| + const std::vector<uint32_t> ssrcs = {1234};
|
| +
|
| + ON_CALL(rtp_recv, REMB()).WillByDefault(Return(true));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Call OnReceiveBitrateChanged twice to get a first estimate.
|
| + clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
|
| + EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Add a send module, which should be preferred over the receive module.
|
| + EXPECT_CALL(rtp_recv, SetREMBStatus(false)).Times(1);
|
| + EXPECT_CALL(rtp_send, SetREMBStatus(true)).Times(1);
|
| + packet_router.AddSendRtpModule(&rtp_send);
|
| + ON_CALL(rtp_recv, REMB()).WillByDefault(Return(false));
|
| + ON_CALL(rtp_send, REMB()).WillByDefault(Return(true));
|
| +
|
| + // Lower bitrate to send another REMB packet.
|
| + EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
|
| +
|
| + EXPECT_CALL(rtp_send, SetREMBStatus(false)).Times(1);
|
| + EXPECT_CALL(rtp_recv, SetREMBStatus(true)).Times(1);
|
| + packet_router.RemoveSendRtpModule(&rtp_send);
|
| + EXPECT_CALL(rtp_recv, SetREMBStatus(false)).Times(1);
|
| + packet_router.RemoveReceiveRtpModule(&rtp_recv);
|
| +}
|
| +
|
| +TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
|
| + rtc::ScopedFakeClock clock;
|
| + MockRtpRtcp rtp;
|
| + PacketRouter packet_router;
|
| +
|
| + EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1);
|
| + packet_router.AddSendRtpModule(&rtp);
|
| +
|
| + uint32_t bitrate_estimate = 456;
|
| + const std::vector<uint32_t> ssrcs = {1234};
|
| +
|
| + ON_CALL(rtp, REMB()).WillByDefault(Return(true));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Call OnReceiveBitrateChanged twice to get a first estimate.
|
| + clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Lower the estimate with more than 3% to trigger a call to SetREMBData right
|
| + // away.
|
| + bitrate_estimate = bitrate_estimate - 100;
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1);
|
| + packet_router.RemoveSendRtpModule(&rtp);
|
| +}
|
| +
|
| +TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
|
| + rtc::ScopedFakeClock clock;
|
| + MockRtpRtcp rtp;
|
| + PacketRouter packet_router;
|
| + packet_router.AddSendRtpModule(&rtp);
|
| +
|
| + uint32_t bitrate_estimate[] = {456, 789};
|
| + std::vector<uint32_t> ssrcs = {1234, 5678};
|
| +
|
| + ON_CALL(rtp, REMB()).WillByDefault(Return(true));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
|
| +
|
| + // Call OnReceiveBitrateChanged twice to get a first estimate.
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[0], ssrcs)).Times(1);
|
| + clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
|
| +
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
|
| +
|
| + // Lower the estimate to trigger a callback.
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[1], ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
|
| +
|
| + packet_router.RemoveSendRtpModule(&rtp);
|
| +}
|
| +
|
| +TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
|
| + rtc::ScopedFakeClock clock;
|
| + MockRtpRtcp rtp;
|
| + PacketRouter packet_router;
|
| + packet_router.AddSendRtpModule(&rtp);
|
| +
|
| + uint32_t bitrate_estimate = 456;
|
| + std::vector<uint32_t> ssrcs = {1234, 5678};
|
| +
|
| + ON_CALL(rtp, REMB()).WillByDefault(Return(true));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Call OnReceiveBitrateChanged twice to get a first estimate.
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Increased estimate shouldn't trigger a callback right away.
|
| + EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
|
| +
|
| + // Decreasing the estimate less than 3% shouldn't trigger a new callback.
|
| + EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
|
| + int lower_estimate = bitrate_estimate * 98 / 100;
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
|
| +
|
| + packet_router.RemoveSendRtpModule(&rtp);
|
| +}
|
| +
|
| +TEST(PacketRouterRembTest, ChangeSendRtpModule) {
|
| + rtc::ScopedFakeClock clock;
|
| + MockRtpRtcp rtp_send;
|
| + MockRtpRtcp rtp_recv;
|
| + PacketRouter packet_router;
|
| + packet_router.AddSendRtpModule(&rtp_send);
|
| + packet_router.AddReceiveRtpModule(&rtp_recv);
|
| +
|
| + uint32_t bitrate_estimate = 456;
|
| + std::vector<uint32_t> ssrcs = {1234, 5678};
|
| +
|
| + ON_CALL(rtp_send, REMB()).WillByDefault(Return(true));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Call OnReceiveBitrateChanged twice to get a first estimate.
|
| + clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
|
| + EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Decrease estimate to trigger a REMB.
|
| + bitrate_estimate = bitrate_estimate - 100;
|
| + EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Remove the sending module -> should get remb on the second module.
|
| + packet_router.RemoveSendRtpModule(&rtp_send);
|
| +
|
| + ON_CALL(rtp_send, REMB()).WillByDefault(Return(false));
|
| + ON_CALL(rtp_recv, REMB()).WillByDefault(Return(true));
|
| +
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + bitrate_estimate = bitrate_estimate - 100;
|
| + EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + packet_router.RemoveReceiveRtpModule(&rtp_recv);
|
| +}
|
| +
|
| +TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
|
| + rtc::ScopedFakeClock clock;
|
| + MockRtpRtcp rtp;
|
| + PacketRouter packet_router;
|
| + packet_router.AddSendRtpModule(&rtp);
|
| +
|
| + uint32_t bitrate_estimate = 456;
|
| + const std::vector<uint32_t> ssrcs = {1234};
|
| +
|
| + ON_CALL(rtp, REMB()).WillByDefault(Return(true));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Call OnReceiveBitrateChanged twice to get a first estimate.
|
| + clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
|
| + EXPECT_CALL(rtp, SetREMBData(_, _)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Lower the estimate, should trigger a call to SetREMBData right away.
|
| + bitrate_estimate = bitrate_estimate - 100;
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
|
| + EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| + packet_router.RemoveSendRtpModule(&rtp);
|
| +}
|
| +
|
| +// Only register receiving modules and make sure we fallback to trigger a REMB
|
| +// packet on this one.
|
| +TEST(PacketRouterRembTest, NoSendingRtpModule) {
|
| + rtc::ScopedFakeClock clock;
|
| + MockRtpRtcp rtp;
|
| + PacketRouter packet_router;
|
| +
|
| + EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1);
|
| + packet_router.AddReceiveRtpModule(&rtp);
|
| +
|
| + uint32_t bitrate_estimate = 456;
|
| + const std::vector<uint32_t> ssrcs = {1234};
|
| +
|
| + ON_CALL(rtp, REMB()).WillByDefault(Return(true));
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Call OnReceiveBitrateChanged twice to get a first estimate.
|
| + clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
|
| +
|
| + // Lower the estimate to trigger a new packet REMB packet.
|
| + EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1);
|
| + packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
|
| +
|
| + EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1);
|
| + packet_router.RemoveReceiveRtpModule(&rtp);
|
| +}
|
| +
|
| } // namespace webrtc
|
|
|