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 |
(...skipping 20 matching lines...) Expand all Loading... |
31 class TransportFeedbackAdapterTest : public ::testing::Test { | 31 class TransportFeedbackAdapterTest : public ::testing::Test { |
32 public: | 32 public: |
33 TransportFeedbackAdapterTest() | 33 TransportFeedbackAdapterTest() |
34 : clock_(0), bitrate_controller_(this), target_bitrate_bps_(0) {} | 34 : clock_(0), bitrate_controller_(this), target_bitrate_bps_(0) {} |
35 | 35 |
36 virtual ~TransportFeedbackAdapterTest() {} | 36 virtual ~TransportFeedbackAdapterTest() {} |
37 | 37 |
38 virtual void SetUp() { | 38 virtual void SetUp() { |
39 adapter_.reset(new TransportFeedbackAdapter(&clock_, &bitrate_controller_)); | 39 adapter_.reset(new TransportFeedbackAdapter(&clock_, &bitrate_controller_)); |
40 adapter_->InitBwe(); | 40 adapter_->InitBwe(); |
| 41 adapter_->SetStartBitrate(300000); |
41 } | 42 } |
42 | 43 |
43 virtual void TearDown() { adapter_.reset(); } | 44 virtual void TearDown() { adapter_.reset(); } |
44 | 45 |
45 protected: | 46 protected: |
46 // Proxy class used since TransportFeedbackAdapter will own the instance | 47 // Proxy class used since TransportFeedbackAdapter will own the instance |
47 // passed at construction. | 48 // passed at construction. |
48 class MockBitrateControllerAdapter : public MockBitrateController { | 49 class MockBitrateControllerAdapter : public MockBitrateController { |
49 public: | 50 public: |
50 explicit MockBitrateControllerAdapter(TransportFeedbackAdapterTest* owner) | 51 explicit MockBitrateControllerAdapter(TransportFeedbackAdapterTest* owner) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 123 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
123 packet.arrival_time_ms * 1000)); | 124 packet.arrival_time_ms * 1000)); |
124 } | 125 } |
125 | 126 |
126 feedback.Build(); | 127 feedback.Build(); |
127 | 128 |
128 adapter_->OnTransportFeedback(feedback); | 129 adapter_->OnTransportFeedback(feedback); |
129 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); | 130 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
130 } | 131 } |
131 | 132 |
132 TEST_F(TransportFeedbackAdapterTest, Timeout) { | 133 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { |
133 const int64_t kFeedbackTimeoutMs = 60001; | 134 const int64_t kFeedbackTimeoutMs = 60001; |
134 { | 135 const int kMaxConsecutiveFailedLookups = 5; |
| 136 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { |
135 std::vector<PacketInfo> packets; | 137 std::vector<PacketInfo> packets; |
136 packets.push_back(PacketInfo(100, 200, 0, 1500, 0)); | 138 packets.push_back(PacketInfo(i * 100, 2 * i * 100, 0, 1500, 0)); |
137 packets.push_back(PacketInfo(110, 210, 1, 1500, 0)); | 139 packets.push_back(PacketInfo(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, 0)); |
138 packets.push_back(PacketInfo(120, 220, 2, 1500, 0)); | 140 packets.push_back(PacketInfo(i * 100 + 20, 2 * i * 100 + 20, 2, 1500, 0)); |
139 packets.push_back(PacketInfo(130, 230, 3, 1500, 1)); | 141 packets.push_back(PacketInfo(i * 100 + 30, 2 * i * 100 + 30, 3, 1500, 1)); |
140 packets.push_back(PacketInfo(140, 240, 4, 1500, 1)); | 142 packets.push_back(PacketInfo(i * 100 + 40, 2 * i * 100 + 40, 4, 1500, 1)); |
141 | 143 |
142 for (const PacketInfo& packet : packets) | 144 for (const PacketInfo& packet : packets) |
143 OnSentPacket(packet); | 145 OnSentPacket(packet); |
144 | 146 |
145 rtcp::TransportFeedback feedback; | 147 rtcp::TransportFeedback feedback; |
146 feedback.SetBase(packets[0].sequence_number, | 148 feedback.SetBase(packets[0].sequence_number, |
147 packets[0].arrival_time_ms * 1000); | 149 packets[0].arrival_time_ms * 1000); |
148 | 150 |
149 for (const PacketInfo& packet : packets) { | 151 for (const PacketInfo& packet : packets) { |
150 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 152 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
151 packet.arrival_time_ms * 1000)); | 153 packet.arrival_time_ms * 1000)); |
152 } | 154 } |
153 | 155 |
154 feedback.Build(); | 156 feedback.Build(); |
155 | 157 |
156 clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs); | 158 clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs); |
157 PacketInfo later_packet(kFeedbackTimeoutMs + 140, kFeedbackTimeoutMs + 240, | 159 PacketInfo later_packet(kFeedbackTimeoutMs + i * 100 + 40, |
158 5, 1500, 1); | 160 kFeedbackTimeoutMs + i * 200 + 40, 5, 1500, 1); |
159 OnSentPacket(later_packet); | 161 OnSentPacket(later_packet); |
160 | 162 |
161 adapter_->OnTransportFeedback(feedback); | 163 adapter_->OnTransportFeedback(feedback); |
162 EXPECT_EQ(0, rtc::checked_cast<int>( | 164 |
163 adapter_->GetTransportFeedbackVector().size())); | 165 // Check that packets have timed out. |
| 166 for (PacketInfo& packet : packets) { |
| 167 packet.send_time_ms = -1; |
| 168 packet.payload_size = 0; |
| 169 packet.probe_cluster_id = -1; |
| 170 } |
| 171 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
164 } | 172 } |
165 | 173 |
| 174 // Target bitrate should have halved due to feedback delays. |
| 175 EXPECT_EQ(150000u, target_bitrate_bps_); |
| 176 |
| 177 // Test with feedback that isn't late enough to time out. |
166 { | 178 { |
167 std::vector<PacketInfo> packets; | 179 std::vector<PacketInfo> packets; |
168 packets.push_back(PacketInfo(100, 200, 0, 1500, 0)); | 180 packets.push_back(PacketInfo(100, 200, 0, 1500, 0)); |
169 packets.push_back(PacketInfo(110, 210, 1, 1500, 0)); | 181 packets.push_back(PacketInfo(110, 210, 1, 1500, 0)); |
170 packets.push_back(PacketInfo(120, 220, 2, 1500, 0)); | 182 packets.push_back(PacketInfo(120, 220, 2, 1500, 0)); |
171 packets.push_back(PacketInfo(130, 230, 3, 1500, 1)); | 183 packets.push_back(PacketInfo(130, 230, 3, 1500, 1)); |
172 packets.push_back(PacketInfo(140, 240, 4, 1500, 1)); | 184 packets.push_back(PacketInfo(140, 240, 4, 1500, 1)); |
173 | 185 |
174 for (const PacketInfo& packet : packets) | 186 for (const PacketInfo& packet : packets) |
175 OnSentPacket(packet); | 187 OnSentPacket(packet); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 for (const PacketInfo& packet : packets) { | 230 for (const PacketInfo& packet : packets) { |
219 if (packet.sequence_number <= kReceiveSideDropAfter) { | 231 if (packet.sequence_number <= kReceiveSideDropAfter) { |
220 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 232 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
221 packet.arrival_time_ms * 1000)); | 233 packet.arrival_time_ms * 1000)); |
222 } | 234 } |
223 } | 235 } |
224 | 236 |
225 feedback.Build(); | 237 feedback.Build(); |
226 | 238 |
227 std::vector<PacketInfo> expected_packets( | 239 std::vector<PacketInfo> expected_packets( |
228 packets.begin() + kSendSideDropBefore, | 240 packets.begin(), packets.begin() + kReceiveSideDropAfter + 1); |
229 packets.begin() + kReceiveSideDropAfter + 1); | 241 // Packets that have timed out on the send-side have lost the |
| 242 // information stored on the send-side. |
| 243 for (size_t i = 0; i < kSendSideDropBefore; ++i) { |
| 244 expected_packets[i].send_time_ms = -1; |
| 245 expected_packets[i].probe_cluster_id = -1; |
| 246 expected_packets[i].payload_size = 0; |
| 247 } |
230 | 248 |
231 adapter_->OnTransportFeedback(feedback); | 249 adapter_->OnTransportFeedback(feedback); |
232 ComparePacketVectors(expected_packets, | 250 ComparePacketVectors(expected_packets, |
233 adapter_->GetTransportFeedbackVector()); | 251 adapter_->GetTransportFeedbackVector()); |
234 } | 252 } |
235 | 253 |
236 TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) { | 254 TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) { |
237 int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor * | 255 int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor * |
238 static_cast<int64_t>(1 << 8) * | 256 static_cast<int64_t>(1 << 8) * |
239 static_cast<int64_t>((1 << 23) - 1) / 1000; | 257 static_cast<int64_t>((1 << 23) - 1) / 1000; |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 EXPECT_TRUE(feedback.get() != nullptr); | 431 EXPECT_TRUE(feedback.get() != nullptr); |
414 adapter_->OnTransportFeedback(*feedback.get()); | 432 adapter_->OnTransportFeedback(*feedback.get()); |
415 clock_.AdvanceTimeMilliseconds(50); | 433 clock_.AdvanceTimeMilliseconds(50); |
416 ++seq_num; | 434 ++seq_num; |
417 } | 435 } |
418 EXPECT_GT(target_bitrate_bps_, 0u); | 436 EXPECT_GT(target_bitrate_bps_, 0u); |
419 } | 437 } |
420 | 438 |
421 } // namespace test | 439 } // namespace test |
422 } // namespace webrtc | 440 } // namespace webrtc |
OLD | NEW |