| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 <algorithm> | 11 #include <algorithm> |
| 12 #include <limits> | 12 #include <limits> |
| 13 #include <vector> | 13 #include <vector> |
| 14 | 14 |
| 15 #include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h" | 15 #include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h" |
| 16 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 16 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
| 17 #include "webrtc/system_wrappers/include/clock.h" | 17 #include "webrtc/system_wrappers/include/clock.h" |
| 18 #include "webrtc/test/gtest.h" | 18 #include "webrtc/test/gtest.h" |
| 19 | 19 |
| 20 namespace { |
| 21 |
| 22 constexpr int kDefaultHistoryLengthMs = 1000; |
| 23 constexpr size_t kRtpHeadersSize = 12; |
| 24 constexpr size_t kTransportHeadersSize = 20; |
| 25 |
| 26 } // namespace |
| 27 |
| 20 namespace webrtc { | 28 namespace webrtc { |
| 21 namespace test { | 29 namespace test { |
| 22 | 30 |
| 23 static const int kDefaultHistoryLengthMs = 1000; | |
| 24 | |
| 25 class SendTimeHistoryTest : public ::testing::Test { | 31 class SendTimeHistoryTest : public ::testing::Test { |
| 26 protected: | 32 protected: |
| 27 SendTimeHistoryTest() | 33 SendTimeHistoryTest() |
| 28 : clock_(0), history_(&clock_, kDefaultHistoryLengthMs) {} | 34 : clock_(0), history_(&clock_, kDefaultHistoryLengthMs) {} |
| 29 ~SendTimeHistoryTest() {} | 35 ~SendTimeHistoryTest() {} |
| 30 | 36 |
| 31 virtual void SetUp() {} | 37 virtual void SetUp() {} |
| 32 | 38 |
| 33 virtual void TearDown() {} | 39 virtual void TearDown() {} |
| 34 | 40 |
| 35 void AddPacketWithSendTime(uint16_t sequence_number, | 41 void AddPacketWithSendTime(uint16_t sequence_number, |
| 36 size_t length, | 42 size_t payload_size, |
| 37 int64_t send_time_ms, | 43 int64_t send_time_ms, |
| 38 const PacedPacketInfo& pacing_info) { | 44 const PacedPacketInfo& pacing_info) { |
| 39 PacketFeedback packet(clock_.TimeInMilliseconds(), sequence_number, length, | 45 PacketFeedback packet(clock_.TimeInMilliseconds(), sequence_number, |
| 46 payload_size, kRtpHeadersSize, kTransportHeadersSize, |
| 40 0, 0, pacing_info); | 47 0, 0, pacing_info); |
| 41 history_.AddAndRemoveOld(packet); | 48 history_.AddAndRemoveOld(packet); |
| 42 history_.OnSentPacket(sequence_number, send_time_ms); | 49 history_.OnSentPacket(sequence_number, send_time_ms); |
| 43 } | 50 } |
| 44 | 51 |
| 45 webrtc::SimulatedClock clock_; | 52 webrtc::SimulatedClock clock_; |
| 46 SendTimeHistory history_; | 53 SendTimeHistory history_; |
| 47 }; | 54 }; |
| 48 | 55 |
| 49 TEST_F(SendTimeHistoryTest, SaveAndRestoreNetworkId) { | 56 TEST_F(SendTimeHistoryTest, SaveAndRestoreNetworkId) { |
| 50 const PacedPacketInfo kPacingInfo(0, 5, 1200); | 57 const PacedPacketInfo kPacingInfo(0, 5, 1200); |
| 51 uint16_t sequence_number = 0; | 58 uint16_t sequence_number = 0; |
| 52 int64_t now_ms = clock_.TimeInMilliseconds(); | 59 int64_t now_ms = clock_.TimeInMilliseconds(); |
| 53 for (int i = 1; i < 5; ++i) { | 60 for (int i = 1; i < 5; ++i) { |
| 54 PacketFeedback packet(now_ms, sequence_number, 1000, i, i - 1, | 61 PacketFeedback packet(now_ms, sequence_number, 1000, kRtpHeadersSize, |
| 55 kPacingInfo); | 62 kTransportHeadersSize, i, i - 1, kPacingInfo); |
| 56 history_.AddAndRemoveOld(packet); | 63 history_.AddAndRemoveOld(packet); |
| 57 history_.OnSentPacket(sequence_number, now_ms); | 64 history_.OnSentPacket(sequence_number, now_ms); |
| 58 PacketFeedback restored(now_ms, sequence_number); | 65 PacketFeedback restored(now_ms, sequence_number); |
| 59 EXPECT_TRUE(history_.GetFeedback(&restored, sequence_number++)); | 66 EXPECT_TRUE(history_.GetFeedback(&restored, sequence_number++)); |
| 60 EXPECT_EQ(packet.local_net_id, restored.local_net_id); | 67 EXPECT_EQ(packet.local_net_id, restored.local_net_id); |
| 61 EXPECT_EQ(packet.remote_net_id, restored.remote_net_id); | 68 EXPECT_EQ(packet.remote_net_id, restored.remote_net_id); |
| 62 } | 69 } |
| 63 } | 70 } |
| 64 | 71 |
| 65 TEST_F(SendTimeHistoryTest, AddRemoveOne) { | 72 TEST_F(SendTimeHistoryTest, AddRemoveOne) { |
| 66 const uint16_t kSeqNo = 10; | 73 const uint16_t kSeqNo = 10; |
| 67 // TODO(philipel): Fix PacedPacketInfo constructor? | 74 // TODO(philipel): Fix PacedPacketInfo constructor? |
| 68 const PacedPacketInfo kPacingInfo(0, 5, 1200); | 75 const PacedPacketInfo kPacingInfo(0, 5, 1200); |
| 69 const PacketFeedback kSentPacket(0, 1, kSeqNo, 1, kPacingInfo); | 76 const PacketFeedback kSentPacket(0, 1, kSeqNo, 1, kRtpHeadersSize, |
| 77 kTransportHeadersSize, kPacingInfo); |
| 70 AddPacketWithSendTime(kSeqNo, 1, 1, kPacingInfo); | 78 AddPacketWithSendTime(kSeqNo, 1, 1, kPacingInfo); |
| 71 | 79 |
| 72 PacketFeedback received_packet(0, 0, kSeqNo, 0, kPacingInfo); | 80 PacketFeedback received_packet(0, 0, kSeqNo, 0, kRtpHeadersSize, |
| 81 kTransportHeadersSize, kPacingInfo); |
| 73 EXPECT_TRUE(history_.GetFeedback(&received_packet, false)); | 82 EXPECT_TRUE(history_.GetFeedback(&received_packet, false)); |
| 74 EXPECT_EQ(kSentPacket, received_packet); | 83 EXPECT_EQ(kSentPacket, received_packet); |
| 75 | 84 |
| 76 PacketFeedback received_packet2(0, 0, kSeqNo, 0, kPacingInfo); | 85 PacketFeedback received_packet2(0, 0, kSeqNo, 0, kRtpHeadersSize, |
| 86 kTransportHeadersSize, kPacingInfo); |
| 77 EXPECT_TRUE(history_.GetFeedback(&received_packet2, true)); | 87 EXPECT_TRUE(history_.GetFeedback(&received_packet2, true)); |
| 78 EXPECT_EQ(kSentPacket, received_packet2); | 88 EXPECT_EQ(kSentPacket, received_packet2); |
| 79 | 89 |
| 80 PacketFeedback received_packet3(0, 0, kSeqNo, 0, kPacingInfo); | 90 PacketFeedback received_packet3(0, 0, kSeqNo, 0, kRtpHeadersSize, |
| 91 kTransportHeadersSize, kPacingInfo); |
| 81 EXPECT_FALSE(history_.GetFeedback(&received_packet3, true)); | 92 EXPECT_FALSE(history_.GetFeedback(&received_packet3, true)); |
| 82 } | 93 } |
| 83 | 94 |
| 84 TEST_F(SendTimeHistoryTest, PopulatesExpectedFields) { | 95 TEST_F(SendTimeHistoryTest, PopulatesExpectedFields) { |
| 85 const uint16_t kSeqNo = 10; | 96 const uint16_t kSeqNo = 10; |
| 86 const int64_t kSendTime = 1000; | 97 const int64_t kSendTime = 1000; |
| 87 const int64_t kReceiveTime = 2000; | 98 const int64_t kReceiveTime = 2000; |
| 88 const size_t kPayloadSize = 42; | 99 const size_t kPayloadSize = 42; |
| 89 const PacedPacketInfo kPacingInfo(3, 10, 1212); | 100 const PacedPacketInfo kPacingInfo(3, 10, 1212); |
| 90 | 101 |
| 91 AddPacketWithSendTime(kSeqNo, kPayloadSize, kSendTime, kPacingInfo); | 102 AddPacketWithSendTime(kSeqNo, kPayloadSize, kSendTime, kPacingInfo); |
| 92 | 103 |
| 93 PacketFeedback packet_feedback(kReceiveTime, kSeqNo); | 104 PacketFeedback packet_feedback(kReceiveTime, kSeqNo); |
| 94 EXPECT_TRUE(history_.GetFeedback(&packet_feedback, true)); | 105 EXPECT_TRUE(history_.GetFeedback(&packet_feedback, true)); |
| 95 EXPECT_EQ(kReceiveTime, packet_feedback.arrival_time_ms); | 106 EXPECT_EQ(kReceiveTime, packet_feedback.arrival_time_ms); |
| 96 EXPECT_EQ(kSendTime, packet_feedback.send_time_ms); | 107 EXPECT_EQ(kSendTime, packet_feedback.send_time_ms); |
| 97 EXPECT_EQ(kSeqNo, packet_feedback.sequence_number); | 108 EXPECT_EQ(kSeqNo, packet_feedback.sequence_number); |
| 98 EXPECT_EQ(kPayloadSize, packet_feedback.payload_size); | 109 EXPECT_EQ(kPayloadSize, packet_feedback.payload_size); |
| 99 EXPECT_EQ(kPacingInfo, packet_feedback.pacing_info); | 110 EXPECT_EQ(kPacingInfo, packet_feedback.pacing_info); |
| 100 } | 111 } |
| 101 | 112 |
| 102 TEST_F(SendTimeHistoryTest, AddThenRemoveOutOfOrder) { | 113 TEST_F(SendTimeHistoryTest, AddThenRemoveOutOfOrder) { |
| 103 std::vector<PacketFeedback> sent_packets; | 114 std::vector<PacketFeedback> sent_packets; |
| 104 std::vector<PacketFeedback> received_packets; | 115 std::vector<PacketFeedback> received_packets; |
| 105 const size_t num_items = 100; | 116 const size_t num_items = 100; |
| 106 const size_t kPacketSize = 400; | 117 const size_t kPayloadSize = 400; |
| 107 const size_t kTransmissionTime = 1234; | 118 const size_t kTransmissionTime = 1234; |
| 108 const PacedPacketInfo kPacingInfo(1, 2, 200); | 119 const PacedPacketInfo kPacingInfo(1, 2, 200); |
| 109 for (size_t i = 0; i < num_items; ++i) { | 120 for (size_t i = 0; i < num_items; ++i) { |
| 110 sent_packets.push_back(PacketFeedback(0, static_cast<int64_t>(i), | 121 sent_packets.push_back(PacketFeedback( |
| 111 static_cast<uint16_t>(i), kPacketSize, | 122 0, static_cast<int64_t>(i), static_cast<uint16_t>(i), kPayloadSize, |
| 112 kPacingInfo)); | 123 kRtpHeadersSize, kTransportHeadersSize, kPacingInfo)); |
| 113 received_packets.push_back(PacketFeedback( | 124 received_packets.push_back( |
| 114 static_cast<int64_t>(i) + kTransmissionTime, 0, | 125 PacketFeedback(static_cast<int64_t>(i) + kTransmissionTime, 0, |
| 115 static_cast<uint16_t>(i), kPacketSize, PacedPacketInfo())); | 126 static_cast<uint16_t>(i), kPayloadSize, kRtpHeadersSize, |
| 127 kTransportHeadersSize, PacedPacketInfo())); |
| 116 } | 128 } |
| 117 for (size_t i = 0; i < num_items; ++i) { | 129 for (size_t i = 0; i < num_items; ++i) { |
| 118 PacketFeedback packet = sent_packets[i]; | 130 PacketFeedback packet = sent_packets[i]; |
| 119 packet.arrival_time_ms = -1; | 131 packet.arrival_time_ms = -1; |
| 120 packet.send_time_ms = -1; | 132 packet.send_time_ms = -1; |
| 121 history_.AddAndRemoveOld(packet); | 133 history_.AddAndRemoveOld(packet); |
| 122 } | 134 } |
| 123 for (size_t i = 0; i < num_items; ++i) | 135 for (size_t i = 0; i < num_items; ++i) |
| 124 history_.OnSentPacket(sent_packets[i].sequence_number, | 136 history_.OnSentPacket(sent_packets[i].sequence_number, |
| 125 sent_packets[i].send_time_ms); | 137 sent_packets[i].send_time_ms); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 136 EXPECT_FALSE(history_.GetFeedback(&packet, false)); | 148 EXPECT_FALSE(history_.GetFeedback(&packet, false)); |
| 137 } | 149 } |
| 138 | 150 |
| 139 TEST_F(SendTimeHistoryTest, HistorySize) { | 151 TEST_F(SendTimeHistoryTest, HistorySize) { |
| 140 const int kItems = kDefaultHistoryLengthMs / 100; | 152 const int kItems = kDefaultHistoryLengthMs / 100; |
| 141 for (int i = 0; i < kItems; ++i) { | 153 for (int i = 0; i < kItems; ++i) { |
| 142 clock_.AdvanceTimeMilliseconds(100); | 154 clock_.AdvanceTimeMilliseconds(100); |
| 143 AddPacketWithSendTime(i, 0, i * 100, PacedPacketInfo()); | 155 AddPacketWithSendTime(i, 0, i * 100, PacedPacketInfo()); |
| 144 } | 156 } |
| 145 for (int i = 0; i < kItems; ++i) { | 157 for (int i = 0; i < kItems; ++i) { |
| 146 PacketFeedback packet(0, 0, static_cast<uint16_t>(i), 0, PacedPacketInfo()); | 158 PacketFeedback packet(0, 0, static_cast<uint16_t>(i), 0, kRtpHeadersSize, |
| 159 kTransportHeadersSize, PacedPacketInfo()); |
| 147 EXPECT_TRUE(history_.GetFeedback(&packet, false)); | 160 EXPECT_TRUE(history_.GetFeedback(&packet, false)); |
| 148 EXPECT_EQ(i * 100, packet.send_time_ms); | 161 EXPECT_EQ(i * 100, packet.send_time_ms); |
| 149 } | 162 } |
| 150 clock_.AdvanceTimeMilliseconds(101); | 163 clock_.AdvanceTimeMilliseconds(101); |
| 151 AddPacketWithSendTime(kItems, 0, kItems * 101, PacedPacketInfo()); | 164 AddPacketWithSendTime(kItems, 0, kItems * 101, PacedPacketInfo()); |
| 152 PacketFeedback packet(0, 0, 0, 0, PacedPacketInfo()); | 165 PacketFeedback packet(0, 0, 0, 0, kRtpHeadersSize, kTransportHeadersSize, |
| 166 PacedPacketInfo()); |
| 153 EXPECT_FALSE(history_.GetFeedback(&packet, false)); | 167 EXPECT_FALSE(history_.GetFeedback(&packet, false)); |
| 154 for (int i = 1; i < (kItems + 1); ++i) { | 168 for (int i = 1; i < (kItems + 1); ++i) { |
| 155 PacketFeedback packet2(0, 0, static_cast<uint16_t>(i), 0, | 169 PacketFeedback packet2(0, 0, static_cast<uint16_t>(i), 0, kRtpHeadersSize, |
| 156 PacedPacketInfo()); | 170 kTransportHeadersSize, PacedPacketInfo()); |
| 157 EXPECT_TRUE(history_.GetFeedback(&packet2, false)); | 171 EXPECT_TRUE(history_.GetFeedback(&packet2, false)); |
| 158 int64_t expected_time_ms = (i == kItems) ? i * 101 : i * 100; | 172 int64_t expected_time_ms = (i == kItems) ? i * 101 : i * 100; |
| 159 EXPECT_EQ(expected_time_ms, packet2.send_time_ms); | 173 EXPECT_EQ(expected_time_ms, packet2.send_time_ms); |
| 160 } | 174 } |
| 161 } | 175 } |
| 162 | 176 |
| 163 TEST_F(SendTimeHistoryTest, HistorySizeWithWraparound) { | 177 TEST_F(SendTimeHistoryTest, HistorySizeWithWraparound) { |
| 164 const uint16_t kMaxSeqNo = std::numeric_limits<uint16_t>::max(); | 178 const uint16_t kMaxSeqNo = std::numeric_limits<uint16_t>::max(); |
| 165 AddPacketWithSendTime(kMaxSeqNo - 2, 0, 0, PacedPacketInfo()); | 179 AddPacketWithSendTime(kMaxSeqNo - 2, 0, 0, PacedPacketInfo()); |
| 166 | 180 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 EXPECT_TRUE(history_.GetFeedback(&packet10, false)); | 215 EXPECT_TRUE(history_.GetFeedback(&packet10, false)); |
| 202 } | 216 } |
| 203 | 217 |
| 204 TEST_F(SendTimeHistoryTest, InterlievedGetAndRemove) { | 218 TEST_F(SendTimeHistoryTest, InterlievedGetAndRemove) { |
| 205 const uint16_t kSeqNo = 1; | 219 const uint16_t kSeqNo = 1; |
| 206 const int64_t kTimestamp = 2; | 220 const int64_t kTimestamp = 2; |
| 207 const PacedPacketInfo kPacingInfo1(1, 1, 100); | 221 const PacedPacketInfo kPacingInfo1(1, 1, 100); |
| 208 const PacedPacketInfo kPacingInfo2(2, 2, 200); | 222 const PacedPacketInfo kPacingInfo2(2, 2, 200); |
| 209 const PacedPacketInfo kPacingInfo3(3, 3, 300); | 223 const PacedPacketInfo kPacingInfo3(3, 3, 300); |
| 210 PacketFeedback packets[3] = { | 224 PacketFeedback packets[3] = { |
| 211 {0, kTimestamp, kSeqNo, 0, kPacingInfo1}, | 225 {0, kTimestamp, kSeqNo, 0, kRtpHeadersSize, kTransportHeadersSize, |
| 212 {0, kTimestamp + 1, kSeqNo + 1, 0, kPacingInfo2}, | 226 kPacingInfo1}, |
| 213 {0, kTimestamp + 2, kSeqNo + 2, 0, kPacingInfo3}}; | 227 {0, kTimestamp + 1, kSeqNo + 1, 0, kRtpHeadersSize, kTransportHeadersSize, |
| 228 kPacingInfo2}, |
| 229 {0, kTimestamp + 2, kSeqNo + 2, 0, kRtpHeadersSize, kTransportHeadersSize, |
| 230 kPacingInfo3}}; |
| 214 | 231 |
| 215 AddPacketWithSendTime(packets[0].sequence_number, packets[0].payload_size, | 232 AddPacketWithSendTime(packets[0].sequence_number, packets[0].payload_size, |
| 216 packets[0].send_time_ms, packets[0].pacing_info); | 233 packets[0].send_time_ms, packets[0].pacing_info); |
| 217 AddPacketWithSendTime(packets[1].sequence_number, packets[1].payload_size, | 234 AddPacketWithSendTime(packets[1].sequence_number, packets[1].payload_size, |
| 218 packets[1].send_time_ms, packets[1].pacing_info); | 235 packets[1].send_time_ms, packets[1].pacing_info); |
| 219 PacketFeedback packet(0, 0, packets[0].sequence_number, 0, PacedPacketInfo()); | 236 PacketFeedback packet(0, 0, packets[0].sequence_number, 0, kRtpHeadersSize, |
| 237 kTransportHeadersSize, PacedPacketInfo()); |
| 220 EXPECT_TRUE(history_.GetFeedback(&packet, true)); | 238 EXPECT_TRUE(history_.GetFeedback(&packet, true)); |
| 221 EXPECT_EQ(packets[0], packet); | 239 EXPECT_EQ(packets[0], packet); |
| 222 | 240 |
| 223 AddPacketWithSendTime(packets[2].sequence_number, packets[2].payload_size, | 241 AddPacketWithSendTime(packets[2].sequence_number, packets[2].payload_size, |
| 224 packets[2].send_time_ms, packets[2].pacing_info); | 242 packets[2].send_time_ms, packets[2].pacing_info); |
| 225 | 243 |
| 226 PacketFeedback packet2(0, 0, packets[1].sequence_number, 0, kPacingInfo1); | 244 PacketFeedback packet2(0, 0, packets[1].sequence_number, 0, kRtpHeadersSize, |
| 245 kTransportHeadersSize, kPacingInfo1); |
| 227 EXPECT_TRUE(history_.GetFeedback(&packet2, true)); | 246 EXPECT_TRUE(history_.GetFeedback(&packet2, true)); |
| 228 EXPECT_EQ(packets[1], packet2); | 247 EXPECT_EQ(packets[1], packet2); |
| 229 | 248 |
| 230 PacketFeedback packet3(0, 0, packets[2].sequence_number, 0, kPacingInfo2); | 249 PacketFeedback packet3(0, 0, packets[2].sequence_number, 0, kRtpHeadersSize, |
| 250 kTransportHeadersSize, kPacingInfo2); |
| 231 EXPECT_TRUE(history_.GetFeedback(&packet3, true)); | 251 EXPECT_TRUE(history_.GetFeedback(&packet3, true)); |
| 232 EXPECT_EQ(packets[2], packet3); | 252 EXPECT_EQ(packets[2], packet3); |
| 233 } | 253 } |
| 234 } // namespace test | 254 } // namespace test |
| 235 } // namespace webrtc | 255 } // namespace webrtc |
| OLD | NEW |