OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include "base/big_endian.h" | 7 #include "base/big_endian.h" |
8 #include "base/test/simple_test_tick_clock.h" | 8 #include "base/test/simple_test_tick_clock.h" |
9 #include "media/cast/logging/simple_event_subscriber.h" | 9 #include "media/cast/logging/simple_event_subscriber.h" |
10 #include "media/cast/test/fake_single_thread_task_runner.h" | 10 #include "media/cast/test/fake_single_thread_task_runner.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 } | 65 } |
66 | 66 |
67 virtual ~PacedSenderTest() { | 67 virtual ~PacedSenderTest() { |
68 logging_.RemoveRawEventSubscriber(&subscriber_); | 68 logging_.RemoveRawEventSubscriber(&subscriber_); |
69 } | 69 } |
70 | 70 |
71 static void UpdateCastTransportStatus(transport::CastTransportStatus status) { | 71 static void UpdateCastTransportStatus(transport::CastTransportStatus status) { |
72 NOTREACHED(); | 72 NOTREACHED(); |
73 } | 73 } |
74 | 74 |
75 PacketList CreatePacketList(size_t packet_size, | 75 SendPacketVector CreateSendPacketVector(size_t packet_size, |
76 int num_of_packets_in_frame, | 76 int num_of_packets_in_frame, |
77 bool audio) { | 77 bool audio) { |
78 DCHECK_GE(packet_size, 12u); | 78 DCHECK_GE(packet_size, 12u); |
79 PacketList packets; | 79 SendPacketVector packets; |
| 80 base::TimeTicks frame_tick = testing_clock_.NowTicks(); |
| 81 // Advance the clock so that we don't get the same frame_tick |
| 82 // next time this function is called. |
| 83 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(1)); |
80 for (int i = 0; i < num_of_packets_in_frame; ++i) { | 84 for (int i = 0; i < num_of_packets_in_frame; ++i) { |
| 85 PacketKey key = PacedPacketSender::MakePacketKey( |
| 86 frame_tick, |
| 87 audio ? kAudioSsrc : kVideoSsrc, // ssrc |
| 88 i); |
| 89 |
81 PacketRef packet(new base::RefCountedData<Packet>); | 90 PacketRef packet(new base::RefCountedData<Packet>); |
82 packet->data.resize(packet_size, kValue); | 91 packet->data.resize(packet_size, kValue); |
83 // Write ssrc to packet so that it can be recognized as a | 92 // Write ssrc to packet so that it can be recognized as a |
84 // "video frame" for logging purposes. | 93 // "video frame" for logging purposes. |
85 base::BigEndianWriter writer( | 94 base::BigEndianWriter writer( |
86 reinterpret_cast<char*>(&packet->data[8]), 4); | 95 reinterpret_cast<char*>(&packet->data[8]), 4); |
87 bool success = writer.WriteU32(audio ? kAudioSsrc : kVideoSsrc); | 96 bool success = writer.WriteU32(audio ? kAudioSsrc : kVideoSsrc); |
88 DCHECK(success); | 97 DCHECK(success); |
89 packets.push_back(packet); | 98 packets.push_back(std::make_pair(key, packet)); |
90 } | 99 } |
91 return packets; | 100 return packets; |
92 } | 101 } |
93 | 102 |
94 // Use this function to drain the packet list in PacedSender without having | 103 // Use this function to drain the packet list in PacedSender without having |
95 // to test the pacing implementation details. | 104 // to test the pacing implementation details. |
96 bool RunUntilEmpty(int max_tries) { | 105 bool RunUntilEmpty(int max_tries) { |
97 for (int i = 0; i < max_tries; i++) { | 106 for (int i = 0; i < max_tries; i++) { |
98 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); | 107 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); |
99 task_runner_->RunTasks(); | 108 task_runner_->RunTasks(); |
(...skipping 10 matching lines...) Expand all Loading... |
110 base::SimpleTestTickClock testing_clock_; | 119 base::SimpleTestTickClock testing_clock_; |
111 TestPacketSender mock_transport_; | 120 TestPacketSender mock_transport_; |
112 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 121 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
113 scoped_ptr<PacedSender> paced_sender_; | 122 scoped_ptr<PacedSender> paced_sender_; |
114 | 123 |
115 DISALLOW_COPY_AND_ASSIGN(PacedSenderTest); | 124 DISALLOW_COPY_AND_ASSIGN(PacedSenderTest); |
116 }; | 125 }; |
117 | 126 |
118 TEST_F(PacedSenderTest, PassThroughRtcp) { | 127 TEST_F(PacedSenderTest, PassThroughRtcp) { |
119 mock_transport_.AddExpectedSize(kSize1, 2); | 128 mock_transport_.AddExpectedSize(kSize1, 2); |
120 PacketList packets = CreatePacketList(kSize1, 1, true); | 129 SendPacketVector packets = CreateSendPacketVector(kSize1, 1, true); |
121 | 130 |
122 EXPECT_TRUE(paced_sender_->SendPackets(packets)); | 131 EXPECT_TRUE(paced_sender_->SendPackets(packets)); |
123 EXPECT_TRUE(paced_sender_->ResendPackets(packets)); | 132 EXPECT_TRUE(paced_sender_->ResendPackets(packets)); |
124 | 133 |
125 mock_transport_.AddExpectedSize(kSize2, 1); | 134 mock_transport_.AddExpectedSize(kSize2, 1); |
126 Packet tmp(kSize2, kValue); | 135 Packet tmp(kSize2, kValue); |
127 EXPECT_TRUE(paced_sender_->SendRtcpPacket( | 136 EXPECT_TRUE(paced_sender_->SendRtcpPacket( |
| 137 1, |
128 new base::RefCountedData<Packet>(tmp))); | 138 new base::RefCountedData<Packet>(tmp))); |
129 } | 139 } |
130 | 140 |
131 TEST_F(PacedSenderTest, BasicPace) { | 141 TEST_F(PacedSenderTest, BasicPace) { |
132 int num_of_packets = 27; | 142 int num_of_packets = 27; |
133 PacketList packets = CreatePacketList(kSize1, num_of_packets, false); | 143 SendPacketVector packets = CreateSendPacketVector(kSize1, |
| 144 num_of_packets, |
| 145 false); |
134 | 146 |
135 mock_transport_.AddExpectedSize(kSize1, 10); | 147 mock_transport_.AddExpectedSize(kSize1, 10); |
136 EXPECT_TRUE(paced_sender_->SendPackets(packets)); | 148 EXPECT_TRUE(paced_sender_->SendPackets(packets)); |
137 | 149 |
138 // Check that we get the next burst. | 150 // Check that we get the next burst. |
139 mock_transport_.AddExpectedSize(kSize1, 10); | 151 mock_transport_.AddExpectedSize(kSize1, 10); |
140 | 152 |
141 base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); | 153 base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); |
142 testing_clock_.Advance(timeout); | 154 testing_clock_.Advance(timeout); |
143 task_runner_->RunTasks(); | 155 task_runner_->RunTasks(); |
(...skipping 25 matching lines...) Expand all Loading... |
169 } | 181 } |
170 EXPECT_EQ(num_of_packets, sent_to_network_event_count); | 182 EXPECT_EQ(num_of_packets, sent_to_network_event_count); |
171 } | 183 } |
172 | 184 |
173 TEST_F(PacedSenderTest, PaceWithNack) { | 185 TEST_F(PacedSenderTest, PaceWithNack) { |
174 // Testing what happen when we get multiple NACK requests for a fully lost | 186 // Testing what happen when we get multiple NACK requests for a fully lost |
175 // frames just as we sent the first packets in a frame. | 187 // frames just as we sent the first packets in a frame. |
176 int num_of_packets_in_frame = 12; | 188 int num_of_packets_in_frame = 12; |
177 int num_of_packets_in_nack = 12; | 189 int num_of_packets_in_nack = 12; |
178 | 190 |
179 PacketList first_frame_packets = | 191 SendPacketVector nack_packets = |
180 CreatePacketList(kSize1, num_of_packets_in_frame, false); | 192 CreateSendPacketVector(kNackSize, num_of_packets_in_nack, false); |
181 | 193 |
182 PacketList second_frame_packets = | 194 SendPacketVector first_frame_packets = |
183 CreatePacketList(kSize2, num_of_packets_in_frame, true); | 195 CreateSendPacketVector(kSize1, num_of_packets_in_frame, false); |
184 | 196 |
185 PacketList nack_packets = | 197 SendPacketVector second_frame_packets = |
186 CreatePacketList(kNackSize, num_of_packets_in_nack, false); | 198 CreateSendPacketVector(kSize2, num_of_packets_in_frame, true); |
187 | 199 |
188 // Check that the first burst of the frame go out on the wire. | 200 // Check that the first burst of the frame go out on the wire. |
189 mock_transport_.AddExpectedSize(kSize1, 10); | 201 mock_transport_.AddExpectedSize(kSize1, 10); |
190 EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); | 202 EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); |
191 | 203 |
192 // Add first NACK request. | 204 // Add first NACK request. |
193 EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets)); | 205 EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets)); |
194 | 206 |
195 // Check that we get the first NACK burst. | 207 // Check that we get the first NACK burst. |
196 mock_transport_.AddExpectedSize(kNackSize, 10); | 208 mock_transport_.AddExpectedSize(kNackSize, 10); |
197 base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); | 209 base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); |
198 testing_clock_.Advance(timeout); | 210 testing_clock_.Advance(timeout); |
199 task_runner_->RunTasks(); | 211 task_runner_->RunTasks(); |
200 | 212 |
201 // Add second NACK request. | 213 // Add second NACK request. |
202 EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets)); | 214 EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets)); |
203 | 215 |
204 // Check that we get the next NACK burst. | 216 // Check that we get the next NACK burst. |
205 mock_transport_.AddExpectedSize(kNackSize, 10); | 217 mock_transport_.AddExpectedSize(kNackSize, 10); |
206 testing_clock_.Advance(timeout); | 218 testing_clock_.Advance(timeout); |
207 task_runner_->RunTasks(); | 219 task_runner_->RunTasks(); |
208 | 220 |
209 // End of NACK plus two packets from the oldest frame. | 221 // End of NACK plus two packets from the oldest frame. |
210 mock_transport_.AddExpectedSize(kNackSize, 4); | 222 // Note that two of the NACKs have been de-duped. |
| 223 mock_transport_.AddExpectedSize(kNackSize, 2); |
211 mock_transport_.AddExpectedSize(kSize1, 2); | 224 mock_transport_.AddExpectedSize(kSize1, 2); |
212 testing_clock_.Advance(timeout); | 225 testing_clock_.Advance(timeout); |
213 task_runner_->RunTasks(); | 226 task_runner_->RunTasks(); |
214 | 227 |
215 // Add second frame. | 228 // Add second frame. |
216 // Make sure we don't delay the second frame due to the previous packets. | 229 // Make sure we don't delay the second frame due to the previous packets. |
217 mock_transport_.AddExpectedSize(kSize2, 10); | 230 mock_transport_.AddExpectedSize(kSize2, 10); |
218 EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); | 231 EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); |
219 | 232 |
220 // Last packets of frame 2. | 233 // Last packets of frame 2. |
221 mock_transport_.AddExpectedSize(kSize2, 2); | 234 mock_transport_.AddExpectedSize(kSize2, 2); |
222 testing_clock_.Advance(timeout); | 235 testing_clock_.Advance(timeout); |
223 task_runner_->RunTasks(); | 236 task_runner_->RunTasks(); |
224 | 237 |
225 // No more packets. | 238 // No more packets. |
226 EXPECT_TRUE(RunUntilEmpty(5)); | 239 EXPECT_TRUE(RunUntilEmpty(5)); |
227 | 240 |
228 std::vector<PacketEvent> packet_events; | 241 std::vector<PacketEvent> packet_events; |
229 subscriber_.GetPacketEventsAndReset(&packet_events); | 242 subscriber_.GetPacketEventsAndReset(&packet_events); |
230 int expected_video_network_event_count = num_of_packets_in_frame; | 243 int expected_video_network_event_count = num_of_packets_in_frame; |
231 int expected_video_retransmitted_event_count = 2 * num_of_packets_in_nack; | 244 int expected_video_retransmitted_event_count = 2 * num_of_packets_in_nack; |
| 245 expected_video_retransmitted_event_count -= 2; // 2 packets deduped |
232 int expected_audio_network_event_count = num_of_packets_in_frame; | 246 int expected_audio_network_event_count = num_of_packets_in_frame; |
233 EXPECT_EQ(expected_video_network_event_count + | 247 EXPECT_EQ(expected_video_network_event_count + |
234 expected_video_retransmitted_event_count + | 248 expected_video_retransmitted_event_count + |
235 expected_audio_network_event_count, | 249 expected_audio_network_event_count, |
236 static_cast<int>(packet_events.size())); | 250 static_cast<int>(packet_events.size())); |
237 int audio_network_event_count = 0; | 251 int audio_network_event_count = 0; |
238 int video_network_event_count = 0; | 252 int video_network_event_count = 0; |
239 int video_retransmitted_event_count = 0; | 253 int video_retransmitted_event_count = 0; |
240 for (std::vector<PacketEvent>::iterator it = packet_events.begin(); | 254 for (std::vector<PacketEvent>::iterator it = packet_events.begin(); |
241 it != packet_events.end(); | 255 it != packet_events.end(); |
242 ++it) { | 256 ++it) { |
243 if (it->type == kVideoPacketSentToNetwork) | 257 if (it->type == kVideoPacketSentToNetwork) |
244 video_network_event_count++; | 258 video_network_event_count++; |
245 else if (it->type == kVideoPacketRetransmitted) | 259 else if (it->type == kVideoPacketRetransmitted) |
246 video_retransmitted_event_count++; | 260 video_retransmitted_event_count++; |
247 else if (it->type == kAudioPacketSentToNetwork) | 261 else if (it->type == kAudioPacketSentToNetwork) |
248 audio_network_event_count++; | 262 audio_network_event_count++; |
249 else | 263 else |
250 FAIL() << "Got unexpected event type " << CastLoggingToString(it->type); | 264 FAIL() << "Got unexpected event type " << CastLoggingToString(it->type); |
251 } | 265 } |
252 EXPECT_EQ(expected_audio_network_event_count, audio_network_event_count); | 266 EXPECT_EQ(expected_audio_network_event_count, audio_network_event_count); |
253 EXPECT_EQ(expected_video_network_event_count, video_network_event_count); | 267 EXPECT_EQ(expected_video_network_event_count, video_network_event_count); |
254 EXPECT_EQ(expected_video_retransmitted_event_count, | 268 EXPECT_EQ(expected_video_retransmitted_event_count, |
255 video_retransmitted_event_count); | 269 video_retransmitted_event_count); |
256 } | 270 } |
257 | 271 |
258 TEST_F(PacedSenderTest, PaceWith60fps) { | 272 TEST_F(PacedSenderTest, PaceWith60fps) { |
259 // Testing what happen when we get multiple NACK requests for a fully lost | 273 // Testing what happen when we get multiple NACK requests for a fully lost |
260 // frames just as we sent the first packets in a frame. | 274 // frames just as we sent the first packets in a frame. |
261 int num_of_packets_in_frame = 17; | 275 int num_of_packets_in_frame = 17; |
262 | 276 |
263 PacketList first_frame_packets = | 277 SendPacketVector first_frame_packets = |
264 CreatePacketList(kSize1, num_of_packets_in_frame, false); | 278 CreateSendPacketVector(kSize1, num_of_packets_in_frame, false); |
265 | 279 |
266 PacketList second_frame_packets = | 280 SendPacketVector second_frame_packets = |
267 CreatePacketList(kSize2, num_of_packets_in_frame, false); | 281 CreateSendPacketVector(kSize2, num_of_packets_in_frame, false); |
268 | 282 |
269 PacketList third_frame_packets = | 283 SendPacketVector third_frame_packets = |
270 CreatePacketList(kSize3, num_of_packets_in_frame, false); | 284 CreateSendPacketVector(kSize3, num_of_packets_in_frame, false); |
271 | 285 |
272 PacketList fourth_frame_packets = | 286 SendPacketVector fourth_frame_packets = |
273 CreatePacketList(kSize4, num_of_packets_in_frame, false); | 287 CreateSendPacketVector(kSize4, num_of_packets_in_frame, false); |
274 | 288 |
275 base::TimeDelta timeout_10ms = base::TimeDelta::FromMilliseconds(10); | 289 base::TimeDelta timeout_10ms = base::TimeDelta::FromMilliseconds(10); |
276 | 290 |
277 // Check that the first burst of the frame go out on the wire. | 291 // Check that the first burst of the frame go out on the wire. |
278 mock_transport_.AddExpectedSize(kSize1, 10); | 292 mock_transport_.AddExpectedSize(kSize1, 10); |
279 EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); | 293 EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); |
280 | 294 |
281 mock_transport_.AddExpectedSize(kSize1, 7); | 295 mock_transport_.AddExpectedSize(kSize1, 7); |
282 testing_clock_.Advance(timeout_10ms); | 296 testing_clock_.Advance(timeout_10ms); |
283 task_runner_->RunTasks(); | 297 task_runner_->RunTasks(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 testing_clock_.Advance(timeout_10ms); | 339 testing_clock_.Advance(timeout_10ms); |
326 task_runner_->RunTasks(); | 340 task_runner_->RunTasks(); |
327 | 341 |
328 // No more packets. | 342 // No more packets. |
329 EXPECT_TRUE(RunUntilEmpty(5)); | 343 EXPECT_TRUE(RunUntilEmpty(5)); |
330 } | 344 } |
331 | 345 |
332 } // namespace transport | 346 } // namespace transport |
333 } // namespace cast | 347 } // namespace cast |
334 } // namespace media | 348 } // namespace media |
OLD | NEW |