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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 void set_adaptation_enabled(bool enabled) { | 132 void set_adaptation_enabled(bool enabled) { |
133 rtc::CritScope cs(&crit_); | 133 rtc::CritScope cs(&crit_); |
134 adaptation_enabled_ = enabled; | 134 adaptation_enabled_ = enabled; |
135 } | 135 } |
136 | 136 |
137 bool adaption_enabled() const { | 137 bool adaption_enabled() const { |
138 rtc::CritScope cs(&crit_); | 138 rtc::CritScope cs(&crit_); |
139 return adaptation_enabled_; | 139 return adaptation_enabled_; |
140 } | 140 } |
141 | 141 |
| 142 rtc::VideoSinkWants last_wants() const { |
| 143 rtc::CritScope cs(&crit_); |
| 144 return last_wants_; |
| 145 } |
| 146 |
142 void IncomingCapturedFrame(const VideoFrame& video_frame) override { | 147 void IncomingCapturedFrame(const VideoFrame& video_frame) override { |
143 int cropped_width = 0; | 148 int cropped_width = 0; |
144 int cropped_height = 0; | 149 int cropped_height = 0; |
145 int out_width = 0; | 150 int out_width = 0; |
146 int out_height = 0; | 151 int out_height = 0; |
147 if (adaption_enabled()) { | 152 if (adaption_enabled()) { |
148 if (adapter_.AdaptFrameResolution( | 153 if (adapter_.AdaptFrameResolution( |
149 video_frame.width(), video_frame.height(), | 154 video_frame.width(), video_frame.height(), |
150 video_frame.timestamp_us() * 1000, &cropped_width, | 155 video_frame.timestamp_us() * 1000, &cropped_width, |
151 &cropped_height, &out_width, &out_height)) { | 156 &cropped_height, &out_width, &out_height)) { |
152 VideoFrame adapted_frame(new rtc::RefCountedObject<TestBuffer>( | 157 VideoFrame adapted_frame(new rtc::RefCountedObject<TestBuffer>( |
153 nullptr, out_width, out_height), | 158 nullptr, out_width, out_height), |
154 99, 99, kVideoRotation_0); | 159 99, 99, kVideoRotation_0); |
155 adapted_frame.set_ntp_time_ms(video_frame.ntp_time_ms()); | 160 adapted_frame.set_ntp_time_ms(video_frame.ntp_time_ms()); |
156 test::FrameForwarder::IncomingCapturedFrame(adapted_frame); | 161 test::FrameForwarder::IncomingCapturedFrame(adapted_frame); |
157 } | 162 } |
158 } else { | 163 } else { |
159 test::FrameForwarder::IncomingCapturedFrame(video_frame); | 164 test::FrameForwarder::IncomingCapturedFrame(video_frame); |
160 } | 165 } |
161 } | 166 } |
162 | 167 |
163 void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, | 168 void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, |
164 const rtc::VideoSinkWants& wants) override { | 169 const rtc::VideoSinkWants& wants) override { |
165 rtc::CritScope cs(&crit_); | 170 rtc::CritScope cs(&crit_); |
| 171 last_wants_ = sink_wants(); |
166 adapter_.OnResolutionFramerateRequest(wants.target_pixel_count, | 172 adapter_.OnResolutionFramerateRequest(wants.target_pixel_count, |
167 wants.max_pixel_count, | 173 wants.max_pixel_count, |
168 wants.max_framerate_fps); | 174 wants.max_framerate_fps); |
169 test::FrameForwarder::AddOrUpdateSink(sink, wants); | 175 test::FrameForwarder::AddOrUpdateSink(sink, wants); |
170 } | 176 } |
171 | |
172 cricket::VideoAdapter adapter_; | 177 cricket::VideoAdapter adapter_; |
173 bool adaptation_enabled_ GUARDED_BY(crit_); | 178 bool adaptation_enabled_ GUARDED_BY(crit_); |
| 179 rtc::VideoSinkWants last_wants_ GUARDED_BY(crit_); |
174 }; | 180 }; |
175 | 181 |
176 class MockableSendStatisticsProxy : public SendStatisticsProxy { | 182 class MockableSendStatisticsProxy : public SendStatisticsProxy { |
177 public: | 183 public: |
178 MockableSendStatisticsProxy(Clock* clock, | 184 MockableSendStatisticsProxy(Clock* clock, |
179 const VideoSendStream::Config& config, | 185 const VideoSendStream::Config& config, |
180 VideoEncoderConfig::ContentType content_type) | 186 VideoEncoderConfig::ContentType content_type) |
181 : SendStatisticsProxy(clock, config, content_type) {} | 187 : SendStatisticsProxy(clock, config, content_type) {} |
182 | 188 |
183 VideoSendStream::Stats GetStats() override { | 189 VideoSendStream::Stats GetStats() override { |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const { | 280 VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const { |
275 VideoFrame frame( | 281 VideoFrame frame( |
276 new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99, | 282 new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99, |
277 kVideoRotation_0); | 283 kVideoRotation_0); |
278 frame.set_ntp_time_ms(ntp_time_ms); | 284 frame.set_ntp_time_ms(ntp_time_ms); |
279 frame.set_timestamp_us(ntp_time_ms * 1000); | 285 frame.set_timestamp_us(ntp_time_ms * 1000); |
280 return frame; | 286 return frame; |
281 } | 287 } |
282 | 288 |
283 void VerifyNoLimitation(const rtc::VideoSinkWants& wants) { | 289 void VerifyNoLimitation(const rtc::VideoSinkWants& wants) { |
| 290 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); |
| 291 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); |
284 EXPECT_FALSE(wants.target_pixel_count); | 292 EXPECT_FALSE(wants.target_pixel_count); |
285 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); | |
286 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); | |
287 } | 293 } |
288 | 294 |
289 void VerifyResolutionLimitationLessThan(const rtc::VideoSinkWants& wants, | 295 void VerifyFpsEqResolutionEq(const rtc::VideoSinkWants& wants1, |
290 int pixel_count) { | 296 const rtc::VideoSinkWants& wants2) { |
| 297 EXPECT_EQ(wants1.max_framerate_fps, wants2.max_framerate_fps); |
| 298 EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count); |
| 299 } |
| 300 |
| 301 void VerifyFpsMaxResolutionLt(const rtc::VideoSinkWants& wants1, |
| 302 const rtc::VideoSinkWants& wants2) { |
| 303 EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps); |
| 304 EXPECT_LT(wants1.max_pixel_count, wants2.max_pixel_count); |
| 305 EXPECT_GT(wants1.max_pixel_count, 0); |
| 306 } |
| 307 |
| 308 void VerifyFpsMaxResolutionGt(const rtc::VideoSinkWants& wants1, |
| 309 const rtc::VideoSinkWants& wants2) { |
| 310 EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps); |
| 311 EXPECT_GT(wants1.max_pixel_count, wants2.max_pixel_count); |
| 312 } |
| 313 |
| 314 void VerifyFpsMaxResolutionLt(const rtc::VideoSinkWants& wants, |
| 315 int pixel_count) { |
| 316 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); |
291 EXPECT_LT(wants.max_pixel_count, pixel_count); | 317 EXPECT_LT(wants.max_pixel_count, pixel_count); |
292 EXPECT_GT(wants.max_pixel_count, 0); | 318 EXPECT_GT(wants.max_pixel_count, 0); |
293 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps); | 319 } |
| 320 |
| 321 void VerifyFpsLtResolutionMax(const rtc::VideoSinkWants& wants, int fps) { |
| 322 EXPECT_LT(wants.max_framerate_fps, fps); |
| 323 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); |
| 324 EXPECT_FALSE(wants.target_pixel_count); |
294 } | 325 } |
295 | 326 |
296 class TestEncoder : public test::FakeEncoder { | 327 class TestEncoder : public test::FakeEncoder { |
297 public: | 328 public: |
298 TestEncoder() | 329 TestEncoder() |
299 : FakeEncoder(Clock::GetRealTimeClock()), | 330 : FakeEncoder(Clock::GetRealTimeClock()), |
300 continue_encode_event_(false, false) {} | 331 continue_encode_event_(false, false) {} |
301 | 332 |
302 VideoCodec codec_config() const { | 333 VideoCodec codec_config() const { |
303 rtc::CritScope lock(&crit_sect_); | 334 rtc::CritScope lock(&crit_sect_); |
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 } | 970 } |
940 | 971 |
941 TEST_F(ViEEncoderTest, SwitchingSourceKeepsCpuAdaptation) { | 972 TEST_F(ViEEncoderTest, SwitchingSourceKeepsCpuAdaptation) { |
942 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 973 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
943 | 974 |
944 const int kWidth = 1280; | 975 const int kWidth = 1280; |
945 const int kHeight = 720; | 976 const int kHeight = 720; |
946 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 977 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
947 sink_.WaitForEncodedFrame(1); | 978 sink_.WaitForEncodedFrame(1); |
948 VideoSendStream::Stats stats = stats_proxy_->GetStats(); | 979 VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
| 980 EXPECT_FALSE(stats.bw_limited_resolution); |
949 EXPECT_FALSE(stats.cpu_limited_resolution); | 981 EXPECT_FALSE(stats.cpu_limited_resolution); |
950 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); | 982 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |
951 | 983 |
952 // Trigger CPU overuse. | 984 // Trigger CPU overuse. |
953 vie_encoder_->TriggerCpuOveruse(); | 985 vie_encoder_->TriggerCpuOveruse(); |
954 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 986 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
955 sink_.WaitForEncodedFrame(2); | 987 sink_.WaitForEncodedFrame(2); |
956 stats = stats_proxy_->GetStats(); | 988 stats = stats_proxy_->GetStats(); |
| 989 EXPECT_FALSE(stats.bw_limited_resolution); |
957 EXPECT_TRUE(stats.cpu_limited_resolution); | 990 EXPECT_TRUE(stats.cpu_limited_resolution); |
958 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 991 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
959 | 992 |
960 // Set new source with adaptation still enabled. | 993 // Set new source with adaptation still enabled. |
961 test::FrameForwarder new_video_source; | 994 test::FrameForwarder new_video_source; |
962 vie_encoder_->SetSource( | 995 vie_encoder_->SetSource( |
963 &new_video_source, | 996 &new_video_source, |
964 VideoSendStream::DegradationPreference::kMaintainFramerate); | 997 VideoSendStream::DegradationPreference::kMaintainFramerate); |
965 | 998 |
966 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); | 999 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); |
967 sink_.WaitForEncodedFrame(3); | 1000 sink_.WaitForEncodedFrame(3); |
968 stats = stats_proxy_->GetStats(); | 1001 stats = stats_proxy_->GetStats(); |
| 1002 EXPECT_FALSE(stats.bw_limited_resolution); |
969 EXPECT_TRUE(stats.cpu_limited_resolution); | 1003 EXPECT_TRUE(stats.cpu_limited_resolution); |
970 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 1004 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
971 | 1005 |
972 // Set adaptation disabled. | 1006 // Set adaptation disabled. |
973 vie_encoder_->SetSource( | 1007 vie_encoder_->SetSource( |
974 &new_video_source, | 1008 &new_video_source, |
975 VideoSendStream::DegradationPreference::kDegradationDisabled); | 1009 VideoSendStream::DegradationPreference::kDegradationDisabled); |
976 | 1010 |
977 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 1011 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); |
978 sink_.WaitForEncodedFrame(4); | 1012 sink_.WaitForEncodedFrame(4); |
979 stats = stats_proxy_->GetStats(); | 1013 stats = stats_proxy_->GetStats(); |
| 1014 EXPECT_FALSE(stats.bw_limited_resolution); |
980 EXPECT_FALSE(stats.cpu_limited_resolution); | 1015 EXPECT_FALSE(stats.cpu_limited_resolution); |
981 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 1016 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
982 | 1017 |
983 // Set adaptation back to enabled. | 1018 // Set adaptation back to enabled. |
984 vie_encoder_->SetSource( | 1019 vie_encoder_->SetSource( |
985 &new_video_source, | 1020 &new_video_source, |
986 VideoSendStream::DegradationPreference::kMaintainFramerate); | 1021 VideoSendStream::DegradationPreference::kMaintainFramerate); |
987 | 1022 |
988 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); | 1023 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); |
989 sink_.WaitForEncodedFrame(5); | 1024 sink_.WaitForEncodedFrame(5); |
990 stats = stats_proxy_->GetStats(); | 1025 stats = stats_proxy_->GetStats(); |
| 1026 EXPECT_FALSE(stats.bw_limited_resolution); |
991 EXPECT_TRUE(stats.cpu_limited_resolution); | 1027 EXPECT_TRUE(stats.cpu_limited_resolution); |
992 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 1028 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
993 | 1029 |
994 // Trigger CPU normal use. | 1030 // Trigger CPU normal use. |
995 vie_encoder_->TriggerCpuNormalUsage(); | 1031 vie_encoder_->TriggerCpuNormalUsage(); |
996 new_video_source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); | 1032 new_video_source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); |
997 sink_.WaitForEncodedFrame(6); | 1033 sink_.WaitForEncodedFrame(6); |
998 stats = stats_proxy_->GetStats(); | 1034 stats = stats_proxy_->GetStats(); |
| 1035 EXPECT_FALSE(stats.bw_limited_resolution); |
999 EXPECT_FALSE(stats.cpu_limited_resolution); | 1036 EXPECT_FALSE(stats.cpu_limited_resolution); |
1000 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); | 1037 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); |
1001 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); | 1038 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); |
1002 | 1039 |
1003 vie_encoder_->Stop(); | 1040 vie_encoder_->Stop(); |
1004 } | 1041 } |
1005 | 1042 |
1006 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) { | 1043 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) { |
1007 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1044 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
1008 | 1045 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1131 test::FrameForwarder new_video_source; | 1168 test::FrameForwarder new_video_source; |
1132 vie_encoder_->SetSource( | 1169 vie_encoder_->SetSource( |
1133 &new_video_source, | 1170 &new_video_source, |
1134 VideoSendStream::DegradationPreference::kMaintainFramerate); | 1171 VideoSendStream::DegradationPreference::kMaintainFramerate); |
1135 | 1172 |
1136 new_video_source.IncomingCapturedFrame( | 1173 new_video_source.IncomingCapturedFrame( |
1137 CreateFrame(sequence, kWidth, kHeight)); | 1174 CreateFrame(sequence, kWidth, kHeight)); |
1138 sink_.WaitForEncodedFrame(sequence++); | 1175 sink_.WaitForEncodedFrame(sequence++); |
1139 stats = stats_proxy_->GetStats(); | 1176 stats = stats_proxy_->GetStats(); |
1140 EXPECT_TRUE(stats.cpu_limited_resolution); | 1177 EXPECT_TRUE(stats.cpu_limited_resolution); |
| 1178 EXPECT_FALSE(stats.cpu_limited_framerate); |
1141 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 1179 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
1142 | 1180 |
1143 // Set cpu adaptation by frame dropping. | 1181 // Set cpu adaptation by frame dropping. |
1144 vie_encoder_->SetSource( | 1182 vie_encoder_->SetSource( |
1145 &new_video_source, | 1183 &new_video_source, |
1146 VideoSendStream::DegradationPreference::kMaintainResolution); | 1184 VideoSendStream::DegradationPreference::kMaintainResolution); |
1147 new_video_source.IncomingCapturedFrame( | 1185 new_video_source.IncomingCapturedFrame( |
1148 CreateFrame(sequence, kWidth, kHeight)); | 1186 CreateFrame(sequence, kWidth, kHeight)); |
1149 sink_.WaitForEncodedFrame(sequence++); | 1187 sink_.WaitForEncodedFrame(sequence++); |
1150 stats = stats_proxy_->GetStats(); | 1188 stats = stats_proxy_->GetStats(); |
1151 // Not adapted at first. | 1189 // Not adapted at first. |
1152 EXPECT_FALSE(stats.cpu_limited_resolution); | 1190 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 1191 EXPECT_FALSE(stats.cpu_limited_framerate); |
1153 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); | 1192 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
1154 | 1193 |
1155 // Force an input frame rate to be available, or the adaptation call won't | 1194 // Force an input frame rate to be available, or the adaptation call won't |
1156 // know what framerate to adapt form. | 1195 // know what framerate to adapt from. |
1157 VideoSendStream::Stats mock_stats = stats_proxy_->GetStats(); | 1196 VideoSendStream::Stats mock_stats = stats_proxy_->GetStats(); |
1158 mock_stats.input_frame_rate = 30; | 1197 mock_stats.input_frame_rate = 30; |
1159 stats_proxy_->SetMockStats(mock_stats); | 1198 stats_proxy_->SetMockStats(mock_stats); |
1160 vie_encoder_->TriggerCpuOveruse(); | 1199 vie_encoder_->TriggerCpuOveruse(); |
1161 stats_proxy_->ResetMockStats(); | 1200 stats_proxy_->ResetMockStats(); |
1162 | 1201 |
1163 new_video_source.IncomingCapturedFrame( | 1202 new_video_source.IncomingCapturedFrame( |
1164 CreateFrame(sequence, kWidth, kHeight)); | 1203 CreateFrame(sequence, kWidth, kHeight)); |
1165 sink_.WaitForEncodedFrame(sequence++); | 1204 sink_.WaitForEncodedFrame(sequence++); |
1166 | 1205 |
1167 // Framerate now adapted. | 1206 // Framerate now adapted. |
1168 stats = stats_proxy_->GetStats(); | 1207 stats = stats_proxy_->GetStats(); |
1169 EXPECT_TRUE(stats.cpu_limited_resolution); | 1208 EXPECT_FALSE(stats.cpu_limited_resolution); |
| 1209 EXPECT_TRUE(stats.cpu_limited_framerate); |
1170 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); | 1210 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); |
1171 | 1211 |
1172 // Disable CPU adaptation. | 1212 // Disable CPU adaptation. |
1173 vie_encoder_->SetSource( | 1213 vie_encoder_->SetSource( |
1174 &new_video_source, | 1214 &new_video_source, |
1175 VideoSendStream::DegradationPreference::kDegradationDisabled); | 1215 VideoSendStream::DegradationPreference::kDegradationDisabled); |
1176 new_video_source.IncomingCapturedFrame( | 1216 new_video_source.IncomingCapturedFrame( |
1177 CreateFrame(sequence, kWidth, kHeight)); | 1217 CreateFrame(sequence, kWidth, kHeight)); |
1178 sink_.WaitForEncodedFrame(sequence++); | 1218 sink_.WaitForEncodedFrame(sequence++); |
1179 | 1219 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1307 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); | 1347 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |
1308 | 1348 |
1309 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1349 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
1310 sink_.WaitForEncodedFrame(1); | 1350 sink_.WaitForEncodedFrame(1); |
1311 VerifyNoLimitation(source.sink_wants()); | 1351 VerifyNoLimitation(source.sink_wants()); |
1312 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1352 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1313 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1353 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1314 | 1354 |
1315 // Trigger adapt down, expect scaled down resolution. | 1355 // Trigger adapt down, expect scaled down resolution. |
1316 vie_encoder_->TriggerCpuOveruse(); | 1356 vie_encoder_->TriggerCpuOveruse(); |
1317 VerifyResolutionLimitationLessThan(source.sink_wants(), kWidth * kHeight); | 1357 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); |
1318 const int kLastMaxPixelCount = source.sink_wants().max_pixel_count; | 1358 const int kLastMaxPixelCount = source.sink_wants().max_pixel_count; |
1319 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1359 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1320 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1360 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1321 | 1361 |
1322 // Trigger adapt down for same input resolution, expect no change. | 1362 // Trigger adapt down for same input resolution, expect no change. |
1323 vie_encoder_->TriggerCpuOveruse(); | 1363 vie_encoder_->TriggerCpuOveruse(); |
1324 EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count); | 1364 EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count); |
1325 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1365 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1326 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1366 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1327 | 1367 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1359 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1399 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
1360 | 1400 |
1361 // Enable kMaintainResolution preference, no initial limitation. | 1401 // Enable kMaintainResolution preference, no initial limitation. |
1362 test::FrameForwarder source; | 1402 test::FrameForwarder source; |
1363 vie_encoder_->SetSource( | 1403 vie_encoder_->SetSource( |
1364 &source, VideoSendStream::DegradationPreference::kMaintainResolution); | 1404 &source, VideoSendStream::DegradationPreference::kMaintainResolution); |
1365 | 1405 |
1366 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1406 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
1367 sink_.WaitForEncodedFrame(kWidth, kHeight); | 1407 sink_.WaitForEncodedFrame(kWidth, kHeight); |
1368 VerifyNoLimitation(source.sink_wants()); | 1408 VerifyNoLimitation(source.sink_wants()); |
1369 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1409 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); |
1370 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1410 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1371 | 1411 |
1372 // Trigger adapt up, expect no change. | 1412 // Trigger adapt up, expect no change. |
1373 vie_encoder_->TriggerCpuNormalUsage(); | 1413 vie_encoder_->TriggerCpuNormalUsage(); |
1374 VerifyNoLimitation(source.sink_wants()); | 1414 VerifyNoLimitation(source.sink_wants()); |
1375 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1415 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); |
1376 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1416 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1377 | 1417 |
1378 vie_encoder_->Stop(); | 1418 vie_encoder_->Stop(); |
1379 } | 1419 } |
1380 | 1420 |
| 1421 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_DisabledMode) { |
| 1422 const int kWidth = 1280; |
| 1423 const int kHeight = 720; |
| 1424 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1425 |
| 1426 // Enable kDegradationDisabled preference, no initial limitation. |
| 1427 test::FrameForwarder source; |
| 1428 vie_encoder_->SetSource( |
| 1429 &source, VideoSendStream::DegradationPreference::kDegradationDisabled); |
| 1430 |
| 1431 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1432 sink_.WaitForEncodedFrame(kWidth, kHeight); |
| 1433 VerifyNoLimitation(source.sink_wants()); |
| 1434 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
| 1435 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); |
| 1436 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
| 1437 |
| 1438 // Trigger adapt up, expect no change. |
| 1439 vie_encoder_->TriggerQualityHigh(); |
| 1440 VerifyNoLimitation(source.sink_wants()); |
| 1441 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
| 1442 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); |
| 1443 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
| 1444 |
| 1445 vie_encoder_->Stop(); |
| 1446 } |
| 1447 |
1381 TEST_F(ViEEncoderTest, AdaptsResolutionForLowQuality_MaintainFramerateMode) { | 1448 TEST_F(ViEEncoderTest, AdaptsResolutionForLowQuality_MaintainFramerateMode) { |
1382 const int kWidth = 1280; | 1449 const int kWidth = 1280; |
1383 const int kHeight = 720; | 1450 const int kHeight = 720; |
1384 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1451 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
1385 | 1452 |
1386 // Enable kMaintainFramerate preference, no initial limitation. | 1453 // Enable kMaintainFramerate preference, no initial limitation. |
1387 AdaptingFrameForwarder source; | 1454 AdaptingFrameForwarder source; |
1388 source.set_adaptation_enabled(true); | 1455 source.set_adaptation_enabled(true); |
1389 vie_encoder_->SetSource( | 1456 vie_encoder_->SetSource( |
1390 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); | 1457 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |
1391 | 1458 |
1392 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1459 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
1393 sink_.WaitForEncodedFrame(1); | 1460 sink_.WaitForEncodedFrame(1); |
1394 VerifyNoLimitation(source.sink_wants()); | 1461 VerifyNoLimitation(source.sink_wants()); |
1395 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1462 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
1396 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1463 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1397 | 1464 |
1398 // Trigger adapt down, expect scaled down resolution. | 1465 // Trigger adapt down, expect scaled down resolution. |
1399 vie_encoder_->TriggerQualityLow(); | 1466 vie_encoder_->TriggerQualityLow(); |
1400 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 1467 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
1401 sink_.WaitForEncodedFrame(2); | 1468 sink_.WaitForEncodedFrame(2); |
1402 VerifyResolutionLimitationLessThan(source.sink_wants(), kWidth * kHeight); | 1469 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); |
1403 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 1470 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); |
1404 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1471 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1405 | 1472 |
1406 // Trigger adapt up, expect no restriction. | 1473 // Trigger adapt up, expect no restriction. |
1407 vie_encoder_->TriggerQualityHigh(); | 1474 vie_encoder_->TriggerQualityHigh(); |
1408 VerifyNoLimitation(source.sink_wants()); | 1475 VerifyNoLimitation(source.sink_wants()); |
1409 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1476 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
1410 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1477 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1411 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1478 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1412 | 1479 |
1413 vie_encoder_->Stop(); | 1480 vie_encoder_->Stop(); |
1414 } | 1481 } |
1415 | 1482 |
| 1483 TEST_F(ViEEncoderTest, AdaptsFramerateForLowQuality_MaintainResolutionMode) { |
| 1484 const int kWidth = 1280; |
| 1485 const int kHeight = 720; |
| 1486 const int kInputFps = 30; |
| 1487 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1488 |
| 1489 VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
| 1490 stats.input_frame_rate = kInputFps; |
| 1491 stats_proxy_->SetMockStats(stats); |
| 1492 |
| 1493 // Expect no scaling to begin with (preference: kMaintainFramerate). |
| 1494 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
| 1495 sink_.WaitForEncodedFrame(1); |
| 1496 VerifyNoLimitation(video_source_.sink_wants()); |
| 1497 |
| 1498 // Trigger adapt down, expect scaled down resolution. |
| 1499 vie_encoder_->TriggerQualityLow(); |
| 1500 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
| 1501 sink_.WaitForEncodedFrame(2); |
| 1502 VerifyFpsMaxResolutionLt(video_source_.sink_wants(), kWidth * kHeight); |
| 1503 |
| 1504 // Enable kMaintainResolution preference. |
| 1505 test::FrameForwarder new_video_source; |
| 1506 vie_encoder_->SetSource( |
| 1507 &new_video_source, |
| 1508 VideoSendStream::DegradationPreference::kMaintainResolution); |
| 1509 VerifyNoLimitation(new_video_source.sink_wants()); |
| 1510 |
| 1511 // Trigger adapt down, expect reduced framerate. |
| 1512 vie_encoder_->TriggerQualityLow(); |
| 1513 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); |
| 1514 sink_.WaitForEncodedFrame(3); |
| 1515 VerifyFpsLtResolutionMax(new_video_source.sink_wants(), kInputFps); |
| 1516 |
| 1517 // Trigger adapt up, expect no restriction. |
| 1518 vie_encoder_->TriggerQualityHigh(); |
| 1519 VerifyNoLimitation(new_video_source.sink_wants()); |
| 1520 |
| 1521 vie_encoder_->Stop(); |
| 1522 } |
| 1523 |
1416 TEST_F(ViEEncoderTest, DoesNotScaleBelowSetResolutionLimit) { | 1524 TEST_F(ViEEncoderTest, DoesNotScaleBelowSetResolutionLimit) { |
1417 const int kWidth = 1280; | 1525 const int kWidth = 1280; |
1418 const int kHeight = 720; | 1526 const int kHeight = 720; |
1419 const size_t kNumFrames = 10; | 1527 const size_t kNumFrames = 10; |
1420 | 1528 |
1421 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1529 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
1422 | 1530 |
1423 // Enable adapter, expected input resolutions when downscaling: | 1531 // Enable adapter, expected input resolutions when downscaling: |
1424 // 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (min resolution limit) | 1532 // 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (min resolution limit) |
1425 video_source_.set_adaptation_enabled(true); | 1533 video_source_.set_adaptation_enabled(true); |
(...skipping 28 matching lines...) Expand all Loading... |
1454 const int kHeight = 720; | 1562 const int kHeight = 720; |
1455 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 1563 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
1456 | 1564 |
1457 // Enable kMaintainFramerate preference, no initial limitation. | 1565 // Enable kMaintainFramerate preference, no initial limitation. |
1458 AdaptingFrameForwarder source; | 1566 AdaptingFrameForwarder source; |
1459 source.set_adaptation_enabled(true); | 1567 source.set_adaptation_enabled(true); |
1460 vie_encoder_->SetSource( | 1568 vie_encoder_->SetSource( |
1461 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); | 1569 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); |
1462 | 1570 |
1463 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1571 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
1464 sink_.WaitForEncodedFrame(1); | 1572 sink_.WaitForEncodedFrame(kWidth, kHeight); |
1465 VerifyNoLimitation(source.sink_wants()); | 1573 VerifyNoLimitation(source.sink_wants()); |
1466 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1574 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1467 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1575 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1468 | 1576 |
1469 // Trigger adapt down, expect scaled down resolution. | 1577 // Trigger adapt down, expect scaled down resolution. |
1470 vie_encoder_->TriggerCpuOveruse(); | 1578 vie_encoder_->TriggerCpuOveruse(); |
1471 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 1579 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
1472 sink_.WaitForEncodedFrame(2); | 1580 sink_.WaitForEncodedFrame(2); |
1473 VerifyResolutionLimitationLessThan(source.sink_wants(), kWidth * kHeight); | 1581 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); |
1474 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1582 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1475 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1583 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1476 | 1584 |
1477 // Trigger adapt up, expect no restriction. | 1585 // Trigger adapt up, expect no restriction. |
1478 vie_encoder_->TriggerCpuNormalUsage(); | 1586 vie_encoder_->TriggerCpuNormalUsage(); |
1479 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); | 1587 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); |
1480 sink_.WaitForEncodedFrame(3); | 1588 sink_.WaitForEncodedFrame(kWidth, kHeight); |
1481 VerifyNoLimitation(source.sink_wants()); | 1589 VerifyNoLimitation(source.sink_wants()); |
1482 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1590 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1483 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1591 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1484 | 1592 |
1485 // Trigger adapt down, expect scaled down resolution. | 1593 // Trigger adapt down, expect scaled down resolution. |
1486 vie_encoder_->TriggerCpuOveruse(); | 1594 vie_encoder_->TriggerCpuOveruse(); |
1487 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 1595 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); |
1488 sink_.WaitForEncodedFrame(4); | 1596 sink_.WaitForEncodedFrame(4); |
1489 VerifyResolutionLimitationLessThan(source.sink_wants(), kWidth * kHeight); | 1597 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); |
1490 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1598 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1491 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1599 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1492 | 1600 |
1493 // Trigger adapt up, expect no restriction. | 1601 // Trigger adapt up, expect no restriction. |
1494 vie_encoder_->TriggerCpuNormalUsage(); | 1602 vie_encoder_->TriggerCpuNormalUsage(); |
| 1603 source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); |
| 1604 sink_.WaitForEncodedFrame(kWidth, kHeight); |
1495 VerifyNoLimitation(source.sink_wants()); | 1605 VerifyNoLimitation(source.sink_wants()); |
1496 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1606 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1497 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1607 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1498 | 1608 |
1499 vie_encoder_->Stop(); | 1609 vie_encoder_->Stop(); |
1500 } | 1610 } |
1501 | 1611 |
1502 TEST_F(ViEEncoderTest, | 1612 TEST_F(ViEEncoderTest, |
1503 AdaptsResolutionOnOveruseAndLowQuality_MaintainFramerateMode) { | 1613 AdaptsResolutionOnOveruseAndLowQuality_MaintainFramerateMode) { |
1504 const int kWidth = 1280; | 1614 const int kWidth = 1280; |
(...skipping 11 matching lines...) Expand all Loading... |
1516 VerifyNoLimitation(source.sink_wants()); | 1626 VerifyNoLimitation(source.sink_wants()); |
1517 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1627 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1518 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1628 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
1519 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1629 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1520 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1630 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1521 | 1631 |
1522 // Trigger cpu adapt down, expect scaled down resolution (960x540). | 1632 // Trigger cpu adapt down, expect scaled down resolution (960x540). |
1523 vie_encoder_->TriggerCpuOveruse(); | 1633 vie_encoder_->TriggerCpuOveruse(); |
1524 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); | 1634 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); |
1525 sink_.WaitForEncodedFrame(2); | 1635 sink_.WaitForEncodedFrame(2); |
1526 VerifyResolutionLimitationLessThan(source.sink_wants(), kWidth * kHeight); | 1636 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); |
1527 rtc::VideoSinkWants last_wants = source.sink_wants(); | |
1528 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1637 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1529 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1638 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
1530 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1639 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1531 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1640 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1532 | 1641 |
1533 // Trigger cpu adapt down, expect scaled down resolution (640x360). | 1642 // Trigger cpu adapt down, expect scaled down resolution (640x360). |
1534 vie_encoder_->TriggerCpuOveruse(); | 1643 vie_encoder_->TriggerCpuOveruse(); |
1535 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); | 1644 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); |
1536 sink_.WaitForEncodedFrame(3); | 1645 sink_.WaitForEncodedFrame(3); |
1537 EXPECT_LT(source.sink_wants().max_pixel_count, last_wants.max_pixel_count); | 1646 VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants()); |
1538 last_wants = source.sink_wants(); | 1647 rtc::VideoSinkWants last_wants = source.sink_wants(); |
1539 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1648 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1540 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1649 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
1541 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1650 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1542 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1651 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1543 | 1652 |
1544 // Trigger cpu adapt down, max cpu downgrades reached, expect no change. | 1653 // Trigger cpu adapt down, max cpu downgrades reached, expect no change. |
1545 vie_encoder_->TriggerCpuOveruse(); | 1654 vie_encoder_->TriggerCpuOveruse(); |
1546 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); | 1655 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); |
1547 sink_.WaitForEncodedFrame(4); | 1656 sink_.WaitForEncodedFrame(4); |
1548 EXPECT_EQ(last_wants.max_pixel_count, source.sink_wants().max_pixel_count); | 1657 VerifyFpsEqResolutionEq(source.sink_wants(), last_wants); |
1549 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1658 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1550 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1659 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
1551 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1660 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1552 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1661 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1553 | 1662 |
1554 // Trigger quality adapt down, expect scaled down resolution (480x270). | 1663 // Trigger quality adapt down, expect scaled down resolution (480x270). |
1555 vie_encoder_->TriggerQualityLow(); | 1664 vie_encoder_->TriggerQualityLow(); |
1556 source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); | 1665 source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); |
1557 sink_.WaitForEncodedFrame(5); | 1666 sink_.WaitForEncodedFrame(5); |
1558 EXPECT_LT(source.sink_wants().max_pixel_count, last_wants.max_pixel_count); | 1667 VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants()); |
1559 last_wants = source.sink_wants(); | |
1560 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1668 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1561 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 1669 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); |
1562 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1670 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1563 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1671 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1564 | 1672 |
1565 // Trigger cpu adapt up, expect upscaled resolution (640x360). | 1673 // Trigger cpu adapt up, expect upscaled resolution (640x360). |
1566 vie_encoder_->TriggerCpuNormalUsage(); | 1674 vie_encoder_->TriggerCpuNormalUsage(); |
1567 source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); | 1675 source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); |
1568 sink_.WaitForEncodedFrame(6); | 1676 sink_.WaitForEncodedFrame(6); |
1569 EXPECT_GT(source.sink_wants().max_pixel_count, last_wants.max_pixel_count); | 1677 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); |
1570 last_wants = source.sink_wants(); | |
1571 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); | 1678 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); |
1572 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 1679 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); |
1573 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1680 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1574 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1681 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1575 | 1682 |
1576 // Trigger cpu adapt up, expect upscaled resolution (960x540). | 1683 // Trigger cpu adapt up, expect upscaled resolution (960x540). |
1577 vie_encoder_->TriggerCpuNormalUsage(); | 1684 vie_encoder_->TriggerCpuNormalUsage(); |
1578 source.IncomingCapturedFrame(CreateFrame(7, kWidth, kHeight)); | 1685 source.IncomingCapturedFrame(CreateFrame(7, kWidth, kHeight)); |
1579 sink_.WaitForEncodedFrame(7); | 1686 sink_.WaitForEncodedFrame(7); |
1580 EXPECT_GT(source.sink_wants().max_pixel_count, last_wants.max_pixel_count); | 1687 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); |
1581 last_wants = source.sink_wants(); | 1688 last_wants = source.sink_wants(); |
1582 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1689 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1583 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 1690 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); |
1584 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1691 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1585 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1692 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1586 | 1693 |
1587 // Trigger cpu adapt up, no cpu downgrades, expect no change (960x540). | 1694 // Trigger cpu adapt up, no cpu downgrades, expect no change (960x540). |
1588 vie_encoder_->TriggerCpuNormalUsage(); | 1695 vie_encoder_->TriggerCpuNormalUsage(); |
1589 source.IncomingCapturedFrame(CreateFrame(8, kWidth, kHeight)); | 1696 source.IncomingCapturedFrame(CreateFrame(8, kWidth, kHeight)); |
1590 sink_.WaitForEncodedFrame(8); | 1697 sink_.WaitForEncodedFrame(8); |
1591 EXPECT_EQ(last_wants.max_pixel_count, source.sink_wants().max_pixel_count); | 1698 VerifyFpsEqResolutionEq(source.sink_wants(), last_wants); |
1592 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1699 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1593 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); | 1700 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); |
1594 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1701 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1595 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1702 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1596 | 1703 |
1597 // Trigger quality adapt up, expect no restriction (1280x720). | 1704 // Trigger quality adapt up, expect no restriction (1280x720). |
1598 vie_encoder_->TriggerQualityHigh(); | 1705 vie_encoder_->TriggerQualityHigh(); |
1599 source.IncomingCapturedFrame(CreateFrame(9, kWidth, kHeight)); | 1706 source.IncomingCapturedFrame(CreateFrame(9, kWidth, kHeight)); |
1600 sink_.WaitForEncodedFrame(kWidth, kHeight); | 1707 sink_.WaitForEncodedFrame(kWidth, kHeight); |
1601 EXPECT_GT(source.sink_wants().max_pixel_count, last_wants.max_pixel_count); | 1708 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); |
1602 VerifyNoLimitation(source.sink_wants()); | 1709 VerifyNoLimitation(source.sink_wants()); |
1603 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); | 1710 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); |
1604 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 1711 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
1605 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); | 1712 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); |
1606 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 1713 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
1607 | 1714 |
1608 vie_encoder_->Stop(); | 1715 vie_encoder_->Stop(); |
1609 } | 1716 } |
1610 | 1717 |
1611 TEST_F(ViEEncoderTest, CpuLimitedHistogramIsReported) { | 1718 TEST_F(ViEEncoderTest, CpuLimitedHistogramIsReported) { |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1723 CreateFrame(2, kWidth * 3 / 4, kHeight * 3 / 4)); | 1830 CreateFrame(2, kWidth * 3 / 4, kHeight * 3 / 4)); |
1724 | 1831 |
1725 // Expect to drop this frame, the wait should time out. | 1832 // Expect to drop this frame, the wait should time out. |
1726 sink_.ExpectDroppedFrame(); | 1833 sink_.ExpectDroppedFrame(); |
1727 | 1834 |
1728 EXPECT_LT(video_source_.sink_wants().max_pixel_count, last_pixel_count); | 1835 EXPECT_LT(video_source_.sink_wants().max_pixel_count, last_pixel_count); |
1729 | 1836 |
1730 vie_encoder_->Stop(); | 1837 vie_encoder_->Stop(); |
1731 } | 1838 } |
1732 | 1839 |
1733 TEST_F(ViEEncoderTest, NrOfDroppedFramesLimitedWhenBitrateIsTooLow) { | 1840 TEST_F(ViEEncoderTest, NumberOfDroppedFramesLimitedWhenBitrateIsTooLow) { |
1734 const int kTooLowBitrateForFrameSizeBps = 10000; | 1841 const int kTooLowBitrateForFrameSizeBps = 10000; |
1735 vie_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0); | 1842 vie_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0); |
1736 const int kWidth = 640; | 1843 const int kWidth = 640; |
1737 const int kHeight = 360; | 1844 const int kHeight = 360; |
1738 | 1845 |
1739 // We expect the n initial frames to get dropped. | 1846 // We expect the n initial frames to get dropped. |
1740 int i; | 1847 int i; |
1741 for (i = 1; i <= kMaxInitialFramedrop; ++i) { | 1848 for (i = 1; i <= kMaxInitialFramedrop; ++i) { |
1742 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); | 1849 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); |
1743 sink_.ExpectDroppedFrame(); | 1850 sink_.ExpectDroppedFrame(); |
(...skipping 23 matching lines...) Expand all Loading... |
1767 sink_.WaitForEncodedFrame(1); | 1874 sink_.WaitForEncodedFrame(1); |
1768 | 1875 |
1769 vie_encoder_->Stop(); | 1876 vie_encoder_->Stop(); |
1770 } | 1877 } |
1771 | 1878 |
1772 TEST_F(ViEEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) { | 1879 TEST_F(ViEEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) { |
1773 const int kWidth = 640; | 1880 const int kWidth = 640; |
1774 const int kHeight = 360; | 1881 const int kHeight = 360; |
1775 fake_encoder_.SetQualityScaling(false); | 1882 fake_encoder_.SetQualityScaling(false); |
1776 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0); | 1883 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0); |
| 1884 |
1777 // Force quality scaler reconfiguration by resetting the source. | 1885 // Force quality scaler reconfiguration by resetting the source. |
1778 vie_encoder_->SetSource(&video_source_, | 1886 vie_encoder_->SetSource(&video_source_, |
1779 VideoSendStream::DegradationPreference::kBalanced); | 1887 VideoSendStream::DegradationPreference::kBalanced); |
1780 | 1888 |
1781 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); | 1889 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); |
1782 // Frame should not be dropped, even if it's too large. | 1890 // Frame should not be dropped, even if it's too large. |
1783 sink_.WaitForEncodedFrame(1); | 1891 sink_.WaitForEncodedFrame(1); |
1784 | 1892 |
1785 vie_encoder_->Stop(); | 1893 vie_encoder_->Stop(); |
1786 fake_encoder_.SetQualityScaling(true); | 1894 fake_encoder_.SetQualityScaling(true); |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1998 for (int i = 0; i < 10; ++i) { | 2106 for (int i = 0; i < 10; ++i) { |
1999 timestamp_ms += kMinFpsFrameInterval; | 2107 timestamp_ms += kMinFpsFrameInterval; |
2000 fake_clock.AdvanceTimeMicros(kMinFpsFrameInterval * 1000); | 2108 fake_clock.AdvanceTimeMicros(kMinFpsFrameInterval * 1000); |
2001 video_source_.IncomingCapturedFrame( | 2109 video_source_.IncomingCapturedFrame( |
2002 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); | 2110 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); |
2003 sink_.WaitForEncodedFrame(timestamp_ms); | 2111 sink_.WaitForEncodedFrame(timestamp_ms); |
2004 } | 2112 } |
2005 vie_encoder_->Stop(); | 2113 vie_encoder_->Stop(); |
2006 } | 2114 } |
2007 } // namespace webrtc | 2115 } // namespace webrtc |
OLD | NEW |