OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2004 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 | 10 |
(...skipping 2016 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2027 // Trigger underuse which should go back up in resolution. | 2027 // Trigger underuse which should go back up in resolution. |
2028 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse); | 2028 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse); |
2029 EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420)); | 2029 EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420)); |
2030 EXPECT_EQ(6, send_stream->GetNumberOfSwappedFrames()); | 2030 EXPECT_EQ(6, send_stream->GetNumberOfSwappedFrames()); |
2031 EXPECT_EQ(1284, send_stream->GetLastWidth()); | 2031 EXPECT_EQ(1284, send_stream->GetLastWidth()); |
2032 EXPECT_EQ(724, send_stream->GetLastHeight()); | 2032 EXPECT_EQ(724, send_stream->GetLastHeight()); |
2033 | 2033 |
2034 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); | 2034 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); |
2035 } | 2035 } |
2036 | 2036 |
| 2037 TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruseAndSwitchToScreenShare) { |
| 2038 cricket::VideoCodec codec = kVp8Codec720p; |
| 2039 cricket::VideoSendParameters parameters; |
| 2040 parameters.codecs.push_back(codec); |
| 2041 |
| 2042 MediaConfig media_config = MediaConfig(); |
| 2043 channel_.reset( |
| 2044 engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions())); |
| 2045 ASSERT_TRUE(channel_->SetSendParameters(parameters)); |
| 2046 |
| 2047 AddSendStream(); |
| 2048 |
| 2049 cricket::FakeVideoCapturer capturer; |
| 2050 ASSERT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); |
| 2051 ASSERT_EQ(cricket::CS_RUNNING, |
| 2052 capturer.Start(capturer.GetSupportedFormats()->front())); |
| 2053 ASSERT_TRUE(channel_->SetSend(true)); |
| 2054 cricket::VideoOptions camera_options; |
| 2055 channel_->SetVideoSend(last_ssrc_, true /* enable */, &camera_options); |
| 2056 |
| 2057 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size()); |
| 2058 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); |
| 2059 webrtc::LoadObserver* overuse_callback = |
| 2060 send_stream->GetConfig().overuse_callback; |
| 2061 ASSERT_TRUE(overuse_callback != NULL); |
| 2062 |
| 2063 EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420)); |
| 2064 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames()); |
| 2065 EXPECT_EQ(1280, send_stream->GetLastWidth()); |
| 2066 EXPECT_EQ(720, send_stream->GetLastHeight()); |
| 2067 |
| 2068 // Trigger overuse. |
| 2069 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse); |
| 2070 EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420)); |
| 2071 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames()); |
| 2072 EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth()); |
| 2073 EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight()); |
| 2074 |
| 2075 // Switch to screen share. Expect no CPU adaptation. |
| 2076 cricket::FakeVideoCapturer screen_share(true); |
| 2077 ASSERT_EQ(cricket::CS_RUNNING, |
| 2078 screen_share.Start(screen_share.GetSupportedFormats()->front())); |
| 2079 ASSERT_TRUE(channel_->SetCapturer(last_ssrc_, &screen_share)); |
| 2080 cricket::VideoOptions screenshare_options; |
| 2081 screenshare_options.is_screencast = rtc::Optional<bool>(true); |
| 2082 channel_->SetVideoSend(last_ssrc_, true /* enable */, &screenshare_options); |
| 2083 EXPECT_TRUE(screen_share.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420)); |
| 2084 EXPECT_EQ(3, send_stream->GetNumberOfSwappedFrames()); |
| 2085 EXPECT_EQ(1284, send_stream->GetLastWidth()); |
| 2086 EXPECT_EQ(724, send_stream->GetLastHeight()); |
| 2087 |
| 2088 // Switch back to the normal capturer. Expect the frame to be CPU adapted. |
| 2089 ASSERT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); |
| 2090 channel_->SetVideoSend(last_ssrc_, true /* enable */, &camera_options); |
| 2091 EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420)); |
| 2092 EXPECT_EQ(4, send_stream->GetNumberOfSwappedFrames()); |
| 2093 EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth()); |
| 2094 EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight()); |
| 2095 |
| 2096 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); |
| 2097 } |
| 2098 |
2037 void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse, | 2099 void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse, |
2038 bool is_screenshare) { | 2100 bool is_screenshare) { |
2039 cricket::VideoCodec codec = kVp8Codec720p; | 2101 cricket::VideoCodec codec = kVp8Codec720p; |
2040 cricket::VideoSendParameters parameters; | 2102 cricket::VideoSendParameters parameters; |
2041 parameters.codecs.push_back(codec); | 2103 parameters.codecs.push_back(codec); |
2042 | 2104 |
2043 MediaConfig media_config = MediaConfig(); | 2105 MediaConfig media_config = MediaConfig(); |
2044 if (!enable_overuse) { | 2106 if (!enable_overuse) { |
2045 media_config.video.enable_cpu_overuse_detection = false; | 2107 media_config.video.enable_cpu_overuse_detection = false; |
2046 } | 2108 } |
(...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2751 fake_call_->GetVideoSendStreams().front()->GetConfig().overuse_callback; | 2813 fake_call_->GetVideoSendStreams().front()->GetConfig().overuse_callback; |
2752 ASSERT_TRUE(overuse_callback != NULL); | 2814 ASSERT_TRUE(overuse_callback != NULL); |
2753 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse); | 2815 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse); |
2754 | 2816 |
2755 // Capture format VGA -> adapt (OnCpuResolutionRequest downgrade) -> VGA/2. | 2817 // Capture format VGA -> adapt (OnCpuResolutionRequest downgrade) -> VGA/2. |
2756 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); | 2818 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); |
2757 cricket::VideoMediaInfo info; | 2819 cricket::VideoMediaInfo info; |
2758 EXPECT_TRUE(channel_->GetStats(&info)); | 2820 EXPECT_TRUE(channel_->GetStats(&info)); |
2759 ASSERT_EQ(1U, info.senders.size()); | 2821 ASSERT_EQ(1U, info.senders.size()); |
2760 EXPECT_EQ(1, info.senders[0].adapt_changes); | 2822 EXPECT_EQ(1, info.senders[0].adapt_changes); |
2761 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU, | 2823 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU, info.senders[0].adapt_reason); |
2762 info.senders[0].adapt_reason); | |
2763 | 2824 |
2764 // Trigger upgrade and verify that we adapt back up to VGA. | 2825 // Trigger upgrade and verify that we adapt back up to VGA. |
2765 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse); | 2826 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse); |
2766 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); | 2827 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); |
2767 info.Clear(); | 2828 info.Clear(); |
2768 EXPECT_TRUE(channel_->GetStats(&info)); | 2829 EXPECT_TRUE(channel_->GetStats(&info)); |
2769 ASSERT_EQ(1U, info.senders.size()); | 2830 ASSERT_EQ(1U, info.senders.size()); |
2770 EXPECT_EQ(2, info.senders[0].adapt_changes); | 2831 EXPECT_EQ(2, info.senders[0].adapt_changes); |
2771 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_NONE, | 2832 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_NONE, |
2772 info.senders[0].adapt_reason); | 2833 info.senders[0].adapt_reason); |
2773 | 2834 |
2774 // No capturer (no adapter). Adapt changes from old adapter should be kept. | 2835 // No capturer (no adapter). Adapt changes from old adapter should be kept. |
2775 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); | 2836 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); |
2776 info.Clear(); | 2837 info.Clear(); |
2777 EXPECT_TRUE(channel_->GetStats(&info)); | 2838 EXPECT_TRUE(channel_->GetStats(&info)); |
2778 ASSERT_EQ(1U, info.senders.size()); | 2839 ASSERT_EQ(1U, info.senders.size()); |
2779 EXPECT_EQ(2, info.senders[0].adapt_changes); | 2840 EXPECT_EQ(2, info.senders[0].adapt_changes); |
2780 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_NONE, | 2841 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_NONE, |
2781 info.senders[0].adapt_reason); | 2842 info.senders[0].adapt_reason); |
2782 | 2843 |
2783 // Set new capturer, capture format HD. | 2844 // Set new capturer, capture format HD. |
2784 cricket::FakeVideoCapturer video_capturer_hd; | 2845 cricket::FakeVideoCapturer video_capturer_hd; |
2785 cricket::VideoFormat capture_format_hd = (*formats)[0]; | 2846 cricket::VideoFormat capture_format_hd = (*formats)[0]; |
2786 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_hd.Start(capture_format_hd)); | 2847 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_hd.Start(capture_format_hd)); |
2787 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_hd)); | 2848 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_hd)); |
2788 EXPECT_TRUE(video_capturer_hd.CaptureFrame()); | 2849 EXPECT_TRUE(video_capturer_hd.CaptureFrame()); |
2789 | 2850 |
2790 // Trigger overuse, HD -> adapt (OnCpuResolutionRequest downgrade) -> HD/2. | 2851 // Trigger overuse, HD -> adapt (OnCpuResolutionRequest downgrade) -> HD/2. |
2791 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse); | 2852 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse); |
2792 EXPECT_TRUE(video_capturer_hd.CaptureFrame()); | 2853 EXPECT_TRUE(video_capturer_hd.CaptureFrame()); |
2793 info.Clear(); | 2854 info.Clear(); |
2794 EXPECT_TRUE(channel_->GetStats(&info)); | 2855 EXPECT_TRUE(channel_->GetStats(&info)); |
2795 ASSERT_EQ(1U, info.senders.size()); | 2856 ASSERT_EQ(1U, info.senders.size()); |
2796 EXPECT_EQ(3, info.senders[0].adapt_changes); | 2857 EXPECT_EQ(3, info.senders[0].adapt_changes); |
2797 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU, | 2858 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU, info.senders[0].adapt_reason); |
2798 info.senders[0].adapt_reason); | |
2799 | 2859 |
2800 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); | 2860 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); |
2801 } | 2861 } |
2802 | 2862 |
2803 TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationAndBandwidthStats) { | 2863 TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationAndBandwidthStats) { |
2804 AddSendStream(cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))); | 2864 AddSendStream(cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))); |
2805 | 2865 |
2806 // Capture format VGA. | 2866 // Capture format VGA. |
2807 cricket::FakeVideoCapturer video_capturer_vga; | 2867 cricket::FakeVideoCapturer video_capturer_vga; |
2808 const std::vector<cricket::VideoFormat>* formats = | 2868 const std::vector<cricket::VideoFormat>* formats = |
(...skipping 14 matching lines...) Expand all Loading... |
2823 // Trigger overuse -> adapt CPU. | 2883 // Trigger overuse -> adapt CPU. |
2824 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size()); | 2884 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size()); |
2825 webrtc::LoadObserver* overuse_callback = | 2885 webrtc::LoadObserver* overuse_callback = |
2826 fake_call_->GetVideoSendStreams().front()->GetConfig().overuse_callback; | 2886 fake_call_->GetVideoSendStreams().front()->GetConfig().overuse_callback; |
2827 ASSERT_TRUE(overuse_callback != NULL); | 2887 ASSERT_TRUE(overuse_callback != NULL); |
2828 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse); | 2888 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse); |
2829 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); | 2889 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); |
2830 cricket::VideoMediaInfo info; | 2890 cricket::VideoMediaInfo info; |
2831 EXPECT_TRUE(channel_->GetStats(&info)); | 2891 EXPECT_TRUE(channel_->GetStats(&info)); |
2832 ASSERT_EQ(1U, info.senders.size()); | 2892 ASSERT_EQ(1U, info.senders.size()); |
2833 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU, | 2893 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU, info.senders[0].adapt_reason); |
2834 info.senders[0].adapt_reason); | |
2835 | 2894 |
2836 // Set bandwidth limitation stats for the stream -> adapt CPU + BW. | 2895 // Set bandwidth limitation stats for the stream -> adapt CPU + BW. |
2837 webrtc::VideoSendStream::Stats stats; | 2896 webrtc::VideoSendStream::Stats stats; |
2838 stats.bw_limited_resolution = true; | 2897 stats.bw_limited_resolution = true; |
2839 fake_call_->GetVideoSendStreams().front()->SetStats(stats); | 2898 fake_call_->GetVideoSendStreams().front()->SetStats(stats); |
2840 info.Clear(); | 2899 info.Clear(); |
2841 EXPECT_TRUE(channel_->GetStats(&info)); | 2900 EXPECT_TRUE(channel_->GetStats(&info)); |
2842 ASSERT_EQ(1U, info.senders.size()); | 2901 ASSERT_EQ(1U, info.senders.size()); |
2843 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU + | 2902 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU + |
2844 CoordinatedVideoAdapter::ADAPTREASON_BANDWIDTH, | 2903 WebRtcVideoChannel2::ADAPTREASON_BANDWIDTH, |
2845 info.senders[0].adapt_reason); | 2904 info.senders[0].adapt_reason); |
2846 | 2905 |
2847 // Trigger upgrade -> adapt BW. | 2906 // Trigger upgrade -> adapt BW. |
2848 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse); | 2907 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse); |
2849 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); | 2908 EXPECT_TRUE(video_capturer_vga.CaptureFrame()); |
2850 info.Clear(); | 2909 info.Clear(); |
2851 EXPECT_TRUE(channel_->GetStats(&info)); | 2910 EXPECT_TRUE(channel_->GetStats(&info)); |
2852 ASSERT_EQ(1U, info.senders.size()); | 2911 ASSERT_EQ(1U, info.senders.size()); |
2853 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_BANDWIDTH, | 2912 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_BANDWIDTH, |
2854 info.senders[0].adapt_reason); | 2913 info.senders[0].adapt_reason); |
2855 | 2914 |
2856 // Reset bandwidth limitation state -> adapt NONE. | 2915 // Reset bandwidth limitation state -> adapt NONE. |
2857 stats.bw_limited_resolution = false; | 2916 stats.bw_limited_resolution = false; |
2858 fake_call_->GetVideoSendStreams().front()->SetStats(stats); | 2917 fake_call_->GetVideoSendStreams().front()->SetStats(stats); |
2859 info.Clear(); | 2918 info.Clear(); |
2860 EXPECT_TRUE(channel_->GetStats(&info)); | 2919 EXPECT_TRUE(channel_->GetStats(&info)); |
2861 ASSERT_EQ(1U, info.senders.size()); | 2920 ASSERT_EQ(1U, info.senders.size()); |
2862 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_NONE, | 2921 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_NONE, |
2863 info.senders[0].adapt_reason); | 2922 info.senders[0].adapt_reason); |
2864 | 2923 |
2865 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); | 2924 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); |
2866 } | 2925 } |
2867 | 2926 |
2868 TEST_F(WebRtcVideoChannel2Test, | 2927 TEST_F(WebRtcVideoChannel2Test, |
2869 GetStatsTranslatesBandwidthLimitedResolutionCorrectly) { | 2928 GetStatsTranslatesBandwidthLimitedResolutionCorrectly) { |
2870 FakeVideoSendStream* stream = AddSendStream(); | 2929 FakeVideoSendStream* stream = AddSendStream(); |
2871 webrtc::VideoSendStream::Stats stats; | 2930 webrtc::VideoSendStream::Stats stats; |
2872 stats.bw_limited_resolution = true; | 2931 stats.bw_limited_resolution = true; |
2873 stream->SetStats(stats); | 2932 stream->SetStats(stats); |
2874 | 2933 |
2875 cricket::VideoMediaInfo info; | 2934 cricket::VideoMediaInfo info; |
2876 EXPECT_TRUE(channel_->GetStats(&info)); | 2935 EXPECT_TRUE(channel_->GetStats(&info)); |
2877 ASSERT_EQ(1U, info.senders.size()); | 2936 ASSERT_EQ(1U, info.senders.size()); |
2878 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_BANDWIDTH, | 2937 EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_BANDWIDTH, |
2879 info.senders[0].adapt_reason); | 2938 info.senders[0].adapt_reason); |
2880 } | 2939 } |
2881 | 2940 |
2882 TEST_F(WebRtcVideoChannel2Test, | 2941 TEST_F(WebRtcVideoChannel2Test, |
2883 GetStatsTranslatesSendRtcpPacketTypesCorrectly) { | 2942 GetStatsTranslatesSendRtcpPacketTypesCorrectly) { |
2884 FakeVideoSendStream* stream = AddSendStream(); | 2943 FakeVideoSendStream* stream = AddSendStream(); |
2885 webrtc::VideoSendStream::Stats stats; | 2944 webrtc::VideoSendStream::Stats stats; |
2886 stats.substreams[17].rtcp_packet_type_counts.fir_packets = 2; | 2945 stats.substreams[17].rtcp_packet_type_counts.fir_packets = 2; |
2887 stats.substreams[17].rtcp_packet_type_counts.nack_packets = 3; | 2946 stats.substreams[17].rtcp_packet_type_counts.nack_packets = 3; |
2888 stats.substreams[17].rtcp_packet_type_counts.pli_packets = 4; | 2947 stats.substreams[17].rtcp_packet_type_counts.pli_packets = 4; |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3490 } | 3549 } |
3491 | 3550 |
3492 // Test that we normalize send codec format size in simulcast. | 3551 // Test that we normalize send codec format size in simulcast. |
3493 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) { | 3552 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) { |
3494 cricket::VideoCodec codec(kVp8Codec270p); | 3553 cricket::VideoCodec codec(kVp8Codec270p); |
3495 codec.width += 1; | 3554 codec.width += 1; |
3496 codec.height += 1; | 3555 codec.height += 1; |
3497 VerifySimulcastSettings(codec, 2, 2); | 3556 VerifySimulcastSettings(codec, 2, 2); |
3498 } | 3557 } |
3499 } // namespace cricket | 3558 } // namespace cricket |
OLD | NEW |