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 <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 protected: | 104 protected: |
105 VideoSenderTest() { | 105 VideoSenderTest() { |
106 testing_clock_ = new base::SimpleTestTickClock(); | 106 testing_clock_ = new base::SimpleTestTickClock(); |
107 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 107 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
108 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); | 108 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); |
109 cast_environment_ = | 109 cast_environment_ = |
110 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), | 110 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), |
111 task_runner_, | 111 task_runner_, |
112 task_runner_, | 112 task_runner_, |
113 task_runner_); | 113 task_runner_); |
| 114 last_pixel_value_ = kPixelValue; |
114 net::IPEndPoint dummy_endpoint; | 115 net::IPEndPoint dummy_endpoint; |
115 transport_sender_.reset(new transport::CastTransportSenderImpl( | 116 transport_sender_.reset(new transport::CastTransportSenderImpl( |
116 NULL, | 117 NULL, |
117 testing_clock_, | 118 testing_clock_, |
118 dummy_endpoint, | 119 dummy_endpoint, |
119 base::Bind(&UpdateCastTransportStatus), | 120 base::Bind(&UpdateCastTransportStatus), |
120 transport::BulkRawEventsCallback(), | 121 transport::BulkRawEventsCallback(), |
121 base::TimeDelta(), | 122 base::TimeDelta(), |
122 task_runner_, | 123 task_runner_, |
123 &transport_)); | 124 &transport_)); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 transport_sender_.get())); | 173 transport_sender_.get())); |
173 } | 174 } |
174 ASSERT_EQ(STATUS_VIDEO_INITIALIZED, video_sender_->InitializationResult()); | 175 ASSERT_EQ(STATUS_VIDEO_INITIALIZED, video_sender_->InitializationResult()); |
175 } | 176 } |
176 | 177 |
177 scoped_refptr<media::VideoFrame> GetNewVideoFrame() { | 178 scoped_refptr<media::VideoFrame> GetNewVideoFrame() { |
178 gfx::Size size(kWidth, kHeight); | 179 gfx::Size size(kWidth, kHeight); |
179 scoped_refptr<media::VideoFrame> video_frame = | 180 scoped_refptr<media::VideoFrame> video_frame = |
180 media::VideoFrame::CreateFrame( | 181 media::VideoFrame::CreateFrame( |
181 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); | 182 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); |
182 PopulateVideoFrame(video_frame, kPixelValue); | 183 PopulateVideoFrame(video_frame, last_pixel_value_++); |
183 return video_frame; | 184 return video_frame; |
184 } | 185 } |
185 | 186 |
186 void RunTasks(int during_ms) { | 187 void RunTasks(int during_ms) { |
187 for (int i = 0; i < during_ms; ++i) { | 188 for (int i = 0; i < during_ms; ++i) { |
188 // Call process the timers every 1 ms. | 189 // Call process the timers every 1 ms. |
189 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); | 190 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); |
190 task_runner_->RunTasks(); | 191 task_runner_->RunTasks(); |
191 } | 192 } |
192 } | 193 } |
193 | 194 |
194 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | 195 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
195 TestPacketSender transport_; | 196 TestPacketSender transport_; |
196 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | 197 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; |
197 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 198 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
198 scoped_ptr<PeerVideoSender> video_sender_; | 199 scoped_ptr<PeerVideoSender> video_sender_; |
199 scoped_refptr<CastEnvironment> cast_environment_; | 200 scoped_refptr<CastEnvironment> cast_environment_; |
| 201 int last_pixel_value_; |
200 | 202 |
201 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); | 203 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); |
202 }; | 204 }; |
203 | 205 |
204 TEST_F(VideoSenderTest, BuiltInEncoder) { | 206 TEST_F(VideoSenderTest, BuiltInEncoder) { |
205 InitEncoder(false); | 207 InitEncoder(false); |
206 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 208 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
207 | 209 |
208 const base::TimeTicks capture_time = testing_clock_->NowTicks(); | 210 const base::TimeTicks capture_time = testing_clock_->NowTicks(); |
209 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 211 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); | 312 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); |
311 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); | 313 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); |
312 | 314 |
313 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); | 315 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); |
314 } | 316 } |
315 | 317 |
316 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { | 318 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { |
317 InitEncoder(false); | 319 InitEncoder(false); |
318 // Send a stream of frames and don't ACK; by default we shouldn't have more | 320 // Send a stream of frames and don't ACK; by default we shouldn't have more |
319 // than 4 frames in flight. | 321 // than 4 frames in flight. |
320 // Store size in packets of frame 0, as it should be resent sue to timeout. | |
321 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 322 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
322 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 323 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
323 RunTasks(33); | 324 RunTasks(33); |
324 const int size_of_frame0 = transport_.number_of_rtp_packets(); | |
325 | 325 |
326 for (int i = 1; i < 4; ++i) { | 326 // Send 3 more frames and record the number of packets sent. |
| 327 for (int i = 0; i < 3; ++i) { |
327 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 328 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
328 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 329 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
329 RunTasks(33); | 330 RunTasks(33); |
330 } | 331 } |
| 332 const int number_of_packets_sent = transport_.number_of_rtp_packets(); |
331 | 333 |
332 const int number_of_packets_sent = transport_.number_of_rtp_packets(); | 334 // Send 3 more frames - they should not be encoded, as we have not received |
333 // Send 4 more frames - they should not be sent to the transport, as we have | 335 // any acks. |
334 // received any acks. | |
335 for (int i = 0; i < 3; ++i) { | 336 for (int i = 0; i < 3; ++i) { |
336 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 337 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
337 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 338 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
338 RunTasks(33); | 339 RunTasks(33); |
339 } | 340 } |
340 | 341 |
341 EXPECT_EQ(number_of_packets_sent + size_of_frame0, | 342 // We expect a frame to be retransmitted because of duplicated ACKs. |
| 343 // Only one packet of the frame is re-transmitted. |
| 344 EXPECT_EQ(number_of_packets_sent + 1, |
342 transport_.number_of_rtp_packets()); | 345 transport_.number_of_rtp_packets()); |
343 | 346 |
344 // Start acking and make sure we're back to steady-state. | 347 // Start acking and make sure we're back to steady-state. |
345 RtcpCastMessage cast_feedback(1); | 348 RtcpCastMessage cast_feedback(1); |
346 cast_feedback.media_ssrc_ = 2; | 349 cast_feedback.media_ssrc_ = 2; |
347 cast_feedback.ack_frame_id_ = 0; | 350 cast_feedback.ack_frame_id_ = 0; |
348 video_sender_->OnReceivedCastFeedback(cast_feedback); | 351 video_sender_->OnReceivedCastFeedback(cast_feedback); |
349 EXPECT_LE( | 352 EXPECT_LE( |
350 4, | 353 4, |
351 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 354 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
352 | 355 |
353 // Empty the pipeline. | 356 // Empty the pipeline. |
354 RunTasks(100); | 357 RunTasks(100); |
355 // Should have sent at least 7 packets. | 358 // Should have sent at least 7 packets. |
356 EXPECT_LE( | 359 EXPECT_LE( |
357 7, | 360 7, |
358 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 361 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
359 } | 362 } |
360 | 363 |
| 364 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { |
| 365 InitEncoder(false); |
| 366 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 367 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 368 RunTasks(33); |
| 369 RtcpCastMessage cast_feedback(1); |
| 370 cast_feedback.media_ssrc_ = 2; |
| 371 cast_feedback.ack_frame_id_ = 0; |
| 372 |
| 373 // Send 3 more frames but don't ACK. |
| 374 for (int i = 0; i < 3; ++i) { |
| 375 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 376 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 377 RunTasks(33); |
| 378 } |
| 379 const int number_of_packets_sent = transport_.number_of_rtp_packets(); |
| 380 |
| 381 // Send duplicated ACKs and mix some invalid NACKs. |
| 382 for (int i = 0; i < 10; ++i) { |
| 383 RtcpCastMessage ack_feedback(1); |
| 384 ack_feedback.media_ssrc_ = 2; |
| 385 ack_feedback.ack_frame_id_ = 0; |
| 386 RtcpCastMessage nack_feedback(1); |
| 387 nack_feedback.media_ssrc_ = 2; |
| 388 nack_feedback.missing_frames_and_packets_[255] = PacketIdSet(); |
| 389 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 390 video_sender_->OnReceivedCastFeedback(nack_feedback); |
| 391 } |
| 392 EXPECT_EQ(number_of_packets_sent, transport_.number_of_rtp_packets()); |
| 393 |
| 394 // Re-transmit one packet because of duplicated ACKs. |
| 395 for (int i = 0; i < 3; ++i) { |
| 396 RtcpCastMessage ack_feedback(1); |
| 397 ack_feedback.media_ssrc_ = 2; |
| 398 ack_feedback.ack_frame_id_ = 0; |
| 399 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 400 } |
| 401 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); |
| 402 } |
| 403 |
361 } // namespace cast | 404 } // namespace cast |
362 } // namespace media | 405 } // namespace media |
OLD | NEW |