| 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(500)); |
| 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 |