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 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); | 310 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); |
311 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); | 311 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); |
312 | 312 |
313 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); | 313 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); |
314 } | 314 } |
315 | 315 |
316 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { | 316 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { |
317 InitEncoder(false); | 317 InitEncoder(false); |
318 // Send a stream of frames and don't ACK; by default we shouldn't have more | 318 // Send a stream of frames and don't ACK; by default we shouldn't have more |
319 // than 4 frames in flight. | 319 // 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(); | 320 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
322 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 321 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
323 RunTasks(33); | 322 RunTasks(33); |
324 const int size_of_frame0 = transport_.number_of_rtp_packets(); | |
325 | 323 |
326 for (int i = 1; i < 4; ++i) { | 324 // Send 3 more frames and record the number of packets sent. |
| 325 for (int i = 0; i < 3; ++i) { |
327 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 326 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
328 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 327 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
329 RunTasks(33); | 328 RunTasks(33); |
330 } | 329 } |
| 330 const int number_of_packets_sent = transport_.number_of_rtp_packets(); |
331 | 331 |
332 const int number_of_packets_sent = transport_.number_of_rtp_packets(); | 332 // 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 | 333 // any acks. |
334 // received any acks. | |
335 for (int i = 0; i < 3; ++i) { | 334 for (int i = 0; i < 3; ++i) { |
336 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 335 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
337 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 336 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
338 RunTasks(33); | 337 RunTasks(33); |
339 } | 338 } |
340 | 339 |
341 EXPECT_EQ(number_of_packets_sent + size_of_frame0, | 340 // We expect a frame to be retransmitted because of duplicated ACKs. |
| 341 // Only one packet of the frame is re-transmitted. |
| 342 EXPECT_EQ(number_of_packets_sent + 1, |
342 transport_.number_of_rtp_packets()); | 343 transport_.number_of_rtp_packets()); |
343 | 344 |
344 // Start acking and make sure we're back to steady-state. | 345 // Start acking and make sure we're back to steady-state. |
345 RtcpCastMessage cast_feedback(1); | 346 RtcpCastMessage cast_feedback(1); |
346 cast_feedback.media_ssrc_ = 2; | 347 cast_feedback.media_ssrc_ = 2; |
347 cast_feedback.ack_frame_id_ = 0; | 348 cast_feedback.ack_frame_id_ = 0; |
348 video_sender_->OnReceivedCastFeedback(cast_feedback); | 349 video_sender_->OnReceivedCastFeedback(cast_feedback); |
349 EXPECT_LE( | 350 EXPECT_LE( |
350 4, | 351 4, |
351 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 352 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
352 | 353 |
353 // Empty the pipeline. | 354 // Empty the pipeline. |
354 RunTasks(100); | 355 RunTasks(100); |
355 // Should have sent at least 7 packets. | 356 // Should have sent at least 7 packets. |
356 EXPECT_LE( | 357 EXPECT_LE( |
357 7, | 358 7, |
358 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 359 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
359 } | 360 } |
360 | 361 |
| 362 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { |
| 363 InitEncoder(false); |
| 364 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 365 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 366 RunTasks(33); |
| 367 RtcpCastMessage cast_feedback(1); |
| 368 cast_feedback.media_ssrc_ = 2; |
| 369 cast_feedback.ack_frame_id_ = 0; |
| 370 |
| 371 // Send 3 more frames but don't ACK. |
| 372 for (int i = 0; i < 3; ++i) { |
| 373 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 374 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 375 RunTasks(33); |
| 376 } |
| 377 const int number_of_packets_sent = transport_.number_of_rtp_packets(); |
| 378 |
| 379 // Send duplicated ACKs and mix some invalid NACKs. |
| 380 for (int i = 0; i < 10; ++i) { |
| 381 RtcpCastMessage ack_feedback(1); |
| 382 ack_feedback.media_ssrc_ = 2; |
| 383 ack_feedback.ack_frame_id_ = 0; |
| 384 RtcpCastMessage nack_feedback(1); |
| 385 nack_feedback.media_ssrc_ = 2; |
| 386 nack_feedback.missing_frames_and_packets_[255] = PacketIdSet(); |
| 387 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 388 video_sender_->OnReceivedCastFeedback(nack_feedback); |
| 389 } |
| 390 EXPECT_EQ(number_of_packets_sent, transport_.number_of_rtp_packets()); |
| 391 |
| 392 // Re-transmit one packet because of duplicated ACKs. |
| 393 for (int i = 0; i < 3; ++i) { |
| 394 RtcpCastMessage ack_feedback(1); |
| 395 ack_feedback.media_ssrc_ = 2; |
| 396 ack_feedback.ack_frame_id_ = 0; |
| 397 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 398 } |
| 399 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); |
| 400 } |
| 401 |
361 } // namespace cast | 402 } // namespace cast |
362 } // namespace media | 403 } // namespace media |
OLD | NEW |