| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 | 277 |
| 278 VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const { | 278 VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const { |
| 279 VideoFrame frame( | 279 VideoFrame frame( |
| 280 new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99, | 280 new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99, |
| 281 kVideoRotation_0); | 281 kVideoRotation_0); |
| 282 frame.set_ntp_time_ms(ntp_time_ms); | 282 frame.set_ntp_time_ms(ntp_time_ms); |
| 283 frame.set_timestamp_us(ntp_time_ms * 1000); | 283 frame.set_timestamp_us(ntp_time_ms * 1000); |
| 284 return frame; | 284 return frame; |
| 285 } | 285 } |
| 286 | 286 |
| 287 void VerifyNoLimitation(const rtc::VideoSinkWants& wants) { |
| 288 EXPECT_FALSE(wants.target_pixel_count); |
| 289 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); |
| 290 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); |
| 291 } |
| 292 |
| 293 void VerifyResolutionLimitationLessThan(const rtc::VideoSinkWants& wants, |
| 294 int pixel_count) { |
| 295 EXPECT_LT(wants.max_pixel_count, pixel_count); |
| 296 EXPECT_GT(wants.max_pixel_count, 0); |
| 297 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); |
| 298 } |
| 299 |
| 287 class TestEncoder : public test::FakeEncoder { | 300 class TestEncoder : public test::FakeEncoder { |
| 288 public: | 301 public: |
| 289 TestEncoder() | 302 TestEncoder() |
| 290 : FakeEncoder(Clock::GetRealTimeClock()), | 303 : FakeEncoder(Clock::GetRealTimeClock()), |
| 291 continue_encode_event_(false, false) {} | 304 continue_encode_event_(false, false) {} |
| 292 | 305 |
| 293 VideoCodec codec_config() const { | 306 VideoCodec codec_config() const { |
| 294 rtc::CritScope lock(&crit_sect_); | 307 rtc::CritScope lock(&crit_sect_); |
| 295 return config_; | 308 return config_; |
| 296 } | 309 } |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 TEST_F(ViEEncoderTest, SinkWantsRotationApplied) { | 721 TEST_F(ViEEncoderTest, SinkWantsRotationApplied) { |
| 709 EXPECT_FALSE(video_source_.sink_wants().rotation_applied); | 722 EXPECT_FALSE(video_source_.sink_wants().rotation_applied); |
| 710 vie_encoder_->SetSink(&sink_, true /*rotation_applied*/); | 723 vie_encoder_->SetSink(&sink_, true /*rotation_applied*/); |
| 711 EXPECT_TRUE(video_source_.sink_wants().rotation_applied); | 724 EXPECT_TRUE(video_source_.sink_wants().rotation_applied); |
| 712 vie_encoder_->Stop(); | 725 vie_encoder_->Stop(); |
| 713 } | 726 } |
| 714 | 727 |
| 715 TEST_F(ViEEncoderTest, SinkWantsFromOveruseDetector) { | 728 TEST_F(ViEEncoderTest, SinkWantsFromOveruseDetector) { |
| 716 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 729 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 717 | 730 |
| 718 EXPECT_FALSE(video_source_.sink_wants().target_pixel_count); | 731 VerifyNoLimitation(video_source_.sink_wants()); |
| 719 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 720 video_source_.sink_wants().max_pixel_count); | |
| 721 | 732 |
| 722 int frame_width = 1280; | 733 int frame_width = 1280; |
| 723 int frame_height = 720; | 734 int frame_height = 720; |
| 724 | 735 |
| 725 // Trigger CPU overuse kMaxCpuDowngrades times. Every time, ViEEncoder should | 736 // Trigger CPU overuse kMaxCpuDowngrades times. Every time, ViEEncoder should |
| 726 // request lower resolution. | 737 // request lower resolution. |
| 727 for (int i = 1; i <= ViEEncoder::kMaxCpuResolutionDowngrades; ++i) { | 738 for (int i = 1; i <= ViEEncoder::kMaxCpuResolutionDowngrades; ++i) { |
| 728 video_source_.IncomingCapturedFrame( | 739 video_source_.IncomingCapturedFrame( |
| 729 CreateFrame(i, frame_width, frame_height)); | 740 CreateFrame(i, frame_width, frame_height)); |
| 730 sink_.WaitForEncodedFrame(i); | 741 sink_.WaitForEncodedFrame(i); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 756 EXPECT_EQ(frame_width * frame_height * 5 / 3, | 767 EXPECT_EQ(frame_width * frame_height * 5 / 3, |
| 757 video_source_.sink_wants().target_pixel_count.value_or(0)); | 768 video_source_.sink_wants().target_pixel_count.value_or(0)); |
| 758 EXPECT_EQ(frame_width * frame_height * 4, | 769 EXPECT_EQ(frame_width * frame_height * 4, |
| 759 video_source_.sink_wants().max_pixel_count); | 770 video_source_.sink_wants().max_pixel_count); |
| 760 | 771 |
| 761 vie_encoder_->Stop(); | 772 vie_encoder_->Stop(); |
| 762 } | 773 } |
| 763 | 774 |
| 764 TEST_F(ViEEncoderTest, SinkWantsStoredByDegradationPreference) { | 775 TEST_F(ViEEncoderTest, SinkWantsStoredByDegradationPreference) { |
| 765 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 776 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 766 | 777 VerifyNoLimitation(video_source_.sink_wants()); |
| 767 EXPECT_FALSE(video_source_.sink_wants().target_pixel_count); | |
| 768 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 769 video_source_.sink_wants().max_pixel_count); | |
| 770 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 771 video_source_.sink_wants().max_framerate_fps); | |
| 772 | 778 |
| 773 const int kFrameWidth = 1280; | 779 const int kFrameWidth = 1280; |
| 774 const int kFrameHeight = 720; | 780 const int kFrameHeight = 720; |
| 775 const int kFrameIntervalMs = 1000 / 30; | 781 const int kFrameIntervalMs = 1000 / 30; |
| 776 | 782 |
| 777 int frame_timestamp = 1; | 783 int frame_timestamp = 1; |
| 778 | 784 |
| 779 video_source_.IncomingCapturedFrame( | 785 video_source_.IncomingCapturedFrame( |
| 780 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); | 786 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); |
| 781 sink_.WaitForEncodedFrame(frame_timestamp); | 787 sink_.WaitForEncodedFrame(frame_timestamp); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 796 EXPECT_EQ(std::numeric_limits<int>::max(), | 802 EXPECT_EQ(std::numeric_limits<int>::max(), |
| 797 video_source_.sink_wants().max_framerate_fps); | 803 video_source_.sink_wants().max_framerate_fps); |
| 798 | 804 |
| 799 // Set new source, switch to maintain-resolution. | 805 // Set new source, switch to maintain-resolution. |
| 800 test::FrameForwarder new_video_source; | 806 test::FrameForwarder new_video_source; |
| 801 vie_encoder_->SetSource( | 807 vie_encoder_->SetSource( |
| 802 &new_video_source, | 808 &new_video_source, |
| 803 VideoSendStream::DegradationPreference::kMaintainResolution); | 809 VideoSendStream::DegradationPreference::kMaintainResolution); |
| 804 | 810 |
| 805 // Initially no degradation registered. | 811 // Initially no degradation registered. |
| 806 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); | 812 VerifyNoLimitation(new_video_source.sink_wants()); |
| 807 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 808 new_video_source.sink_wants().max_pixel_count); | |
| 809 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 810 new_video_source.sink_wants().max_framerate_fps); | |
| 811 | 813 |
| 812 // Force an input frame rate to be available, or the adaptation call won't | 814 // Force an input frame rate to be available, or the adaptation call won't |
| 813 // know what framerate to adapt form. | 815 // know what framerate to adapt form. |
| 816 const int kInputFps = 30; |
| 814 VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 817 VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
| 815 stats.input_frame_rate = 30; | 818 stats.input_frame_rate = kInputFps; |
| 816 stats_proxy_->SetMockStats(stats); | 819 stats_proxy_->SetMockStats(stats); |
| 817 | 820 |
| 818 vie_encoder_->TriggerCpuOveruse(); | 821 vie_encoder_->TriggerCpuOveruse(); |
| 819 new_video_source.IncomingCapturedFrame( | 822 new_video_source.IncomingCapturedFrame( |
| 820 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); | 823 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); |
| 821 sink_.WaitForEncodedFrame(frame_timestamp); | 824 sink_.WaitForEncodedFrame(frame_timestamp); |
| 822 frame_timestamp += kFrameIntervalMs; | 825 frame_timestamp += kFrameIntervalMs; |
| 823 | 826 |
| 824 // Some framerate constraint should be set. | 827 // Some framerate constraint should be set. |
| 825 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); | 828 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); |
| 826 EXPECT_EQ(std::numeric_limits<int>::max(), | 829 EXPECT_EQ(std::numeric_limits<int>::max(), |
| 827 new_video_source.sink_wants().max_pixel_count); | 830 new_video_source.sink_wants().max_pixel_count); |
| 828 EXPECT_TRUE(new_video_source.sink_wants().max_framerate_fps); | 831 EXPECT_LT(new_video_source.sink_wants().max_framerate_fps, kInputFps); |
| 829 | 832 |
| 830 // Turn of degradation completely. | 833 // Turn off degradation completely. |
| 831 vie_encoder_->SetSource( | 834 vie_encoder_->SetSource( |
| 832 &new_video_source, | 835 &new_video_source, |
| 833 VideoSendStream::DegradationPreference::kDegradationDisabled); | 836 VideoSendStream::DegradationPreference::kDegradationDisabled); |
| 834 | 837 VerifyNoLimitation(new_video_source.sink_wants()); |
| 835 // Initially no degradation registered. | |
| 836 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); | |
| 837 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 838 new_video_source.sink_wants().max_pixel_count); | |
| 839 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 840 new_video_source.sink_wants().max_framerate_fps); | |
| 841 | 838 |
| 842 vie_encoder_->TriggerCpuOveruse(); | 839 vie_encoder_->TriggerCpuOveruse(); |
| 843 new_video_source.IncomingCapturedFrame( | 840 new_video_source.IncomingCapturedFrame( |
| 844 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); | 841 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); |
| 845 sink_.WaitForEncodedFrame(frame_timestamp); | 842 sink_.WaitForEncodedFrame(frame_timestamp); |
| 846 frame_timestamp += kFrameIntervalMs; | 843 frame_timestamp += kFrameIntervalMs; |
| 847 | 844 |
| 848 // Still no degradation. | 845 // Still no degradation. |
| 849 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); | 846 VerifyNoLimitation(new_video_source.sink_wants()); |
| 850 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 851 new_video_source.sink_wants().max_pixel_count); | |
| 852 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 853 new_video_source.sink_wants().max_framerate_fps); | |
| 854 | 847 |
| 855 // Calling SetSource with resolution scaling enabled apply the old SinkWants. | 848 // Calling SetSource with resolution scaling enabled apply the old SinkWants. |
| 856 vie_encoder_->SetSource( | 849 vie_encoder_->SetSource( |
| 857 &new_video_source, | 850 &new_video_source, |
| 858 VideoSendStream::DegradationPreference::kMaintainFramerate); | 851 VideoSendStream::DegradationPreference::kMaintainFramerate); |
| 859 EXPECT_LT(new_video_source.sink_wants().max_pixel_count, | 852 EXPECT_LT(new_video_source.sink_wants().max_pixel_count, |
| 860 kFrameWidth * kFrameHeight); | 853 kFrameWidth * kFrameHeight); |
| 861 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); | 854 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); |
| 862 EXPECT_EQ(std::numeric_limits<int>::max(), | 855 EXPECT_EQ(std::numeric_limits<int>::max(), |
| 863 new_video_source.sink_wants().max_framerate_fps); | 856 new_video_source.sink_wants().max_framerate_fps); |
| 864 | 857 |
| 865 // Calling SetSource with framerate scaling enabled apply the old SinkWants. | 858 // Calling SetSource with framerate scaling enabled apply the old SinkWants. |
| 866 vie_encoder_->SetSource( | 859 vie_encoder_->SetSource( |
| 867 &new_video_source, | 860 &new_video_source, |
| 868 VideoSendStream::DegradationPreference::kMaintainResolution); | 861 VideoSendStream::DegradationPreference::kMaintainResolution); |
| 869 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); | 862 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); |
| 870 EXPECT_EQ(std::numeric_limits<int>::max(), | 863 EXPECT_EQ(std::numeric_limits<int>::max(), |
| 871 new_video_source.sink_wants().max_pixel_count); | 864 new_video_source.sink_wants().max_pixel_count); |
| 872 EXPECT_TRUE(new_video_source.sink_wants().max_framerate_fps); | 865 EXPECT_LT(new_video_source.sink_wants().max_framerate_fps, kInputFps); |
| 873 | 866 |
| 874 vie_encoder_->Stop(); | 867 vie_encoder_->Stop(); |
| 875 } | 868 } |
| 876 | 869 |
| 877 TEST_F(ViEEncoderTest, StatsTracksQualityAdaptationStats) { | 870 TEST_F(ViEEncoderTest, StatsTracksQualityAdaptationStats) { |
| 878 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 871 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 879 | 872 |
| 880 const int kWidth = 1280; | 873 const int kWidth = 1280; |
| 881 const int kHeight = 720; | 874 const int kHeight = 720; |
| 882 | |
| 883 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 875 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 884 sink_.WaitForEncodedFrame(1); | 876 sink_.WaitForEncodedFrame(1); |
| 885 VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 877 VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
| 886 EXPECT_FALSE(stats.bw_limited_resolution); | 878 EXPECT_FALSE(stats.bw_limited_resolution); |
| 887 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); | 879 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); |
| 888 | 880 |
| 889 // Trigger adapt down. | 881 // Trigger adapt down. |
| 890 vie_encoder_->TriggerQualityLow(); | 882 vie_encoder_->TriggerQualityLow(); |
| 891 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 883 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
| 892 sink_.WaitForEncodedFrame(2); | 884 sink_.WaitForEncodedFrame(2); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 906 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); | 898 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |
| 907 | 899 |
| 908 vie_encoder_->Stop(); | 900 vie_encoder_->Stop(); |
| 909 } | 901 } |
| 910 | 902 |
| 911 TEST_F(ViEEncoderTest, StatsTracksCpuAdaptationStats) { | 903 TEST_F(ViEEncoderTest, StatsTracksCpuAdaptationStats) { |
| 912 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 904 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 913 | 905 |
| 914 const int kWidth = 1280; | 906 const int kWidth = 1280; |
| 915 const int kHeight = 720; | 907 const int kHeight = 720; |
| 916 | |
| 917 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 908 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 918 sink_.WaitForEncodedFrame(1); | 909 sink_.WaitForEncodedFrame(1); |
| 919 VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 910 VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
| 920 EXPECT_FALSE(stats.cpu_limited_resolution); | 911 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 921 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); | 912 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |
| 922 | 913 |
| 923 // Trigger CPU overuse. | 914 // Trigger CPU overuse. |
| 924 vie_encoder_->TriggerCpuOveruse(); | 915 vie_encoder_->TriggerCpuOveruse(); |
| 925 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 916 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
| 926 sink_.WaitForEncodedFrame(2); | 917 sink_.WaitForEncodedFrame(2); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 EXPECT_TRUE(stats.cpu_limited_resolution); | 986 EXPECT_TRUE(stats.cpu_limited_resolution); |
| 996 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 987 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
| 997 | 988 |
| 998 // Trigger CPU normal use. | 989 // Trigger CPU normal use. |
| 999 vie_encoder_->TriggerCpuNormalUsage(); | 990 vie_encoder_->TriggerCpuNormalUsage(); |
| 1000 new_video_source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); | 991 new_video_source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); |
| 1001 sink_.WaitForEncodedFrame(6); | 992 sink_.WaitForEncodedFrame(6); |
| 1002 stats = stats_proxy_->GetStats(); | 993 stats = stats_proxy_->GetStats(); |
| 1003 EXPECT_FALSE(stats.cpu_limited_resolution); | 994 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 1004 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); | 995 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); |
| 996 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); |
| 1005 | 997 |
| 1006 vie_encoder_->Stop(); | 998 vie_encoder_->Stop(); |
| 1007 } | 999 } |
| 1008 | 1000 |
| 1009 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) { | 1001 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) { |
| 1010 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1002 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1011 | 1003 |
| 1012 const int kWidth = 1280; | 1004 const int kWidth = 1280; |
| 1013 const int kHeight = 720; | 1005 const int kHeight = 720; |
| 1014 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1006 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1043 vie_encoder_->SetSource(&new_video_source, | 1035 vie_encoder_->SetSource(&new_video_source, |
| 1044 VideoSendStream::DegradationPreference::kBalanced); | 1036 VideoSendStream::DegradationPreference::kBalanced); |
| 1045 | 1037 |
| 1046 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 1038 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); |
| 1047 sink_.WaitForEncodedFrame(4); | 1039 sink_.WaitForEncodedFrame(4); |
| 1048 stats = stats_proxy_->GetStats(); | 1040 stats = stats_proxy_->GetStats(); |
| 1049 EXPECT_FALSE(stats.cpu_limited_resolution); | 1041 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 1050 EXPECT_TRUE(stats.bw_limited_resolution); | 1042 EXPECT_TRUE(stats.bw_limited_resolution); |
| 1051 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); | 1043 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); |
| 1052 | 1044 |
| 1053 // Set adaptation disabled. | 1045 // Disable resolution scaling. |
| 1054 vie_encoder_->SetSource( | 1046 vie_encoder_->SetSource( |
| 1055 &new_video_source, | 1047 &new_video_source, |
| 1056 VideoSendStream::DegradationPreference::kMaintainResolution); | 1048 VideoSendStream::DegradationPreference::kMaintainResolution); |
| 1057 | 1049 |
| 1058 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); | 1050 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); |
| 1059 sink_.WaitForEncodedFrame(5); | 1051 sink_.WaitForEncodedFrame(5); |
| 1060 stats = stats_proxy_->GetStats(); | 1052 stats = stats_proxy_->GetStats(); |
| 1061 EXPECT_FALSE(stats.cpu_limited_resolution); | 1053 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 1062 EXPECT_FALSE(stats.bw_limited_resolution); | 1054 EXPECT_FALSE(stats.bw_limited_resolution); |
| 1063 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); | 1055 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1102 | 1094 |
| 1103 video_source_.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 1095 video_source_.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); |
| 1104 sink_.WaitForEncodedFrame(4); | 1096 sink_.WaitForEncodedFrame(4); |
| 1105 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1097 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1106 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1098 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
| 1107 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1099 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1108 | 1100 |
| 1109 vie_encoder_->Stop(); | 1101 vie_encoder_->Stop(); |
| 1110 } | 1102 } |
| 1111 | 1103 |
| 1112 TEST_F(ViEEncoderTest, StatsTracksAdaptationStatsWhenSwitchingSource) { | 1104 TEST_F(ViEEncoderTest, StatsTracksCpuAdaptationStatsWhenSwitchingSource) { |
| 1113 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1105 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1114 | 1106 |
| 1115 const int kWidth = 1280; | 1107 const int kWidth = 1280; |
| 1116 const int kHeight = 720; | 1108 const int kHeight = 720; |
| 1117 int sequence = 1; | 1109 int sequence = 1; |
| 1118 | 1110 |
| 1119 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); | 1111 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); |
| 1120 sink_.WaitForEncodedFrame(sequence++); | 1112 sink_.WaitForEncodedFrame(sequence++); |
| 1121 | |
| 1122 VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 1113 VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
| 1123 EXPECT_FALSE(stats.cpu_limited_resolution); | 1114 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 1124 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); | 1115 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |
| 1125 | 1116 |
| 1126 // Trigger CPU overuse again, should now adapt down. | 1117 // Trigger CPU overuse, should now adapt down. |
| 1127 vie_encoder_->TriggerCpuOveruse(); | 1118 vie_encoder_->TriggerCpuOveruse(); |
| 1128 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); | 1119 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); |
| 1129 sink_.WaitForEncodedFrame(sequence++); | 1120 sink_.WaitForEncodedFrame(sequence++); |
| 1130 | |
| 1131 stats = stats_proxy_->GetStats(); | 1121 stats = stats_proxy_->GetStats(); |
| 1132 EXPECT_TRUE(stats.cpu_limited_resolution); | 1122 EXPECT_TRUE(stats.cpu_limited_resolution); |
| 1133 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 1123 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
| 1134 | 1124 |
| 1135 // Set new source with adaptation still enabled. | 1125 // Set new source with adaptation still enabled. |
| 1136 test::FrameForwarder new_video_source; | 1126 test::FrameForwarder new_video_source; |
| 1137 vie_encoder_->SetSource( | 1127 vie_encoder_->SetSource( |
| 1138 &new_video_source, | 1128 &new_video_source, |
| 1139 VideoSendStream::DegradationPreference::kMaintainFramerate); | 1129 VideoSendStream::DegradationPreference::kMaintainFramerate); |
| 1140 | 1130 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1226 EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); | 1216 EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); |
| 1227 | 1217 |
| 1228 // Trigger CPU normal usage. | 1218 // Trigger CPU normal usage. |
| 1229 vie_encoder_->TriggerCpuNormalUsage(); | 1219 vie_encoder_->TriggerCpuNormalUsage(); |
| 1230 new_video_source.IncomingCapturedFrame( | 1220 new_video_source.IncomingCapturedFrame( |
| 1231 CreateFrame(sequence, kWidth, kHeight)); | 1221 CreateFrame(sequence, kWidth, kHeight)); |
| 1232 sink_.WaitForEncodedFrame(sequence++); | 1222 sink_.WaitForEncodedFrame(sequence++); |
| 1233 stats = stats_proxy_->GetStats(); | 1223 stats = stats_proxy_->GetStats(); |
| 1234 EXPECT_FALSE(stats.cpu_limited_resolution); | 1224 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 1235 EXPECT_EQ(4, stats.number_of_cpu_adapt_changes); | 1225 EXPECT_EQ(4, stats.number_of_cpu_adapt_changes); |
| 1226 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); |
| 1236 | 1227 |
| 1237 vie_encoder_->Stop(); | 1228 vie_encoder_->Stop(); |
| 1238 } | 1229 } |
| 1239 | 1230 |
| 1240 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) { | 1231 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) { |
| 1241 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1232 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1242 | 1233 |
| 1243 const int kWidth = 1280; | 1234 const int kWidth = 1280; |
| 1244 const int kHeight = 720; | 1235 const int kHeight = 720; |
| 1245 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1236 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1246 sink_.WaitForEncodedFrame(1); | 1237 sink_.WaitForEncodedFrame(1); |
| 1247 | 1238 |
| 1248 VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 1239 VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
| 1249 EXPECT_EQ(video_encoder_config_.max_bitrate_bps, | 1240 EXPECT_EQ(video_encoder_config_.max_bitrate_bps, |
| 1250 stats.preferred_media_bitrate_bps); | 1241 stats.preferred_media_bitrate_bps); |
| 1251 | 1242 |
| 1252 vie_encoder_->Stop(); | 1243 vie_encoder_->Stop(); |
| 1253 } | 1244 } |
| 1254 | 1245 |
| 1255 TEST_F(ViEEncoderTest, ScalingUpAndDownDoesNothingWithMaintainResolution) { | 1246 TEST_F(ViEEncoderTest, ScalingUpAndDownDoesNothingWithMaintainResolution) { |
| 1256 const int kWidth = 1280; | 1247 const int kWidth = 1280; |
| 1257 const int kHeight = 720; | 1248 const int kHeight = 720; |
| 1258 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1249 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1259 | 1250 |
| 1260 // Expect no scaling to begin with. | 1251 // Expect no scaling to begin with. |
| 1261 EXPECT_FALSE(video_source_.sink_wants().target_pixel_count); | 1252 VerifyNoLimitation(video_source_.sink_wants()); |
| 1262 EXPECT_EQ(std::numeric_limits<int>::max(), | |
| 1263 video_source_.sink_wants().max_pixel_count); | |
| 1264 | 1253 |
| 1265 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1254 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1266 sink_.WaitForEncodedFrame(1); | 1255 sink_.WaitForEncodedFrame(1); |
| 1267 | 1256 |
| 1268 // Trigger scale down. | 1257 // Trigger scale down. |
| 1269 vie_encoder_->TriggerQualityLow(); | 1258 vie_encoder_->TriggerQualityLow(); |
| 1270 | 1259 |
| 1271 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 1260 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
| 1272 sink_.WaitForEncodedFrame(2); | 1261 sink_.WaitForEncodedFrame(2); |
| 1273 | 1262 |
| 1274 // Expect a scale down. | 1263 // Expect a scale down. |
| 1275 EXPECT_TRUE(video_source_.sink_wants().max_pixel_count); | 1264 EXPECT_TRUE(video_source_.sink_wants().max_pixel_count); |
| 1276 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight); | 1265 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight); |
| 1277 | 1266 |
| 1278 // Set adaptation disabled. | 1267 // Set resolution scaling disabled. |
| 1279 test::FrameForwarder new_video_source; | 1268 test::FrameForwarder new_video_source; |
| 1280 vie_encoder_->SetSource( | 1269 vie_encoder_->SetSource( |
| 1281 &new_video_source, | 1270 &new_video_source, |
| 1282 VideoSendStream::DegradationPreference::kMaintainResolution); | 1271 VideoSendStream::DegradationPreference::kMaintainResolution); |
| 1283 | 1272 |
| 1284 // Trigger scale down. | 1273 // Trigger scale down. |
| 1285 vie_encoder_->TriggerQualityLow(); | 1274 vie_encoder_->TriggerQualityLow(); |
| 1286 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); | 1275 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); |
| 1287 sink_.WaitForEncodedFrame(3); | 1276 sink_.WaitForEncodedFrame(3); |
| 1288 | 1277 |
| 1289 // Expect no scaling. | 1278 // Expect no scaling. |
| 1290 EXPECT_EQ(std::numeric_limits<int>::max(), | 1279 EXPECT_EQ(std::numeric_limits<int>::max(), |
| 1291 new_video_source.sink_wants().max_pixel_count); | 1280 new_video_source.sink_wants().max_pixel_count); |
| 1292 | 1281 |
| 1293 // Trigger scale up. | 1282 // Trigger scale up. |
| 1294 vie_encoder_->TriggerQualityHigh(); | 1283 vie_encoder_->TriggerQualityHigh(); |
| 1295 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 1284 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); |
| 1296 sink_.WaitForEncodedFrame(4); | 1285 sink_.WaitForEncodedFrame(4); |
| 1297 | 1286 |
| 1298 // Expect nothing to change, still no scaling | 1287 // Expect nothing to change, still no scaling. |
| 1299 EXPECT_EQ(std::numeric_limits<int>::max(), | 1288 EXPECT_EQ(std::numeric_limits<int>::max(), |
| 1300 new_video_source.sink_wants().max_pixel_count); | 1289 new_video_source.sink_wants().max_pixel_count); |
| 1301 | 1290 |
| 1302 vie_encoder_->Stop(); | 1291 vie_encoder_->Stop(); |
| 1303 } | 1292 } |
| 1304 | 1293 |
| 1294 TEST_F(ViEEncoderTest, SkipsSameAdaptDownRequest_MaintainFramerateMode) { |
| 1295 const int kWidth = 1280; |
| 1296 const int kHeight = 720; |
| 1297 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1298 |
| 1299 // Enable kMaintainFramerate preference, no initial limitation. |
| 1300 test::FrameForwarder source; |
| 1301 vie_encoder_->SetSource( |
| 1302 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |
| 1303 |
| 1304 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1305 sink_.WaitForEncodedFrame(1); |
| 1306 VerifyNoLimitation(source.sink_wants()); |
| 1307 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1308 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1309 |
| 1310 // Trigger adapt down, expect scaled down resolution. |
| 1311 vie_encoder_->TriggerCpuOveruse(); |
| 1312 VerifyResolutionLimitationLessThan(source.sink_wants(), kWidth * kHeight); |
| 1313 const int kLastMaxPixelCount = source.sink_wants().max_pixel_count; |
| 1314 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1315 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1316 |
| 1317 // Trigger adapt down for same input resolution, expect no change. |
| 1318 vie_encoder_->TriggerCpuOveruse(); |
| 1319 EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count); |
| 1320 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1321 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1322 |
| 1323 vie_encoder_->Stop(); |
| 1324 } |
| 1325 |
| 1326 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_MaintainFramerateMode) { |
| 1327 const int kWidth = 1280; |
| 1328 const int kHeight = 720; |
| 1329 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1330 |
| 1331 // Enable kMaintainFramerate preference, no initial limitation. |
| 1332 test::FrameForwarder source; |
| 1333 vie_encoder_->SetSource( |
| 1334 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |
| 1335 |
| 1336 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1337 sink_.WaitForEncodedFrame(kWidth, kHeight); |
| 1338 VerifyNoLimitation(source.sink_wants()); |
| 1339 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1340 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1341 |
| 1342 // Trigger adapt up, expect no change. |
| 1343 vie_encoder_->TriggerCpuNormalUsage(); |
| 1344 VerifyNoLimitation(source.sink_wants()); |
| 1345 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1346 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1347 |
| 1348 vie_encoder_->Stop(); |
| 1349 } |
| 1350 |
| 1351 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_MaintainResolutionMode) { |
| 1352 const int kWidth = 1280; |
| 1353 const int kHeight = 720; |
| 1354 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1355 |
| 1356 // Enable kMaintainResolution preference, no initial limitation. |
| 1357 test::FrameForwarder source; |
| 1358 vie_encoder_->SetSource( |
| 1359 &source, VideoSendStream::DegradationPreference::kMaintainResolution); |
| 1360 |
| 1361 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1362 sink_.WaitForEncodedFrame(kWidth, kHeight); |
| 1363 VerifyNoLimitation(source.sink_wants()); |
| 1364 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1365 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1366 |
| 1367 // Trigger adapt up, expect no change. |
| 1368 vie_encoder_->TriggerCpuNormalUsage(); |
| 1369 VerifyNoLimitation(source.sink_wants()); |
| 1370 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
| 1371 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1372 |
| 1373 vie_encoder_->Stop(); |
| 1374 } |
| 1375 |
| 1376 TEST_F(ViEEncoderTest, AdaptsResolutionForLowQuality_MaintainFramerateMode) { |
| 1377 const int kWidth = 1280; |
| 1378 const int kHeight = 720; |
| 1379 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1380 |
| 1381 // Enable kMaintainFramerate preference, no initial limitation. |
| 1382 AdaptingFrameForwarder source; |
| 1383 source.set_adaptation_enabled(true); |
| 1384 vie_encoder_->SetSource( |
| 1385 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |
| 1386 |
| 1387 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1388 sink_.WaitForEncodedFrame(1); |
| 1389 VerifyNoLimitation(source.sink_wants()); |
| 1390 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
| 1391 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
| 1392 |
| 1393 // Trigger adapt down, expect scaled down resolution. |
| 1394 vie_encoder_->TriggerQualityLow(); |
| 1395 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
| 1396 sink_.WaitForEncodedFrame(2); |
| 1397 VerifyResolutionLimitationLessThan(source.sink_wants(), kWidth * kHeight); |
| 1398 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); |
| 1399 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
| 1400 |
| 1401 // Trigger adapt up, expect no restriction. |
| 1402 vie_encoder_->TriggerQualityHigh(); |
| 1403 VerifyNoLimitation(source.sink_wants()); |
| 1404 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
| 1405 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
| 1406 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
| 1407 |
| 1408 vie_encoder_->Stop(); |
| 1409 } |
| 1410 |
| 1305 TEST_F(ViEEncoderTest, DoesNotScaleBelowSetLimit) { | 1411 TEST_F(ViEEncoderTest, DoesNotScaleBelowSetLimit) { |
| 1306 int frame_width = 1280; | 1412 int frame_width = 1280; |
| 1307 int frame_height = 720; | 1413 int frame_height = 720; |
| 1308 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1414 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1309 | 1415 |
| 1310 for (size_t i = 1; i <= 10; i++) { | 1416 for (size_t i = 1; i <= 10; i++) { |
| 1311 video_source_.IncomingCapturedFrame( | 1417 video_source_.IncomingCapturedFrame( |
| 1312 CreateFrame(i, frame_width, frame_height)); | 1418 CreateFrame(i, frame_width, frame_height)); |
| 1313 sink_.WaitForEncodedFrame(i); | 1419 sink_.WaitForEncodedFrame(i); |
| 1314 // Trigger scale down. | 1420 // Trigger scale down. |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1469 VideoSendStream::DegradationPreference::kBalanced); | 1575 VideoSendStream::DegradationPreference::kBalanced); |
| 1470 | 1576 |
| 1471 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1577 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1472 // Frame should not be dropped, even if it's too large. | 1578 // Frame should not be dropped, even if it's too large. |
| 1473 sink_.WaitForEncodedFrame(1); | 1579 sink_.WaitForEncodedFrame(1); |
| 1474 | 1580 |
| 1475 vie_encoder_->Stop(); | 1581 vie_encoder_->Stop(); |
| 1476 fake_encoder_.SetQualityScaling(true); | 1582 fake_encoder_.SetQualityScaling(true); |
| 1477 } | 1583 } |
| 1478 | 1584 |
| 1585 TEST_F(ViEEncoderTest, FailingInitEncodeDoesntCauseCrash) { |
| 1586 fake_encoder_.ForceInitEncodeFailure(true); |
| 1587 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1588 ResetEncoder("VP8", 2, 1, true); |
| 1589 const int kFrameWidth = 1280; |
| 1590 const int kFrameHeight = 720; |
| 1591 video_source_.IncomingCapturedFrame( |
| 1592 CreateFrame(1, kFrameWidth, kFrameHeight)); |
| 1593 sink_.ExpectDroppedFrame(); |
| 1594 vie_encoder_->Stop(); |
| 1595 } |
| 1596 |
| 1479 // TODO(sprang): Extend this with fps throttling and any "balanced" extensions. | 1597 // TODO(sprang): Extend this with fps throttling and any "balanced" extensions. |
| 1480 TEST_F(ViEEncoderTest, AdaptsResolutionOnOveruse) { | 1598 TEST_F(ViEEncoderTest, AdaptsResolutionOnOveruse) { |
| 1481 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1599 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1482 | 1600 |
| 1483 const int kFrameWidth = 1280; | 1601 const int kFrameWidth = 1280; |
| 1484 const int kFrameHeight = 720; | 1602 const int kFrameHeight = 720; |
| 1485 // Enabled default VideoAdapter downscaling. First step is 3/4, not 3/5 as | 1603 // Enabled default VideoAdapter downscaling. First step is 3/4, not 3/5 as |
| 1486 // requested by ViEEncoder::VideoSourceProxy::RequestResolutionLowerThan(). | 1604 // requested by ViEEncoder::VideoSourceProxy::RequestResolutionLowerThan(). |
| 1487 video_source_.set_adaptation_enabled(true); | 1605 video_source_.set_adaptation_enabled(true); |
| 1488 | 1606 |
| 1489 video_source_.IncomingCapturedFrame( | 1607 video_source_.IncomingCapturedFrame( |
| 1490 CreateFrame(1, kFrameWidth, kFrameHeight)); | 1608 CreateFrame(1, kFrameWidth, kFrameHeight)); |
| 1491 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight); | 1609 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight); |
| 1492 | 1610 |
| 1493 // Trigger CPU overuse, downscale by 3/4. | 1611 // Trigger CPU overuse, downscale by 3/4. |
| 1494 vie_encoder_->TriggerCpuOveruse(); | 1612 vie_encoder_->TriggerCpuOveruse(); |
| 1495 video_source_.IncomingCapturedFrame( | 1613 video_source_.IncomingCapturedFrame( |
| 1496 CreateFrame(2, kFrameWidth, kFrameHeight)); | 1614 CreateFrame(2, kFrameWidth, kFrameHeight)); |
| 1497 sink_.WaitForEncodedFrame((kFrameWidth * 3) / 4, (kFrameHeight * 3) / 4); | 1615 sink_.WaitForEncodedFrame((kFrameWidth * 3) / 4, (kFrameHeight * 3) / 4); |
| 1498 | 1616 |
| 1499 // Trigger CPU normal use, return to original resolution. | 1617 // Trigger CPU normal use, return to original resolution. |
| 1500 vie_encoder_->TriggerCpuNormalUsage(); | 1618 vie_encoder_->TriggerCpuNormalUsage(); |
| 1501 video_source_.IncomingCapturedFrame( | 1619 video_source_.IncomingCapturedFrame( |
| 1502 CreateFrame(3, kFrameWidth, kFrameHeight)); | 1620 CreateFrame(3, kFrameWidth, kFrameHeight)); |
| 1503 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight); | 1621 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight); |
| 1504 | 1622 |
| 1505 vie_encoder_->Stop(); | 1623 vie_encoder_->Stop(); |
| 1506 } | 1624 } |
| 1507 | 1625 |
| 1508 TEST_F(ViEEncoderTest, FailingInitEncodeDoesntCauseCrash) { | 1626 TEST_F(ViEEncoderTest, AdaptsFramerateOnOveruse_MaintainResolutionMode) { |
| 1509 fake_encoder_.ForceInitEncodeFailure(true); | |
| 1510 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | |
| 1511 ResetEncoder("VP8", 2, 1, true); | |
| 1512 const int kFrameWidth = 1280; | |
| 1513 const int kFrameHeight = 720; | |
| 1514 video_source_.IncomingCapturedFrame( | |
| 1515 CreateFrame(1, kFrameWidth, kFrameHeight)); | |
| 1516 sink_.ExpectDroppedFrame(); | |
| 1517 vie_encoder_->Stop(); | |
| 1518 } | |
| 1519 | |
| 1520 TEST_F(ViEEncoderTest, AdaptsFrameOnOveruseWithMaintainResolution) { | |
| 1521 const int kDefaultFramerateFps = 30; | 1627 const int kDefaultFramerateFps = 30; |
| 1522 const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kDefaultFramerateFps; | 1628 const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kDefaultFramerateFps; |
| 1523 const int kFrameWidth = 1280; | 1629 const int kFrameWidth = 1280; |
| 1524 const int kFrameHeight = 720; | 1630 const int kFrameHeight = 720; |
| 1525 rtc::ScopedFakeClock fake_clock; | 1631 rtc::ScopedFakeClock fake_clock; |
| 1526 | 1632 |
| 1527 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1633 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1528 vie_encoder_->SetSource( | 1634 vie_encoder_->SetSource( |
| 1529 &video_source_, | 1635 &video_source_, |
| 1530 VideoSendStream::DegradationPreference::kMaintainResolution); | 1636 VideoSendStream::DegradationPreference::kMaintainResolution); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1664 for (int i = 0; i < 10; ++i) { | 1770 for (int i = 0; i < 10; ++i) { |
| 1665 timestamp_ms += kMinFpsFrameInterval; | 1771 timestamp_ms += kMinFpsFrameInterval; |
| 1666 fake_clock.AdvanceTimeMicros(kMinFpsFrameInterval * 1000); | 1772 fake_clock.AdvanceTimeMicros(kMinFpsFrameInterval * 1000); |
| 1667 video_source_.IncomingCapturedFrame( | 1773 video_source_.IncomingCapturedFrame( |
| 1668 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); | 1774 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); |
| 1669 sink_.WaitForEncodedFrame(timestamp_ms); | 1775 sink_.WaitForEncodedFrame(timestamp_ms); |
| 1670 } | 1776 } |
| 1671 vie_encoder_->Stop(); | 1777 vie_encoder_->Stop(); |
| 1672 } | 1778 } |
| 1673 } // namespace webrtc | 1779 } // namespace webrtc |
| OLD | NEW |