Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: media/cast/sender/video_sender_unittest.cc

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address dcheng's comments. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/cast/sender/video_sender.cc ('k') | media/cast/test/cast_benchmarks.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/cast/sender/video_sender.cc ('k') | media/cast/test/cast_benchmarks.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698