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

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

Issue 2722183004: Fix flaky ViEEncoder tests. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 74
75 void PostTaskAndWait(bool down, AdaptReason reason) { 75 void PostTaskAndWait(bool down, AdaptReason reason) {
76 rtc::Event event(false, false); 76 rtc::Event event(false, false);
77 encoder_queue()->PostTask([this, &event, reason, down] { 77 encoder_queue()->PostTask([this, &event, reason, down] {
78 down ? AdaptDown(reason) : AdaptUp(reason); 78 down ? AdaptDown(reason) : AdaptUp(reason);
79 event.Set(); 79 event.Set();
80 }); 80 });
81 ASSERT_TRUE(event.Wait(5000)); 81 ASSERT_TRUE(event.Wait(5000));
82 } 82 }
83 83
84 // This is used as a synchronisation mechanism, to make sure that the
85 // encoder queue is not blocked before we start sending it frames.
86 void WaitUntilTaskQueueIsIdle() {
87 rtc::Event event(false, false);
88 encoder_queue()->PostTask([&event] {
89 event.Set();
90 });
91 ASSERT_TRUE(event.Wait(5000));
92 }
93
84 void TriggerCpuOveruse() { PostTaskAndWait(true, AdaptReason::kCpu); } 94 void TriggerCpuOveruse() { PostTaskAndWait(true, AdaptReason::kCpu); }
85 95
86 void TriggerCpuNormalUsage() { PostTaskAndWait(false, AdaptReason::kCpu); } 96 void TriggerCpuNormalUsage() { PostTaskAndWait(false, AdaptReason::kCpu); }
87 97
88 void TriggerQualityLow() { PostTaskAndWait(true, AdaptReason::kQuality); } 98 void TriggerQualityLow() { PostTaskAndWait(true, AdaptReason::kQuality); }
89 99
90 void TriggerQualityHigh() { PostTaskAndWait(false, AdaptReason::kQuality); } 100 void TriggerQualityHigh() { PostTaskAndWait(false, AdaptReason::kQuality); }
91 }; 101 };
92 102
93 class VideoStreamFactory 103 class VideoStreamFactory
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 if (vie_encoder_) 204 if (vie_encoder_)
195 vie_encoder_->Stop(); 205 vie_encoder_->Stop();
196 vie_encoder_.reset(new ViEEncoderUnderTest( 206 vie_encoder_.reset(new ViEEncoderUnderTest(
197 stats_proxy_.get(), video_send_config_.encoder_settings)); 207 stats_proxy_.get(), video_send_config_.encoder_settings));
198 vie_encoder_->SetSink(&sink_, false /* rotation_applied */); 208 vie_encoder_->SetSink(&sink_, false /* rotation_applied */);
199 vie_encoder_->SetSource(&video_source_, 209 vie_encoder_->SetSource(&video_source_,
200 VideoSendStream::DegradationPreference::kBalanced); 210 VideoSendStream::DegradationPreference::kBalanced);
201 vie_encoder_->SetStartBitrate(kTargetBitrateBps); 211 vie_encoder_->SetStartBitrate(kTargetBitrateBps);
202 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config), 212 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config),
203 kMaxPayloadLength, nack_enabled); 213 kMaxPayloadLength, nack_enabled);
214 vie_encoder_->WaitUntilTaskQueueIsIdle();
204 } 215 }
205 216
206 void ResetEncoder(const std::string& payload_name, 217 void ResetEncoder(const std::string& payload_name,
207 size_t num_streams, 218 size_t num_streams,
208 size_t num_temporal_layers, 219 size_t num_temporal_layers,
209 bool nack_enabled) { 220 bool nack_enabled) {
210 video_send_config_.encoder_settings.payload_name = payload_name; 221 video_send_config_.encoder_settings.payload_name = payload_name;
211 222
212 VideoEncoderConfig video_encoder_config; 223 VideoEncoderConfig video_encoder_config;
213 video_encoder_config.number_of_streams = num_streams; 224 video_encoder_config.number_of_streams = num_streams;
(...skipping 30 matching lines...) Expand all
244 rtc::CritScope lock(&crit_sect_); 255 rtc::CritScope lock(&crit_sect_);
245 return config_; 256 return config_;
246 } 257 }
247 258
248 void BlockNextEncode() { 259 void BlockNextEncode() {
249 rtc::CritScope lock(&local_crit_sect_); 260 rtc::CritScope lock(&local_crit_sect_);
250 block_next_encode_ = true; 261 block_next_encode_ = true;
251 } 262 }
252 263
253 VideoEncoder::ScalingSettings GetScalingSettings() const override { 264 VideoEncoder::ScalingSettings GetScalingSettings() const override {
265 rtc::CritScope lock(&local_crit_sect_);
254 if (quality_scaling_) 266 if (quality_scaling_)
255 return VideoEncoder::ScalingSettings(true, 1, 2); 267 return VideoEncoder::ScalingSettings(true, 1, 2);
256 return VideoEncoder::ScalingSettings(false); 268 return VideoEncoder::ScalingSettings(false);
257 } 269 }
258 270
259 void ContinueEncode() { continue_encode_event_.Set(); } 271 void ContinueEncode() { continue_encode_event_.Set(); }
260 272
261 void CheckLastTimeStampsMatch(int64_t ntp_time_ms, 273 void CheckLastTimeStampsMatch(int64_t ntp_time_ms,
262 uint32_t timestamp) const { 274 uint32_t timestamp) const {
263 rtc::CritScope lock(&local_crit_sect_); 275 rtc::CritScope lock(&local_crit_sect_);
264 EXPECT_EQ(timestamp_, timestamp); 276 EXPECT_EQ(timestamp_, timestamp);
265 EXPECT_EQ(ntp_time_ms_, ntp_time_ms); 277 EXPECT_EQ(ntp_time_ms_, ntp_time_ms);
266 } 278 }
267 279
268 void SetQualityScaling(bool b) { quality_scaling_ = b; } 280 void SetQualityScaling(bool b) {
281 rtc::CritScope lock(&local_crit_sect_);
282 quality_scaling_ = b;
283 }
269 284
270 private: 285 private:
271 int32_t Encode(const VideoFrame& input_image, 286 int32_t Encode(const VideoFrame& input_image,
272 const CodecSpecificInfo* codec_specific_info, 287 const CodecSpecificInfo* codec_specific_info,
273 const std::vector<FrameType>* frame_types) override { 288 const std::vector<FrameType>* frame_types) override {
274 bool block_encode; 289 bool block_encode;
275 { 290 {
276 rtc::CritScope lock(&local_crit_sect_); 291 rtc::CritScope lock(&local_crit_sect_);
277 EXPECT_GT(input_image.timestamp(), timestamp_); 292 EXPECT_GT(input_image.timestamp(), timestamp_);
278 EXPECT_GT(input_image.ntp_time_ms(), ntp_time_ms_); 293 EXPECT_GT(input_image.ntp_time_ms(), ntp_time_ms_);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 EXPECT_TRUE(encoded_frame_event_.Wait(kDefaultTimeoutMs)); 339 EXPECT_TRUE(encoded_frame_event_.Wait(kDefaultTimeoutMs));
325 { 340 {
326 rtc::CritScope lock(&crit_); 341 rtc::CritScope lock(&crit_);
327 width = last_width_; 342 width = last_width_;
328 height = last_height_; 343 height = last_height_;
329 } 344 }
330 EXPECT_EQ(expected_height, height); 345 EXPECT_EQ(expected_height, height);
331 EXPECT_EQ(expected_width, width); 346 EXPECT_EQ(expected_width, width);
332 } 347 }
333 348
334 void ExpectDroppedFrame() { EXPECT_FALSE(encoded_frame_event_.Wait(20)); } 349 void ExpectDroppedFrame() { EXPECT_FALSE(encoded_frame_event_.Wait(100)); }
335 350
336 void SetExpectNoFrames() { 351 void SetExpectNoFrames() {
337 rtc::CritScope lock(&crit_); 352 rtc::CritScope lock(&crit_);
338 expect_frames_ = false; 353 expect_frames_ = false;
339 } 354 }
340 355
341 int number_of_reconfigurations() { 356 int number_of_reconfigurations() {
342 rtc::CritScope lock(&crit_); 357 rtc::CritScope lock(&crit_);
343 return number_of_reconfigurations_; 358 return number_of_reconfigurations_;
344 } 359 }
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 CreateFrame(2, frame_width * 3 / 4, frame_height * 3 / 4)); 1147 CreateFrame(2, frame_width * 3 / 4, frame_height * 3 / 4));
1133 1148
1134 // Expect to drop this frame, the wait should time out. 1149 // Expect to drop this frame, the wait should time out.
1135 sink_.ExpectDroppedFrame(); 1150 sink_.ExpectDroppedFrame();
1136 1151
1137 EXPECT_LT(*video_source_.sink_wants().max_pixel_count, last_pixel_count); 1152 EXPECT_LT(*video_source_.sink_wants().max_pixel_count, last_pixel_count);
1138 1153
1139 vie_encoder_->Stop(); 1154 vie_encoder_->Stop();
1140 } 1155 }
1141 1156
1142 #if defined(MEMORY_SANITIZER) 1157 TEST_F(ViEEncoderTest, NrOfDroppedFramesLimited) {
1143 // Fails under MemorySanitizer: See http://crbug.com/webrtc/7232
1144 #define MAYBE_NrOfDroppedFramesLimited DISABLED_NrOfDroppedFramesLimited
1145 #else
1146 #define MAYBE_NrOfDroppedFramesLimited NrOfDroppedFramesLimited
1147 #endif
1148 TEST_F(ViEEncoderTest, MAYBE_NrOfDroppedFramesLimited) {
1149 // 1kbps. This can never be achieved. 1158 // 1kbps. This can never be achieved.
1150 vie_encoder_->OnBitrateUpdated(1000, 0, 0); 1159 vie_encoder_->OnBitrateUpdated(1000, 0, 0);
1151 int frame_width = 640; 1160 int frame_width = 640;
1152 int frame_height = 360; 1161 int frame_height = 360;
1153 1162
1154 // We expect the n initial frames to get dropped. 1163 // We expect the n initial frames to get dropped.
1155 int i; 1164 int i;
1156 for (i = 1; i <= kMaxInitialFramedrop; ++i) { 1165 for (i = 1; i <= kMaxInitialFramedrop; ++i) {
1157 video_source_.IncomingCapturedFrame( 1166 video_source_.IncomingCapturedFrame(
1158 CreateFrame(i, frame_width, frame_height)); 1167 CreateFrame(i, frame_width, frame_height));
(...skipping 22 matching lines...) Expand all
1181 VideoSendStream::DegradationPreference::kMaintainResolution); 1190 VideoSendStream::DegradationPreference::kMaintainResolution);
1182 1191
1183 video_source_.IncomingCapturedFrame( 1192 video_source_.IncomingCapturedFrame(
1184 CreateFrame(1, frame_width, frame_height)); 1193 CreateFrame(1, frame_width, frame_height));
1185 // Frame should not be dropped, even if it's too large. 1194 // Frame should not be dropped, even if it's too large.
1186 sink_.WaitForEncodedFrame(1); 1195 sink_.WaitForEncodedFrame(1);
1187 1196
1188 vie_encoder_->Stop(); 1197 vie_encoder_->Stop();
1189 } 1198 }
1190 1199
1191 // Disable for TSan v2, see https://crbug.com/webrtc/7260 for details. 1200 TEST_F(ViEEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) {
1192 #if defined(THREAD_SANITIZER)
1193 #define MAYBE_InitialFrameDropOffWhenEncoderDisabledScaling \
1194 DISABLED_InitialFrameDropOffWhenEncoderDisabledScaling
1195 #else
1196 #define MAYBE_InitialFrameDropOffWhenEncoderDisabledScaling \
1197 InitialFrameDropOffWhenEncoderDisabledScaling
1198 #endif
1199 TEST_F(ViEEncoderTest, MAYBE_InitialFrameDropOffWhenEncoderDisabledScaling) {
1200 int frame_width = 640; 1201 int frame_width = 640;
1201 int frame_height = 360; 1202 int frame_height = 360;
1202 fake_encoder_.SetQualityScaling(false); 1203 fake_encoder_.SetQualityScaling(false);
1203 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0); 1204 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0);
1204 // Force quality scaler reconfiguration by resetting the source. 1205 // Force quality scaler reconfiguration by resetting the source.
1205 vie_encoder_->SetSource(&video_source_, 1206 vie_encoder_->SetSource(&video_source_,
1206 VideoSendStream::DegradationPreference::kBalanced); 1207 VideoSendStream::DegradationPreference::kBalanced);
1207 1208
1208 video_source_.IncomingCapturedFrame( 1209 video_source_.IncomingCapturedFrame(
1209 CreateFrame(1, frame_width, frame_height)); 1210 CreateFrame(1, frame_width, frame_height));
(...skipping 26 matching lines...) Expand all
1236 1237
1237 // Trigger CPU normal use, return to original resoluton; 1238 // Trigger CPU normal use, return to original resoluton;
1238 vie_encoder_->TriggerCpuNormalUsage(); 1239 vie_encoder_->TriggerCpuNormalUsage();
1239 video_source_.IncomingCapturedFrame( 1240 video_source_.IncomingCapturedFrame(
1240 CreateFrame(3, kFrameWidth, kFrameHeight)); 1241 CreateFrame(3, kFrameWidth, kFrameHeight));
1241 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight); 1242 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight);
1242 1243
1243 vie_encoder_->Stop(); 1244 vie_encoder_->Stop();
1244 } 1245 }
1245 } // namespace webrtc 1246 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698