| 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 16 matching lines...) Expand all  Loading... | 
|    27 #include "webrtc/test/gtest.h" |    27 #include "webrtc/test/gtest.h" | 
|    28 #include "webrtc/video/send_statistics_proxy.h" |    28 #include "webrtc/video/send_statistics_proxy.h" | 
|    29 #include "webrtc/video/vie_encoder.h" |    29 #include "webrtc/video/vie_encoder.h" | 
|    30  |    30  | 
|    31 namespace { |    31 namespace { | 
|    32 // TODO(kthelgason): Lower this limit when better testing |    32 // TODO(kthelgason): Lower this limit when better testing | 
|    33 // on MediaCodec and fallback implementations are in place. |    33 // on MediaCodec and fallback implementations are in place. | 
|    34 const int kMinPixelsPerFrame = 320 * 180; |    34 const int kMinPixelsPerFrame = 320 * 180; | 
|    35 const int kMinFramerateFps = 2; |    35 const int kMinFramerateFps = 2; | 
|    36 const int64_t kFrameTimeoutMs = 100; |    36 const int64_t kFrameTimeoutMs = 100; | 
 |    37 const int kBpsLimitFor15Fps = 500000; | 
 |    38 const int kBpsLimitFor10Fps = 130000; | 
 |    39 const int kBpsLimitFor7Fps = 60000; | 
|    37 }  // namespace |    40 }  // namespace | 
|    38  |    41  | 
|    39 namespace webrtc { |    42 namespace webrtc { | 
|    40  |    43  | 
|    41 using DegredationPreference = VideoSendStream::DegradationPreference; |    44 using DegredationPreference = VideoSendStream::DegradationPreference; | 
|    42 using ScaleReason = AdaptationObserverInterface::AdaptReason; |    45 using ScaleReason = AdaptationObserverInterface::AdaptReason; | 
|    43 using ::testing::_; |    46 using ::testing::_; | 
|    44 using ::testing::Return; |    47 using ::testing::Return; | 
|    45  |    48  | 
|    46 namespace { |    49 namespace { | 
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   304     EXPECT_LT(wants1.max_pixel_count, wants2.max_pixel_count); |   307     EXPECT_LT(wants1.max_pixel_count, wants2.max_pixel_count); | 
|   305     EXPECT_GT(wants1.max_pixel_count, 0); |   308     EXPECT_GT(wants1.max_pixel_count, 0); | 
|   306   } |   309   } | 
|   307  |   310  | 
|   308   void VerifyFpsMaxResolutionGt(const rtc::VideoSinkWants& wants1, |   311   void VerifyFpsMaxResolutionGt(const rtc::VideoSinkWants& wants1, | 
|   309                                 const rtc::VideoSinkWants& wants2) { |   312                                 const rtc::VideoSinkWants& wants2) { | 
|   310     EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps); |   313     EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps); | 
|   311     EXPECT_GT(wants1.max_pixel_count, wants2.max_pixel_count); |   314     EXPECT_GT(wants1.max_pixel_count, wants2.max_pixel_count); | 
|   312   } |   315   } | 
|   313  |   316  | 
 |   317   void VerifyFpsMaxResolutionEq(const rtc::VideoSinkWants& wants1, | 
 |   318                                 const rtc::VideoSinkWants& wants2) { | 
 |   319     EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps); | 
 |   320     EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count); | 
 |   321   } | 
 |   322  | 
 |   323   void VerifyFpsLtResolutionEq(const rtc::VideoSinkWants& wants1, | 
 |   324                                const rtc::VideoSinkWants& wants2) { | 
 |   325     EXPECT_LT(wants1.max_framerate_fps, wants2.max_framerate_fps); | 
 |   326     EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count); | 
 |   327   } | 
 |   328  | 
 |   329   void VerifyFpsGtResolutionEq(const rtc::VideoSinkWants& wants1, | 
 |   330                                const rtc::VideoSinkWants& wants2) { | 
 |   331     EXPECT_GT(wants1.max_framerate_fps, wants2.max_framerate_fps); | 
 |   332     EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count); | 
 |   333   } | 
 |   334  | 
 |   335   void VerifyFpsEqResolutionLt(const rtc::VideoSinkWants& wants1, | 
 |   336                                const rtc::VideoSinkWants& wants2) { | 
 |   337     EXPECT_EQ(wants1.max_framerate_fps, wants2.max_framerate_fps); | 
 |   338     EXPECT_LT(wants1.max_pixel_count, wants2.max_pixel_count); | 
 |   339     EXPECT_GT(wants1.max_pixel_count, 0); | 
 |   340   } | 
 |   341  | 
 |   342   void VerifyFpsEqResolutionGt(const rtc::VideoSinkWants& wants1, | 
 |   343                                const rtc::VideoSinkWants& wants2) { | 
 |   344     EXPECT_EQ(wants1.max_framerate_fps, wants2.max_framerate_fps); | 
 |   345     EXPECT_GT(wants1.max_pixel_count, wants2.max_pixel_count); | 
 |   346   } | 
 |   347  | 
|   314   void VerifyFpsMaxResolutionLt(const rtc::VideoSinkWants& wants, |   348   void VerifyFpsMaxResolutionLt(const rtc::VideoSinkWants& wants, | 
|   315                                 int pixel_count) { |   349                                 int pixel_count) { | 
|   316     EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); |   350     EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); | 
|   317     EXPECT_LT(wants.max_pixel_count, pixel_count); |   351     EXPECT_LT(wants.max_pixel_count, pixel_count); | 
|   318     EXPECT_GT(wants.max_pixel_count, 0); |   352     EXPECT_GT(wants.max_pixel_count, 0); | 
|   319   } |   353   } | 
|   320  |   354  | 
|   321   void VerifyFpsLtResolutionMax(const rtc::VideoSinkWants& wants, int fps) { |   355   void VerifyFpsLtResolutionMax(const rtc::VideoSinkWants& wants, int fps) { | 
|   322     EXPECT_LT(wants.max_framerate_fps, fps); |   356     EXPECT_LT(wants.max_framerate_fps, fps); | 
|   323     EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); |   357     EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); | 
|   324     EXPECT_FALSE(wants.target_pixel_count); |   358     EXPECT_FALSE(wants.target_pixel_count); | 
|   325   } |   359   } | 
|   326  |   360  | 
 |   361   void VerifyFpsEqResolutionMax(const rtc::VideoSinkWants& wants, | 
 |   362                                 int expected_fps) { | 
 |   363     EXPECT_EQ(expected_fps, wants.max_framerate_fps); | 
 |   364     EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); | 
 |   365     EXPECT_FALSE(wants.target_pixel_count); | 
 |   366   } | 
 |   367  | 
|   327   class TestEncoder : public test::FakeEncoder { |   368   class TestEncoder : public test::FakeEncoder { | 
|   328    public: |   369    public: | 
|   329     TestEncoder() |   370     TestEncoder() | 
|   330         : FakeEncoder(Clock::GetRealTimeClock()), |   371         : FakeEncoder(Clock::GetRealTimeClock()), | 
|   331           continue_encode_event_(false, false) {} |   372           continue_encode_event_(false, false) {} | 
|   332  |   373  | 
|   333     VideoCodec codec_config() const { |   374     VideoCodec codec_config() const { | 
|   334       rtc::CritScope lock(&crit_sect_); |   375       rtc::CritScope lock(&crit_sect_); | 
|   335       return config_; |   376       return config_; | 
|   336     } |   377     } | 
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   801             video_source_.sink_wants().target_pixel_count.value_or(0)); |   842             video_source_.sink_wants().target_pixel_count.value_or(0)); | 
|   802   EXPECT_EQ(frame_width * frame_height * 4, |   843   EXPECT_EQ(frame_width * frame_height * 4, | 
|   803             video_source_.sink_wants().max_pixel_count); |   844             video_source_.sink_wants().max_pixel_count); | 
|   804   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |   845   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
|   805   EXPECT_EQ(kMaxDowngrades + 1, |   846   EXPECT_EQ(kMaxDowngrades + 1, | 
|   806             stats_proxy_->GetStats().number_of_cpu_adapt_changes); |   847             stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
|   807  |   848  | 
|   808   vie_encoder_->Stop(); |   849   vie_encoder_->Stop(); | 
|   809 } |   850 } | 
|   810  |   851  | 
 |   852 TEST_F(ViEEncoderTest, TestMaxCpuResolutionDowngrades_BalancedMode_NoFpsLimit) { | 
 |   853   const int kMaxDowngrades = ViEEncoder::kMaxCpuResolutionDowngrades; | 
 |   854   const int kWidth = 1280; | 
 |   855   const int kHeight = 720; | 
 |   856   vie_encoder_->OnBitrateUpdated(kBpsLimitFor15Fps + 1, 0, 0); | 
 |   857  | 
 |   858   // Enable kBalanced preference, no initial limitation. | 
 |   859   AdaptingFrameForwarder source; | 
 |   860   source.set_adaptation_enabled(true); | 
 |   861   vie_encoder_->SetSource(&source, | 
 |   862                           VideoSendStream::DegradationPreference::kBalanced); | 
 |   863   VerifyNoLimitation(source.sink_wants()); | 
 |   864   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |   865   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |   866  | 
 |   867   // Trigger adapt down kMaxCpuDowngrades times. | 
 |   868   int t = 1; | 
 |   869   for (int i = 1; i <= kMaxDowngrades; ++i) { | 
 |   870     source.IncomingCapturedFrame(CreateFrame(t, kWidth, kHeight)); | 
 |   871     sink_.WaitForEncodedFrame(t++); | 
 |   872     vie_encoder_->TriggerCpuOveruse(); | 
 |   873     VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants()); | 
 |   874     EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |   875     EXPECT_EQ(i, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |   876   } | 
 |   877  | 
 |   878   // Trigger adapt down, max cpu downgrades reach, expect no change. | 
 |   879   rtc::VideoSinkWants last_wants = source.sink_wants(); | 
 |   880   source.IncomingCapturedFrame(CreateFrame(t, kWidth, kHeight)); | 
 |   881   sink_.WaitForEncodedFrame(t++); | 
 |   882   vie_encoder_->TriggerCpuOveruse(); | 
 |   883   VerifyFpsEqResolutionEq(source.sink_wants(), last_wants); | 
 |   884   EXPECT_EQ(last_wants.max_pixel_count, source.sink_wants().max_pixel_count); | 
 |   885   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |   886   EXPECT_EQ(kMaxDowngrades, | 
 |   887             stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |   888  | 
 |   889   // Trigger adapt up kMaxCpuDowngrades times. | 
 |   890   for (int i = 1; i <= kMaxDowngrades; ++i) { | 
 |   891     source.IncomingCapturedFrame(CreateFrame(t, kWidth, kHeight)); | 
 |   892     sink_.WaitForEncodedFrame(t++); | 
 |   893     vie_encoder_->TriggerCpuNormalUsage(); | 
 |   894     VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); | 
 |   895     EXPECT_GT(source.sink_wants().max_pixel_count, last_wants.max_pixel_count); | 
 |   896     EXPECT_EQ(kMaxDowngrades + i, | 
 |   897               stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |   898   } | 
 |   899  | 
 |   900   VerifyNoLimitation(source.sink_wants()); | 
 |   901   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |   902  | 
 |   903   vie_encoder_->Stop(); | 
 |   904 } | 
|   811 TEST_F(ViEEncoderTest, SinkWantsStoredByDegradationPreference) { |   905 TEST_F(ViEEncoderTest, SinkWantsStoredByDegradationPreference) { | 
|   812   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |   906   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|   813   VerifyNoLimitation(video_source_.sink_wants()); |   907   VerifyNoLimitation(video_source_.sink_wants()); | 
|   814  |   908  | 
|   815   const int kFrameWidth = 1280; |   909   const int kFrameWidth = 1280; | 
|   816   const int kFrameHeight = 720; |   910   const int kFrameHeight = 720; | 
|   817   const int kFrameIntervalMs = 1000 / 30; |   911   const int kFrameIntervalMs = 1000 / 30; | 
|   818  |   912  | 
|   819   int frame_timestamp = 1; |   913   int frame_timestamp = 1; | 
|   820  |   914  | 
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1041 } |  1135 } | 
|  1042  |  1136  | 
|  1043 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) { |  1137 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) { | 
|  1044   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  1138   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1045  |  1139  | 
|  1046   const int kWidth = 1280; |  1140   const int kWidth = 1280; | 
|  1047   const int kHeight = 720; |  1141   const int kHeight = 720; | 
|  1048   video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |  1142   video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 
|  1049   sink_.WaitForEncodedFrame(1); |  1143   sink_.WaitForEncodedFrame(1); | 
|  1050   VideoSendStream::Stats stats = stats_proxy_->GetStats(); |  1144   VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 
|  1051   EXPECT_FALSE(stats.cpu_limited_resolution); |  | 
|  1052   EXPECT_FALSE(stats.bw_limited_resolution); |  1145   EXPECT_FALSE(stats.bw_limited_resolution); | 
 |  1146   EXPECT_FALSE(stats.bw_limited_framerate); | 
|  1053   EXPECT_EQ(0, stats.number_of_quality_adapt_changes); |  1147   EXPECT_EQ(0, stats.number_of_quality_adapt_changes); | 
|  1054  |  1148  | 
|  1055   // Set new source with adaptation still enabled. |  1149   // Set new source with adaptation still enabled. | 
|  1056   test::FrameForwarder new_video_source; |  1150   test::FrameForwarder new_video_source; | 
|  1057   vie_encoder_->SetSource(&new_video_source, |  1151   vie_encoder_->SetSource(&new_video_source, | 
|  1058                           VideoSendStream::DegradationPreference::kBalanced); |  1152                           VideoSendStream::DegradationPreference::kBalanced); | 
|  1059  |  1153  | 
|  1060   new_video_source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |  1154   new_video_source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 
|  1061   sink_.WaitForEncodedFrame(2); |  1155   sink_.WaitForEncodedFrame(2); | 
|  1062   stats = stats_proxy_->GetStats(); |  1156   stats = stats_proxy_->GetStats(); | 
|  1063   EXPECT_FALSE(stats.cpu_limited_resolution); |  | 
|  1064   EXPECT_FALSE(stats.bw_limited_resolution); |  1157   EXPECT_FALSE(stats.bw_limited_resolution); | 
 |  1158   EXPECT_FALSE(stats.bw_limited_framerate); | 
|  1065   EXPECT_EQ(0, stats.number_of_quality_adapt_changes); |  1159   EXPECT_EQ(0, stats.number_of_quality_adapt_changes); | 
|  1066  |  1160  | 
|  1067   // Trigger adapt down. |  1161   // Trigger adapt down. | 
|  1068   vie_encoder_->TriggerQualityLow(); |  1162   vie_encoder_->TriggerQualityLow(); | 
|  1069   new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); |  1163   new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); | 
|  1070   sink_.WaitForEncodedFrame(3); |  1164   sink_.WaitForEncodedFrame(3); | 
|  1071   stats = stats_proxy_->GetStats(); |  1165   stats = stats_proxy_->GetStats(); | 
|  1072   EXPECT_FALSE(stats.cpu_limited_resolution); |  | 
|  1073   EXPECT_TRUE(stats.bw_limited_resolution); |  1166   EXPECT_TRUE(stats.bw_limited_resolution); | 
 |  1167   EXPECT_FALSE(stats.bw_limited_framerate); | 
|  1074   EXPECT_EQ(1, stats.number_of_quality_adapt_changes); |  1168   EXPECT_EQ(1, stats.number_of_quality_adapt_changes); | 
|  1075  |  1169  | 
|  1076   // Set new source with adaptation still enabled. |  1170   // Set new source with adaptation still enabled. | 
|  1077   vie_encoder_->SetSource(&new_video_source, |  1171   vie_encoder_->SetSource(&new_video_source, | 
|  1078                           VideoSendStream::DegradationPreference::kBalanced); |  1172                           VideoSendStream::DegradationPreference::kBalanced); | 
|  1079  |  1173  | 
|  1080   new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); |  1174   new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 
|  1081   sink_.WaitForEncodedFrame(4); |  1175   sink_.WaitForEncodedFrame(4); | 
|  1082   stats = stats_proxy_->GetStats(); |  1176   stats = stats_proxy_->GetStats(); | 
|  1083   EXPECT_FALSE(stats.cpu_limited_resolution); |  | 
|  1084   EXPECT_TRUE(stats.bw_limited_resolution); |  1177   EXPECT_TRUE(stats.bw_limited_resolution); | 
 |  1178   EXPECT_FALSE(stats.bw_limited_framerate); | 
|  1085   EXPECT_EQ(1, stats.number_of_quality_adapt_changes); |  1179   EXPECT_EQ(1, stats.number_of_quality_adapt_changes); | 
|  1086  |  1180  | 
|  1087   // Disable resolution scaling. |  1181   // Disable resolution scaling. | 
|  1088   vie_encoder_->SetSource( |  1182   vie_encoder_->SetSource( | 
|  1089       &new_video_source, |  1183       &new_video_source, | 
|  1090       VideoSendStream::DegradationPreference::kMaintainResolution); |  1184       VideoSendStream::DegradationPreference::kMaintainResolution); | 
|  1091  |  1185  | 
|  1092   new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); |  1186   new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); | 
|  1093   sink_.WaitForEncodedFrame(5); |  1187   sink_.WaitForEncodedFrame(5); | 
|  1094   stats = stats_proxy_->GetStats(); |  1188   stats = stats_proxy_->GetStats(); | 
|  1095   EXPECT_FALSE(stats.cpu_limited_resolution); |  | 
|  1096   EXPECT_FALSE(stats.bw_limited_resolution); |  1189   EXPECT_FALSE(stats.bw_limited_resolution); | 
 |  1190   EXPECT_FALSE(stats.bw_limited_framerate); | 
|  1097   EXPECT_EQ(1, stats.number_of_quality_adapt_changes); |  1191   EXPECT_EQ(1, stats.number_of_quality_adapt_changes); | 
|  1098   EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |  1192   EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); | 
|  1099  |  1193  | 
|  1100   vie_encoder_->Stop(); |  1194   vie_encoder_->Stop(); | 
|  1101 } |  1195 } | 
|  1102  |  1196  | 
|  1103 TEST_F(ViEEncoderTest, QualityAdaptationStatsAreResetWhenScalerIsDisabled) { |  1197 TEST_F(ViEEncoderTest, QualityAdaptationStatsAreResetWhenScalerIsDisabled) { | 
|  1104   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  1198   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1105  |  1199  | 
|  1106   const int kWidth = 1280; |  1200   const int kWidth = 1280; | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1147   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  1241   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1148  |  1242  | 
|  1149   const int kWidth = 1280; |  1243   const int kWidth = 1280; | 
|  1150   const int kHeight = 720; |  1244   const int kHeight = 720; | 
|  1151   int sequence = 1; |  1245   int sequence = 1; | 
|  1152  |  1246  | 
|  1153   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); |  1247   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); | 
|  1154   sink_.WaitForEncodedFrame(sequence++); |  1248   sink_.WaitForEncodedFrame(sequence++); | 
|  1155   VideoSendStream::Stats stats = stats_proxy_->GetStats(); |  1249   VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 
|  1156   EXPECT_FALSE(stats.cpu_limited_resolution); |  1250   EXPECT_FALSE(stats.cpu_limited_resolution); | 
 |  1251   EXPECT_FALSE(stats.cpu_limited_framerate); | 
|  1157   EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |  1252   EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); | 
|  1158  |  1253  | 
|  1159   // Trigger CPU overuse, should now adapt down. |  1254   // Trigger CPU overuse, should now adapt down. | 
|  1160   vie_encoder_->TriggerCpuOveruse(); |  1255   vie_encoder_->TriggerCpuOveruse(); | 
|  1161   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); |  1256   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); | 
|  1162   sink_.WaitForEncodedFrame(sequence++); |  1257   sink_.WaitForEncodedFrame(sequence++); | 
|  1163   stats = stats_proxy_->GetStats(); |  1258   stats = stats_proxy_->GetStats(); | 
|  1164   EXPECT_TRUE(stats.cpu_limited_resolution); |  1259   EXPECT_TRUE(stats.cpu_limited_resolution); | 
 |  1260   EXPECT_FALSE(stats.cpu_limited_framerate); | 
|  1165   EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |  1261   EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 
|  1166  |  1262  | 
|  1167   // Set new source with adaptation still enabled. |  1263   // Set new source with adaptation still enabled. | 
|  1168   test::FrameForwarder new_video_source; |  1264   test::FrameForwarder new_video_source; | 
|  1169   vie_encoder_->SetSource( |  1265   vie_encoder_->SetSource( | 
|  1170       &new_video_source, |  1266       &new_video_source, | 
|  1171       VideoSendStream::DegradationPreference::kMaintainFramerate); |  1267       VideoSendStream::DegradationPreference::kMaintainFramerate); | 
|  1172  |  1268  | 
|  1173   new_video_source.IncomingCapturedFrame( |  1269   new_video_source.IncomingCapturedFrame( | 
|  1174       CreateFrame(sequence, kWidth, kHeight)); |  1270       CreateFrame(sequence, kWidth, kHeight)); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1212   // Disable CPU adaptation. |  1308   // Disable CPU adaptation. | 
|  1213   vie_encoder_->SetSource( |  1309   vie_encoder_->SetSource( | 
|  1214       &new_video_source, |  1310       &new_video_source, | 
|  1215       VideoSendStream::DegradationPreference::kDegradationDisabled); |  1311       VideoSendStream::DegradationPreference::kDegradationDisabled); | 
|  1216   new_video_source.IncomingCapturedFrame( |  1312   new_video_source.IncomingCapturedFrame( | 
|  1217       CreateFrame(sequence, kWidth, kHeight)); |  1313       CreateFrame(sequence, kWidth, kHeight)); | 
|  1218   sink_.WaitForEncodedFrame(sequence++); |  1314   sink_.WaitForEncodedFrame(sequence++); | 
|  1219  |  1315  | 
|  1220   stats = stats_proxy_->GetStats(); |  1316   stats = stats_proxy_->GetStats(); | 
|  1221   EXPECT_FALSE(stats.cpu_limited_resolution); |  1317   EXPECT_FALSE(stats.cpu_limited_resolution); | 
 |  1318   EXPECT_FALSE(stats.cpu_limited_framerate); | 
|  1222   EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); |  1319   EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); | 
|  1223  |  1320  | 
|  1224   // Try to trigger overuse. Should not succeed. |  1321   // Try to trigger overuse. Should not succeed. | 
|  1225   stats_proxy_->SetMockStats(mock_stats); |  1322   stats_proxy_->SetMockStats(mock_stats); | 
|  1226   vie_encoder_->TriggerCpuOveruse(); |  1323   vie_encoder_->TriggerCpuOveruse(); | 
|  1227   stats_proxy_->ResetMockStats(); |  1324   stats_proxy_->ResetMockStats(); | 
|  1228  |  1325  | 
|  1229   stats = stats_proxy_->GetStats(); |  1326   stats = stats_proxy_->GetStats(); | 
|  1230   EXPECT_FALSE(stats.cpu_limited_resolution); |  1327   EXPECT_FALSE(stats.cpu_limited_resolution); | 
 |  1328   EXPECT_FALSE(stats.cpu_limited_framerate); | 
|  1231   EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); |  1329   EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); | 
|  1232  |  1330  | 
|  1233   // Switch back the source with resolution adaptation enabled. |  1331   // Switch back the source with resolution adaptation enabled. | 
|  1234   vie_encoder_->SetSource( |  1332   vie_encoder_->SetSource( | 
|  1235       &video_source_, |  1333       &video_source_, | 
|  1236       VideoSendStream::DegradationPreference::kMaintainFramerate); |  1334       VideoSendStream::DegradationPreference::kMaintainFramerate); | 
|  1237   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); |  1335   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); | 
|  1238   sink_.WaitForEncodedFrame(sequence++); |  1336   sink_.WaitForEncodedFrame(sequence++); | 
|  1239   stats = stats_proxy_->GetStats(); |  1337   stats = stats_proxy_->GetStats(); | 
|  1240   EXPECT_TRUE(stats.cpu_limited_resolution); |  1338   EXPECT_TRUE(stats.cpu_limited_resolution); | 
 |  1339   EXPECT_FALSE(stats.cpu_limited_framerate); | 
|  1241   EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); |  1340   EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); | 
|  1242  |  1341  | 
|  1243   // Trigger CPU normal usage. |  1342   // Trigger CPU normal usage. | 
|  1244   vie_encoder_->TriggerCpuNormalUsage(); |  1343   vie_encoder_->TriggerCpuNormalUsage(); | 
|  1245   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); |  1344   video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); | 
|  1246   sink_.WaitForEncodedFrame(sequence++); |  1345   sink_.WaitForEncodedFrame(sequence++); | 
|  1247   stats = stats_proxy_->GetStats(); |  1346   stats = stats_proxy_->GetStats(); | 
|  1248   EXPECT_FALSE(stats.cpu_limited_resolution); |  1347   EXPECT_FALSE(stats.cpu_limited_resolution); | 
 |  1348   EXPECT_FALSE(stats.cpu_limited_framerate); | 
|  1249   EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); |  1349   EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); | 
|  1250  |  1350  | 
|  1251   // Back to the source with adaptation off, set it back to maintain-resolution. |  1351   // Back to the source with adaptation off, set it back to maintain-resolution. | 
|  1252   vie_encoder_->SetSource( |  1352   vie_encoder_->SetSource( | 
|  1253       &new_video_source, |  1353       &new_video_source, | 
|  1254       VideoSendStream::DegradationPreference::kMaintainResolution); |  1354       VideoSendStream::DegradationPreference::kMaintainResolution); | 
|  1255   new_video_source.IncomingCapturedFrame( |  1355   new_video_source.IncomingCapturedFrame( | 
|  1256       CreateFrame(sequence, kWidth, kHeight)); |  1356       CreateFrame(sequence, kWidth, kHeight)); | 
|  1257   sink_.WaitForEncodedFrame(sequence++); |  1357   sink_.WaitForEncodedFrame(sequence++); | 
|  1258   stats = stats_proxy_->GetStats(); |  1358   stats = stats_proxy_->GetStats(); | 
|  1259   // Disabled, since we previously switched the source too disabled. |  1359   // Disabled, since we previously switched the source to disabled. | 
|  1260   EXPECT_FALSE(stats.cpu_limited_resolution); |  1360   EXPECT_FALSE(stats.cpu_limited_resolution); | 
 |  1361   EXPECT_TRUE(stats.cpu_limited_framerate); | 
|  1261   EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); |  1362   EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); | 
|  1262  |  1363  | 
|  1263   // Trigger CPU normal usage. |  1364   // Trigger CPU normal usage. | 
|  1264   vie_encoder_->TriggerCpuNormalUsage(); |  1365   vie_encoder_->TriggerCpuNormalUsage(); | 
|  1265   new_video_source.IncomingCapturedFrame( |  1366   new_video_source.IncomingCapturedFrame( | 
|  1266       CreateFrame(sequence, kWidth, kHeight)); |  1367       CreateFrame(sequence, kWidth, kHeight)); | 
|  1267   sink_.WaitForEncodedFrame(sequence++); |  1368   sink_.WaitForEncodedFrame(sequence++); | 
|  1268   stats = stats_proxy_->GetStats(); |  1369   stats = stats_proxy_->GetStats(); | 
|  1269   EXPECT_FALSE(stats.cpu_limited_resolution); |  1370   EXPECT_FALSE(stats.cpu_limited_resolution); | 
 |  1371   EXPECT_FALSE(stats.cpu_limited_framerate); | 
|  1270   EXPECT_EQ(4, stats.number_of_cpu_adapt_changes); |  1372   EXPECT_EQ(4, stats.number_of_cpu_adapt_changes); | 
|  1271   EXPECT_EQ(0, stats.number_of_quality_adapt_changes); |  1373   EXPECT_EQ(0, stats.number_of_quality_adapt_changes); | 
|  1272  |  1374  | 
|  1273   vie_encoder_->Stop(); |  1375   vie_encoder_->Stop(); | 
|  1274 } |  1376 } | 
|  1275  |  1377  | 
|  1276 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) { |  1378 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) { | 
|  1277   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  1379   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1278  |  1380  | 
|  1279   const int kWidth = 1280; |  1381   const int kWidth = 1280; | 
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1361  |  1463  | 
|  1362   // Trigger adapt down for same input resolution, expect no change. |  1464   // Trigger adapt down for same input resolution, expect no change. | 
|  1363   vie_encoder_->TriggerCpuOveruse(); |  1465   vie_encoder_->TriggerCpuOveruse(); | 
|  1364   EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count); |  1466   EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count); | 
|  1365   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |  1467   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
|  1366   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |  1468   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
|  1367  |  1469  | 
|  1368   vie_encoder_->Stop(); |  1470   vie_encoder_->Stop(); | 
|  1369 } |  1471 } | 
|  1370  |  1472  | 
 |  1473 TEST_F(ViEEncoderTest, SkipsSameOrLargerAdaptDownRequest_BalancedMode) { | 
 |  1474   const int kWidth = 1280; | 
 |  1475   const int kHeight = 720; | 
 |  1476   vie_encoder_->OnBitrateUpdated(kBpsLimitFor15Fps + 1, 0, 0); | 
 |  1477  | 
 |  1478   // Enable kBalanced preference, no initial limitation. | 
 |  1479   test::FrameForwarder source; | 
 |  1480   vie_encoder_->SetSource(&source, | 
 |  1481                           VideoSendStream::DegradationPreference::kBalanced); | 
 |  1482   source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 
 |  1483   sink_.WaitForEncodedFrame(1); | 
 |  1484   VerifyNoLimitation(source.sink_wants()); | 
 |  1485  | 
 |  1486   // Trigger adapt down, expect scaled down resolution. | 
 |  1487   vie_encoder_->TriggerQualityLow(); | 
 |  1488   VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); | 
 |  1489   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1490   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1491   const int kLastMaxPixelCount = source.sink_wants().max_pixel_count; | 
 |  1492  | 
 |  1493   // Trigger adapt down for same input resolution, expect no change. | 
 |  1494   source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 
 |  1495   sink_.WaitForEncodedFrame(2); | 
 |  1496   vie_encoder_->TriggerQualityLow(); | 
 |  1497   EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count); | 
 |  1498   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1499   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1500  | 
 |  1501   // Trigger adapt down for larger input resolution, expect no change. | 
 |  1502   source.IncomingCapturedFrame(CreateFrame(3, kWidth + 1, kHeight + 1)); | 
 |  1503   sink_.WaitForEncodedFrame(3); | 
 |  1504   vie_encoder_->TriggerQualityLow(); | 
 |  1505   EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count); | 
 |  1506   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1507   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1508  | 
 |  1509   vie_encoder_->Stop(); | 
 |  1510 } | 
 |  1511  | 
|  1371 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_MaintainFramerateMode) { |  1512 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_MaintainFramerateMode) { | 
|  1372   const int kWidth = 1280; |  1513   const int kWidth = 1280; | 
|  1373   const int kHeight = 720; |  1514   const int kHeight = 720; | 
|  1374   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  1515   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1375  |  1516  | 
|  1376   // Enable kMaintainFramerate preference, no initial limitation. |  1517   // Enable kMaintainFramerate preference, no initial limitation. | 
|  1377   test::FrameForwarder source; |  1518   test::FrameForwarder source; | 
|  1378   vie_encoder_->SetSource( |  1519   vie_encoder_->SetSource( | 
|  1379       &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |  1520       &source, VideoSendStream::DegradationPreference::kMaintainFramerate); | 
|  1380  |  1521  | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|  1411  |  1552  | 
|  1412   // Trigger adapt up, expect no change. |  1553   // Trigger adapt up, expect no change. | 
|  1413   vie_encoder_->TriggerCpuNormalUsage(); |  1554   vie_encoder_->TriggerCpuNormalUsage(); | 
|  1414   VerifyNoLimitation(source.sink_wants()); |  1555   VerifyNoLimitation(source.sink_wants()); | 
|  1415   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); |  1556   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
|  1416   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |  1557   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
|  1417  |  1558  | 
|  1418   vie_encoder_->Stop(); |  1559   vie_encoder_->Stop(); | 
|  1419 } |  1560 } | 
|  1420  |  1561  | 
 |  1562 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_BalancedMode) { | 
 |  1563   const int kWidth = 1280; | 
 |  1564   const int kHeight = 720; | 
 |  1565   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
 |  1566  | 
 |  1567   // Enable kBalanced preference, no initial limitation. | 
 |  1568   test::FrameForwarder source; | 
 |  1569   vie_encoder_->SetSource(&source, | 
 |  1570                           VideoSendStream::DegradationPreference::kBalanced); | 
 |  1571  | 
 |  1572   source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 
 |  1573   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  1574   VerifyNoLimitation(source.sink_wants()); | 
 |  1575   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1576   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  1577   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1578  | 
 |  1579   // Trigger adapt up, expect no change. | 
 |  1580   vie_encoder_->TriggerQualityHigh(); | 
 |  1581   VerifyNoLimitation(source.sink_wants()); | 
 |  1582   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1583   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  1584   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1585  | 
 |  1586   vie_encoder_->Stop(); | 
 |  1587 } | 
 |  1588  | 
|  1421 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_DisabledMode) { |  1589 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_DisabledMode) { | 
|  1422   const int kWidth = 1280; |  1590   const int kWidth = 1280; | 
|  1423   const int kHeight = 720; |  1591   const int kHeight = 720; | 
|  1424   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  1592   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1425  |  1593  | 
|  1426   // Enable kDegradationDisabled preference, no initial limitation. |  1594   // Enable kDegradationDisabled preference, no initial limitation. | 
|  1427   test::FrameForwarder source; |  1595   test::FrameForwarder source; | 
|  1428   vie_encoder_->SetSource( |  1596   vie_encoder_->SetSource( | 
|  1429       &source, VideoSendStream::DegradationPreference::kDegradationDisabled); |  1597       &source, VideoSendStream::DegradationPreference::kDegradationDisabled); | 
|  1430  |  1598  | 
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1603   source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); |  1771   source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); | 
|  1604   sink_.WaitForEncodedFrame(kWidth, kHeight); |  1772   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
|  1605   VerifyNoLimitation(source.sink_wants()); |  1773   VerifyNoLimitation(source.sink_wants()); | 
|  1606   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |  1774   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
|  1607   EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |  1775   EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
|  1608  |  1776  | 
|  1609   vie_encoder_->Stop(); |  1777   vie_encoder_->Stop(); | 
|  1610 } |  1778 } | 
|  1611  |  1779  | 
|  1612 TEST_F(ViEEncoderTest, |  1780 TEST_F(ViEEncoderTest, | 
 |  1781        AdaptsResolutionUpAndDownTwiceForLowQuality_BalancedMode_NoFpsLimit) { | 
 |  1782   const int kWidth = 1280; | 
 |  1783   const int kHeight = 720; | 
 |  1784   vie_encoder_->OnBitrateUpdated(kBpsLimitFor15Fps + 1, 0, 0); | 
 |  1785  | 
 |  1786   // Enable kBalanced preference, no initial limitation. | 
 |  1787   AdaptingFrameForwarder source; | 
 |  1788   source.set_adaptation_enabled(true); | 
 |  1789   vie_encoder_->SetSource(&source, | 
 |  1790                           VideoSendStream::DegradationPreference::kBalanced); | 
 |  1791  | 
 |  1792   source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 
 |  1793   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  1794   VerifyNoLimitation(source.sink_wants()); | 
 |  1795   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1796   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1797  | 
 |  1798   // Trigger adapt down, expect scaled down resolution. | 
 |  1799   vie_encoder_->TriggerQualityLow(); | 
 |  1800   source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 
 |  1801   sink_.WaitForEncodedFrame(2); | 
 |  1802   VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); | 
 |  1803   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1804   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1805  | 
 |  1806   // Trigger adapt up, expect no restriction. | 
 |  1807   vie_encoder_->TriggerQualityHigh(); | 
 |  1808   source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); | 
 |  1809   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  1810   VerifyNoLimitation(source.sink_wants()); | 
 |  1811   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1812   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1813  | 
 |  1814   // Trigger adapt down, expect scaled down resolution. | 
 |  1815   vie_encoder_->TriggerQualityLow(); | 
 |  1816   source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 
 |  1817   sink_.WaitForEncodedFrame(4); | 
 |  1818   VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); | 
 |  1819   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1820   EXPECT_EQ(3, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1821  | 
 |  1822   // Trigger adapt up, expect no restriction. | 
 |  1823   vie_encoder_->TriggerQualityHigh(); | 
 |  1824   source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); | 
 |  1825   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  1826   VerifyNoLimitation(source.sink_wants()); | 
 |  1827   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  1828   EXPECT_EQ(4, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  1829  | 
 |  1830   vie_encoder_->Stop(); | 
 |  1831 } | 
 |  1832  | 
 |  1833 TEST_F(ViEEncoderTest, | 
|  1613        AdaptsResolutionOnOveruseAndLowQuality_MaintainFramerateMode) { |  1834        AdaptsResolutionOnOveruseAndLowQuality_MaintainFramerateMode) { | 
|  1614   const int kWidth = 1280; |  1835   const int kWidth = 1280; | 
|  1615   const int kHeight = 720; |  1836   const int kHeight = 720; | 
|  1616   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  1837   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1617  |  1838  | 
|  1618   // Enable kMaintainFramerate preference, no initial limitation. |  1839   // Enable kMaintainFramerate preference, no initial limitation. | 
|  1619   AdaptingFrameForwarder source; |  1840   AdaptingFrameForwarder source; | 
|  1620   source.set_adaptation_enabled(true); |  1841   source.set_adaptation_enabled(true); | 
|  1621   vie_encoder_->SetSource( |  1842   vie_encoder_->SetSource( | 
|  1622       &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |  1843       &source, VideoSendStream::DegradationPreference::kMaintainFramerate); | 
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1911   source.IncomingCapturedFrame(CreateFrame(1, kTooSmallWidth, kTooSmallHeight)); |  2132   source.IncomingCapturedFrame(CreateFrame(1, kTooSmallWidth, kTooSmallHeight)); | 
|  1912   sink_.WaitForEncodedFrame(1); |  2133   sink_.WaitForEncodedFrame(1); | 
|  1913   vie_encoder_->TriggerCpuOveruse(); |  2134   vie_encoder_->TriggerCpuOveruse(); | 
|  1914   VerifyNoLimitation(source.sink_wants()); |  2135   VerifyNoLimitation(source.sink_wants()); | 
|  1915   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |  2136   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
|  1916   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |  2137   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
|  1917  |  2138  | 
|  1918   vie_encoder_->Stop(); |  2139   vie_encoder_->Stop(); | 
|  1919 } |  2140 } | 
|  1920  |  2141  | 
 |  2142 TEST_F(ViEEncoderTest, ResolutionNotAdaptedForTooSmallFrame_BalancedMode) { | 
 |  2143   const int kTooSmallWidth = 10; | 
 |  2144   const int kTooSmallHeight = 10; | 
 |  2145   const int kFpsLimit = 7; | 
 |  2146   vie_encoder_->OnBitrateUpdated(kBpsLimitFor7Fps, 0, 0); | 
 |  2147  | 
 |  2148   // Enable kBalanced preference, no initial limitation. | 
 |  2149   test::FrameForwarder source; | 
 |  2150   vie_encoder_->SetSource(&source, | 
 |  2151                           VideoSendStream::DegradationPreference::kBalanced); | 
 |  2152   VerifyNoLimitation(source.sink_wants()); | 
 |  2153   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2154   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2155  | 
 |  2156   // Trigger adapt down, expect limited framerate. | 
 |  2157   source.IncomingCapturedFrame(CreateFrame(1, kTooSmallWidth, kTooSmallHeight)); | 
 |  2158   sink_.WaitForEncodedFrame(1); | 
 |  2159   vie_encoder_->TriggerQualityLow(); | 
 |  2160   VerifyFpsEqResolutionMax(source.sink_wants(), kFpsLimit); | 
 |  2161   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2162   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2163   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2164  | 
 |  2165   // Trigger adapt down, too small frame, expect no change. | 
 |  2166   source.IncomingCapturedFrame(CreateFrame(2, kTooSmallWidth, kTooSmallHeight)); | 
 |  2167   sink_.WaitForEncodedFrame(2); | 
 |  2168   vie_encoder_->TriggerQualityLow(); | 
 |  2169   VerifyFpsEqResolutionMax(source.sink_wants(), kFpsLimit); | 
 |  2170   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2171   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2172   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2173  | 
 |  2174   vie_encoder_->Stop(); | 
 |  2175 } | 
 |  2176  | 
|  1921 TEST_F(ViEEncoderTest, FailingInitEncodeDoesntCauseCrash) { |  2177 TEST_F(ViEEncoderTest, FailingInitEncodeDoesntCauseCrash) { | 
|  1922   fake_encoder_.ForceInitEncodeFailure(true); |  2178   fake_encoder_.ForceInitEncodeFailure(true); | 
|  1923   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |  2179   vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 
|  1924   ResetEncoder("VP8", 2, 1, true); |  2180   ResetEncoder("VP8", 2, 1, true); | 
|  1925   const int kFrameWidth = 1280; |  2181   const int kFrameWidth = 1280; | 
|  1926   const int kFrameHeight = 720; |  2182   const int kFrameHeight = 720; | 
|  1927   video_source_.IncomingCapturedFrame( |  2183   video_source_.IncomingCapturedFrame( | 
|  1928       CreateFrame(1, kFrameWidth, kFrameHeight)); |  2184       CreateFrame(1, kFrameWidth, kFrameHeight)); | 
|  1929   sink_.ExpectDroppedFrame(); |  2185   sink_.ExpectDroppedFrame(); | 
|  1930   vie_encoder_->Stop(); |  2186   vie_encoder_->Stop(); | 
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2105   // Insert frames at min fps, all should go through. |  2361   // Insert frames at min fps, all should go through. | 
|  2106   for (int i = 0; i < 10; ++i) { |  2362   for (int i = 0; i < 10; ++i) { | 
|  2107     timestamp_ms += kMinFpsFrameInterval; |  2363     timestamp_ms += kMinFpsFrameInterval; | 
|  2108     fake_clock.AdvanceTimeMicros(kMinFpsFrameInterval * 1000); |  2364     fake_clock.AdvanceTimeMicros(kMinFpsFrameInterval * 1000); | 
|  2109     video_source_.IncomingCapturedFrame( |  2365     video_source_.IncomingCapturedFrame( | 
|  2110         CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); |  2366         CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); | 
|  2111     sink_.WaitForEncodedFrame(timestamp_ms); |  2367     sink_.WaitForEncodedFrame(timestamp_ms); | 
|  2112   } |  2368   } | 
|  2113   vie_encoder_->Stop(); |  2369   vie_encoder_->Stop(); | 
|  2114 } |  2370 } | 
 |  2371  | 
 |  2372 TEST_F(ViEEncoderTest, AdaptsResolutionAndFramerateForLowQuality_BalancedMode) { | 
 |  2373   const int kWidth = 1280; | 
 |  2374   const int kHeight = 720; | 
 |  2375   const int64_t kFrameIntervalMs = 150; | 
 |  2376   int64_t timestamp_ms = kFrameIntervalMs; | 
 |  2377   vie_encoder_->OnBitrateUpdated(kBpsLimitFor15Fps, 0, 0); | 
 |  2378  | 
 |  2379   // Enable kBalanced preference, no initial limitation. | 
 |  2380   AdaptingFrameForwarder source; | 
 |  2381   source.set_adaptation_enabled(true); | 
 |  2382   vie_encoder_->SetSource(&source, | 
 |  2383                           VideoSendStream::DegradationPreference::kBalanced); | 
 |  2384   timestamp_ms += kFrameIntervalMs; | 
 |  2385   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2386   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  2387   VerifyNoLimitation(source.sink_wants()); | 
 |  2388   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2389   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2390   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2391  | 
 |  2392   // Trigger adapt down, expect scaled down resolution (960x540@30fps). | 
 |  2393   vie_encoder_->TriggerQualityLow(); | 
 |  2394   timestamp_ms += kFrameIntervalMs; | 
 |  2395   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2396   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2397   VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); | 
 |  2398   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2399   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2400   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2401  | 
 |  2402   // Trigger adapt down, expect scaled down resolution (640x360@30fps). | 
 |  2403   vie_encoder_->TriggerQualityLow(); | 
 |  2404   timestamp_ms += kFrameIntervalMs; | 
 |  2405   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2406   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2407   VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants()); | 
 |  2408   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2409   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2410   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2411  | 
 |  2412   // Trigger adapt down, expect reduced fps (640x360@15fps). | 
 |  2413   vie_encoder_->TriggerQualityLow(); | 
 |  2414   timestamp_ms += kFrameIntervalMs; | 
 |  2415   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2416   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2417   VerifyFpsLtResolutionEq(source.sink_wants(), source.last_wants()); | 
 |  2418   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2419   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2420   EXPECT_EQ(3, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2421  | 
 |  2422   // Trigger adapt down, expect scaled down resolution (480x270@15fps). | 
 |  2423   vie_encoder_->OnBitrateUpdated(kBpsLimitFor10Fps, 0, 0); | 
 |  2424   vie_encoder_->TriggerQualityLow(); | 
 |  2425   timestamp_ms += kFrameIntervalMs; | 
 |  2426   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2427   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2428   VerifyFpsEqResolutionLt(source.sink_wants(), source.last_wants()); | 
 |  2429   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2430   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2431   EXPECT_EQ(4, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2432  | 
 |  2433   // Restrict bitrate, trigger adapt down, expect reduced fps (480x270@10fps). | 
 |  2434   vie_encoder_->TriggerQualityLow(); | 
 |  2435   timestamp_ms += kFrameIntervalMs; | 
 |  2436   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2437   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2438   VerifyFpsLtResolutionEq(source.sink_wants(), source.last_wants()); | 
 |  2439   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2440   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2441   EXPECT_EQ(5, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2442  | 
 |  2443   // Trigger adapt down, expect scaled down resolution (320x180@10fps). | 
 |  2444   vie_encoder_->TriggerQualityLow(); | 
 |  2445   timestamp_ms += kFrameIntervalMs; | 
 |  2446   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2447   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2448   VerifyFpsEqResolutionLt(source.sink_wants(), source.last_wants()); | 
 |  2449   rtc::VideoSinkWants last_wants = source.sink_wants(); | 
 |  2450   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2451   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2452   EXPECT_EQ(6, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2453  | 
 |  2454   // Trigger adapt down, min resolution reached, expect no change. | 
 |  2455   vie_encoder_->TriggerQualityLow(); | 
 |  2456   timestamp_ms += kFrameIntervalMs; | 
 |  2457   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2458   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2459   VerifyFpsEqResolutionEq(source.sink_wants(), last_wants); | 
 |  2460   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2461   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2462   EXPECT_EQ(6, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2463  | 
 |  2464   // Trigger adapt up, expect upscaled resolution (480x270@10fps). | 
 |  2465   vie_encoder_->TriggerQualityHigh(); | 
 |  2466   timestamp_ms += kFrameIntervalMs; | 
 |  2467   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2468   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2469   VerifyFpsEqResolutionGt(source.sink_wants(), source.last_wants()); | 
 |  2470   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2471   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2472   EXPECT_EQ(7, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2473  | 
 |  2474   // Increase bitrate, trigger adapt up, expect increased fps (480x270@15fps). | 
 |  2475   vie_encoder_->OnBitrateUpdated(kBpsLimitFor15Fps + 1, 0, 0); | 
 |  2476   vie_encoder_->TriggerQualityHigh(); | 
 |  2477   timestamp_ms += kFrameIntervalMs; | 
 |  2478   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2479   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2480   VerifyFpsGtResolutionEq(source.sink_wants(), source.last_wants()); | 
 |  2481   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2482   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2483   EXPECT_EQ(8, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2484  | 
 |  2485   // Trigger adapt up, expect upscaled resolution (640x360@15fps). | 
 |  2486   vie_encoder_->TriggerQualityHigh(); | 
 |  2487   timestamp_ms += kFrameIntervalMs; | 
 |  2488   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2489   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2490   VerifyFpsEqResolutionGt(source.sink_wants(), source.last_wants()); | 
 |  2491   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2492   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2493   EXPECT_EQ(9, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2494  | 
 |  2495   // Trigger adapt up, expect increased fps (640x360@30fps). | 
 |  2496   vie_encoder_->TriggerQualityHigh(); | 
 |  2497   timestamp_ms += kFrameIntervalMs; | 
 |  2498   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2499   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2500   VerifyFpsMaxResolutionEq(source.sink_wants(), source.last_wants()); | 
 |  2501   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2502   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2503   EXPECT_EQ(10, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2504  | 
 |  2505   // Trigger adapt up, expect upscaled resolution (960x540@30fps). | 
 |  2506   vie_encoder_->TriggerQualityHigh(); | 
 |  2507   timestamp_ms += kFrameIntervalMs; | 
 |  2508   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2509   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2510   VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); | 
 |  2511   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2512   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2513   EXPECT_EQ(11, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2514  | 
 |  2515   // Trigger adapt up,  expect no restriction (1280x720fps@30fps). | 
 |  2516   vie_encoder_->TriggerQualityHigh(); | 
 |  2517   timestamp_ms += kFrameIntervalMs; | 
 |  2518   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2519   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  2520   VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); | 
 |  2521   VerifyNoLimitation(source.sink_wants()); | 
 |  2522   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2523   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2524   EXPECT_EQ(12, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2525  | 
 |  2526   // Trigger adapt up, expect no change. | 
 |  2527   vie_encoder_->TriggerQualityHigh(); | 
 |  2528   VerifyNoLimitation(source.sink_wants()); | 
 |  2529   EXPECT_EQ(12, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2530  | 
 |  2531   vie_encoder_->Stop(); | 
 |  2532 } | 
 |  2533  | 
 |  2534 TEST_F(ViEEncoderTest, AdaptWithTwoReasonsAndDifferentOrder_Framerate) { | 
 |  2535   const int kWidth = 1280; | 
 |  2536   const int kHeight = 720; | 
 |  2537   const int64_t kFrameIntervalMs = 150; | 
 |  2538   int64_t timestamp_ms = kFrameIntervalMs; | 
 |  2539   vie_encoder_->OnBitrateUpdated(kBpsLimitFor15Fps, 0, 0); | 
 |  2540  | 
 |  2541   // Enable kBalanced preference, no initial limitation. | 
 |  2542   AdaptingFrameForwarder source; | 
 |  2543   source.set_adaptation_enabled(true); | 
 |  2544   vie_encoder_->SetSource(&source, | 
 |  2545                           VideoSendStream::DegradationPreference::kBalanced); | 
 |  2546   timestamp_ms += kFrameIntervalMs; | 
 |  2547   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2548   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  2549   VerifyNoLimitation(source.sink_wants()); | 
 |  2550   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2551   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2552   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2553   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2554   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2555   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2556  | 
 |  2557   // Trigger cpu adapt down, expect scaled down resolution (960x540@30fps). | 
 |  2558   vie_encoder_->TriggerCpuOveruse(); | 
 |  2559   timestamp_ms += kFrameIntervalMs; | 
 |  2560   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2561   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2562   VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); | 
 |  2563   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2564   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2565   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2566   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2567   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2568   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2569  | 
 |  2570   // Trigger cpu adapt down, expect scaled down resolution (640x360@30fps). | 
 |  2571   vie_encoder_->TriggerCpuOveruse(); | 
 |  2572   timestamp_ms += kFrameIntervalMs; | 
 |  2573   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2574   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2575   VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants()); | 
 |  2576   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2577   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2578   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2579   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2580   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2581   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2582  | 
 |  2583   // Trigger quality adapt down, expect reduced fps (640x360@15fps). | 
 |  2584   vie_encoder_->TriggerQualityLow(); | 
 |  2585   timestamp_ms += kFrameIntervalMs; | 
 |  2586   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2587   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2588   VerifyFpsLtResolutionEq(source.sink_wants(), source.last_wants()); | 
 |  2589   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2590   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2591   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2592   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2593   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2594   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2595  | 
 |  2596   // Trigger cpu adapt up, expect increased fps (640x360@30fps). | 
 |  2597   vie_encoder_->TriggerCpuNormalUsage(); | 
 |  2598   timestamp_ms += kFrameIntervalMs; | 
 |  2599   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2600   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2601   VerifyFpsMaxResolutionEq(source.sink_wants(), source.last_wants()); | 
 |  2602   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2603   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2604   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2605   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2606   EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2607   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2608  | 
 |  2609   // Trigger quality adapt up, expect upscaled resolution (960x540@30fps). | 
 |  2610   vie_encoder_->TriggerQualityHigh(); | 
 |  2611   timestamp_ms += kFrameIntervalMs; | 
 |  2612   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2613   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2614   VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); | 
 |  2615   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2616   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2617   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2618   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2619   EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2620   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2621  | 
 |  2622   // Trigger cpu adapt up,  expect no restriction (1280x720fps@30fps). | 
 |  2623   vie_encoder_->TriggerCpuNormalUsage(); | 
 |  2624   timestamp_ms += kFrameIntervalMs; | 
 |  2625   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2626   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  2627   VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); | 
 |  2628   VerifyNoLimitation(source.sink_wants()); | 
 |  2629   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2630   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2631   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2632   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2633   EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2634   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2635  | 
 |  2636   // Trigger adapt up, expect no change. | 
 |  2637   vie_encoder_->TriggerQualityHigh(); | 
 |  2638   VerifyNoLimitation(source.sink_wants()); | 
 |  2639   EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2640   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2641  | 
 |  2642   vie_encoder_->Stop(); | 
 |  2643 } | 
 |  2644  | 
 |  2645 TEST_F(ViEEncoderTest, AdaptWithTwoReasonsAndDifferentOrder_Resolution) { | 
 |  2646   const int kWidth = 640; | 
 |  2647   const int kHeight = 360; | 
 |  2648   const int kFpsLimit = 15; | 
 |  2649   const int64_t kFrameIntervalMs = 150; | 
 |  2650   int64_t timestamp_ms = kFrameIntervalMs; | 
 |  2651   vie_encoder_->OnBitrateUpdated(kBpsLimitFor15Fps, 0, 0); | 
 |  2652  | 
 |  2653   // Enable kBalanced preference, no initial limitation. | 
 |  2654   AdaptingFrameForwarder source; | 
 |  2655   source.set_adaptation_enabled(true); | 
 |  2656   vie_encoder_->SetSource(&source, | 
 |  2657                           VideoSendStream::DegradationPreference::kBalanced); | 
 |  2658   timestamp_ms += kFrameIntervalMs; | 
 |  2659   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2660   sink_.WaitForEncodedFrame(kWidth, kHeight); | 
 |  2661   VerifyNoLimitation(source.sink_wants()); | 
 |  2662   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2663   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2664   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2665   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2666   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2667   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2668  | 
 |  2669   // Trigger cpu adapt down, expect scaled down framerate (640x360@15fps). | 
 |  2670   vie_encoder_->TriggerCpuOveruse(); | 
 |  2671   timestamp_ms += kFrameIntervalMs; | 
 |  2672   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2673   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2674   VerifyFpsEqResolutionMax(source.sink_wants(), kFpsLimit); | 
 |  2675   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2676   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2677   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2678   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2679   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2680   EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2681  | 
 |  2682   // Trigger quality adapt down, expect scaled down resolution (480x270@15fps). | 
 |  2683   vie_encoder_->TriggerQualityLow(); | 
 |  2684   timestamp_ms += kFrameIntervalMs; | 
 |  2685   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2686   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2687   VerifyFpsEqResolutionLt(source.sink_wants(), source.last_wants()); | 
 |  2688   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2689   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2690   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2691   EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2692   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2693   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2694  | 
 |  2695   // Trigger cpu adapt up, expect upscaled resolution (640x360@15fps). | 
 |  2696   vie_encoder_->TriggerCpuNormalUsage(); | 
 |  2697   timestamp_ms += kFrameIntervalMs; | 
 |  2698   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2699   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2700   VerifyFpsEqResolutionGt(source.sink_wants(), source.last_wants()); | 
 |  2701   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2702   EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2703   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2704   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2705   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2706   EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2707  | 
 |  2708   // Trigger quality adapt up, expect increased fps (640x360@30fps). | 
 |  2709   vie_encoder_->TriggerQualityHigh(); | 
 |  2710   timestamp_ms += kFrameIntervalMs; | 
 |  2711   source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight)); | 
 |  2712   sink_.WaitForEncodedFrame(timestamp_ms); | 
 |  2713   VerifyNoLimitation(source.sink_wants()); | 
 |  2714   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 
 |  2715   EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate); | 
 |  2716   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 
 |  2717   EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); | 
 |  2718   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2719   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2720  | 
 |  2721   // Trigger adapt up, expect no change. | 
 |  2722   vie_encoder_->TriggerQualityHigh(); | 
 |  2723   VerifyNoLimitation(source.sink_wants()); | 
 |  2724   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 
 |  2725   EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 
 |  2726  | 
 |  2727   vie_encoder_->Stop(); | 
 |  2728 } | 
 |  2729  | 
|  2115 }  // namespace webrtc |  2730 }  // namespace webrtc | 
| OLD | NEW |