OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, | 117 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
118 CastTransportSender* const transport_sender) | 118 CastTransportSender* const transport_sender) |
119 : VideoSender(cast_environment, | 119 : VideoSender(cast_environment, |
120 video_config, | 120 video_config, |
121 status_change_cb, | 121 status_change_cb, |
122 create_vea_cb, | 122 create_vea_cb, |
123 create_video_encode_mem_cb, | 123 create_video_encode_mem_cb, |
124 transport_sender, | 124 transport_sender, |
125 base::Bind(&IgnorePlayoutDelayChanges)) {} | 125 base::Bind(&IgnorePlayoutDelayChanges)) {} |
126 using VideoSender::OnReceivedCastFeedback; | 126 using VideoSender::OnReceivedCastFeedback; |
| 127 using VideoSender::OnReceivedPli; |
127 }; | 128 }; |
128 | 129 |
129 class TransportClient : public CastTransportSender::Client { | 130 class TransportClient : public CastTransportSender::Client { |
130 public: | 131 public: |
131 TransportClient() {} | 132 TransportClient() {} |
132 | 133 |
133 void OnStatusChanged(CastTransportStatus status) final { | 134 void OnStatusChanged(CastTransportStatus status) final { |
134 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); | 135 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); |
135 }; | 136 }; |
136 void OnLoggingEventsReceived( | 137 void OnLoggingEventsReceived( |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 | 330 |
330 // Make sure that we send at least one RTCP packet. | 331 // Make sure that we send at least one RTCP packet. |
331 base::TimeDelta max_rtcp_timeout = | 332 base::TimeDelta max_rtcp_timeout = |
332 base::TimeDelta::FromMilliseconds(1 + kRtcpReportIntervalMs * 3 / 2); | 333 base::TimeDelta::FromMilliseconds(1 + kRtcpReportIntervalMs * 3 / 2); |
333 | 334 |
334 RunTasks(max_rtcp_timeout.InMilliseconds()); | 335 RunTasks(max_rtcp_timeout.InMilliseconds()); |
335 EXPECT_LE(1, transport_->number_of_rtp_packets()); | 336 EXPECT_LE(1, transport_->number_of_rtp_packets()); |
336 EXPECT_LE(1, transport_->number_of_rtcp_packets()); | 337 EXPECT_LE(1, transport_->number_of_rtcp_packets()); |
337 // Build Cast msg and expect RTCP packet. | 338 // Build Cast msg and expect RTCP packet. |
338 RtcpCastMessage cast_feedback(1); | 339 RtcpCastMessage cast_feedback(1); |
339 cast_feedback.media_ssrc = 2; | 340 cast_feedback.remote_ssrc = 2; |
340 cast_feedback.ack_frame_id = 0; | 341 cast_feedback.ack_frame_id = 0; |
341 video_sender_->OnReceivedCastFeedback(cast_feedback); | 342 video_sender_->OnReceivedCastFeedback(cast_feedback); |
342 RunTasks(max_rtcp_timeout.InMilliseconds()); | 343 RunTasks(max_rtcp_timeout.InMilliseconds()); |
343 EXPECT_LE(1, transport_->number_of_rtcp_packets()); | 344 EXPECT_LE(1, transport_->number_of_rtcp_packets()); |
344 } | 345 } |
345 | 346 |
346 TEST_F(VideoSenderTest, ResendTimer) { | 347 TEST_F(VideoSenderTest, ResendTimer) { |
347 InitEncoder(false, true); | 348 InitEncoder(false, true); |
348 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 349 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
349 | 350 |
350 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 351 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
351 | 352 |
352 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 353 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
353 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 354 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
354 | 355 |
355 // ACK the key frame. | 356 // ACK the key frame. |
356 RtcpCastMessage cast_feedback(1); | 357 RtcpCastMessage cast_feedback(1); |
357 cast_feedback.media_ssrc = 2; | 358 cast_feedback.remote_ssrc = 2; |
358 cast_feedback.ack_frame_id = 0; | 359 cast_feedback.ack_frame_id = 0; |
359 video_sender_->OnReceivedCastFeedback(cast_feedback); | 360 video_sender_->OnReceivedCastFeedback(cast_feedback); |
360 | 361 |
361 video_frame = GetNewVideoFrame(); | 362 video_frame = GetNewVideoFrame(); |
362 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 363 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
363 | 364 |
364 base::TimeDelta max_resend_timeout = | 365 base::TimeDelta max_resend_timeout = |
365 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); | 366 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); |
366 | 367 |
367 // Make sure that we do a re-send. | 368 // Make sure that we do a re-send. |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 431 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
431 RunTasks(33); | 432 RunTasks(33); |
432 } | 433 } |
433 | 434 |
434 // We expect a frame to be retransmitted because of duplicated ACKs. | 435 // We expect a frame to be retransmitted because of duplicated ACKs. |
435 // Only one packet of the frame is re-transmitted. | 436 // Only one packet of the frame is re-transmitted. |
436 EXPECT_EQ(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); | 437 EXPECT_EQ(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); |
437 | 438 |
438 // Start acking and make sure we're back to steady-state. | 439 // Start acking and make sure we're back to steady-state. |
439 RtcpCastMessage cast_feedback(1); | 440 RtcpCastMessage cast_feedback(1); |
440 cast_feedback.media_ssrc = 2; | 441 cast_feedback.remote_ssrc = 2; |
441 cast_feedback.ack_frame_id = 0; | 442 cast_feedback.ack_frame_id = 0; |
442 video_sender_->OnReceivedCastFeedback(cast_feedback); | 443 video_sender_->OnReceivedCastFeedback(cast_feedback); |
443 EXPECT_LE(4, transport_->number_of_rtp_packets() + | 444 EXPECT_LE(4, transport_->number_of_rtp_packets() + |
444 transport_->number_of_rtcp_packets()); | 445 transport_->number_of_rtcp_packets()); |
445 | 446 |
446 // Empty the pipeline. | 447 // Empty the pipeline. |
447 RunTasks(100); | 448 RunTasks(100); |
448 // Should have sent at least 7 packets. | 449 // Should have sent at least 7 packets. |
449 EXPECT_LE(7, transport_->number_of_rtp_packets() + | 450 EXPECT_LE(7, transport_->number_of_rtp_packets() + |
450 transport_->number_of_rtcp_packets()); | 451 transport_->number_of_rtcp_packets()); |
451 } | 452 } |
452 | 453 |
453 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { | 454 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { |
454 InitEncoder(false, true); | 455 InitEncoder(false, true); |
455 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 456 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
456 | 457 |
457 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 458 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
458 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 459 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
459 RunTasks(33); | 460 RunTasks(33); |
460 RtcpCastMessage cast_feedback(1); | 461 RtcpCastMessage cast_feedback(1); |
461 cast_feedback.media_ssrc = 2; | 462 cast_feedback.remote_ssrc = 2; |
462 cast_feedback.ack_frame_id = 0; | 463 cast_feedback.ack_frame_id = 0; |
463 | 464 |
464 // Send 3 more frames but don't ACK. | 465 // Send 3 more frames but don't ACK. |
465 for (int i = 0; i < 3; ++i) { | 466 for (int i = 0; i < 3; ++i) { |
466 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 467 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
467 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 468 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
468 RunTasks(33); | 469 RunTasks(33); |
469 } | 470 } |
470 const int number_of_packets_sent = transport_->number_of_rtp_packets(); | 471 const int number_of_packets_sent = transport_->number_of_rtp_packets(); |
471 | 472 |
472 // Send duplicated ACKs and mix some invalid NACKs. | 473 // Send duplicated ACKs and mix some invalid NACKs. |
473 for (int i = 0; i < 10; ++i) { | 474 for (int i = 0; i < 10; ++i) { |
474 RtcpCastMessage ack_feedback(1); | 475 RtcpCastMessage ack_feedback(1); |
475 ack_feedback.media_ssrc = 2; | 476 ack_feedback.remote_ssrc = 2; |
476 ack_feedback.ack_frame_id = 0; | 477 ack_feedback.ack_frame_id = 0; |
477 RtcpCastMessage nack_feedback(1); | 478 RtcpCastMessage nack_feedback(1); |
478 nack_feedback.media_ssrc = 2; | 479 nack_feedback.remote_ssrc = 2; |
479 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); | 480 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); |
480 video_sender_->OnReceivedCastFeedback(ack_feedback); | 481 video_sender_->OnReceivedCastFeedback(ack_feedback); |
481 video_sender_->OnReceivedCastFeedback(nack_feedback); | 482 video_sender_->OnReceivedCastFeedback(nack_feedback); |
482 } | 483 } |
483 EXPECT_EQ(number_of_packets_sent, transport_->number_of_rtp_packets()); | 484 EXPECT_EQ(number_of_packets_sent, transport_->number_of_rtp_packets()); |
484 | 485 |
485 // Re-transmit one packet because of duplicated ACKs. | 486 // Re-transmit one packet because of duplicated ACKs. |
486 for (int i = 0; i < 3; ++i) { | 487 for (int i = 0; i < 3; ++i) { |
487 RtcpCastMessage ack_feedback(1); | 488 RtcpCastMessage ack_feedback(1); |
488 ack_feedback.media_ssrc = 2; | 489 ack_feedback.remote_ssrc = 2; |
489 ack_feedback.ack_frame_id = 0; | 490 ack_feedback.ack_frame_id = 0; |
490 video_sender_->OnReceivedCastFeedback(ack_feedback); | 491 video_sender_->OnReceivedCastFeedback(ack_feedback); |
491 } | 492 } |
492 EXPECT_EQ(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); | 493 EXPECT_EQ(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); |
493 } | 494 } |
494 | 495 |
495 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { | 496 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { |
496 InitEncoder(false, true); | 497 InitEncoder(false, true); |
497 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 498 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
498 | 499 |
499 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 500 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
500 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 501 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
501 RunTasks(33); | 502 RunTasks(33); |
502 RtcpCastMessage cast_feedback(1); | 503 RtcpCastMessage cast_feedback(1); |
503 cast_feedback.media_ssrc = 2; | 504 cast_feedback.remote_ssrc = 2; |
504 cast_feedback.ack_frame_id = 0; | 505 cast_feedback.ack_frame_id = 0; |
505 | 506 |
506 // Send 2 more frames but don't ACK. | 507 // Send 2 more frames but don't ACK. |
507 for (int i = 0; i < 2; ++i) { | 508 for (int i = 0; i < 2; ++i) { |
508 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 509 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
509 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 510 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
510 RunTasks(33); | 511 RunTasks(33); |
511 } | 512 } |
512 // Pause the transport | 513 // Pause the transport |
513 transport_->SetPause(true); | 514 transport_->SetPause(true); |
514 | 515 |
515 // Insert one more video frame. | 516 // Insert one more video frame. |
516 video_frame = GetLargeNewVideoFrame(); | 517 video_frame = GetLargeNewVideoFrame(); |
517 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 518 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
518 RunTasks(33); | 519 RunTasks(33); |
519 | 520 |
520 const int number_of_packets_sent = transport_->number_of_rtp_packets(); | 521 const int number_of_packets_sent = transport_->number_of_rtp_packets(); |
521 | 522 |
522 // Send duplicated ACKs and mix some invalid NACKs. | 523 // Send duplicated ACKs and mix some invalid NACKs. |
523 for (int i = 0; i < 10; ++i) { | 524 for (int i = 0; i < 10; ++i) { |
524 RtcpCastMessage ack_feedback(1); | 525 RtcpCastMessage ack_feedback(1); |
525 ack_feedback.media_ssrc = 2; | 526 ack_feedback.remote_ssrc = 2; |
526 ack_feedback.ack_frame_id = 0; | 527 ack_feedback.ack_frame_id = 0; |
527 RtcpCastMessage nack_feedback(1); | 528 RtcpCastMessage nack_feedback(1); |
528 nack_feedback.media_ssrc = 2; | 529 nack_feedback.remote_ssrc = 2; |
529 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); | 530 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); |
530 video_sender_->OnReceivedCastFeedback(ack_feedback); | 531 video_sender_->OnReceivedCastFeedback(ack_feedback); |
531 video_sender_->OnReceivedCastFeedback(nack_feedback); | 532 video_sender_->OnReceivedCastFeedback(nack_feedback); |
532 } | 533 } |
533 EXPECT_EQ(number_of_packets_sent, transport_->number_of_rtp_packets()); | 534 EXPECT_EQ(number_of_packets_sent, transport_->number_of_rtp_packets()); |
534 | 535 |
535 // Re-transmit one packet because of duplicated ACKs. | 536 // Re-transmit one packet because of duplicated ACKs. |
536 for (int i = 0; i < 3; ++i) { | 537 for (int i = 0; i < 3; ++i) { |
537 RtcpCastMessage ack_feedback(1); | 538 RtcpCastMessage ack_feedback(1); |
538 ack_feedback.media_ssrc = 2; | 539 ack_feedback.remote_ssrc = 2; |
539 ack_feedback.ack_frame_id = 0; | 540 ack_feedback.ack_frame_id = 0; |
540 video_sender_->OnReceivedCastFeedback(ack_feedback); | 541 video_sender_->OnReceivedCastFeedback(ack_feedback); |
541 } | 542 } |
542 | 543 |
543 transport_->SetPause(false); | 544 transport_->SetPause(false); |
544 RunTasks(100); | 545 RunTasks(100); |
545 EXPECT_LT(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); | 546 EXPECT_LT(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); |
546 } | 547 } |
547 | 548 |
548 TEST_F(VideoSenderTest, AcksCancelRetransmits) { | 549 TEST_F(VideoSenderTest, AcksCancelRetransmits) { |
549 InitEncoder(false, true); | 550 InitEncoder(false, true); |
550 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 551 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
551 | 552 |
552 transport_->SetPause(true); | 553 transport_->SetPause(true); |
553 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); | 554 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); |
554 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 555 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
555 RunTasks(33); | 556 RunTasks(33); |
556 | 557 |
557 // Frame should be in buffer, waiting. Now let's ack it. | 558 // Frame should be in buffer, waiting. Now let's ack it. |
558 RtcpCastMessage cast_feedback(1); | 559 RtcpCastMessage cast_feedback(1); |
559 cast_feedback.media_ssrc = 2; | 560 cast_feedback.remote_ssrc = 2; |
560 cast_feedback.ack_frame_id = 0; | 561 cast_feedback.ack_frame_id = 0; |
561 video_sender_->OnReceivedCastFeedback(cast_feedback); | 562 video_sender_->OnReceivedCastFeedback(cast_feedback); |
562 | 563 |
563 transport_->SetPause(false); | 564 transport_->SetPause(false); |
564 RunTasks(33); | 565 RunTasks(33); |
565 EXPECT_EQ(0, transport_->number_of_rtp_packets()); | 566 EXPECT_EQ(0, transport_->number_of_rtp_packets()); |
566 } | 567 } |
567 | 568 |
568 TEST_F(VideoSenderTest, CheckVideoFrameFactoryIsNull) { | 569 TEST_F(VideoSenderTest, CheckVideoFrameFactoryIsNull) { |
569 InitEncoder(false, true); | 570 InitEncoder(false, true); |
(...skipping 25 matching lines...) Expand all Loading... |
595 double utilization = -1.0; | 596 double utilization = -1.0; |
596 EXPECT_TRUE(video_frame->metadata()->GetDouble( | 597 EXPECT_TRUE(video_frame->metadata()->GetDouble( |
597 media::VideoFrameMetadata::RESOURCE_UTILIZATION, &utilization)); | 598 media::VideoFrameMetadata::RESOURCE_UTILIZATION, &utilization)); |
598 EXPECT_LE(0.0, utilization); | 599 EXPECT_LE(0.0, utilization); |
599 if (i == 0) | 600 if (i == 0) |
600 EXPECT_GE(1.0, utilization); // Key frames never exceed 1.0. | 601 EXPECT_GE(1.0, utilization); // Key frames never exceed 1.0. |
601 DVLOG(1) << "Utilization computed by VideoSender is: " << utilization; | 602 DVLOG(1) << "Utilization computed by VideoSender is: " << utilization; |
602 } | 603 } |
603 } | 604 } |
604 | 605 |
| 606 TEST_F(VideoSenderTest, CancelSendingOnReceivingPli) { |
| 607 InitEncoder(false, true); |
| 608 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 609 |
| 610 // Send a frame and ACK it. |
| 611 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 612 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 613 RunTasks(33); |
| 614 |
| 615 RtcpCastMessage cast_feedback(1); |
| 616 cast_feedback.remote_ssrc = 2; |
| 617 cast_feedback.ack_frame_id = 0; |
| 618 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 619 |
| 620 transport_->SetPause(true); |
| 621 // Send three more frames. |
| 622 for (int i = 0; i < 3; i++) { |
| 623 video_frame = GetNewVideoFrame(); |
| 624 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 625 RunTasks(33); |
| 626 } |
| 627 EXPECT_EQ(1, transport_->number_of_rtp_packets()); |
| 628 |
| 629 // Frames should be in buffer, waiting. |
| 630 // Received PLI from receiver. |
| 631 video_sender_->OnReceivedPli(); |
| 632 video_frame = GetNewVideoFrame(); |
| 633 video_sender_->InsertRawVideoFrame( |
| 634 video_frame, |
| 635 testing_clock_->NowTicks() + base::TimeDelta::FromMilliseconds(1000)); |
| 636 RunTasks(33); |
| 637 transport_->SetPause(false); |
| 638 RunTasks(33); |
| 639 EXPECT_EQ(2, transport_->number_of_rtp_packets()); |
| 640 } |
| 641 |
605 } // namespace cast | 642 } // namespace cast |
606 } // namespace media | 643 } // namespace media |
OLD | NEW |