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

Side by Side Diff: webrtc/video/full_stack.cc

Issue 1298613004: Add scrolling screenshare test to full_stack perf tests. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 4 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 22 matching lines...) Expand all
33 #include "webrtc/test/frame_generator_capturer.h" 33 #include "webrtc/test/frame_generator_capturer.h"
34 #include "webrtc/test/statistics.h" 34 #include "webrtc/test/statistics.h"
35 #include "webrtc/test/testsupport/fileutils.h" 35 #include "webrtc/test/testsupport/fileutils.h"
36 #include "webrtc/typedefs.h" 36 #include "webrtc/typedefs.h"
37 37
38 namespace webrtc { 38 namespace webrtc {
39 39
40 static const int kFullStackTestDurationSecs = 60; 40 static const int kFullStackTestDurationSecs = 60;
41 static const int kSendStatsPollingIntervalMs = 1000; 41 static const int kSendStatsPollingIntervalMs = 1000;
42 42
43 enum class ContentMode {
44 kRealTimeVideo,
45 kScreensharingStaticImage,
46 kScreensharingScrollingImage,
47 };
48
43 struct FullStackTestParams { 49 struct FullStackTestParams {
44 const char* test_label; 50 const char* test_label;
45 struct { 51 struct {
46 const char* name; 52 const char* name;
47 size_t width, height; 53 size_t width, height;
48 int fps; 54 int fps;
49 } clip; 55 } clip;
50 bool screenshare; 56 ContentMode mode;
51 int min_bitrate_bps; 57 int min_bitrate_bps;
52 int target_bitrate_bps; 58 int target_bitrate_bps;
53 int max_bitrate_bps; 59 int max_bitrate_bps;
54 double avg_psnr_threshold; 60 double avg_psnr_threshold;
55 double avg_ssim_threshold; 61 double avg_ssim_threshold;
56 int test_durations_secs; 62 int test_durations_secs;
57 std::string codec; 63 std::string codec;
58 FakeNetworkPipe::Config link; 64 FakeNetworkPipe::Config link;
59 }; 65 };
60 66
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 VideoStream* stream = &encoder_config_.streams[0]; 530 VideoStream* stream = &encoder_config_.streams[0];
525 stream->width = params.clip.width; 531 stream->width = params.clip.width;
526 stream->height = params.clip.height; 532 stream->height = params.clip.height;
527 stream->min_bitrate_bps = params.min_bitrate_bps; 533 stream->min_bitrate_bps = params.min_bitrate_bps;
528 stream->target_bitrate_bps = params.target_bitrate_bps; 534 stream->target_bitrate_bps = params.target_bitrate_bps;
529 stream->max_bitrate_bps = params.max_bitrate_bps; 535 stream->max_bitrate_bps = params.max_bitrate_bps;
530 stream->max_framerate = params.clip.fps; 536 stream->max_framerate = params.clip.fps;
531 537
532 VideoCodecVP8 vp8_settings; 538 VideoCodecVP8 vp8_settings;
533 VideoCodecVP9 vp9_settings; 539 VideoCodecVP9 vp9_settings;
534 if (params.screenshare) { 540 if (params.mode == ContentMode::kScreensharingStaticImage ||
541 params.mode == ContentMode::kScreensharingScrollingImage) {
535 encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; 542 encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
536 encoder_config_.min_transmit_bitrate_bps = 400 * 1000; 543 encoder_config_.min_transmit_bitrate_bps = 400 * 1000;
537 if (params.codec == "VP8") { 544 if (params.codec == "VP8") {
538 vp8_settings = VideoEncoder::GetDefaultVp8Settings(); 545 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
539 vp8_settings.denoisingOn = false; 546 vp8_settings.denoisingOn = false;
540 vp8_settings.frameDroppingOn = false; 547 vp8_settings.frameDroppingOn = false;
541 vp8_settings.numberOfTemporalLayers = 2; 548 vp8_settings.numberOfTemporalLayers = 2;
542 encoder_config_.encoder_specific_settings = &vp8_settings; 549 encoder_config_.encoder_specific_settings = &vp8_settings;
543 } else if (params.codec == "VP9") { 550 } else if (params.codec == "VP9") {
544 vp9_settings = VideoEncoder::GetDefaultVp9Settings(); 551 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
(...skipping 13 matching lines...) Expand all
558 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].ssrc = kSendRtxSsrcs[0]; 565 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].ssrc = kSendRtxSsrcs[0];
559 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].payload_type = 566 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].payload_type =
560 kSendRtxPayloadType; 567 kSendRtxPayloadType;
561 568
562 for (auto& config : receive_configs_) 569 for (auto& config : receive_configs_)
563 config.pre_decode_callback = &analyzer; 570 config.pre_decode_callback = &analyzer;
564 CreateStreams(); 571 CreateStreams();
565 analyzer.input_ = send_stream_->Input(); 572 analyzer.input_ = send_stream_->Input();
566 analyzer.send_stream_ = send_stream_; 573 analyzer.send_stream_ = send_stream_;
567 574
568 if (params.screenshare) { 575 std::vector<std::string> slides;
569 std::vector<std::string> slides; 576 slides.push_back(test::ResourcePath("web_screenshot_1850_1110", "yuv"));
570 slides.push_back(test::ResourcePath("web_screenshot_1850_1110", "yuv")); 577 slides.push_back(test::ResourcePath("presentation_1850_1110", "yuv"));
571 slides.push_back(test::ResourcePath("presentation_1850_1110", "yuv")); 578 slides.push_back(test::ResourcePath("photo_1850_1110", "yuv"));
572 slides.push_back(test::ResourcePath("photo_1850_1110", "yuv")); 579 slides.push_back(test::ResourcePath("difficult_photo_1850_1110", "yuv"));
573 slides.push_back(test::ResourcePath("difficult_photo_1850_1110", "yuv")); 580 size_t kSlidesWidth = 1850;
581 size_t kSlidesHeight = 1110;
574 582
575 rtc::scoped_ptr<test::FrameGenerator> frame_generator( 583 Clock* clock = Clock::GetRealTimeClock();
576 test::FrameGenerator::CreateFromYuvFile( 584 rtc::scoped_ptr<test::FrameGenerator> frame_generator;
577 slides, 1850, 1110,
578 10 * params.clip.fps) // Cycle image every 10 seconds.
579 );
580 frame_generator_capturer_.reset(new test::FrameGeneratorCapturer(
581 Clock::GetRealTimeClock(), &analyzer, frame_generator.release(),
582 params.clip.fps));
583 ASSERT_TRUE(frame_generator_capturer_->Init());
584 } else {
585 frame_generator_capturer_.reset(
586 test::FrameGeneratorCapturer::CreateFromYuvFile(
587 &analyzer, test::ResourcePath(params.clip.name, "yuv"),
588 params.clip.width, params.clip.height, params.clip.fps,
589 Clock::GetRealTimeClock()));
590 585
591 ASSERT_TRUE(frame_generator_capturer_.get() != nullptr) 586 switch (params.mode) {
592 << "Could not create capturer for " << params.clip.name 587 case ContentMode::kRealTimeVideo:
593 << ".yuv. Is this resource file present?"; 588 frame_generator.reset(test::FrameGenerator::CreateFromYuvFile(
589 std::vector<std::string>(1,
590 test::ResourcePath(params.clip.name, "yuv")),
591 params.clip.width, params.clip.height, 1));
592 break;
593 case ContentMode::kScreensharingScrollingImage:
594 frame_generator.reset(
595 test::FrameGenerator::CreateScrollingInputFromYuvFiles(
596 clock, slides, kSlidesWidth, kSlidesHeight, params.clip.width,
597 params.clip.height, 2000,
598 8000)); // Scroll for 2 seconds, then pause for 8.
599 break;
600 case ContentMode::kScreensharingStaticImage:
601 frame_generator.reset(test::FrameGenerator::CreateFromYuvFile(
602 slides, kSlidesWidth, kSlidesHeight,
603 10 * params.clip.fps)); // Cycle image every 10 seconds.
604 break;
594 } 605 }
595 606
607 ASSERT_TRUE(frame_generator.get() != nullptr);
608 frame_generator_capturer_.reset(new test::FrameGeneratorCapturer(
609 clock, &analyzer, frame_generator.release(), params.clip.fps));
610 ASSERT_TRUE(frame_generator_capturer_->Init());
611
596 Start(); 612 Start();
597 613
598 analyzer.Wait(); 614 analyzer.Wait();
599 615
600 send_transport.StopSending(); 616 send_transport.StopSending();
601 recv_transport.StopSending(); 617 recv_transport.StopSending();
602 618
603 Stop(); 619 Stop();
604 620
605 DestroyStreams(); 621 DestroyStreams();
606 } 622 }
607 623
608 TEST_F(FullStackTest, ParisQcifWithoutPacketLoss) { 624 TEST_F(FullStackTest, ParisQcifWithoutPacketLoss) {
609 FullStackTestParams paris_qcif = {"net_delay_0_0_plr_0", 625 FullStackTestParams paris_qcif = {"net_delay_0_0_plr_0",
610 {"paris_qcif", 176, 144, 30}, 626 {"paris_qcif", 176, 144, 30},
611 false, 627 ContentMode::kRealTimeVideo,
612 300000, 628 300000,
613 300000, 629 300000,
614 300000, 630 300000,
615 36.0, 631 36.0,
616 0.96, 632 0.96,
617 kFullStackTestDurationSecs, 633 kFullStackTestDurationSecs,
618 "VP8"}; 634 "VP8"};
619 RunTest(paris_qcif); 635 RunTest(paris_qcif);
620 } 636 }
621 637
622 TEST_F(FullStackTest, ForemanCifWithoutPacketLoss) { 638 TEST_F(FullStackTest, ForemanCifWithoutPacketLoss) {
623 // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif. 639 // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
624 FullStackTestParams foreman_cif = {"foreman_cif_net_delay_0_0_plr_0", 640 FullStackTestParams foreman_cif = {"foreman_cif_net_delay_0_0_plr_0",
625 {"foreman_cif", 352, 288, 30}, 641 {"foreman_cif", 352, 288, 30},
626 false, 642 ContentMode::kRealTimeVideo,
627 700000, 643 700000,
628 700000, 644 700000,
629 700000, 645 700000,
630 0.0, 646 0.0,
631 0.0, 647 0.0,
632 kFullStackTestDurationSecs, 648 kFullStackTestDurationSecs,
633 "VP8"}; 649 "VP8"};
634 RunTest(foreman_cif); 650 RunTest(foreman_cif);
635 } 651 }
636 652
637 TEST_F(FullStackTest, ForemanCifPlr5) { 653 TEST_F(FullStackTest, ForemanCifPlr5) {
638 FullStackTestParams foreman_cif = {"foreman_cif_delay_50_0_plr_5", 654 FullStackTestParams foreman_cif = {"foreman_cif_delay_50_0_plr_5",
639 {"foreman_cif", 352, 288, 30}, 655 {"foreman_cif", 352, 288, 30},
640 false, 656 ContentMode::kRealTimeVideo,
641 30000, 657 30000,
642 500000, 658 500000,
643 2000000, 659 2000000,
644 0.0, 660 0.0,
645 0.0, 661 0.0,
646 kFullStackTestDurationSecs, 662 kFullStackTestDurationSecs,
647 "VP8"}; 663 "VP8"};
648 foreman_cif.link.loss_percent = 5; 664 foreman_cif.link.loss_percent = 5;
649 foreman_cif.link.queue_delay_ms = 50; 665 foreman_cif.link.queue_delay_ms = 50;
650 RunTest(foreman_cif); 666 RunTest(foreman_cif);
651 } 667 }
652 668
653 TEST_F(FullStackTest, ForemanCif500kbps) { 669 TEST_F(FullStackTest, ForemanCif500kbps) {
654 FullStackTestParams foreman_cif = {"foreman_cif_500kbps", 670 FullStackTestParams foreman_cif = {"foreman_cif_500kbps",
655 {"foreman_cif", 352, 288, 30}, 671 {"foreman_cif", 352, 288, 30},
656 false, 672 ContentMode::kRealTimeVideo,
657 30000, 673 30000,
658 500000, 674 500000,
659 2000000, 675 2000000,
660 0.0, 676 0.0,
661 0.0, 677 0.0,
662 kFullStackTestDurationSecs, 678 kFullStackTestDurationSecs,
663 "VP8"}; 679 "VP8"};
664 foreman_cif.link.queue_length_packets = 0; 680 foreman_cif.link.queue_length_packets = 0;
665 foreman_cif.link.queue_delay_ms = 0; 681 foreman_cif.link.queue_delay_ms = 0;
666 foreman_cif.link.link_capacity_kbps = 500; 682 foreman_cif.link.link_capacity_kbps = 500;
667 RunTest(foreman_cif); 683 RunTest(foreman_cif);
668 } 684 }
669 685
670 TEST_F(FullStackTest, ForemanCif500kbpsLimitedQueue) { 686 TEST_F(FullStackTest, ForemanCif500kbpsLimitedQueue) {
671 FullStackTestParams foreman_cif = {"foreman_cif_500kbps_32pkts_queue", 687 FullStackTestParams foreman_cif = {"foreman_cif_500kbps_32pkts_queue",
672 {"foreman_cif", 352, 288, 30}, 688 {"foreman_cif", 352, 288, 30},
673 false, 689 ContentMode::kRealTimeVideo,
674 30000, 690 30000,
675 500000, 691 500000,
676 2000000, 692 2000000,
677 0.0, 693 0.0,
678 0.0, 694 0.0,
679 kFullStackTestDurationSecs, 695 kFullStackTestDurationSecs,
680 "VP8"}; 696 "VP8"};
681 foreman_cif.link.queue_length_packets = 32; 697 foreman_cif.link.queue_length_packets = 32;
682 foreman_cif.link.queue_delay_ms = 0; 698 foreman_cif.link.queue_delay_ms = 0;
683 foreman_cif.link.link_capacity_kbps = 500; 699 foreman_cif.link.link_capacity_kbps = 500;
684 RunTest(foreman_cif); 700 RunTest(foreman_cif);
685 } 701 }
686 702
687 TEST_F(FullStackTest, ForemanCif500kbps100ms) { 703 TEST_F(FullStackTest, ForemanCif500kbps100ms) {
688 FullStackTestParams foreman_cif = {"foreman_cif_500kbps_100ms", 704 FullStackTestParams foreman_cif = {"foreman_cif_500kbps_100ms",
689 {"foreman_cif", 352, 288, 30}, 705 {"foreman_cif", 352, 288, 30},
690 false, 706 ContentMode::kRealTimeVideo,
691 30000, 707 30000,
692 500000, 708 500000,
693 2000000, 709 2000000,
694 0.0, 710 0.0,
695 0.0, 711 0.0,
696 kFullStackTestDurationSecs, 712 kFullStackTestDurationSecs,
697 "VP8"}; 713 "VP8"};
698 foreman_cif.link.queue_length_packets = 0; 714 foreman_cif.link.queue_length_packets = 0;
699 foreman_cif.link.queue_delay_ms = 100; 715 foreman_cif.link.queue_delay_ms = 100;
700 foreman_cif.link.link_capacity_kbps = 500; 716 foreman_cif.link.link_capacity_kbps = 500;
701 RunTest(foreman_cif); 717 RunTest(foreman_cif);
702 } 718 }
703 719
704 TEST_F(FullStackTest, ForemanCif500kbps100msLimitedQueue) { 720 TEST_F(FullStackTest, ForemanCif500kbps100msLimitedQueue) {
705 FullStackTestParams foreman_cif = {"foreman_cif_500kbps_100ms_32pkts_queue", 721 FullStackTestParams foreman_cif = {"foreman_cif_500kbps_100ms_32pkts_queue",
706 {"foreman_cif", 352, 288, 30}, 722 {"foreman_cif", 352, 288, 30},
707 false, 723 ContentMode::kRealTimeVideo,
708 30000, 724 30000,
709 500000, 725 500000,
710 2000000, 726 2000000,
711 0.0, 727 0.0,
712 0.0, 728 0.0,
713 kFullStackTestDurationSecs, 729 kFullStackTestDurationSecs,
714 "VP8"}; 730 "VP8"};
715 foreman_cif.link.queue_length_packets = 32; 731 foreman_cif.link.queue_length_packets = 32;
716 foreman_cif.link.queue_delay_ms = 100; 732 foreman_cif.link.queue_delay_ms = 100;
717 foreman_cif.link.link_capacity_kbps = 500; 733 foreman_cif.link.link_capacity_kbps = 500;
718 RunTest(foreman_cif); 734 RunTest(foreman_cif);
719 } 735 }
720 736
721 TEST_F(FullStackTest, ForemanCif1000kbps100msLimitedQueue) { 737 TEST_F(FullStackTest, ForemanCif1000kbps100msLimitedQueue) {
722 FullStackTestParams foreman_cif = {"foreman_cif_1000kbps_100ms_32pkts_queue", 738 FullStackTestParams foreman_cif = {"foreman_cif_1000kbps_100ms_32pkts_queue",
723 {"foreman_cif", 352, 288, 30}, 739 {"foreman_cif", 352, 288, 30},
724 false, 740 ContentMode::kRealTimeVideo,
725 30000, 741 30000,
726 2000000, 742 2000000,
727 2000000, 743 2000000,
728 0.0, 744 0.0,
729 0.0, 745 0.0,
730 kFullStackTestDurationSecs, 746 kFullStackTestDurationSecs,
731 "VP8"}; 747 "VP8"};
732 foreman_cif.link.queue_length_packets = 32; 748 foreman_cif.link.queue_length_packets = 32;
733 foreman_cif.link.queue_delay_ms = 100; 749 foreman_cif.link.queue_delay_ms = 100;
734 foreman_cif.link.link_capacity_kbps = 1000; 750 foreman_cif.link.link_capacity_kbps = 1000;
735 RunTest(foreman_cif); 751 RunTest(foreman_cif);
736 } 752 }
737 753
738 // Temporarily disabled on Android due to low test timeouts. 754 // Temporarily disabled on Android due to low test timeouts.
739 // https://code.google.com/p/chromium/issues/detail?id=513170 755 // https://code.google.com/p/chromium/issues/detail?id=513170
740 #include "webrtc/test/testsupport/gtest_disable.h" 756 #include "webrtc/test/testsupport/gtest_disable.h"
741 TEST_F(FullStackTest, DISABLED_ON_ANDROID(ScreenshareSlidesVP8_2TL)) { 757 TEST_F(FullStackTest, DISABLED_ON_ANDROID(ScreenshareSlidesVP8_2TL)) {
742 FullStackTestParams screenshare_params = { 758 FullStackTestParams screenshare_params = {
743 "screenshare_slides", 759 "screenshare_slides",
744 {"screenshare_slides", 1850, 1110, 5}, 760 {"screenshare_slides", 1850, 1110, 5},
745 true, 761 ContentMode::kScreensharingStaticImage,
746 50000, 762 50000,
747 200000, 763 200000,
748 2000000, 764 2000000,
765 0.0,
766 0.0,
767 kFullStackTestDurationSecs,
768 "VP8"};
769 RunTest(screenshare_params);
770 }
771
772 TEST_F(FullStackTest, DISABLED_ON_ANDROID(ScreenshareSlidesVP8_2TL_Scroll)) {
773 FullStackTestParams screenshare_params = {
774 "screenshare_slides_scrolling",
775 // Crop height by two, scrolling vertically only.
776 {"screenshare_slides_scrolling", 1850, 1110 / 2, 5},
777 ContentMode::kScreensharingScrollingImage,
778 50000,
779 200000,
780 2000000,
749 0.0, 781 0.0,
750 0.0, 782 0.0,
751 kFullStackTestDurationSecs, 783 kFullStackTestDurationSecs,
752 "VP8"}; 784 "VP8"};
753 RunTest(screenshare_params); 785 RunTest(screenshare_params);
754 } 786 }
755 787
756 // Disabled on Android along with VP8 screenshare above. 788 // Disabled on Android along with VP8 screenshare above.
757 TEST_F(FullStackTest, DISABLED_ON_ANDROID(ScreenshareSlidesVP9_2TL)) { 789 TEST_F(FullStackTest, DISABLED_ON_ANDROID(ScreenshareSlidesVP9_2TL)) {
758 FullStackTestParams screenshare_params = { 790 FullStackTestParams screenshare_params = {
759 "screenshare_slides_vp9_2tl", 791 "screenshare_slides_vp9_2tl",
760 {"screenshare_slides", 1850, 1110, 5}, 792 {"screenshare_slides", 1850, 1110, 5},
761 true, 793 ContentMode::kScreensharingStaticImage,
762 50000, 794 50000,
763 200000, 795 200000,
764 2000000, 796 2000000,
765 0.0, 797 0.0,
766 0.0, 798 0.0,
767 kFullStackTestDurationSecs, 799 kFullStackTestDurationSecs,
768 "VP9"}; 800 "VP9"};
769 RunTest(screenshare_params); 801 RunTest(screenshare_params);
770 } 802 }
771 } // namespace webrtc 803 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698