| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <list> | 11 #include <list> |
| 12 #include <memory> | 12 #include <memory> |
| 13 | 13 |
| 14 #include "webrtc/modules/pacing/paced_sender.h" | 14 #include "webrtc/modules/pacing/paced_sender.h" |
| 15 #include "webrtc/system_wrappers/include/clock.h" | 15 #include "webrtc/system_wrappers/include/clock.h" |
| 16 #include "webrtc/test/gmock.h" | 16 #include "webrtc/test/gmock.h" |
| 17 #include "webrtc/test/gtest.h" | 17 #include "webrtc/test/gtest.h" |
| 18 | 18 |
| 19 using testing::_; | 19 using testing::_; |
| 20 using testing::Return; | 20 using testing::Return; |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 constexpr unsigned kFirstClusterBps = 900000; | 23 constexpr unsigned kFirstClusterBps = 900000; |
| 24 constexpr int kFirstClusterCount = 6; | |
| 25 constexpr unsigned kSecondClusterBps = 1800000; | 24 constexpr unsigned kSecondClusterBps = 1800000; |
| 26 constexpr int kSecondClusterCount = 5; | |
| 27 | 25 |
| 28 // The error stems from truncating the time interval of probe packets to integer | 26 // The error stems from truncating the time interval of probe packets to integer |
| 29 // values. This results in probing slightly higher than the target bitrate. | 27 // values. This results in probing slightly higher than the target bitrate. |
| 30 // For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets. | 28 // For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets. |
| 31 constexpr int kBitrateProbingError = 150000; | 29 constexpr int kBitrateProbingError = 150000; |
| 32 } // namespace | 30 } // namespace |
| 33 | 31 |
| 34 namespace webrtc { | 32 namespace webrtc { |
| 35 namespace test { | 33 namespace test { |
| 36 | 34 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 int packets_sent_; | 96 int packets_sent_; |
| 99 int padding_sent_; | 97 int padding_sent_; |
| 100 }; | 98 }; |
| 101 | 99 |
| 102 class PacedSenderTest : public ::testing::Test { | 100 class PacedSenderTest : public ::testing::Test { |
| 103 protected: | 101 protected: |
| 104 PacedSenderTest() : clock_(123456) { | 102 PacedSenderTest() : clock_(123456) { |
| 105 srand(0); | 103 srand(0); |
| 106 // Need to initialize PacedSender after we initialize clock. | 104 // Need to initialize PacedSender after we initialize clock. |
| 107 send_bucket_.reset(new PacedSender(&clock_, &callback_)); | 105 send_bucket_.reset(new PacedSender(&clock_, &callback_)); |
| 108 send_bucket_->CreateProbeCluster(kFirstClusterBps, kFirstClusterCount); | 106 send_bucket_->CreateProbeCluster(kFirstClusterBps); |
| 109 send_bucket_->CreateProbeCluster(kSecondClusterBps, kSecondClusterCount); | 107 send_bucket_->CreateProbeCluster(kSecondClusterBps); |
| 110 // Default to bitrate probing disabled for testing purposes. Probing tests | 108 // Default to bitrate probing disabled for testing purposes. Probing tests |
| 111 // have to enable probing, either by creating a new PacedSender instance or | 109 // have to enable probing, either by creating a new PacedSender instance or |
| 112 // by calling SetProbingEnabled(true). | 110 // by calling SetProbingEnabled(true). |
| 113 send_bucket_->SetProbingEnabled(false); | 111 send_bucket_->SetProbingEnabled(false); |
| 114 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps); | 112 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps); |
| 115 | 113 |
| 116 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess()); | 114 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess()); |
| 117 } | 115 } |
| 118 | 116 |
| 119 void SendAndExpectPacket(PacedSender::Priority priority, | 117 void SendAndExpectPacket(PacedSender::Priority priority, |
| (...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 } | 797 } |
| 800 | 798 |
| 801 TEST_F(PacedSenderTest, ProbingWithInsertedPackets) { | 799 TEST_F(PacedSenderTest, ProbingWithInsertedPackets) { |
| 802 const size_t kPacketSize = 1200; | 800 const size_t kPacketSize = 1200; |
| 803 const int kInitialBitrateBps = 300000; | 801 const int kInitialBitrateBps = 300000; |
| 804 uint32_t ssrc = 12346; | 802 uint32_t ssrc = 12346; |
| 805 uint16_t sequence_number = 1234; | 803 uint16_t sequence_number = 1234; |
| 806 | 804 |
| 807 PacedSenderProbing packet_sender; | 805 PacedSenderProbing packet_sender; |
| 808 send_bucket_.reset(new PacedSender(&clock_, &packet_sender)); | 806 send_bucket_.reset(new PacedSender(&clock_, &packet_sender)); |
| 809 send_bucket_->CreateProbeCluster(kFirstClusterBps, kFirstClusterCount); | 807 send_bucket_->CreateProbeCluster(kFirstClusterBps); |
| 810 send_bucket_->CreateProbeCluster(kSecondClusterBps, kSecondClusterCount); | 808 send_bucket_->CreateProbeCluster(kSecondClusterBps); |
| 811 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps); | 809 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps); |
| 812 | 810 |
| 813 for (int i = 0; i < kFirstClusterCount + kSecondClusterCount; ++i) { | 811 for (int i = 0; i < 10; ++i) { |
| 814 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 812 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
| 815 sequence_number++, clock_.TimeInMilliseconds(), | 813 sequence_number++, clock_.TimeInMilliseconds(), |
| 816 kPacketSize, false); | 814 kPacketSize, false); |
| 817 } | 815 } |
| 818 | 816 |
| 819 int64_t start = clock_.TimeInMilliseconds(); | 817 int64_t start = clock_.TimeInMilliseconds(); |
| 820 while (packet_sender.packets_sent() < kFirstClusterCount) { | 818 while (packet_sender.packets_sent() < 5) { |
| 821 int time_until_process = send_bucket_->TimeUntilNextProcess(); | 819 int time_until_process = send_bucket_->TimeUntilNextProcess(); |
| 822 clock_.AdvanceTimeMilliseconds(time_until_process); | 820 clock_.AdvanceTimeMilliseconds(time_until_process); |
| 823 send_bucket_->Process(); | 821 send_bucket_->Process(); |
| 824 } | 822 } |
| 825 int packets_sent = packet_sender.packets_sent(); | 823 int packets_sent = packet_sender.packets_sent(); |
| 826 // Validate first cluster bitrate. Note that we have to account for number | 824 // Validate first cluster bitrate. Note that we have to account for number |
| 827 // of intervals and hence (packets_sent - 1) on the first cluster. | 825 // of intervals and hence (packets_sent - 1) on the first cluster. |
| 828 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 / | 826 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 / |
| 829 (clock_.TimeInMilliseconds() - start), | 827 (clock_.TimeInMilliseconds() - start), |
| 830 kFirstClusterBps, kBitrateProbingError); | 828 kFirstClusterBps, kBitrateProbingError); |
| 831 EXPECT_EQ(0, packet_sender.padding_sent()); | 829 EXPECT_EQ(0, packet_sender.padding_sent()); |
| 832 | 830 |
| 833 start = clock_.TimeInMilliseconds(); | 831 start = clock_.TimeInMilliseconds(); |
| 834 while (packet_sender.packets_sent() < | 832 while (packet_sender.packets_sent() < 10) { |
| 835 kFirstClusterCount + kSecondClusterCount) { | |
| 836 int time_until_process = send_bucket_->TimeUntilNextProcess(); | 833 int time_until_process = send_bucket_->TimeUntilNextProcess(); |
| 837 clock_.AdvanceTimeMilliseconds(time_until_process); | 834 clock_.AdvanceTimeMilliseconds(time_until_process); |
| 838 send_bucket_->Process(); | 835 send_bucket_->Process(); |
| 839 } | 836 } |
| 840 packets_sent = packet_sender.packets_sent() - packets_sent; | 837 packets_sent = packet_sender.packets_sent() - packets_sent; |
| 841 // Validate second cluster bitrate. | 838 // Validate second cluster bitrate. |
| 842 EXPECT_NEAR( | 839 EXPECT_NEAR( |
| 843 packets_sent * kPacketSize * 8000 / (clock_.TimeInMilliseconds() - start), | 840 packets_sent * kPacketSize * 8000 / (clock_.TimeInMilliseconds() - start), |
| 844 kSecondClusterBps, kBitrateProbingError); | 841 kSecondClusterBps, kBitrateProbingError); |
| 845 } | 842 } |
| 846 | 843 |
| 847 TEST_F(PacedSenderTest, ProbingWithPaddingSupport) { | 844 TEST_F(PacedSenderTest, ProbingWithPaddingSupport) { |
| 848 const size_t kPacketSize = 1200; | 845 const size_t kPacketSize = 1200; |
| 849 const int kInitialBitrateBps = 300000; | 846 const int kInitialBitrateBps = 300000; |
| 850 uint32_t ssrc = 12346; | 847 uint32_t ssrc = 12346; |
| 851 uint16_t sequence_number = 1234; | 848 uint16_t sequence_number = 1234; |
| 852 | 849 |
| 853 PacedSenderProbing packet_sender; | 850 PacedSenderProbing packet_sender; |
| 854 send_bucket_.reset(new PacedSender(&clock_, &packet_sender)); | 851 send_bucket_.reset(new PacedSender(&clock_, &packet_sender)); |
| 855 send_bucket_->CreateProbeCluster(kFirstClusterBps, kFirstClusterCount); | 852 send_bucket_->CreateProbeCluster(kFirstClusterBps); |
| 856 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps); | 853 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps); |
| 857 | 854 |
| 858 for (int i = 0; i < kFirstClusterCount - 2; ++i) { | 855 for (int i = 0; i < 3; ++i) { |
| 859 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 856 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
| 860 sequence_number++, clock_.TimeInMilliseconds(), | 857 sequence_number++, clock_.TimeInMilliseconds(), |
| 861 kPacketSize, false); | 858 kPacketSize, false); |
| 862 } | 859 } |
| 863 | 860 |
| 864 int64_t start = clock_.TimeInMilliseconds(); | 861 int64_t start = clock_.TimeInMilliseconds(); |
| 865 int process_count = 0; | 862 int process_count = 0; |
| 866 while (process_count < kFirstClusterCount) { | 863 while (process_count < 5) { |
| 867 int time_until_process = send_bucket_->TimeUntilNextProcess(); | 864 int time_until_process = send_bucket_->TimeUntilNextProcess(); |
| 868 clock_.AdvanceTimeMilliseconds(time_until_process); | 865 clock_.AdvanceTimeMilliseconds(time_until_process); |
| 869 send_bucket_->Process(); | 866 send_bucket_->Process(); |
| 870 ++process_count; | 867 ++process_count; |
| 871 } | 868 } |
| 872 int packets_sent = packet_sender.packets_sent(); | 869 int packets_sent = packet_sender.packets_sent(); |
| 873 int padding_sent = packet_sender.padding_sent(); | 870 int padding_sent = packet_sender.padding_sent(); |
| 874 EXPECT_GT(packets_sent, 0); | 871 EXPECT_GT(packets_sent, 0); |
| 875 EXPECT_GT(padding_sent, 0); | 872 EXPECT_GT(padding_sent, 0); |
| 876 // Note that the number of intervals here for kPacketSize is | 873 // Note that the number of intervals here for kPacketSize is |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1002 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs()); | 999 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs()); |
| 1003 } | 1000 } |
| 1004 | 1001 |
| 1005 TEST_F(PacedSenderTest, ProbeClusterId) { | 1002 TEST_F(PacedSenderTest, ProbeClusterId) { |
| 1006 uint32_t ssrc = 12346; | 1003 uint32_t ssrc = 12346; |
| 1007 uint16_t sequence_number = 1234; | 1004 uint16_t sequence_number = 1234; |
| 1008 const size_t kPacketSize = 1200; | 1005 const size_t kPacketSize = 1200; |
| 1009 | 1006 |
| 1010 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps); | 1007 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps); |
| 1011 send_bucket_->SetProbingEnabled(true); | 1008 send_bucket_->SetProbingEnabled(true); |
| 1012 for (int i = 0; i < 11; ++i) { | 1009 for (int i = 0; i < 10; ++i) { |
| 1013 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 1010 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
| 1014 sequence_number + i, clock_.TimeInMilliseconds(), | 1011 sequence_number + i, clock_.TimeInMilliseconds(), |
| 1015 kPacketSize, false); | 1012 kPacketSize, false); |
| 1016 } | 1013 } |
| 1017 | 1014 |
| 1018 // First probing cluster. | 1015 // First probing cluster. |
| 1019 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0)) | 1016 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0)) |
| 1020 .Times(6) | 1017 .Times(5) |
| 1021 .WillRepeatedly(Return(true)); | 1018 .WillRepeatedly(Return(true)); |
| 1022 for (int i = 0; i < 6; ++i) { | 1019 for (int i = 0; i < 5; ++i) { |
| 1023 clock_.AdvanceTimeMilliseconds(20); | 1020 clock_.AdvanceTimeMilliseconds(20); |
| 1024 send_bucket_->Process(); | 1021 send_bucket_->Process(); |
| 1025 } | 1022 } |
| 1026 | 1023 |
| 1027 // Second probing cluster. | 1024 // Second probing cluster. |
| 1028 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1)) | 1025 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1)) |
| 1029 .Times(5) | 1026 .Times(5) |
| 1030 .WillRepeatedly(Return(true)); | 1027 .WillRepeatedly(Return(true)); |
| 1031 for (int i = 0; i < 5; ++i) { | 1028 for (int i = 0; i < 5; ++i) { |
| 1032 clock_.AdvanceTimeMilliseconds(20); | 1029 clock_.AdvanceTimeMilliseconds(20); |
| 1033 send_bucket_->Process(); | 1030 send_bucket_->Process(); |
| 1034 } | 1031 } |
| 1035 | 1032 |
| 1036 // No more probing packets. | 1033 // No more probing packets. |
| 1037 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe)) | 1034 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe)) |
| 1038 .Times(1) | 1035 .Times(1) |
| 1039 .WillRepeatedly(Return(500)); | 1036 .WillRepeatedly(Return(500)); |
| 1040 send_bucket_->Process(); | 1037 send_bucket_->Process(); |
| 1041 } | 1038 } |
| 1042 | 1039 |
| 1043 } // namespace test | 1040 } // namespace test |
| 1044 } // namespace webrtc | 1041 } // namespace webrtc |
| OLD | NEW |