| 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 |