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

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

Issue 2923993002: Revert of Periodically update codec bit/frame rate settings. (Closed)
Patch Set: Created 3 years, 6 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 | « webrtc/video/vie_encoder.cc ('k') | 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 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 } // namespace 211 } // namespace
212 212
213 class ViEEncoderTest : public ::testing::Test { 213 class ViEEncoderTest : public ::testing::Test {
214 public: 214 public:
215 static const int kDefaultTimeoutMs = 30 * 1000; 215 static const int kDefaultTimeoutMs = 30 * 1000;
216 216
217 ViEEncoderTest() 217 ViEEncoderTest()
218 : video_send_config_(VideoSendStream::Config(nullptr)), 218 : video_send_config_(VideoSendStream::Config(nullptr)),
219 codec_width_(320), 219 codec_width_(320),
220 codec_height_(240), 220 codec_height_(240),
221 max_framerate_(30),
222 fake_encoder_(), 221 fake_encoder_(),
223 stats_proxy_(new MockableSendStatisticsProxy( 222 stats_proxy_(new MockableSendStatisticsProxy(
224 Clock::GetRealTimeClock(), 223 Clock::GetRealTimeClock(),
225 video_send_config_, 224 video_send_config_,
226 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo)), 225 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo)),
227 sink_(&fake_encoder_) {} 226 sink_(&fake_encoder_) {}
228 227
229 void SetUp() override { 228 void SetUp() override {
230 metrics::Reset(); 229 metrics::Reset();
231 video_send_config_ = VideoSendStream::Config(nullptr); 230 video_send_config_ = VideoSendStream::Config(nullptr);
232 video_send_config_.encoder_settings.encoder = &fake_encoder_; 231 video_send_config_.encoder_settings.encoder = &fake_encoder_;
233 video_send_config_.encoder_settings.payload_name = "FAKE"; 232 video_send_config_.encoder_settings.payload_name = "FAKE";
234 video_send_config_.encoder_settings.payload_type = 125; 233 video_send_config_.encoder_settings.payload_type = 125;
235 234
236 VideoEncoderConfig video_encoder_config; 235 VideoEncoderConfig video_encoder_config;
237 test::FillEncoderConfiguration(1, &video_encoder_config); 236 test::FillEncoderConfiguration(1, &video_encoder_config);
238 video_encoder_config.video_stream_factory =
239 new rtc::RefCountedObject<VideoStreamFactory>(1);
240 video_encoder_config_ = video_encoder_config.Copy(); 237 video_encoder_config_ = video_encoder_config.Copy();
241
242 // Framerate limit is specified by the VideoStreamFactory.
243 std::vector<VideoStream> streams =
244 video_encoder_config.video_stream_factory->CreateEncoderStreams(
245 codec_width_, codec_height_, video_encoder_config);
246 max_framerate_ = streams[0].max_framerate;
247 fake_clock_.SetTimeMicros(1234);
248
249 ConfigureEncoder(std::move(video_encoder_config), true /* nack_enabled */); 238 ConfigureEncoder(std::move(video_encoder_config), true /* nack_enabled */);
250 } 239 }
251 240
252 void ConfigureEncoder(VideoEncoderConfig video_encoder_config, 241 void ConfigureEncoder(VideoEncoderConfig video_encoder_config,
253 bool nack_enabled) { 242 bool nack_enabled) {
254 if (vie_encoder_) 243 if (vie_encoder_)
255 vie_encoder_->Stop(); 244 vie_encoder_->Stop();
256 vie_encoder_.reset(new ViEEncoderUnderTest( 245 vie_encoder_.reset(new ViEEncoderUnderTest(
257 stats_proxy_.get(), video_send_config_.encoder_settings)); 246 stats_proxy_.get(), video_send_config_.encoder_settings));
258 vie_encoder_->SetSink(&sink_, false /* rotation_applied */); 247 vie_encoder_->SetSink(&sink_, false /* rotation_applied */);
259 vie_encoder_->SetSource( 248 vie_encoder_->SetSource(
260 &video_source_, 249 &video_source_,
261 VideoSendStream::DegradationPreference::kMaintainFramerate); 250 VideoSendStream::DegradationPreference::kMaintainFramerate);
262 vie_encoder_->SetStartBitrate(kTargetBitrateBps); 251 vie_encoder_->SetStartBitrate(kTargetBitrateBps);
263 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config), 252 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config),
264 kMaxPayloadLength, nack_enabled); 253 kMaxPayloadLength, nack_enabled);
265 vie_encoder_->WaitUntilTaskQueueIsIdle(); 254 vie_encoder_->WaitUntilTaskQueueIsIdle();
266 } 255 }
267 256
268 void ResetEncoder(const std::string& payload_name, 257 void ResetEncoder(const std::string& payload_name,
269 size_t num_streams, 258 size_t num_streams,
270 size_t num_temporal_layers, 259 size_t num_temporal_layers,
271 bool nack_enabled, 260 bool nack_enabled) {
272 bool screenshare) {
273 video_send_config_.encoder_settings.payload_name = payload_name; 261 video_send_config_.encoder_settings.payload_name = payload_name;
274 262
275 VideoEncoderConfig video_encoder_config; 263 VideoEncoderConfig video_encoder_config;
276 video_encoder_config.number_of_streams = num_streams; 264 video_encoder_config.number_of_streams = num_streams;
277 video_encoder_config.max_bitrate_bps = kTargetBitrateBps; 265 video_encoder_config.max_bitrate_bps = kTargetBitrateBps;
278 video_encoder_config.video_stream_factory = 266 video_encoder_config.video_stream_factory =
279 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers); 267 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers);
280 video_encoder_config.content_type =
281 screenshare ? VideoEncoderConfig::ContentType::kScreen
282 : VideoEncoderConfig::ContentType::kRealtimeVideo;
283 ConfigureEncoder(std::move(video_encoder_config), nack_enabled); 268 ConfigureEncoder(std::move(video_encoder_config), nack_enabled);
284 } 269 }
285 270
286 VideoFrame CreateFrame(int64_t ntp_time_ms, 271 VideoFrame CreateFrame(int64_t ntp_time_ms,
287 rtc::Event* destruction_event) const { 272 rtc::Event* destruction_event) const {
288 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>( 273 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>(
289 destruction_event, codec_width_, codec_height_), 274 destruction_event, codec_width_, codec_height_),
290 99, 99, kVideoRotation_0); 275 99, 99, kVideoRotation_0);
291 frame.set_ntp_time_ms(ntp_time_ms); 276 frame.set_ntp_time_ms(ntp_time_ms);
292 return frame; 277 return frame;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 EXPECT_LT(wants.max_pixel_count, pixel_count); 317 EXPECT_LT(wants.max_pixel_count, pixel_count);
333 EXPECT_GT(wants.max_pixel_count, 0); 318 EXPECT_GT(wants.max_pixel_count, 0);
334 } 319 }
335 320
336 void VerifyFpsLtResolutionMax(const rtc::VideoSinkWants& wants, int fps) { 321 void VerifyFpsLtResolutionMax(const rtc::VideoSinkWants& wants, int fps) {
337 EXPECT_LT(wants.max_framerate_fps, fps); 322 EXPECT_LT(wants.max_framerate_fps, fps);
338 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count); 323 EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count);
339 EXPECT_FALSE(wants.target_pixel_count); 324 EXPECT_FALSE(wants.target_pixel_count);
340 } 325 }
341 326
342 void WaitForEncodedFrame(int64_t expected_ntp_time) {
343 sink_.WaitForEncodedFrame(expected_ntp_time);
344 fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
345 }
346
347 bool TimedWaitForEncodedFrame(int64_t expected_ntp_time, int64_t timeout_ms) {
348 bool ok = sink_.TimedWaitForEncodedFrame(expected_ntp_time, timeout_ms);
349 fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
350 return ok;
351 }
352
353 void WaitForEncodedFrame(uint32_t expected_width, uint32_t expected_height) {
354 sink_.WaitForEncodedFrame(expected_width, expected_height);
355 fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
356 }
357
358 void ExpectDroppedFrame() {
359 sink_.ExpectDroppedFrame();
360 fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
361 }
362
363 bool WaitForFrame(int64_t timeout_ms) {
364 bool ok = sink_.WaitForFrame(timeout_ms);
365 fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
366 return ok;
367 }
368
369 class TestEncoder : public test::FakeEncoder { 327 class TestEncoder : public test::FakeEncoder {
370 public: 328 public:
371 TestEncoder() 329 TestEncoder()
372 : FakeEncoder(Clock::GetRealTimeClock()), 330 : FakeEncoder(Clock::GetRealTimeClock()),
373 continue_encode_event_(false, false) {} 331 continue_encode_event_(false, false) {}
374 332
375 VideoCodec codec_config() const { 333 VideoCodec codec_config() const {
376 rtc::CritScope lock(&crit_sect_); 334 rtc::CritScope lock(&crit_sect_);
377 return config_; 335 return config_;
378 } 336 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 GUARDED_BY(local_crit_sect_); 425 GUARDED_BY(local_crit_sect_);
468 bool force_init_encode_failed_ GUARDED_BY(local_crit_sect_) = false; 426 bool force_init_encode_failed_ GUARDED_BY(local_crit_sect_) = false;
469 }; 427 };
470 428
471 class TestSink : public ViEEncoder::EncoderSink { 429 class TestSink : public ViEEncoder::EncoderSink {
472 public: 430 public:
473 explicit TestSink(TestEncoder* test_encoder) 431 explicit TestSink(TestEncoder* test_encoder)
474 : test_encoder_(test_encoder), encoded_frame_event_(false, false) {} 432 : test_encoder_(test_encoder), encoded_frame_event_(false, false) {}
475 433
476 void WaitForEncodedFrame(int64_t expected_ntp_time) { 434 void WaitForEncodedFrame(int64_t expected_ntp_time) {
477 EXPECT_TRUE(
478 TimedWaitForEncodedFrame(expected_ntp_time, kDefaultTimeoutMs));
479 }
480
481 bool TimedWaitForEncodedFrame(int64_t expected_ntp_time,
482 int64_t timeout_ms) {
483 uint32_t timestamp = 0; 435 uint32_t timestamp = 0;
484 if (!encoded_frame_event_.Wait(timeout_ms)) 436 EXPECT_TRUE(encoded_frame_event_.Wait(kDefaultTimeoutMs));
485 return false;
486 { 437 {
487 rtc::CritScope lock(&crit_); 438 rtc::CritScope lock(&crit_);
488 timestamp = last_timestamp_; 439 timestamp = last_timestamp_;
489 } 440 }
490 test_encoder_->CheckLastTimeStampsMatch(expected_ntp_time, timestamp); 441 test_encoder_->CheckLastTimeStampsMatch(expected_ntp_time, timestamp);
491 return true;
492 } 442 }
493 443
494 void WaitForEncodedFrame(uint32_t expected_width, 444 void WaitForEncodedFrame(uint32_t expected_width,
495 uint32_t expected_height) { 445 uint32_t expected_height) {
496 EXPECT_TRUE(encoded_frame_event_.Wait(kDefaultTimeoutMs)); 446 EXPECT_TRUE(encoded_frame_event_.Wait(kDefaultTimeoutMs));
497 CheckLastFrameSizeMathces(expected_width, expected_height); 447 CheckLastFrameSizeMathces(expected_width, expected_height);
498 } 448 }
499 449
500 void CheckLastFrameSizeMathces(uint32_t expected_width, 450 void CheckLastFrameSizeMathces(uint32_t expected_width,
501 uint32_t expected_height) { 451 uint32_t expected_height) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 uint32_t last_width_ = 0; 510 uint32_t last_width_ = 0;
561 bool expect_frames_ = true; 511 bool expect_frames_ = true;
562 int number_of_reconfigurations_ = 0; 512 int number_of_reconfigurations_ = 0;
563 int min_transmit_bitrate_bps_ = 0; 513 int min_transmit_bitrate_bps_ = 0;
564 }; 514 };
565 515
566 VideoSendStream::Config video_send_config_; 516 VideoSendStream::Config video_send_config_;
567 VideoEncoderConfig video_encoder_config_; 517 VideoEncoderConfig video_encoder_config_;
568 int codec_width_; 518 int codec_width_;
569 int codec_height_; 519 int codec_height_;
570 int max_framerate_;
571 TestEncoder fake_encoder_; 520 TestEncoder fake_encoder_;
572 std::unique_ptr<MockableSendStatisticsProxy> stats_proxy_; 521 std::unique_ptr<MockableSendStatisticsProxy> stats_proxy_;
573 TestSink sink_; 522 TestSink sink_;
574 AdaptingFrameForwarder video_source_; 523 AdaptingFrameForwarder video_source_;
575 std::unique_ptr<ViEEncoderUnderTest> vie_encoder_; 524 std::unique_ptr<ViEEncoderUnderTest> vie_encoder_;
576 rtc::ScopedFakeClock fake_clock_;
577 }; 525 };
578 526
579 TEST_F(ViEEncoderTest, EncodeOneFrame) { 527 TEST_F(ViEEncoderTest, EncodeOneFrame) {
580 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 528 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
581 rtc::Event frame_destroyed_event(false, false); 529 rtc::Event frame_destroyed_event(false, false);
582 video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event)); 530 video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event));
583 WaitForEncodedFrame(1); 531 sink_.WaitForEncodedFrame(1);
584 EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs)); 532 EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs));
585 vie_encoder_->Stop(); 533 vie_encoder_->Stop();
586 } 534 }
587 535
588 TEST_F(ViEEncoderTest, DropsFramesBeforeFirstOnBitrateUpdated) { 536 TEST_F(ViEEncoderTest, DropsFramesBeforeFirstOnBitrateUpdated) {
589 // Dropped since no target bitrate has been set. 537 // Dropped since no target bitrate has been set.
590 rtc::Event frame_destroyed_event(false, false); 538 rtc::Event frame_destroyed_event(false, false);
591 video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event)); 539 video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event));
592 EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs)); 540 EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs));
593 541
594 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 542 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
595 543
596 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr)); 544 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
597 WaitForEncodedFrame(2); 545 sink_.WaitForEncodedFrame(2);
598 vie_encoder_->Stop(); 546 vie_encoder_->Stop();
599 } 547 }
600 548
601 TEST_F(ViEEncoderTest, DropsFramesWhenRateSetToZero) { 549 TEST_F(ViEEncoderTest, DropsFramesWhenRateSetToZero) {
602 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 550 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
603 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 551 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
604 WaitForEncodedFrame(1); 552 sink_.WaitForEncodedFrame(1);
605 553
606 vie_encoder_->OnBitrateUpdated(0, 0, 0); 554 vie_encoder_->OnBitrateUpdated(0, 0, 0);
607 // Dropped since bitrate is zero. 555 // Dropped since bitrate is zero.
608 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr)); 556 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
609 557
610 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 558 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
611 video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr)); 559 video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr));
612 WaitForEncodedFrame(3); 560 sink_.WaitForEncodedFrame(3);
613 vie_encoder_->Stop(); 561 vie_encoder_->Stop();
614 } 562 }
615 563
616 TEST_F(ViEEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) { 564 TEST_F(ViEEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) {
617 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 565 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
618 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 566 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
619 WaitForEncodedFrame(1); 567 sink_.WaitForEncodedFrame(1);
620 568
621 // This frame will be dropped since it has the same ntp timestamp. 569 // This frame will be dropped since it has the same ntp timestamp.
622 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 570 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
623 571
624 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr)); 572 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
625 WaitForEncodedFrame(2); 573 sink_.WaitForEncodedFrame(2);
626 vie_encoder_->Stop(); 574 vie_encoder_->Stop();
627 } 575 }
628 576
629 TEST_F(ViEEncoderTest, DropsFrameAfterStop) { 577 TEST_F(ViEEncoderTest, DropsFrameAfterStop) {
630 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 578 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
631 579
632 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 580 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
633 WaitForEncodedFrame(1); 581 sink_.WaitForEncodedFrame(1);
634 582
635 vie_encoder_->Stop(); 583 vie_encoder_->Stop();
636 sink_.SetExpectNoFrames(); 584 sink_.SetExpectNoFrames();
637 rtc::Event frame_destroyed_event(false, false); 585 rtc::Event frame_destroyed_event(false, false);
638 video_source_.IncomingCapturedFrame(CreateFrame(2, &frame_destroyed_event)); 586 video_source_.IncomingCapturedFrame(CreateFrame(2, &frame_destroyed_event));
639 EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs)); 587 EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs));
640 } 588 }
641 589
642 TEST_F(ViEEncoderTest, DropsPendingFramesOnSlowEncode) { 590 TEST_F(ViEEncoderTest, DropsPendingFramesOnSlowEncode) {
643 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 591 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
644 592
645 fake_encoder_.BlockNextEncode(); 593 fake_encoder_.BlockNextEncode();
646 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 594 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
647 WaitForEncodedFrame(1); 595 sink_.WaitForEncodedFrame(1);
648 // Here, the encoder thread will be blocked in the TestEncoder waiting for a 596 // Here, the encoder thread will be blocked in the TestEncoder waiting for a
649 // call to ContinueEncode. 597 // call to ContinueEncode.
650 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr)); 598 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
651 video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr)); 599 video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr));
652 fake_encoder_.ContinueEncode(); 600 fake_encoder_.ContinueEncode();
653 WaitForEncodedFrame(3); 601 sink_.WaitForEncodedFrame(3);
654 602
655 vie_encoder_->Stop(); 603 vie_encoder_->Stop();
656 } 604 }
657 605
658 TEST_F(ViEEncoderTest, ConfigureEncoderTriggersOnEncoderConfigurationChanged) { 606 TEST_F(ViEEncoderTest, ConfigureEncoderTriggersOnEncoderConfigurationChanged) {
659 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 607 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
660 EXPECT_EQ(0, sink_.number_of_reconfigurations()); 608 EXPECT_EQ(0, sink_.number_of_reconfigurations());
661 609
662 // Capture a frame and wait for it to synchronize with the encoder thread. 610 // Capture a frame and wait for it to synchronize with the encoder thread.
663 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 611 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
664 WaitForEncodedFrame(1); 612 sink_.WaitForEncodedFrame(1);
665 // The encoder will have been configured once when the first frame is 613 // The encoder will have been configured once when the first frame is
666 // received. 614 // received.
667 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 615 EXPECT_EQ(1, sink_.number_of_reconfigurations());
668 616
669 VideoEncoderConfig video_encoder_config; 617 VideoEncoderConfig video_encoder_config;
670 test::FillEncoderConfiguration(1, &video_encoder_config); 618 test::FillEncoderConfiguration(1, &video_encoder_config);
671 video_encoder_config.min_transmit_bitrate_bps = 9999; 619 video_encoder_config.min_transmit_bitrate_bps = 9999;
672 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config), 620 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config),
673 kMaxPayloadLength, true /* nack_enabled */); 621 kMaxPayloadLength, true /* nack_enabled */);
674 622
675 // Capture a frame and wait for it to synchronize with the encoder thread. 623 // Capture a frame and wait for it to synchronize with the encoder thread.
676 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr)); 624 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
677 WaitForEncodedFrame(2); 625 sink_.WaitForEncodedFrame(2);
678 EXPECT_EQ(2, sink_.number_of_reconfigurations()); 626 EXPECT_EQ(2, sink_.number_of_reconfigurations());
679 EXPECT_EQ(9999, sink_.last_min_transmit_bitrate()); 627 EXPECT_EQ(9999, sink_.last_min_transmit_bitrate());
680 628
681 vie_encoder_->Stop(); 629 vie_encoder_->Stop();
682 } 630 }
683 631
684 TEST_F(ViEEncoderTest, FrameResolutionChangeReconfigureEncoder) { 632 TEST_F(ViEEncoderTest, FrameResolutionChangeReconfigureEncoder) {
685 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 633 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
686 634
687 // Capture a frame and wait for it to synchronize with the encoder thread. 635 // Capture a frame and wait for it to synchronize with the encoder thread.
688 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 636 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
689 WaitForEncodedFrame(1); 637 sink_.WaitForEncodedFrame(1);
690 // The encoder will have been configured once. 638 // The encoder will have been configured once.
691 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 639 EXPECT_EQ(1, sink_.number_of_reconfigurations());
692 EXPECT_EQ(codec_width_, fake_encoder_.codec_config().width); 640 EXPECT_EQ(codec_width_, fake_encoder_.codec_config().width);
693 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height); 641 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height);
694 642
695 codec_width_ *= 2; 643 codec_width_ *= 2;
696 codec_height_ *= 2; 644 codec_height_ *= 2;
697 // Capture a frame with a higher resolution and wait for it to synchronize 645 // Capture a frame with a higher resolution and wait for it to synchronize
698 // with the encoder thread. 646 // with the encoder thread.
699 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr)); 647 video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
700 WaitForEncodedFrame(2); 648 sink_.WaitForEncodedFrame(2);
701 EXPECT_EQ(codec_width_, fake_encoder_.codec_config().width); 649 EXPECT_EQ(codec_width_, fake_encoder_.codec_config().width);
702 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height); 650 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height);
703 EXPECT_EQ(2, sink_.number_of_reconfigurations()); 651 EXPECT_EQ(2, sink_.number_of_reconfigurations());
704 652
705 vie_encoder_->Stop(); 653 vie_encoder_->Stop();
706 } 654 }
707 655
708 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) { 656 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) {
709 const bool kNackEnabled = true; 657 const bool kNackEnabled = true;
710 const size_t kNumStreams = 1; 658 const size_t kNumStreams = 1;
711 const size_t kNumTl = 1; 659 const size_t kNumTl = 1;
712 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); 660 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
713 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 661 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
714 662
715 // Capture a frame and wait for it to synchronize with the encoder thread. 663 // Capture a frame and wait for it to synchronize with the encoder thread.
716 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 664 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
717 WaitForEncodedFrame(1); 665 sink_.WaitForEncodedFrame(1);
718 // The encoder have been configured once when the first frame is received. 666 // The encoder have been configured once when the first frame is received.
719 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 667 EXPECT_EQ(1, sink_.number_of_reconfigurations());
720 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 668 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
721 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 669 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
722 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 670 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
723 // Resilience is off for no temporal layers with nack on. 671 // Resilience is off for no temporal layers with nack on.
724 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); 672 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience);
725 vie_encoder_->Stop(); 673 vie_encoder_->Stop();
726 } 674 }
727 675
728 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) { 676 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) {
729 const bool kNackEnabled = true; 677 const bool kNackEnabled = true;
730 const size_t kNumStreams = 2; 678 const size_t kNumStreams = 2;
731 const size_t kNumTl = 1; 679 const size_t kNumTl = 1;
732 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); 680 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
733 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 681 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
734 682
735 // Capture a frame and wait for it to synchronize with the encoder thread. 683 // Capture a frame and wait for it to synchronize with the encoder thread.
736 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 684 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
737 WaitForEncodedFrame(1); 685 sink_.WaitForEncodedFrame(1);
738 // The encoder have been configured once when the first frame is received. 686 // The encoder have been configured once when the first frame is received.
739 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 687 EXPECT_EQ(1, sink_.number_of_reconfigurations());
740 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 688 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
741 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 689 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
742 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 690 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
743 // Resilience is off for no temporal layers and >1 streams with nack on. 691 // Resilience is off for no temporal layers and >1 streams with nack on.
744 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); 692 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience);
745 vie_encoder_->Stop(); 693 vie_encoder_->Stop();
746 } 694 }
747 695
748 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) { 696 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) {
749 const bool kNackEnabled = false; 697 const bool kNackEnabled = false;
750 const size_t kNumStreams = 1; 698 const size_t kNumStreams = 1;
751 const size_t kNumTl = 1; 699 const size_t kNumTl = 1;
752 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); 700 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
753 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 701 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
754 702
755 // Capture a frame and wait for it to synchronize with the encoder thread. 703 // Capture a frame and wait for it to synchronize with the encoder thread.
756 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 704 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
757 WaitForEncodedFrame(1); 705 sink_.WaitForEncodedFrame(1);
758 // The encoder have been configured once when the first frame is received. 706 // The encoder have been configured once when the first frame is received.
759 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 707 EXPECT_EQ(1, sink_.number_of_reconfigurations());
760 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 708 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
761 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 709 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
762 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 710 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
763 // Resilience is on for no temporal layers with nack off. 711 // Resilience is on for no temporal layers with nack off.
764 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); 712 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience);
765 vie_encoder_->Stop(); 713 vie_encoder_->Stop();
766 } 714 }
767 715
768 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) { 716 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) {
769 const bool kNackEnabled = true; 717 const bool kNackEnabled = true;
770 const size_t kNumStreams = 1; 718 const size_t kNumStreams = 1;
771 const size_t kNumTl = 2; 719 const size_t kNumTl = 2;
772 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); 720 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
773 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 721 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
774 722
775 // Capture a frame and wait for it to synchronize with the encoder thread. 723 // Capture a frame and wait for it to synchronize with the encoder thread.
776 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 724 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
777 WaitForEncodedFrame(1); 725 sink_.WaitForEncodedFrame(1);
778 // The encoder have been configured once when the first frame is received. 726 // The encoder have been configured once when the first frame is received.
779 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 727 EXPECT_EQ(1, sink_.number_of_reconfigurations());
780 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 728 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
781 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 729 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
782 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 730 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
783 // Resilience is on for temporal layers. 731 // Resilience is on for temporal layers.
784 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); 732 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience);
785 vie_encoder_->Stop(); 733 vie_encoder_->Stop();
786 } 734 }
787 735
(...skipping 23 matching lines...) Expand all
811 VerifyNoLimitation(video_source_.sink_wants()); 759 VerifyNoLimitation(video_source_.sink_wants());
812 760
813 int frame_width = 1280; 761 int frame_width = 1280;
814 int frame_height = 720; 762 int frame_height = 720;
815 763
816 // Trigger CPU overuse kMaxCpuDowngrades times. Every time, ViEEncoder should 764 // Trigger CPU overuse kMaxCpuDowngrades times. Every time, ViEEncoder should
817 // request lower resolution. 765 // request lower resolution.
818 for (int i = 1; i <= kMaxDowngrades; ++i) { 766 for (int i = 1; i <= kMaxDowngrades; ++i) {
819 video_source_.IncomingCapturedFrame( 767 video_source_.IncomingCapturedFrame(
820 CreateFrame(i, frame_width, frame_height)); 768 CreateFrame(i, frame_width, frame_height));
821 WaitForEncodedFrame(i); 769 sink_.WaitForEncodedFrame(i);
822 770
823 vie_encoder_->TriggerCpuOveruse(); 771 vie_encoder_->TriggerCpuOveruse();
824 772
825 EXPECT_FALSE(video_source_.sink_wants().target_pixel_count); 773 EXPECT_FALSE(video_source_.sink_wants().target_pixel_count);
826 EXPECT_LT(video_source_.sink_wants().max_pixel_count, 774 EXPECT_LT(video_source_.sink_wants().max_pixel_count,
827 frame_width * frame_height); 775 frame_width * frame_height);
828 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 776 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
829 EXPECT_EQ(i, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 777 EXPECT_EQ(i, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
830 778
831 frame_width /= 2; 779 frame_width /= 2;
832 frame_height /= 2; 780 frame_height /= 2;
833 } 781 }
834 782
835 // Trigger CPU overuse one more time. This should not trigger a request for 783 // Trigger CPU overuse one more time. This should not trigger a request for
836 // lower resolution. 784 // lower resolution.
837 rtc::VideoSinkWants current_wants = video_source_.sink_wants(); 785 rtc::VideoSinkWants current_wants = video_source_.sink_wants();
838 video_source_.IncomingCapturedFrame( 786 video_source_.IncomingCapturedFrame(
839 CreateFrame(kMaxDowngrades + 1, frame_width, frame_height)); 787 CreateFrame(kMaxDowngrades + 1, frame_width, frame_height));
840 WaitForEncodedFrame(kMaxDowngrades + 1); 788 sink_.WaitForEncodedFrame(kMaxDowngrades + 1);
841 vie_encoder_->TriggerCpuOveruse(); 789 vie_encoder_->TriggerCpuOveruse();
842 EXPECT_EQ(video_source_.sink_wants().target_pixel_count, 790 EXPECT_EQ(video_source_.sink_wants().target_pixel_count,
843 current_wants.target_pixel_count); 791 current_wants.target_pixel_count);
844 EXPECT_EQ(video_source_.sink_wants().max_pixel_count, 792 EXPECT_EQ(video_source_.sink_wants().max_pixel_count,
845 current_wants.max_pixel_count); 793 current_wants.max_pixel_count);
846 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 794 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
847 EXPECT_EQ(kMaxDowngrades, 795 EXPECT_EQ(kMaxDowngrades,
848 stats_proxy_->GetStats().number_of_cpu_adapt_changes); 796 stats_proxy_->GetStats().number_of_cpu_adapt_changes);
849 797
850 // Trigger CPU normal use. 798 // Trigger CPU normal use.
(...skipping 14 matching lines...) Expand all
865 VerifyNoLimitation(video_source_.sink_wants()); 813 VerifyNoLimitation(video_source_.sink_wants());
866 814
867 const int kFrameWidth = 1280; 815 const int kFrameWidth = 1280;
868 const int kFrameHeight = 720; 816 const int kFrameHeight = 720;
869 const int kFrameIntervalMs = 1000 / 30; 817 const int kFrameIntervalMs = 1000 / 30;
870 818
871 int frame_timestamp = 1; 819 int frame_timestamp = 1;
872 820
873 video_source_.IncomingCapturedFrame( 821 video_source_.IncomingCapturedFrame(
874 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); 822 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
875 WaitForEncodedFrame(frame_timestamp); 823 sink_.WaitForEncodedFrame(frame_timestamp);
876 frame_timestamp += kFrameIntervalMs; 824 frame_timestamp += kFrameIntervalMs;
877 825
878 // Trigger CPU overuse. 826 // Trigger CPU overuse.
879 vie_encoder_->TriggerCpuOveruse(); 827 vie_encoder_->TriggerCpuOveruse();
880 video_source_.IncomingCapturedFrame( 828 video_source_.IncomingCapturedFrame(
881 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); 829 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
882 WaitForEncodedFrame(frame_timestamp); 830 sink_.WaitForEncodedFrame(frame_timestamp);
883 frame_timestamp += kFrameIntervalMs; 831 frame_timestamp += kFrameIntervalMs;
884 832
885 // Default degradation preference is maintain-framerate, so will lower max 833 // Default degradation preference is maintain-framerate, so will lower max
886 // wanted resolution. 834 // wanted resolution.
887 EXPECT_FALSE(video_source_.sink_wants().target_pixel_count); 835 EXPECT_FALSE(video_source_.sink_wants().target_pixel_count);
888 EXPECT_LT(video_source_.sink_wants().max_pixel_count, 836 EXPECT_LT(video_source_.sink_wants().max_pixel_count,
889 kFrameWidth * kFrameHeight); 837 kFrameWidth * kFrameHeight);
890 EXPECT_EQ(std::numeric_limits<int>::max(), 838 EXPECT_EQ(std::numeric_limits<int>::max(),
891 video_source_.sink_wants().max_framerate_fps); 839 video_source_.sink_wants().max_framerate_fps);
892 840
893 // Set new source, switch to maintain-resolution. 841 // Set new source, switch to maintain-resolution.
894 test::FrameForwarder new_video_source; 842 test::FrameForwarder new_video_source;
895 vie_encoder_->SetSource( 843 vie_encoder_->SetSource(
896 &new_video_source, 844 &new_video_source,
897 VideoSendStream::DegradationPreference::kMaintainResolution); 845 VideoSendStream::DegradationPreference::kMaintainResolution);
898 846
899 // Initially no degradation registered. 847 // Initially no degradation registered.
900 VerifyNoLimitation(new_video_source.sink_wants()); 848 VerifyNoLimitation(new_video_source.sink_wants());
901 849
902 // Force an input frame rate to be available, or the adaptation call won't 850 // Force an input frame rate to be available, or the adaptation call won't
903 // know what framerate to adapt form. 851 // know what framerate to adapt form.
904 const int kInputFps = 30; 852 const int kInputFps = 30;
905 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 853 VideoSendStream::Stats stats = stats_proxy_->GetStats();
906 stats.input_frame_rate = kInputFps; 854 stats.input_frame_rate = kInputFps;
907 stats_proxy_->SetMockStats(stats); 855 stats_proxy_->SetMockStats(stats);
908 856
909 vie_encoder_->TriggerCpuOveruse(); 857 vie_encoder_->TriggerCpuOveruse();
910 new_video_source.IncomingCapturedFrame( 858 new_video_source.IncomingCapturedFrame(
911 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); 859 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
912 WaitForEncodedFrame(frame_timestamp); 860 sink_.WaitForEncodedFrame(frame_timestamp);
913 frame_timestamp += kFrameIntervalMs; 861 frame_timestamp += kFrameIntervalMs;
914 862
915 // Some framerate constraint should be set. 863 // Some framerate constraint should be set.
916 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count); 864 EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count);
917 EXPECT_EQ(std::numeric_limits<int>::max(), 865 EXPECT_EQ(std::numeric_limits<int>::max(),
918 new_video_source.sink_wants().max_pixel_count); 866 new_video_source.sink_wants().max_pixel_count);
919 EXPECT_LT(new_video_source.sink_wants().max_framerate_fps, kInputFps); 867 EXPECT_LT(new_video_source.sink_wants().max_framerate_fps, kInputFps);
920 868
921 // Turn off degradation completely. 869 // Turn off degradation completely.
922 vie_encoder_->SetSource( 870 vie_encoder_->SetSource(
923 &new_video_source, 871 &new_video_source,
924 VideoSendStream::DegradationPreference::kDegradationDisabled); 872 VideoSendStream::DegradationPreference::kDegradationDisabled);
925 VerifyNoLimitation(new_video_source.sink_wants()); 873 VerifyNoLimitation(new_video_source.sink_wants());
926 874
927 vie_encoder_->TriggerCpuOveruse(); 875 vie_encoder_->TriggerCpuOveruse();
928 new_video_source.IncomingCapturedFrame( 876 new_video_source.IncomingCapturedFrame(
929 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight)); 877 CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
930 WaitForEncodedFrame(frame_timestamp); 878 sink_.WaitForEncodedFrame(frame_timestamp);
931 frame_timestamp += kFrameIntervalMs; 879 frame_timestamp += kFrameIntervalMs;
932 880
933 // Still no degradation. 881 // Still no degradation.
934 VerifyNoLimitation(new_video_source.sink_wants()); 882 VerifyNoLimitation(new_video_source.sink_wants());
935 883
936 // Calling SetSource with resolution scaling enabled apply the old SinkWants. 884 // Calling SetSource with resolution scaling enabled apply the old SinkWants.
937 vie_encoder_->SetSource( 885 vie_encoder_->SetSource(
938 &new_video_source, 886 &new_video_source,
939 VideoSendStream::DegradationPreference::kMaintainFramerate); 887 VideoSendStream::DegradationPreference::kMaintainFramerate);
940 EXPECT_LT(new_video_source.sink_wants().max_pixel_count, 888 EXPECT_LT(new_video_source.sink_wants().max_pixel_count,
(...skipping 13 matching lines...) Expand all
954 902
955 vie_encoder_->Stop(); 903 vie_encoder_->Stop();
956 } 904 }
957 905
958 TEST_F(ViEEncoderTest, StatsTracksQualityAdaptationStats) { 906 TEST_F(ViEEncoderTest, StatsTracksQualityAdaptationStats) {
959 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 907 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
960 908
961 const int kWidth = 1280; 909 const int kWidth = 1280;
962 const int kHeight = 720; 910 const int kHeight = 720;
963 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 911 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
964 WaitForEncodedFrame(1); 912 sink_.WaitForEncodedFrame(1);
965 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 913 VideoSendStream::Stats stats = stats_proxy_->GetStats();
966 EXPECT_FALSE(stats.bw_limited_resolution); 914 EXPECT_FALSE(stats.bw_limited_resolution);
967 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); 915 EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
968 916
969 // Trigger adapt down. 917 // Trigger adapt down.
970 vie_encoder_->TriggerQualityLow(); 918 vie_encoder_->TriggerQualityLow();
971 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 919 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
972 WaitForEncodedFrame(2); 920 sink_.WaitForEncodedFrame(2);
973 921
974 stats = stats_proxy_->GetStats(); 922 stats = stats_proxy_->GetStats();
975 EXPECT_TRUE(stats.bw_limited_resolution); 923 EXPECT_TRUE(stats.bw_limited_resolution);
976 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); 924 EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
977 925
978 // Trigger adapt up. 926 // Trigger adapt up.
979 vie_encoder_->TriggerQualityHigh(); 927 vie_encoder_->TriggerQualityHigh();
980 video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 928 video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
981 WaitForEncodedFrame(3); 929 sink_.WaitForEncodedFrame(3);
982 930
983 stats = stats_proxy_->GetStats(); 931 stats = stats_proxy_->GetStats();
984 EXPECT_FALSE(stats.bw_limited_resolution); 932 EXPECT_FALSE(stats.bw_limited_resolution);
985 EXPECT_EQ(2, stats.number_of_quality_adapt_changes); 933 EXPECT_EQ(2, stats.number_of_quality_adapt_changes);
986 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); 934 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
987 935
988 vie_encoder_->Stop(); 936 vie_encoder_->Stop();
989 } 937 }
990 938
991 TEST_F(ViEEncoderTest, StatsTracksCpuAdaptationStats) { 939 TEST_F(ViEEncoderTest, StatsTracksCpuAdaptationStats) {
992 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 940 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
993 941
994 const int kWidth = 1280; 942 const int kWidth = 1280;
995 const int kHeight = 720; 943 const int kHeight = 720;
996 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 944 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
997 WaitForEncodedFrame(1); 945 sink_.WaitForEncodedFrame(1);
998 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 946 VideoSendStream::Stats stats = stats_proxy_->GetStats();
999 EXPECT_FALSE(stats.cpu_limited_resolution); 947 EXPECT_FALSE(stats.cpu_limited_resolution);
1000 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); 948 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
1001 949
1002 // Trigger CPU overuse. 950 // Trigger CPU overuse.
1003 vie_encoder_->TriggerCpuOveruse(); 951 vie_encoder_->TriggerCpuOveruse();
1004 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 952 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1005 WaitForEncodedFrame(2); 953 sink_.WaitForEncodedFrame(2);
1006 954
1007 stats = stats_proxy_->GetStats(); 955 stats = stats_proxy_->GetStats();
1008 EXPECT_TRUE(stats.cpu_limited_resolution); 956 EXPECT_TRUE(stats.cpu_limited_resolution);
1009 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 957 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1010 958
1011 // Trigger CPU normal use. 959 // Trigger CPU normal use.
1012 vie_encoder_->TriggerCpuNormalUsage(); 960 vie_encoder_->TriggerCpuNormalUsage();
1013 video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 961 video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
1014 WaitForEncodedFrame(3); 962 sink_.WaitForEncodedFrame(3);
1015 963
1016 stats = stats_proxy_->GetStats(); 964 stats = stats_proxy_->GetStats();
1017 EXPECT_FALSE(stats.cpu_limited_resolution); 965 EXPECT_FALSE(stats.cpu_limited_resolution);
1018 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 966 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
1019 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); 967 EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
1020 968
1021 vie_encoder_->Stop(); 969 vie_encoder_->Stop();
1022 } 970 }
1023 971
1024 TEST_F(ViEEncoderTest, SwitchingSourceKeepsCpuAdaptation) { 972 TEST_F(ViEEncoderTest, SwitchingSourceKeepsCpuAdaptation) {
1025 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 973 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1026 974
1027 const int kWidth = 1280; 975 const int kWidth = 1280;
1028 const int kHeight = 720; 976 const int kHeight = 720;
1029 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 977 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1030 WaitForEncodedFrame(1); 978 sink_.WaitForEncodedFrame(1);
1031 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 979 VideoSendStream::Stats stats = stats_proxy_->GetStats();
1032 EXPECT_FALSE(stats.bw_limited_resolution); 980 EXPECT_FALSE(stats.bw_limited_resolution);
1033 EXPECT_FALSE(stats.cpu_limited_resolution); 981 EXPECT_FALSE(stats.cpu_limited_resolution);
1034 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); 982 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
1035 983
1036 // Trigger CPU overuse. 984 // Trigger CPU overuse.
1037 vie_encoder_->TriggerCpuOveruse(); 985 vie_encoder_->TriggerCpuOveruse();
1038 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 986 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1039 WaitForEncodedFrame(2); 987 sink_.WaitForEncodedFrame(2);
1040 stats = stats_proxy_->GetStats(); 988 stats = stats_proxy_->GetStats();
1041 EXPECT_FALSE(stats.bw_limited_resolution); 989 EXPECT_FALSE(stats.bw_limited_resolution);
1042 EXPECT_TRUE(stats.cpu_limited_resolution); 990 EXPECT_TRUE(stats.cpu_limited_resolution);
1043 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 991 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1044 992
1045 // Set new source with adaptation still enabled. 993 // Set new source with adaptation still enabled.
1046 test::FrameForwarder new_video_source; 994 test::FrameForwarder new_video_source;
1047 vie_encoder_->SetSource( 995 vie_encoder_->SetSource(
1048 &new_video_source, 996 &new_video_source,
1049 VideoSendStream::DegradationPreference::kMaintainFramerate); 997 VideoSendStream::DegradationPreference::kMaintainFramerate);
1050 998
1051 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 999 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
1052 WaitForEncodedFrame(3); 1000 sink_.WaitForEncodedFrame(3);
1053 stats = stats_proxy_->GetStats(); 1001 stats = stats_proxy_->GetStats();
1054 EXPECT_FALSE(stats.bw_limited_resolution); 1002 EXPECT_FALSE(stats.bw_limited_resolution);
1055 EXPECT_TRUE(stats.cpu_limited_resolution); 1003 EXPECT_TRUE(stats.cpu_limited_resolution);
1056 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 1004 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1057 1005
1058 // Set adaptation disabled. 1006 // Set adaptation disabled.
1059 vie_encoder_->SetSource( 1007 vie_encoder_->SetSource(
1060 &new_video_source, 1008 &new_video_source,
1061 VideoSendStream::DegradationPreference::kDegradationDisabled); 1009 VideoSendStream::DegradationPreference::kDegradationDisabled);
1062 1010
1063 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); 1011 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
1064 WaitForEncodedFrame(4); 1012 sink_.WaitForEncodedFrame(4);
1065 stats = stats_proxy_->GetStats(); 1013 stats = stats_proxy_->GetStats();
1066 EXPECT_FALSE(stats.bw_limited_resolution); 1014 EXPECT_FALSE(stats.bw_limited_resolution);
1067 EXPECT_FALSE(stats.cpu_limited_resolution); 1015 EXPECT_FALSE(stats.cpu_limited_resolution);
1068 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 1016 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1069 1017
1070 // Set adaptation back to enabled. 1018 // Set adaptation back to enabled.
1071 vie_encoder_->SetSource( 1019 vie_encoder_->SetSource(
1072 &new_video_source, 1020 &new_video_source,
1073 VideoSendStream::DegradationPreference::kMaintainFramerate); 1021 VideoSendStream::DegradationPreference::kMaintainFramerate);
1074 1022
1075 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); 1023 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
1076 WaitForEncodedFrame(5); 1024 sink_.WaitForEncodedFrame(5);
1077 stats = stats_proxy_->GetStats(); 1025 stats = stats_proxy_->GetStats();
1078 EXPECT_FALSE(stats.bw_limited_resolution); 1026 EXPECT_FALSE(stats.bw_limited_resolution);
1079 EXPECT_TRUE(stats.cpu_limited_resolution); 1027 EXPECT_TRUE(stats.cpu_limited_resolution);
1080 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 1028 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1081 1029
1082 // Trigger CPU normal use. 1030 // Trigger CPU normal use.
1083 vie_encoder_->TriggerCpuNormalUsage(); 1031 vie_encoder_->TriggerCpuNormalUsage();
1084 new_video_source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); 1032 new_video_source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight));
1085 WaitForEncodedFrame(6); 1033 sink_.WaitForEncodedFrame(6);
1086 stats = stats_proxy_->GetStats(); 1034 stats = stats_proxy_->GetStats();
1087 EXPECT_FALSE(stats.bw_limited_resolution); 1035 EXPECT_FALSE(stats.bw_limited_resolution);
1088 EXPECT_FALSE(stats.cpu_limited_resolution); 1036 EXPECT_FALSE(stats.cpu_limited_resolution);
1089 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 1037 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
1090 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); 1038 EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
1091 1039
1092 vie_encoder_->Stop(); 1040 vie_encoder_->Stop();
1093 } 1041 }
1094 1042
1095 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) { 1043 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) {
1096 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1044 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1097 1045
1098 const int kWidth = 1280; 1046 const int kWidth = 1280;
1099 const int kHeight = 720; 1047 const int kHeight = 720;
1100 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1048 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1101 WaitForEncodedFrame(1); 1049 sink_.WaitForEncodedFrame(1);
1102 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 1050 VideoSendStream::Stats stats = stats_proxy_->GetStats();
1103 EXPECT_FALSE(stats.bw_limited_resolution); 1051 EXPECT_FALSE(stats.bw_limited_resolution);
1104 EXPECT_FALSE(stats.bw_limited_framerate); 1052 EXPECT_FALSE(stats.bw_limited_framerate);
1105 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); 1053 EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
1106 1054
1107 // Set new source with adaptation still enabled. 1055 // Set new source with adaptation still enabled.
1108 test::FrameForwarder new_video_source; 1056 test::FrameForwarder new_video_source;
1109 vie_encoder_->SetSource(&new_video_source, 1057 vie_encoder_->SetSource(&new_video_source,
1110 VideoSendStream::DegradationPreference::kBalanced); 1058 VideoSendStream::DegradationPreference::kBalanced);
1111 1059
1112 new_video_source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 1060 new_video_source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1113 WaitForEncodedFrame(2); 1061 sink_.WaitForEncodedFrame(2);
1114 stats = stats_proxy_->GetStats(); 1062 stats = stats_proxy_->GetStats();
1115 EXPECT_FALSE(stats.bw_limited_resolution); 1063 EXPECT_FALSE(stats.bw_limited_resolution);
1116 EXPECT_FALSE(stats.bw_limited_framerate); 1064 EXPECT_FALSE(stats.bw_limited_framerate);
1117 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); 1065 EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
1118 1066
1119 // Trigger adapt down. 1067 // Trigger adapt down.
1120 vie_encoder_->TriggerQualityLow(); 1068 vie_encoder_->TriggerQualityLow();
1121 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 1069 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
1122 WaitForEncodedFrame(3); 1070 sink_.WaitForEncodedFrame(3);
1123 stats = stats_proxy_->GetStats(); 1071 stats = stats_proxy_->GetStats();
1124 EXPECT_TRUE(stats.bw_limited_resolution); 1072 EXPECT_TRUE(stats.bw_limited_resolution);
1125 EXPECT_FALSE(stats.bw_limited_framerate); 1073 EXPECT_FALSE(stats.bw_limited_framerate);
1126 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); 1074 EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
1127 1075
1128 // Set new source with adaptation still enabled. 1076 // Set new source with adaptation still enabled.
1129 vie_encoder_->SetSource(&new_video_source, 1077 vie_encoder_->SetSource(&new_video_source,
1130 VideoSendStream::DegradationPreference::kBalanced); 1078 VideoSendStream::DegradationPreference::kBalanced);
1131 1079
1132 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); 1080 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
1133 WaitForEncodedFrame(4); 1081 sink_.WaitForEncodedFrame(4);
1134 stats = stats_proxy_->GetStats(); 1082 stats = stats_proxy_->GetStats();
1135 EXPECT_TRUE(stats.bw_limited_resolution); 1083 EXPECT_TRUE(stats.bw_limited_resolution);
1136 EXPECT_FALSE(stats.bw_limited_framerate); 1084 EXPECT_FALSE(stats.bw_limited_framerate);
1137 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); 1085 EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
1138 1086
1139 // Disable resolution scaling. 1087 // Disable resolution scaling.
1140 vie_encoder_->SetSource( 1088 vie_encoder_->SetSource(
1141 &new_video_source, 1089 &new_video_source,
1142 VideoSendStream::DegradationPreference::kMaintainResolution); 1090 VideoSendStream::DegradationPreference::kMaintainResolution);
1143 1091
1144 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); 1092 new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
1145 WaitForEncodedFrame(5); 1093 sink_.WaitForEncodedFrame(5);
1146 stats = stats_proxy_->GetStats(); 1094 stats = stats_proxy_->GetStats();
1147 EXPECT_FALSE(stats.bw_limited_resolution); 1095 EXPECT_FALSE(stats.bw_limited_resolution);
1148 EXPECT_FALSE(stats.bw_limited_framerate); 1096 EXPECT_FALSE(stats.bw_limited_framerate);
1149 EXPECT_EQ(1, stats.number_of_quality_adapt_changes); 1097 EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
1150 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); 1098 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
1151 1099
1152 vie_encoder_->Stop(); 1100 vie_encoder_->Stop();
1153 } 1101 }
1154 1102
1155 TEST_F(ViEEncoderTest, QualityAdaptationStatsAreResetWhenScalerIsDisabled) { 1103 TEST_F(ViEEncoderTest, QualityAdaptationStatsAreResetWhenScalerIsDisabled) {
1156 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1104 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1157 1105
1158 const int kWidth = 1280; 1106 const int kWidth = 1280;
1159 const int kHeight = 720; 1107 const int kHeight = 720;
1160 video_source_.set_adaptation_enabled(true); 1108 video_source_.set_adaptation_enabled(true);
1161 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1109 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1162 WaitForEncodedFrame(1); 1110 sink_.WaitForEncodedFrame(1);
1163 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1111 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1164 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1112 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1165 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1113 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1166 1114
1167 // Trigger adapt down. 1115 // Trigger adapt down.
1168 vie_encoder_->TriggerQualityLow(); 1116 vie_encoder_->TriggerQualityLow();
1169 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 1117 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1170 WaitForEncodedFrame(2); 1118 sink_.WaitForEncodedFrame(2);
1171 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1119 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1172 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1120 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
1173 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1121 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1174 1122
1175 // Trigger overuse. 1123 // Trigger overuse.
1176 vie_encoder_->TriggerCpuOveruse(); 1124 vie_encoder_->TriggerCpuOveruse();
1177 video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 1125 video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
1178 WaitForEncodedFrame(3); 1126 sink_.WaitForEncodedFrame(3);
1179 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1127 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1180 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1128 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
1181 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1129 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1182 1130
1183 // Set source with adaptation still enabled but quality scaler is off. 1131 // Set source with adaptation still enabled but quality scaler is off.
1184 fake_encoder_.SetQualityScaling(false); 1132 fake_encoder_.SetQualityScaling(false);
1185 vie_encoder_->SetSource( 1133 vie_encoder_->SetSource(
1186 &video_source_, 1134 &video_source_,
1187 VideoSendStream::DegradationPreference::kMaintainFramerate); 1135 VideoSendStream::DegradationPreference::kMaintainFramerate);
1188 1136
1189 video_source_.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); 1137 video_source_.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
1190 WaitForEncodedFrame(4); 1138 sink_.WaitForEncodedFrame(4);
1191 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1139 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1192 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1140 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1193 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1141 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1194 1142
1195 vie_encoder_->Stop(); 1143 vie_encoder_->Stop();
1196 } 1144 }
1197 1145
1198 TEST_F(ViEEncoderTest, StatsTracksCpuAdaptationStatsWhenSwitchingSource) { 1146 TEST_F(ViEEncoderTest, StatsTracksCpuAdaptationStatsWhenSwitchingSource) {
1199 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1147 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1200 1148
1201 const int kWidth = 1280; 1149 const int kWidth = 1280;
1202 const int kHeight = 720; 1150 const int kHeight = 720;
1203 int sequence = 1; 1151 int sequence = 1;
1204 1152
1205 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); 1153 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
1206 WaitForEncodedFrame(sequence++); 1154 sink_.WaitForEncodedFrame(sequence++);
1207 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 1155 VideoSendStream::Stats stats = stats_proxy_->GetStats();
1208 EXPECT_FALSE(stats.cpu_limited_resolution); 1156 EXPECT_FALSE(stats.cpu_limited_resolution);
1209 EXPECT_FALSE(stats.cpu_limited_framerate); 1157 EXPECT_FALSE(stats.cpu_limited_framerate);
1210 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); 1158 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
1211 1159
1212 // Trigger CPU overuse, should now adapt down. 1160 // Trigger CPU overuse, should now adapt down.
1213 vie_encoder_->TriggerCpuOveruse(); 1161 vie_encoder_->TriggerCpuOveruse();
1214 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); 1162 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
1215 WaitForEncodedFrame(sequence++); 1163 sink_.WaitForEncodedFrame(sequence++);
1216 stats = stats_proxy_->GetStats(); 1164 stats = stats_proxy_->GetStats();
1217 EXPECT_TRUE(stats.cpu_limited_resolution); 1165 EXPECT_TRUE(stats.cpu_limited_resolution);
1218 EXPECT_FALSE(stats.cpu_limited_framerate); 1166 EXPECT_FALSE(stats.cpu_limited_framerate);
1219 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 1167 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1220 1168
1221 // Set new source with adaptation still enabled. 1169 // Set new source with adaptation still enabled.
1222 test::FrameForwarder new_video_source; 1170 test::FrameForwarder new_video_source;
1223 vie_encoder_->SetSource( 1171 vie_encoder_->SetSource(
1224 &new_video_source, 1172 &new_video_source,
1225 VideoSendStream::DegradationPreference::kMaintainFramerate); 1173 VideoSendStream::DegradationPreference::kMaintainFramerate);
1226 1174
1227 new_video_source.IncomingCapturedFrame( 1175 new_video_source.IncomingCapturedFrame(
1228 CreateFrame(sequence, kWidth, kHeight)); 1176 CreateFrame(sequence, kWidth, kHeight));
1229 WaitForEncodedFrame(sequence++); 1177 sink_.WaitForEncodedFrame(sequence++);
1230 stats = stats_proxy_->GetStats(); 1178 stats = stats_proxy_->GetStats();
1231 EXPECT_TRUE(stats.cpu_limited_resolution); 1179 EXPECT_TRUE(stats.cpu_limited_resolution);
1232 EXPECT_FALSE(stats.cpu_limited_framerate); 1180 EXPECT_FALSE(stats.cpu_limited_framerate);
1233 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 1181 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1234 1182
1235 // Set cpu adaptation by frame dropping. 1183 // Set cpu adaptation by frame dropping.
1236 vie_encoder_->SetSource( 1184 vie_encoder_->SetSource(
1237 &new_video_source, 1185 &new_video_source,
1238 VideoSendStream::DegradationPreference::kMaintainResolution); 1186 VideoSendStream::DegradationPreference::kMaintainResolution);
1239 new_video_source.IncomingCapturedFrame( 1187 new_video_source.IncomingCapturedFrame(
1240 CreateFrame(sequence, kWidth, kHeight)); 1188 CreateFrame(sequence, kWidth, kHeight));
1241 WaitForEncodedFrame(sequence++); 1189 sink_.WaitForEncodedFrame(sequence++);
1242 stats = stats_proxy_->GetStats(); 1190 stats = stats_proxy_->GetStats();
1243 // Not adapted at first. 1191 // Not adapted at first.
1244 EXPECT_FALSE(stats.cpu_limited_resolution); 1192 EXPECT_FALSE(stats.cpu_limited_resolution);
1245 EXPECT_FALSE(stats.cpu_limited_framerate); 1193 EXPECT_FALSE(stats.cpu_limited_framerate);
1246 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 1194 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
1247 1195
1248 // Force an input frame rate to be available, or the adaptation call won't 1196 // Force an input frame rate to be available, or the adaptation call won't
1249 // know what framerate to adapt from. 1197 // know what framerate to adapt from.
1250 VideoSendStream::Stats mock_stats = stats_proxy_->GetStats(); 1198 VideoSendStream::Stats mock_stats = stats_proxy_->GetStats();
1251 mock_stats.input_frame_rate = 30; 1199 mock_stats.input_frame_rate = 30;
1252 stats_proxy_->SetMockStats(mock_stats); 1200 stats_proxy_->SetMockStats(mock_stats);
1253 vie_encoder_->TriggerCpuOveruse(); 1201 vie_encoder_->TriggerCpuOveruse();
1254 stats_proxy_->ResetMockStats(); 1202 stats_proxy_->ResetMockStats();
1255 1203
1256 new_video_source.IncomingCapturedFrame( 1204 new_video_source.IncomingCapturedFrame(
1257 CreateFrame(sequence, kWidth, kHeight)); 1205 CreateFrame(sequence, kWidth, kHeight));
1258 WaitForEncodedFrame(sequence++); 1206 sink_.WaitForEncodedFrame(sequence++);
1259 1207
1260 // Framerate now adapted. 1208 // Framerate now adapted.
1261 stats = stats_proxy_->GetStats(); 1209 stats = stats_proxy_->GetStats();
1262 EXPECT_FALSE(stats.cpu_limited_resolution); 1210 EXPECT_FALSE(stats.cpu_limited_resolution);
1263 EXPECT_TRUE(stats.cpu_limited_framerate); 1211 EXPECT_TRUE(stats.cpu_limited_framerate);
1264 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 1212 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
1265 1213
1266 // Disable CPU adaptation. 1214 // Disable CPU adaptation.
1267 vie_encoder_->SetSource( 1215 vie_encoder_->SetSource(
1268 &new_video_source, 1216 &new_video_source,
1269 VideoSendStream::DegradationPreference::kDegradationDisabled); 1217 VideoSendStream::DegradationPreference::kDegradationDisabled);
1270 new_video_source.IncomingCapturedFrame( 1218 new_video_source.IncomingCapturedFrame(
1271 CreateFrame(sequence, kWidth, kHeight)); 1219 CreateFrame(sequence, kWidth, kHeight));
1272 WaitForEncodedFrame(sequence++); 1220 sink_.WaitForEncodedFrame(sequence++);
1273 1221
1274 stats = stats_proxy_->GetStats(); 1222 stats = stats_proxy_->GetStats();
1275 EXPECT_FALSE(stats.cpu_limited_resolution); 1223 EXPECT_FALSE(stats.cpu_limited_resolution);
1276 EXPECT_FALSE(stats.cpu_limited_framerate); 1224 EXPECT_FALSE(stats.cpu_limited_framerate);
1277 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 1225 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
1278 1226
1279 // Try to trigger overuse. Should not succeed. 1227 // Try to trigger overuse. Should not succeed.
1280 stats_proxy_->SetMockStats(mock_stats); 1228 stats_proxy_->SetMockStats(mock_stats);
1281 vie_encoder_->TriggerCpuOveruse(); 1229 vie_encoder_->TriggerCpuOveruse();
1282 stats_proxy_->ResetMockStats(); 1230 stats_proxy_->ResetMockStats();
1283 1231
1284 stats = stats_proxy_->GetStats(); 1232 stats = stats_proxy_->GetStats();
1285 EXPECT_FALSE(stats.cpu_limited_resolution); 1233 EXPECT_FALSE(stats.cpu_limited_resolution);
1286 EXPECT_FALSE(stats.cpu_limited_framerate); 1234 EXPECT_FALSE(stats.cpu_limited_framerate);
1287 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 1235 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
1288 1236
1289 // Switch back the source with resolution adaptation enabled. 1237 // Switch back the source with resolution adaptation enabled.
1290 vie_encoder_->SetSource( 1238 vie_encoder_->SetSource(
1291 &video_source_, 1239 &video_source_,
1292 VideoSendStream::DegradationPreference::kMaintainFramerate); 1240 VideoSendStream::DegradationPreference::kMaintainFramerate);
1293 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); 1241 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
1294 WaitForEncodedFrame(sequence++); 1242 sink_.WaitForEncodedFrame(sequence++);
1295 stats = stats_proxy_->GetStats(); 1243 stats = stats_proxy_->GetStats();
1296 EXPECT_TRUE(stats.cpu_limited_resolution); 1244 EXPECT_TRUE(stats.cpu_limited_resolution);
1297 EXPECT_FALSE(stats.cpu_limited_framerate); 1245 EXPECT_FALSE(stats.cpu_limited_framerate);
1298 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 1246 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
1299 1247
1300 // Trigger CPU normal usage. 1248 // Trigger CPU normal usage.
1301 vie_encoder_->TriggerCpuNormalUsage(); 1249 vie_encoder_->TriggerCpuNormalUsage();
1302 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight)); 1250 video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
1303 WaitForEncodedFrame(sequence++); 1251 sink_.WaitForEncodedFrame(sequence++);
1304 stats = stats_proxy_->GetStats(); 1252 stats = stats_proxy_->GetStats();
1305 EXPECT_FALSE(stats.cpu_limited_resolution); 1253 EXPECT_FALSE(stats.cpu_limited_resolution);
1306 EXPECT_FALSE(stats.cpu_limited_framerate); 1254 EXPECT_FALSE(stats.cpu_limited_framerate);
1307 EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); 1255 EXPECT_EQ(3, stats.number_of_cpu_adapt_changes);
1308 1256
1309 // Back to the source with adaptation off, set it back to maintain-resolution. 1257 // Back to the source with adaptation off, set it back to maintain-resolution.
1310 vie_encoder_->SetSource( 1258 vie_encoder_->SetSource(
1311 &new_video_source, 1259 &new_video_source,
1312 VideoSendStream::DegradationPreference::kMaintainResolution); 1260 VideoSendStream::DegradationPreference::kMaintainResolution);
1313 new_video_source.IncomingCapturedFrame( 1261 new_video_source.IncomingCapturedFrame(
1314 CreateFrame(sequence, kWidth, kHeight)); 1262 CreateFrame(sequence, kWidth, kHeight));
1315 WaitForEncodedFrame(sequence++); 1263 sink_.WaitForEncodedFrame(sequence++);
1316 stats = stats_proxy_->GetStats(); 1264 stats = stats_proxy_->GetStats();
1317 // Disabled, since we previously switched the source to disabled. 1265 // Disabled, since we previously switched the source to disabled.
1318 EXPECT_FALSE(stats.cpu_limited_resolution); 1266 EXPECT_FALSE(stats.cpu_limited_resolution);
1319 EXPECT_TRUE(stats.cpu_limited_framerate); 1267 EXPECT_TRUE(stats.cpu_limited_framerate);
1320 EXPECT_EQ(3, stats.number_of_cpu_adapt_changes); 1268 EXPECT_EQ(3, stats.number_of_cpu_adapt_changes);
1321 1269
1322 // Trigger CPU normal usage. 1270 // Trigger CPU normal usage.
1323 vie_encoder_->TriggerCpuNormalUsage(); 1271 vie_encoder_->TriggerCpuNormalUsage();
1324 new_video_source.IncomingCapturedFrame( 1272 new_video_source.IncomingCapturedFrame(
1325 CreateFrame(sequence, kWidth, kHeight)); 1273 CreateFrame(sequence, kWidth, kHeight));
1326 WaitForEncodedFrame(sequence++); 1274 sink_.WaitForEncodedFrame(sequence++);
1327 stats = stats_proxy_->GetStats(); 1275 stats = stats_proxy_->GetStats();
1328 EXPECT_FALSE(stats.cpu_limited_resolution); 1276 EXPECT_FALSE(stats.cpu_limited_resolution);
1329 EXPECT_FALSE(stats.cpu_limited_framerate); 1277 EXPECT_FALSE(stats.cpu_limited_framerate);
1330 EXPECT_EQ(4, stats.number_of_cpu_adapt_changes); 1278 EXPECT_EQ(4, stats.number_of_cpu_adapt_changes);
1331 EXPECT_EQ(0, stats.number_of_quality_adapt_changes); 1279 EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
1332 1280
1333 vie_encoder_->Stop(); 1281 vie_encoder_->Stop();
1334 } 1282 }
1335 1283
1336 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) { 1284 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) {
1337 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1285 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1338 1286
1339 const int kWidth = 1280; 1287 const int kWidth = 1280;
1340 const int kHeight = 720; 1288 const int kHeight = 720;
1341 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1289 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1342 WaitForEncodedFrame(1); 1290 sink_.WaitForEncodedFrame(1);
1343 1291
1344 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 1292 VideoSendStream::Stats stats = stats_proxy_->GetStats();
1345 EXPECT_EQ(video_encoder_config_.max_bitrate_bps, 1293 EXPECT_EQ(video_encoder_config_.max_bitrate_bps,
1346 stats.preferred_media_bitrate_bps); 1294 stats.preferred_media_bitrate_bps);
1347 1295
1348 vie_encoder_->Stop(); 1296 vie_encoder_->Stop();
1349 } 1297 }
1350 1298
1351 TEST_F(ViEEncoderTest, ScalingUpAndDownDoesNothingWithMaintainResolution) { 1299 TEST_F(ViEEncoderTest, ScalingUpAndDownDoesNothingWithMaintainResolution) {
1352 const int kWidth = 1280; 1300 const int kWidth = 1280;
1353 const int kHeight = 720; 1301 const int kHeight = 720;
1354 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1302 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1355 1303
1356 // Expect no scaling to begin with. 1304 // Expect no scaling to begin with.
1357 VerifyNoLimitation(video_source_.sink_wants()); 1305 VerifyNoLimitation(video_source_.sink_wants());
1358 1306
1359 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1307 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1360 WaitForEncodedFrame(1); 1308 sink_.WaitForEncodedFrame(1);
1361 1309
1362 // Trigger scale down. 1310 // Trigger scale down.
1363 vie_encoder_->TriggerQualityLow(); 1311 vie_encoder_->TriggerQualityLow();
1364 1312
1365 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 1313 video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1366 WaitForEncodedFrame(2); 1314 sink_.WaitForEncodedFrame(2);
1367 1315
1368 // Expect a scale down. 1316 // Expect a scale down.
1369 EXPECT_TRUE(video_source_.sink_wants().max_pixel_count); 1317 EXPECT_TRUE(video_source_.sink_wants().max_pixel_count);
1370 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight); 1318 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight);
1371 1319
1372 // Set resolution scaling disabled. 1320 // Set resolution scaling disabled.
1373 test::FrameForwarder new_video_source; 1321 test::FrameForwarder new_video_source;
1374 vie_encoder_->SetSource( 1322 vie_encoder_->SetSource(
1375 &new_video_source, 1323 &new_video_source,
1376 VideoSendStream::DegradationPreference::kMaintainResolution); 1324 VideoSendStream::DegradationPreference::kMaintainResolution);
1377 1325
1378 // Trigger scale down. 1326 // Trigger scale down.
1379 vie_encoder_->TriggerQualityLow(); 1327 vie_encoder_->TriggerQualityLow();
1380 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 1328 new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
1381 WaitForEncodedFrame(3); 1329 sink_.WaitForEncodedFrame(3);
1382 1330
1383 // Expect no scaling. 1331 // Expect no scaling.
1384 EXPECT_EQ(std::numeric_limits<int>::max(), 1332 EXPECT_EQ(std::numeric_limits<int>::max(),
1385 new_video_source.sink_wants().max_pixel_count); 1333 new_video_source.sink_wants().max_pixel_count);
1386 1334
1387 // Trigger scale up. 1335 // Trigger scale up.
1388 vie_encoder_->TriggerQualityHigh(); 1336 vie_encoder_->TriggerQualityHigh();
1389 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); 1337 new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
1390 WaitForEncodedFrame(4); 1338 sink_.WaitForEncodedFrame(4);
1391 1339
1392 // Expect nothing to change, still no scaling. 1340 // Expect nothing to change, still no scaling.
1393 EXPECT_EQ(std::numeric_limits<int>::max(), 1341 EXPECT_EQ(std::numeric_limits<int>::max(),
1394 new_video_source.sink_wants().max_pixel_count); 1342 new_video_source.sink_wants().max_pixel_count);
1395 1343
1396 vie_encoder_->Stop(); 1344 vie_encoder_->Stop();
1397 } 1345 }
1398 1346
1399 TEST_F(ViEEncoderTest, SkipsSameAdaptDownRequest_MaintainFramerateMode) { 1347 TEST_F(ViEEncoderTest, SkipsSameAdaptDownRequest_MaintainFramerateMode) {
1400 const int kWidth = 1280; 1348 const int kWidth = 1280;
1401 const int kHeight = 720; 1349 const int kHeight = 720;
1402 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1350 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1403 1351
1404 // Enable kMaintainFramerate preference, no initial limitation. 1352 // Enable kMaintainFramerate preference, no initial limitation.
1405 test::FrameForwarder source; 1353 test::FrameForwarder source;
1406 vie_encoder_->SetSource( 1354 vie_encoder_->SetSource(
1407 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); 1355 &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
1408 1356
1409 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1357 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1410 WaitForEncodedFrame(1); 1358 sink_.WaitForEncodedFrame(1);
1411 VerifyNoLimitation(source.sink_wants()); 1359 VerifyNoLimitation(source.sink_wants());
1412 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1360 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1413 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1361 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1414 1362
1415 // Trigger adapt down, expect scaled down resolution. 1363 // Trigger adapt down, expect scaled down resolution.
1416 vie_encoder_->TriggerCpuOveruse(); 1364 vie_encoder_->TriggerCpuOveruse();
1417 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); 1365 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
1418 const int kLastMaxPixelCount = source.sink_wants().max_pixel_count; 1366 const int kLastMaxPixelCount = source.sink_wants().max_pixel_count;
1419 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1367 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1420 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1368 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
(...skipping 11 matching lines...) Expand all
1432 const int kWidth = 1280; 1380 const int kWidth = 1280;
1433 const int kHeight = 720; 1381 const int kHeight = 720;
1434 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1382 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1435 1383
1436 // Enable kMaintainFramerate preference, no initial limitation. 1384 // Enable kMaintainFramerate preference, no initial limitation.
1437 test::FrameForwarder source; 1385 test::FrameForwarder source;
1438 vie_encoder_->SetSource( 1386 vie_encoder_->SetSource(
1439 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); 1387 &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
1440 1388
1441 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1389 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1442 WaitForEncodedFrame(kWidth, kHeight); 1390 sink_.WaitForEncodedFrame(kWidth, kHeight);
1443 VerifyNoLimitation(source.sink_wants()); 1391 VerifyNoLimitation(source.sink_wants());
1444 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1392 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1445 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1393 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1446 1394
1447 // Trigger adapt up, expect no change. 1395 // Trigger adapt up, expect no change.
1448 vie_encoder_->TriggerCpuNormalUsage(); 1396 vie_encoder_->TriggerCpuNormalUsage();
1449 VerifyNoLimitation(source.sink_wants()); 1397 VerifyNoLimitation(source.sink_wants());
1450 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1398 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1451 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1399 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1452 1400
1453 vie_encoder_->Stop(); 1401 vie_encoder_->Stop();
1454 } 1402 }
1455 1403
1456 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_MaintainResolutionMode) { 1404 TEST_F(ViEEncoderTest, NoChangeForInitialNormalUsage_MaintainResolutionMode) {
1457 const int kWidth = 1280; 1405 const int kWidth = 1280;
1458 const int kHeight = 720; 1406 const int kHeight = 720;
1459 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1407 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1460 1408
1461 // Enable kMaintainResolution preference, no initial limitation. 1409 // Enable kMaintainResolution preference, no initial limitation.
1462 test::FrameForwarder source; 1410 test::FrameForwarder source;
1463 vie_encoder_->SetSource( 1411 vie_encoder_->SetSource(
1464 &source, VideoSendStream::DegradationPreference::kMaintainResolution); 1412 &source, VideoSendStream::DegradationPreference::kMaintainResolution);
1465 1413
1466 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1414 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1467 WaitForEncodedFrame(kWidth, kHeight); 1415 sink_.WaitForEncodedFrame(kWidth, kHeight);
1468 VerifyNoLimitation(source.sink_wants()); 1416 VerifyNoLimitation(source.sink_wants());
1469 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); 1417 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
1470 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1418 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1471 1419
1472 // Trigger adapt up, expect no change. 1420 // Trigger adapt up, expect no change.
1473 vie_encoder_->TriggerCpuNormalUsage(); 1421 vie_encoder_->TriggerCpuNormalUsage();
1474 VerifyNoLimitation(source.sink_wants()); 1422 VerifyNoLimitation(source.sink_wants());
1475 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate); 1423 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
1476 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1424 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1477 1425
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 const int kHeight = 720; 1458 const int kHeight = 720;
1511 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1459 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1512 1460
1513 // Enable kMaintainFramerate preference, no initial limitation. 1461 // Enable kMaintainFramerate preference, no initial limitation.
1514 AdaptingFrameForwarder source; 1462 AdaptingFrameForwarder source;
1515 source.set_adaptation_enabled(true); 1463 source.set_adaptation_enabled(true);
1516 vie_encoder_->SetSource( 1464 vie_encoder_->SetSource(
1517 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); 1465 &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
1518 1466
1519 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1467 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1520 WaitForEncodedFrame(1); 1468 sink_.WaitForEncodedFrame(1);
1521 VerifyNoLimitation(source.sink_wants()); 1469 VerifyNoLimitation(source.sink_wants());
1522 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1470 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1523 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1471 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1524 1472
1525 // Trigger adapt down, expect scaled down resolution. 1473 // Trigger adapt down, expect scaled down resolution.
1526 vie_encoder_->TriggerQualityLow(); 1474 vie_encoder_->TriggerQualityLow();
1527 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 1475 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1528 WaitForEncodedFrame(2); 1476 sink_.WaitForEncodedFrame(2);
1529 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); 1477 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
1530 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1478 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
1531 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1479 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1532 1480
1533 // Trigger adapt up, expect no restriction. 1481 // Trigger adapt up, expect no restriction.
1534 vie_encoder_->TriggerQualityHigh(); 1482 vie_encoder_->TriggerQualityHigh();
1535 VerifyNoLimitation(source.sink_wants()); 1483 VerifyNoLimitation(source.sink_wants());
1536 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1484 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1537 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1485 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1538 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1486 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 // Enable adapter, expected input resolutions when downscaling: 1539 // Enable adapter, expected input resolutions when downscaling:
1592 // 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (min resolution limit) 1540 // 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (min resolution limit)
1593 video_source_.set_adaptation_enabled(true); 1541 video_source_.set_adaptation_enabled(true);
1594 1542
1595 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1543 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1596 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1544 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1597 1545
1598 int downscales = 0; 1546 int downscales = 0;
1599 for (size_t i = 1; i <= kNumFrames; i++) { 1547 for (size_t i = 1; i <= kNumFrames; i++) {
1600 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); 1548 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
1601 WaitForEncodedFrame(i); 1549 sink_.WaitForEncodedFrame(i);
1602 1550
1603 // Trigger scale down. 1551 // Trigger scale down.
1604 rtc::VideoSinkWants last_wants = video_source_.sink_wants(); 1552 rtc::VideoSinkWants last_wants = video_source_.sink_wants();
1605 vie_encoder_->TriggerQualityLow(); 1553 vie_encoder_->TriggerQualityLow();
1606 EXPECT_GE(video_source_.sink_wants().max_pixel_count, kMinPixelsPerFrame); 1554 EXPECT_GE(video_source_.sink_wants().max_pixel_count, kMinPixelsPerFrame);
1607 1555
1608 if (video_source_.sink_wants().max_pixel_count < last_wants.max_pixel_count) 1556 if (video_source_.sink_wants().max_pixel_count < last_wants.max_pixel_count)
1609 ++downscales; 1557 ++downscales;
1610 1558
1611 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1559 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
(...skipping 10 matching lines...) Expand all
1622 const int kHeight = 720; 1570 const int kHeight = 720;
1623 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1571 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1624 1572
1625 // Enable kMaintainFramerate preference, no initial limitation. 1573 // Enable kMaintainFramerate preference, no initial limitation.
1626 AdaptingFrameForwarder source; 1574 AdaptingFrameForwarder source;
1627 source.set_adaptation_enabled(true); 1575 source.set_adaptation_enabled(true);
1628 vie_encoder_->SetSource( 1576 vie_encoder_->SetSource(
1629 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); 1577 &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
1630 1578
1631 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1579 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1632 WaitForEncodedFrame(kWidth, kHeight); 1580 sink_.WaitForEncodedFrame(kWidth, kHeight);
1633 VerifyNoLimitation(source.sink_wants()); 1581 VerifyNoLimitation(source.sink_wants());
1634 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1582 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1635 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1583 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1636 1584
1637 // Trigger adapt down, expect scaled down resolution. 1585 // Trigger adapt down, expect scaled down resolution.
1638 vie_encoder_->TriggerCpuOveruse(); 1586 vie_encoder_->TriggerCpuOveruse();
1639 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 1587 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1640 WaitForEncodedFrame(2); 1588 sink_.WaitForEncodedFrame(2);
1641 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); 1589 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
1642 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1590 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1643 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1591 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1644 1592
1645 // Trigger adapt up, expect no restriction. 1593 // Trigger adapt up, expect no restriction.
1646 vie_encoder_->TriggerCpuNormalUsage(); 1594 vie_encoder_->TriggerCpuNormalUsage();
1647 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 1595 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
1648 WaitForEncodedFrame(kWidth, kHeight); 1596 sink_.WaitForEncodedFrame(kWidth, kHeight);
1649 VerifyNoLimitation(source.sink_wants()); 1597 VerifyNoLimitation(source.sink_wants());
1650 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1598 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1651 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1599 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1652 1600
1653 // Trigger adapt down, expect scaled down resolution. 1601 // Trigger adapt down, expect scaled down resolution.
1654 vie_encoder_->TriggerCpuOveruse(); 1602 vie_encoder_->TriggerCpuOveruse();
1655 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); 1603 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
1656 WaitForEncodedFrame(4); 1604 sink_.WaitForEncodedFrame(4);
1657 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); 1605 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
1658 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1606 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1659 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1607 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1660 1608
1661 // Trigger adapt up, expect no restriction. 1609 // Trigger adapt up, expect no restriction.
1662 vie_encoder_->TriggerCpuNormalUsage(); 1610 vie_encoder_->TriggerCpuNormalUsage();
1663 source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); 1611 source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
1664 sink_.WaitForEncodedFrame(kWidth, kHeight); 1612 sink_.WaitForEncodedFrame(kWidth, kHeight);
1665 VerifyNoLimitation(source.sink_wants()); 1613 VerifyNoLimitation(source.sink_wants());
1666 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1614 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1667 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1615 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1668 1616
1669 vie_encoder_->Stop(); 1617 vie_encoder_->Stop();
1670 } 1618 }
1671 1619
1672 TEST_F(ViEEncoderTest, 1620 TEST_F(ViEEncoderTest,
1673 AdaptsResolutionOnOveruseAndLowQuality_MaintainFramerateMode) { 1621 AdaptsResolutionOnOveruseAndLowQuality_MaintainFramerateMode) {
1674 const int kWidth = 1280; 1622 const int kWidth = 1280;
1675 const int kHeight = 720; 1623 const int kHeight = 720;
1676 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1624 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1677 1625
1678 // Enable kMaintainFramerate preference, no initial limitation. 1626 // Enable kMaintainFramerate preference, no initial limitation.
1679 AdaptingFrameForwarder source; 1627 AdaptingFrameForwarder source;
1680 source.set_adaptation_enabled(true); 1628 source.set_adaptation_enabled(true);
1681 vie_encoder_->SetSource( 1629 vie_encoder_->SetSource(
1682 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); 1630 &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
1683 1631
1684 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1632 source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1685 WaitForEncodedFrame(kWidth, kHeight); 1633 sink_.WaitForEncodedFrame(kWidth, kHeight);
1686 VerifyNoLimitation(source.sink_wants()); 1634 VerifyNoLimitation(source.sink_wants());
1687 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1635 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1688 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1636 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1689 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1637 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1690 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1638 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1691 1639
1692 // Trigger cpu adapt down, expect scaled down resolution (960x540). 1640 // Trigger cpu adapt down, expect scaled down resolution (960x540).
1693 vie_encoder_->TriggerCpuOveruse(); 1641 vie_encoder_->TriggerCpuOveruse();
1694 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); 1642 source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
1695 WaitForEncodedFrame(2); 1643 sink_.WaitForEncodedFrame(2);
1696 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight); 1644 VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
1697 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1645 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1698 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1646 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1699 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1647 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1700 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1648 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1701 1649
1702 // Trigger cpu adapt down, expect scaled down resolution (640x360). 1650 // Trigger cpu adapt down, expect scaled down resolution (640x360).
1703 vie_encoder_->TriggerCpuOveruse(); 1651 vie_encoder_->TriggerCpuOveruse();
1704 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); 1652 source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
1705 WaitForEncodedFrame(3); 1653 sink_.WaitForEncodedFrame(3);
1706 VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants()); 1654 VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants());
1707 rtc::VideoSinkWants last_wants = source.sink_wants(); 1655 rtc::VideoSinkWants last_wants = source.sink_wants();
1708 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1656 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1709 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1657 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1710 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1658 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1711 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1659 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1712 1660
1713 // Trigger cpu adapt down, max cpu downgrades reached, expect no change. 1661 // Trigger cpu adapt down, max cpu downgrades reached, expect no change.
1714 vie_encoder_->TriggerCpuOveruse(); 1662 vie_encoder_->TriggerCpuOveruse();
1715 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight)); 1663 source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
1716 WaitForEncodedFrame(4); 1664 sink_.WaitForEncodedFrame(4);
1717 VerifyFpsEqResolutionEq(source.sink_wants(), last_wants); 1665 VerifyFpsEqResolutionEq(source.sink_wants(), last_wants);
1718 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1666 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1719 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1667 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1720 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1668 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1721 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1669 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1722 1670
1723 // Trigger quality adapt down, expect scaled down resolution (480x270). 1671 // Trigger quality adapt down, expect scaled down resolution (480x270).
1724 vie_encoder_->TriggerQualityLow(); 1672 vie_encoder_->TriggerQualityLow();
1725 source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight)); 1673 source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
1726 WaitForEncodedFrame(5); 1674 sink_.WaitForEncodedFrame(5);
1727 VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants()); 1675 VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants());
1728 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1676 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1729 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1677 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
1730 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1678 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1731 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1679 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1732 1680
1733 // Trigger cpu adapt up, expect upscaled resolution (640x360). 1681 // Trigger cpu adapt up, expect upscaled resolution (640x360).
1734 vie_encoder_->TriggerCpuNormalUsage(); 1682 vie_encoder_->TriggerCpuNormalUsage();
1735 source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight)); 1683 source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight));
1736 WaitForEncodedFrame(6); 1684 sink_.WaitForEncodedFrame(6);
1737 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); 1685 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
1738 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution); 1686 EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
1739 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1687 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
1740 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1688 EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1741 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1689 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1742 1690
1743 // Trigger cpu adapt up, expect upscaled resolution (960x540). 1691 // Trigger cpu adapt up, expect upscaled resolution (960x540).
1744 vie_encoder_->TriggerCpuNormalUsage(); 1692 vie_encoder_->TriggerCpuNormalUsage();
1745 source.IncomingCapturedFrame(CreateFrame(7, kWidth, kHeight)); 1693 source.IncomingCapturedFrame(CreateFrame(7, kWidth, kHeight));
1746 WaitForEncodedFrame(7); 1694 sink_.WaitForEncodedFrame(7);
1747 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); 1695 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
1748 last_wants = source.sink_wants(); 1696 last_wants = source.sink_wants();
1749 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1697 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1750 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1698 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
1751 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1699 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1752 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1700 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1753 1701
1754 // Trigger cpu adapt up, no cpu downgrades, expect no change (960x540). 1702 // Trigger cpu adapt up, no cpu downgrades, expect no change (960x540).
1755 vie_encoder_->TriggerCpuNormalUsage(); 1703 vie_encoder_->TriggerCpuNormalUsage();
1756 source.IncomingCapturedFrame(CreateFrame(8, kWidth, kHeight)); 1704 source.IncomingCapturedFrame(CreateFrame(8, kWidth, kHeight));
1757 WaitForEncodedFrame(8); 1705 sink_.WaitForEncodedFrame(8);
1758 VerifyFpsEqResolutionEq(source.sink_wants(), last_wants); 1706 VerifyFpsEqResolutionEq(source.sink_wants(), last_wants);
1759 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1707 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1760 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution); 1708 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
1761 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1709 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1762 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1710 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1763 1711
1764 // Trigger quality adapt up, expect no restriction (1280x720). 1712 // Trigger quality adapt up, expect no restriction (1280x720).
1765 vie_encoder_->TriggerQualityHigh(); 1713 vie_encoder_->TriggerQualityHigh();
1766 source.IncomingCapturedFrame(CreateFrame(9, kWidth, kHeight)); 1714 source.IncomingCapturedFrame(CreateFrame(9, kWidth, kHeight));
1767 WaitForEncodedFrame(kWidth, kHeight); 1715 sink_.WaitForEncodedFrame(kWidth, kHeight);
1768 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants()); 1716 VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
1769 VerifyNoLimitation(source.sink_wants()); 1717 VerifyNoLimitation(source.sink_wants());
1770 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1718 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1771 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); 1719 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
1772 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1720 EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1773 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes); 1721 EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
1774 1722
1775 vie_encoder_->Stop(); 1723 vie_encoder_->Stop();
1776 } 1724 }
1777 1725
1778 TEST_F(ViEEncoderTest, CpuLimitedHistogramIsReported) { 1726 TEST_F(ViEEncoderTest, CpuLimitedHistogramIsReported) {
1727 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1779 const int kWidth = 640; 1728 const int kWidth = 640;
1780 const int kHeight = 360; 1729 const int kHeight = 360;
1781 1730
1782 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1783
1784 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) { 1731 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
1785 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); 1732 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
1786 WaitForEncodedFrame(i); 1733 sink_.WaitForEncodedFrame(i);
1787 } 1734 }
1788 1735
1789 vie_encoder_->TriggerCpuOveruse(); 1736 vie_encoder_->TriggerCpuOveruse();
1790 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) { 1737 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
1791 video_source_.IncomingCapturedFrame(CreateFrame( 1738 video_source_.IncomingCapturedFrame(CreateFrame(
1792 SendStatisticsProxy::kMinRequiredMetricsSamples + i, kWidth, kHeight)); 1739 SendStatisticsProxy::kMinRequiredMetricsSamples + i, kWidth, kHeight));
1793 WaitForEncodedFrame(SendStatisticsProxy::kMinRequiredMetricsSamples + i); 1740 sink_.WaitForEncodedFrame(SendStatisticsProxy::kMinRequiredMetricsSamples +
1741 i);
1794 } 1742 }
1795 1743
1796 vie_encoder_->Stop(); 1744 vie_encoder_->Stop();
1797 vie_encoder_.reset(); 1745 vie_encoder_.reset();
1798 stats_proxy_.reset(); 1746 stats_proxy_.reset();
1799 1747
1800 EXPECT_EQ(1, 1748 EXPECT_EQ(1,
1801 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent")); 1749 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
1802 EXPECT_EQ( 1750 EXPECT_EQ(
1803 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50)); 1751 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50));
1804 } 1752 }
1805 1753
1806 TEST_F(ViEEncoderTest, CpuLimitedHistogramIsNotReportedForDisabledDegradation) { 1754 TEST_F(ViEEncoderTest, CpuLimitedHistogramIsNotReportedForDisabledDegradation) {
1807 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1755 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1808 const int kWidth = 640; 1756 const int kWidth = 640;
1809 const int kHeight = 360; 1757 const int kHeight = 360;
1810 1758
1811 vie_encoder_->SetSource( 1759 vie_encoder_->SetSource(
1812 &video_source_, 1760 &video_source_,
1813 VideoSendStream::DegradationPreference::kDegradationDisabled); 1761 VideoSendStream::DegradationPreference::kDegradationDisabled);
1814 1762
1815 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) { 1763 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
1816 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); 1764 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
1817 WaitForEncodedFrame(i); 1765 sink_.WaitForEncodedFrame(i);
1818 } 1766 }
1819 1767
1820 vie_encoder_->Stop(); 1768 vie_encoder_->Stop();
1821 vie_encoder_.reset(); 1769 vie_encoder_.reset();
1822 stats_proxy_.reset(); 1770 stats_proxy_.reset();
1823 1771
1824 EXPECT_EQ(0, 1772 EXPECT_EQ(0,
1825 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent")); 1773 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
1826 } 1774 }
1827 1775
(...skipping 10 matching lines...) Expand all
1838 .GetAllocation(kLowTargetBitrateBps, kDefaultFps); 1786 .GetAllocation(kLowTargetBitrateBps, kDefaultFps);
1839 1787
1840 // First called on bitrate updated, then again on first frame. 1788 // First called on bitrate updated, then again on first frame.
1841 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) 1789 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
1842 .Times(2); 1790 .Times(2);
1843 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0); 1791 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0);
1844 1792
1845 const int64_t kStartTimeMs = 1; 1793 const int64_t kStartTimeMs = 1;
1846 video_source_.IncomingCapturedFrame( 1794 video_source_.IncomingCapturedFrame(
1847 CreateFrame(kStartTimeMs, codec_width_, codec_height_)); 1795 CreateFrame(kStartTimeMs, codec_width_, codec_height_));
1848 WaitForEncodedFrame(kStartTimeMs); 1796 sink_.WaitForEncodedFrame(kStartTimeMs);
1849 1797
1850 // Not called on second frame. 1798 // Not called on second frame.
1851 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) 1799 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
1852 .Times(0); 1800 .Times(0);
1853 video_source_.IncomingCapturedFrame( 1801 video_source_.IncomingCapturedFrame(
1854 CreateFrame(kStartTimeMs + 1, codec_width_, codec_height_)); 1802 CreateFrame(kStartTimeMs + 1, codec_width_, codec_height_));
1855 WaitForEncodedFrame(kStartTimeMs + 1); 1803 sink_.WaitForEncodedFrame(kStartTimeMs + 1);
1856 1804
1857 // Called after a process interval. 1805 // Called after a process interval.
1858 const int64_t kProcessIntervalMs = 1806 const int64_t kProcessIntervalMs =
1859 vcm::VCMProcessTimer::kDefaultProcessIntervalMs; 1807 vcm::VCMProcessTimer::kDefaultProcessIntervalMs;
1860 fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerMillisec * 1808 // TODO(sprang): ViEEncoder should die and/or get injectable clock.
1861 (kProcessIntervalMs + (1000 / kDefaultFps))); 1809 // Sleep for one processing interval plus one frame to avoid flakiness.
1810 SleepMs(kProcessIntervalMs + 1000 / kDefaultFps);
1862 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) 1811 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
1863 .Times(1); 1812 .Times(1);
1864 video_source_.IncomingCapturedFrame(CreateFrame( 1813 video_source_.IncomingCapturedFrame(CreateFrame(
1865 kStartTimeMs + kProcessIntervalMs, codec_width_, codec_height_)); 1814 kStartTimeMs + kProcessIntervalMs, codec_width_, codec_height_));
1866 WaitForEncodedFrame(kStartTimeMs + kProcessIntervalMs); 1815 sink_.WaitForEncodedFrame(kStartTimeMs + kProcessIntervalMs);
1867 1816
1868 vie_encoder_->Stop(); 1817 vie_encoder_->Stop();
1869 } 1818 }
1870 1819
1871 TEST_F(ViEEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) { 1820 TEST_F(ViEEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) {
1872 const int kTooLowBitrateForFrameSizeBps = 10000; 1821 const int kTooLowBitrateForFrameSizeBps = 10000;
1873 vie_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0); 1822 vie_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0);
1874 const int kWidth = 640; 1823 const int kWidth = 640;
1875 const int kHeight = 360; 1824 const int kHeight = 360;
1876 1825
1877 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1826 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1878 1827
1879 // Expect to drop this frame, the wait should time out. 1828 // Expect to drop this frame, the wait should time out.
1880 ExpectDroppedFrame(); 1829 sink_.ExpectDroppedFrame();
1881 1830
1882 // Expect the sink_wants to specify a scaled frame. 1831 // Expect the sink_wants to specify a scaled frame.
1883 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight); 1832 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight);
1884 1833
1885 int last_pixel_count = video_source_.sink_wants().max_pixel_count; 1834 int last_pixel_count = video_source_.sink_wants().max_pixel_count;
1886 1835
1887 // Next frame is scaled. 1836 // Next frame is scaled.
1888 video_source_.IncomingCapturedFrame( 1837 video_source_.IncomingCapturedFrame(
1889 CreateFrame(2, kWidth * 3 / 4, kHeight * 3 / 4)); 1838 CreateFrame(2, kWidth * 3 / 4, kHeight * 3 / 4));
1890 1839
1891 // Expect to drop this frame, the wait should time out. 1840 // Expect to drop this frame, the wait should time out.
1892 ExpectDroppedFrame(); 1841 sink_.ExpectDroppedFrame();
1893 1842
1894 EXPECT_LT(video_source_.sink_wants().max_pixel_count, last_pixel_count); 1843 EXPECT_LT(video_source_.sink_wants().max_pixel_count, last_pixel_count);
1895 1844
1896 vie_encoder_->Stop(); 1845 vie_encoder_->Stop();
1897 } 1846 }
1898 1847
1899 TEST_F(ViEEncoderTest, NumberOfDroppedFramesLimitedWhenBitrateIsTooLow) { 1848 TEST_F(ViEEncoderTest, NumberOfDroppedFramesLimitedWhenBitrateIsTooLow) {
1900 const int kTooLowBitrateForFrameSizeBps = 10000; 1849 const int kTooLowBitrateForFrameSizeBps = 10000;
1901 vie_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0); 1850 vie_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0);
1902 const int kWidth = 640; 1851 const int kWidth = 640;
1903 const int kHeight = 360; 1852 const int kHeight = 360;
1904 1853
1905 // We expect the n initial frames to get dropped. 1854 // We expect the n initial frames to get dropped.
1906 int i; 1855 int i;
1907 for (i = 1; i <= kMaxInitialFramedrop; ++i) { 1856 for (i = 1; i <= kMaxInitialFramedrop; ++i) {
1908 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); 1857 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
1909 ExpectDroppedFrame(); 1858 sink_.ExpectDroppedFrame();
1910 } 1859 }
1911 // The n+1th frame should not be dropped, even though it's size is too large. 1860 // The n+1th frame should not be dropped, even though it's size is too large.
1912 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); 1861 video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
1913 WaitForEncodedFrame(i); 1862 sink_.WaitForEncodedFrame(i);
1914 1863
1915 // Expect the sink_wants to specify a scaled frame. 1864 // Expect the sink_wants to specify a scaled frame.
1916 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight); 1865 EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight);
1917 1866
1918 vie_encoder_->Stop(); 1867 vie_encoder_->Stop();
1919 } 1868 }
1920 1869
1921 TEST_F(ViEEncoderTest, InitialFrameDropOffWithMaintainResolutionPreference) { 1870 TEST_F(ViEEncoderTest, InitialFrameDropOffWithMaintainResolutionPreference) {
1922 const int kWidth = 640; 1871 const int kWidth = 640;
1923 const int kHeight = 360; 1872 const int kHeight = 360;
1924 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0); 1873 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0);
1925 1874
1926 // Set degradation preference. 1875 // Set degradation preference.
1927 vie_encoder_->SetSource( 1876 vie_encoder_->SetSource(
1928 &video_source_, 1877 &video_source_,
1929 VideoSendStream::DegradationPreference::kMaintainResolution); 1878 VideoSendStream::DegradationPreference::kMaintainResolution);
1930 1879
1931 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1880 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1932 // Frame should not be dropped, even if it's too large. 1881 // Frame should not be dropped, even if it's too large.
1933 WaitForEncodedFrame(1); 1882 sink_.WaitForEncodedFrame(1);
1934 1883
1935 vie_encoder_->Stop(); 1884 vie_encoder_->Stop();
1936 } 1885 }
1937 1886
1938 TEST_F(ViEEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) { 1887 TEST_F(ViEEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) {
1939 const int kWidth = 640; 1888 const int kWidth = 640;
1940 const int kHeight = 360; 1889 const int kHeight = 360;
1941 fake_encoder_.SetQualityScaling(false); 1890 fake_encoder_.SetQualityScaling(false);
1942 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0); 1891 vie_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0);
1943 1892
1944 // Force quality scaler reconfiguration by resetting the source. 1893 // Force quality scaler reconfiguration by resetting the source.
1945 vie_encoder_->SetSource(&video_source_, 1894 vie_encoder_->SetSource(&video_source_,
1946 VideoSendStream::DegradationPreference::kBalanced); 1895 VideoSendStream::DegradationPreference::kBalanced);
1947 1896
1948 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); 1897 video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
1949 // Frame should not be dropped, even if it's too large. 1898 // Frame should not be dropped, even if it's too large.
1950 WaitForEncodedFrame(1); 1899 sink_.WaitForEncodedFrame(1);
1951 1900
1952 vie_encoder_->Stop(); 1901 vie_encoder_->Stop();
1953 fake_encoder_.SetQualityScaling(true); 1902 fake_encoder_.SetQualityScaling(true);
1954 } 1903 }
1955 1904
1956 TEST_F(ViEEncoderTest, 1905 TEST_F(ViEEncoderTest,
1957 ResolutionNotAdaptedForTooSmallFrame_MaintainFramerateMode) { 1906 ResolutionNotAdaptedForTooSmallFrame_MaintainFramerateMode) {
1958 const int kTooSmallWidth = 10; 1907 const int kTooSmallWidth = 10;
1959 const int kTooSmallHeight = 10; 1908 const int kTooSmallHeight = 10;
1960 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1909 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1961 1910
1962 // Enable kMaintainFramerate preference, no initial limitation. 1911 // Enable kMaintainFramerate preference, no initial limitation.
1963 test::FrameForwarder source; 1912 test::FrameForwarder source;
1964 vie_encoder_->SetSource( 1913 vie_encoder_->SetSource(
1965 &source, VideoSendStream::DegradationPreference::kMaintainFramerate); 1914 &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
1966 VerifyNoLimitation(source.sink_wants()); 1915 VerifyNoLimitation(source.sink_wants());
1967 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1916 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1968 1917
1969 // Trigger adapt down, too small frame, expect no change. 1918 // Trigger adapt down, too small frame, expect no change.
1970 source.IncomingCapturedFrame(CreateFrame(1, kTooSmallWidth, kTooSmallHeight)); 1919 source.IncomingCapturedFrame(CreateFrame(1, kTooSmallWidth, kTooSmallHeight));
1971 WaitForEncodedFrame(1); 1920 sink_.WaitForEncodedFrame(1);
1972 vie_encoder_->TriggerCpuOveruse(); 1921 vie_encoder_->TriggerCpuOveruse();
1973 VerifyNoLimitation(source.sink_wants()); 1922 VerifyNoLimitation(source.sink_wants());
1974 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution); 1923 EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
1975 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes); 1924 EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
1976 1925
1977 vie_encoder_->Stop(); 1926 vie_encoder_->Stop();
1978 } 1927 }
1979 1928
1980 TEST_F(ViEEncoderTest, FailingInitEncodeDoesntCauseCrash) { 1929 TEST_F(ViEEncoderTest, FailingInitEncodeDoesntCauseCrash) {
1981 fake_encoder_.ForceInitEncodeFailure(true); 1930 fake_encoder_.ForceInitEncodeFailure(true);
1982 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1931 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1983 ResetEncoder("VP8", 2, 1, true, false); 1932 ResetEncoder("VP8", 2, 1, true);
1984 const int kFrameWidth = 1280; 1933 const int kFrameWidth = 1280;
1985 const int kFrameHeight = 720; 1934 const int kFrameHeight = 720;
1986 video_source_.IncomingCapturedFrame( 1935 video_source_.IncomingCapturedFrame(
1987 CreateFrame(1, kFrameWidth, kFrameHeight)); 1936 CreateFrame(1, kFrameWidth, kFrameHeight));
1988 ExpectDroppedFrame(); 1937 sink_.ExpectDroppedFrame();
1989 vie_encoder_->Stop(); 1938 vie_encoder_->Stop();
1990 } 1939 }
1991 1940
1992 // TODO(sprang): Extend this with fps throttling and any "balanced" extensions. 1941 // TODO(sprang): Extend this with fps throttling and any "balanced" extensions.
1993 TEST_F(ViEEncoderTest, AdaptsResolutionOnOveruse_MaintainFramerateMode) { 1942 TEST_F(ViEEncoderTest, AdaptsResolutionOnOveruse_MaintainFramerateMode) {
1994 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1943 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
1995 1944
1996 const int kFrameWidth = 1280; 1945 const int kFrameWidth = 1280;
1997 const int kFrameHeight = 720; 1946 const int kFrameHeight = 720;
1998 // Enabled default VideoAdapter downscaling. First step is 3/4, not 3/5 as 1947 // Enabled default VideoAdapter downscaling. First step is 3/4, not 3/5 as
1999 // requested by ViEEncoder::VideoSourceProxy::RequestResolutionLowerThan(). 1948 // requested by ViEEncoder::VideoSourceProxy::RequestResolutionLowerThan().
2000 video_source_.set_adaptation_enabled(true); 1949 video_source_.set_adaptation_enabled(true);
2001 1950
2002 video_source_.IncomingCapturedFrame( 1951 video_source_.IncomingCapturedFrame(
2003 CreateFrame(1, kFrameWidth, kFrameHeight)); 1952 CreateFrame(1, kFrameWidth, kFrameHeight));
2004 WaitForEncodedFrame(kFrameWidth, kFrameHeight); 1953 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight);
2005 1954
2006 // Trigger CPU overuse, downscale by 3/4. 1955 // Trigger CPU overuse, downscale by 3/4.
2007 vie_encoder_->TriggerCpuOveruse(); 1956 vie_encoder_->TriggerCpuOveruse();
2008 video_source_.IncomingCapturedFrame( 1957 video_source_.IncomingCapturedFrame(
2009 CreateFrame(2, kFrameWidth, kFrameHeight)); 1958 CreateFrame(2, kFrameWidth, kFrameHeight));
2010 WaitForEncodedFrame((kFrameWidth * 3) / 4, (kFrameHeight * 3) / 4); 1959 sink_.WaitForEncodedFrame((kFrameWidth * 3) / 4, (kFrameHeight * 3) / 4);
2011 1960
2012 // Trigger CPU normal use, return to original resolution. 1961 // Trigger CPU normal use, return to original resolution.
2013 vie_encoder_->TriggerCpuNormalUsage(); 1962 vie_encoder_->TriggerCpuNormalUsage();
2014 video_source_.IncomingCapturedFrame( 1963 video_source_.IncomingCapturedFrame(
2015 CreateFrame(3, kFrameWidth, kFrameHeight)); 1964 CreateFrame(3, kFrameWidth, kFrameHeight));
2016 WaitForEncodedFrame(kFrameWidth, kFrameHeight); 1965 sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight);
2017 1966
2018 vie_encoder_->Stop(); 1967 vie_encoder_->Stop();
2019 } 1968 }
2020 1969
2021 TEST_F(ViEEncoderTest, AdaptsFramerateOnOveruse_MaintainResolutionMode) { 1970 TEST_F(ViEEncoderTest, AdaptsFramerateOnOveruse_MaintainResolutionMode) {
2022 // const int kDefaultFramerateFps = 30; 1971 const int kDefaultFramerateFps = 30;
1972 const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kDefaultFramerateFps;
2023 const int kFrameWidth = 1280; 1973 const int kFrameWidth = 1280;
2024 const int kFrameHeight = 720; 1974 const int kFrameHeight = 720;
2025 int kFrameIntervalMs = rtc::kNumMillisecsPerSec / max_framerate_; 1975 rtc::ScopedFakeClock fake_clock;
2026 1976
2027 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 1977 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
2028 vie_encoder_->SetSource( 1978 vie_encoder_->SetSource(
2029 &video_source_, 1979 &video_source_,
2030 VideoSendStream::DegradationPreference::kMaintainResolution); 1980 VideoSendStream::DegradationPreference::kMaintainResolution);
2031 video_source_.set_adaptation_enabled(true); 1981 video_source_.set_adaptation_enabled(true);
2032 1982
2033 int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; 1983 fake_clock.SetTimeMicros(kFrameIntervalMs * 1000);
1984 int64_t timestamp_ms = kFrameIntervalMs;
2034 1985
2035 video_source_.IncomingCapturedFrame( 1986 video_source_.IncomingCapturedFrame(
2036 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 1987 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2037 WaitForEncodedFrame(timestamp_ms); 1988 sink_.WaitForEncodedFrame(timestamp_ms);
2038 1989
2039 // Try to trigger overuse. No fps estimate available => no effect. 1990 // Try to trigger overuse. No fps estimate available => no effect.
2040 vie_encoder_->TriggerCpuOveruse(); 1991 vie_encoder_->TriggerCpuOveruse();
2041 1992
2042 // Insert frames for one second to get a stable estimate. 1993 // Insert frames for one second to get a stable estimate.
2043 for (int i = 0; i < max_framerate_; ++i) { 1994 for (int i = 0; i < kDefaultFramerateFps; ++i) {
2044 timestamp_ms += kFrameIntervalMs; 1995 timestamp_ms += kFrameIntervalMs;
1996 fake_clock.AdvanceTimeMicros(kFrameIntervalMs * 1000);
2045 video_source_.IncomingCapturedFrame( 1997 video_source_.IncomingCapturedFrame(
2046 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 1998 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2047 WaitForEncodedFrame(timestamp_ms); 1999 sink_.WaitForEncodedFrame(timestamp_ms);
2048 } 2000 }
2049 2001
2050 // Trigger CPU overuse, reduce framerate by 2/3. 2002 // Trigger CPU overuse, reduce framerate by 2/3.
2051 vie_encoder_->TriggerCpuOveruse(); 2003 vie_encoder_->TriggerCpuOveruse();
2052 int num_frames_dropped = 0; 2004 int num_frames_dropped = 0;
2053 for (int i = 0; i < max_framerate_; ++i) { 2005 for (int i = 0; i < kDefaultFramerateFps; ++i) {
2054 timestamp_ms += kFrameIntervalMs; 2006 timestamp_ms += kFrameIntervalMs;
2007 fake_clock.AdvanceTimeMicros(kFrameIntervalMs * 1000);
2055 video_source_.IncomingCapturedFrame( 2008 video_source_.IncomingCapturedFrame(
2056 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 2009 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2057 if (!WaitForFrame(kFrameTimeoutMs)) { 2010 if (!sink_.WaitForFrame(kFrameTimeoutMs)) {
2058 ++num_frames_dropped; 2011 ++num_frames_dropped;
2059 } else { 2012 } else {
2060 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight); 2013 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
2061 } 2014 }
2062 } 2015 }
2063 2016
2064 // Add some slack to account for frames dropped by the frame dropper. 2017 // TODO(sprang): Find where there's rounding errors or stuff causing the
2065 const int kErrorMargin = 1; 2018 // margin here to be a little larger than we'd like (input fps estimate is
2066 EXPECT_NEAR(num_frames_dropped, max_framerate_ - (max_framerate_ * 2 / 3), 2019 // off) and the frame dropping is a little too aggressive.
2020 const int kErrorMargin = 5;
2021 EXPECT_NEAR(num_frames_dropped,
2022 kDefaultFramerateFps - (kDefaultFramerateFps * 2 / 3),
2067 kErrorMargin); 2023 kErrorMargin);
2068 2024
2069 // Trigger CPU overuse, reduce framerate by 2/3 again. 2025 // Trigger CPU overuse, reduce framerate by 2/3 again.
2070 vie_encoder_->TriggerCpuOveruse(); 2026 vie_encoder_->TriggerCpuOveruse();
2071 num_frames_dropped = 0; 2027 num_frames_dropped = 0;
2072 for (int i = 0; i < max_framerate_; ++i) { 2028 for (int i = 0; i < kDefaultFramerateFps; ++i) {
2073 timestamp_ms += kFrameIntervalMs; 2029 timestamp_ms += kFrameIntervalMs;
2030 fake_clock.AdvanceTimeMicros(kFrameIntervalMs * 1000);
2074 video_source_.IncomingCapturedFrame( 2031 video_source_.IncomingCapturedFrame(
2075 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 2032 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2076 if (!WaitForFrame(kFrameTimeoutMs)) { 2033 if (!sink_.WaitForFrame(kFrameTimeoutMs)) {
2077 ++num_frames_dropped; 2034 ++num_frames_dropped;
2078 } else { 2035 } else {
2079 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight); 2036 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
2080 } 2037 }
2081 } 2038 }
2082 EXPECT_NEAR(num_frames_dropped, max_framerate_ - (max_framerate_ * 4 / 9), 2039 EXPECT_NEAR(num_frames_dropped,
2040 kDefaultFramerateFps - (kDefaultFramerateFps * 4 / 9),
2083 kErrorMargin); 2041 kErrorMargin);
2084 2042
2085 // Go back up one step. 2043 // Go back up one step.
2086 vie_encoder_->TriggerCpuNormalUsage(); 2044 vie_encoder_->TriggerCpuNormalUsage();
2087 num_frames_dropped = 0; 2045 num_frames_dropped = 0;
2088 for (int i = 0; i < max_framerate_; ++i) { 2046 for (int i = 0; i < kDefaultFramerateFps; ++i) {
2089 timestamp_ms += kFrameIntervalMs; 2047 timestamp_ms += kFrameIntervalMs;
2048 fake_clock.AdvanceTimeMicros(kFrameIntervalMs * 1000);
2090 video_source_.IncomingCapturedFrame( 2049 video_source_.IncomingCapturedFrame(
2091 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 2050 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2092 if (!WaitForFrame(kFrameTimeoutMs)) { 2051 if (!sink_.WaitForFrame(kFrameTimeoutMs)) {
2093 ++num_frames_dropped; 2052 ++num_frames_dropped;
2094 } else { 2053 } else {
2095 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight); 2054 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
2096 } 2055 }
2097 } 2056 }
2098 EXPECT_NEAR(num_frames_dropped, max_framerate_ - (max_framerate_ * 2 / 3), 2057 EXPECT_NEAR(num_frames_dropped,
2058 kDefaultFramerateFps - (kDefaultFramerateFps * 2 / 3),
2099 kErrorMargin); 2059 kErrorMargin);
2100 2060
2101 // Go back up to original mode. 2061 // Go back up to original mode.
2102 vie_encoder_->TriggerCpuNormalUsage(); 2062 vie_encoder_->TriggerCpuNormalUsage();
2103 num_frames_dropped = 0; 2063 num_frames_dropped = 0;
2104 for (int i = 0; i < max_framerate_; ++i) { 2064 for (int i = 0; i < kDefaultFramerateFps; ++i) {
2105 timestamp_ms += kFrameIntervalMs; 2065 timestamp_ms += kFrameIntervalMs;
2066 fake_clock.AdvanceTimeMicros(kFrameIntervalMs * 1000);
2106 video_source_.IncomingCapturedFrame( 2067 video_source_.IncomingCapturedFrame(
2107 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 2068 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2108 if (!WaitForFrame(kFrameTimeoutMs)) { 2069 if (!sink_.WaitForFrame(kFrameTimeoutMs)) {
2109 ++num_frames_dropped; 2070 ++num_frames_dropped;
2110 } else { 2071 } else {
2111 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight); 2072 sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
2112 } 2073 }
2113 } 2074 }
2114 EXPECT_NEAR(num_frames_dropped, 0, kErrorMargin); 2075 EXPECT_NEAR(num_frames_dropped, 0, kErrorMargin);
2115 2076
2116 vie_encoder_->Stop(); 2077 vie_encoder_->Stop();
2117 } 2078 }
2118 2079
2119 TEST_F(ViEEncoderTest, DoesntAdaptDownPastMinFramerate) { 2080 TEST_F(ViEEncoderTest, DoesntAdaptDownPastMinFramerate) {
2120 const int kFramerateFps = 5; 2081 const int kFramerateFps = 5;
2121 const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kFramerateFps; 2082 const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kFramerateFps;
2122 const int kMinFpsFrameInterval = rtc::kNumMillisecsPerSec / kMinFramerateFps; 2083 const int kMinFpsFrameInterval = rtc::kNumMillisecsPerSec / kMinFramerateFps;
2123 const int kFrameWidth = 1280; 2084 const int kFrameWidth = 1280;
2124 const int kFrameHeight = 720; 2085 const int kFrameHeight = 720;
2125 2086
2126 // Reconfigure encoder with two temporal layers and screensharing, which will 2087 rtc::ScopedFakeClock fake_clock;
2127 // disable frame dropping and make testing easier.
2128 ResetEncoder("VP8", 1, 2, true, true);
2129
2130 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 2088 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
2131 vie_encoder_->SetSource( 2089 vie_encoder_->SetSource(
2132 &video_source_, 2090 &video_source_,
2133 VideoSendStream::DegradationPreference::kMaintainResolution); 2091 VideoSendStream::DegradationPreference::kMaintainResolution);
2134 video_source_.set_adaptation_enabled(true); 2092 video_source_.set_adaptation_enabled(true);
2135 2093
2136 int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; 2094 fake_clock.SetTimeMicros(kFrameIntervalMs * 1000);
2095 int64_t timestamp_ms = kFrameIntervalMs;
2137 2096
2138 // Trigger overuse as much as we can. 2097 // Trigger overuse as much as we can.
2139 for (int i = 0; i < ViEEncoder::kMaxCpuResolutionDowngrades; ++i) { 2098 for (int i = 0; i < ViEEncoder::kMaxCpuResolutionDowngrades; ++i) {
2140 // Insert frames to get a new fps estimate... 2099 // Insert frames to get a new fps estimate...
2141 for (int j = 0; j < kFramerateFps; ++j) { 2100 for (int j = 0; j < kFramerateFps; ++j) {
2142 video_source_.IncomingCapturedFrame( 2101 video_source_.IncomingCapturedFrame(
2143 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 2102 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2144 timestamp_ms += kFrameIntervalMs; 2103 timestamp_ms += kFrameIntervalMs;
2104 fake_clock.AdvanceTimeMicros(kFrameIntervalMs * 1000);
2145 } 2105 }
2146 // ...and then try to adapt again. 2106 // ...and then try to adapt again.
2147 vie_encoder_->TriggerCpuOveruse(); 2107 vie_encoder_->TriggerCpuOveruse();
2148 } 2108 }
2149 2109
2150 // Drain any frame in the pipeline. 2110 // Drain any frame in the pipeline.
2151 WaitForFrame(kDefaultTimeoutMs); 2111 sink_.WaitForFrame(kDefaultTimeoutMs);
2152 2112
2153 // Insert frames at min fps, all should go through. 2113 // Insert frames at min fps, all should go through.
2154 for (int i = 0; i < 10; ++i) { 2114 for (int i = 0; i < 10; ++i) {
2155 timestamp_ms += kMinFpsFrameInterval; 2115 timestamp_ms += kMinFpsFrameInterval;
2116 fake_clock.AdvanceTimeMicros(kMinFpsFrameInterval * 1000);
2156 video_source_.IncomingCapturedFrame( 2117 video_source_.IncomingCapturedFrame(
2157 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); 2118 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2158 WaitForEncodedFrame(timestamp_ms); 2119 sink_.WaitForEncodedFrame(timestamp_ms);
2159 } 2120 }
2160 vie_encoder_->Stop(); 2121 vie_encoder_->Stop();
2161 } 2122 }
2162
2163 TEST_F(ViEEncoderTest, PriodicallyUpdatesChannelParameters) {
2164 const int kFrameWidth = 1280;
2165 const int kFrameHeight = 720;
2166 const int kLowFps = 2;
2167 const int kHighFps = 30;
2168
2169 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
2170
2171 int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
2172 max_framerate_ = kLowFps;
2173
2174 // Insert 2 seconds of 2fps video.
2175 for (int i = 0; i < kLowFps * 2; ++i) {
2176 video_source_.IncomingCapturedFrame(
2177 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2178 WaitForEncodedFrame(timestamp_ms);
2179 timestamp_ms += 1000 / kLowFps;
2180 }
2181
2182 // Make sure encoder is updated with new target.
2183 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
2184 video_source_.IncomingCapturedFrame(
2185 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2186 WaitForEncodedFrame(timestamp_ms);
2187 timestamp_ms += 1000 / kLowFps;
2188
2189 EXPECT_EQ(kLowFps, fake_encoder_.GetConfiguredInputFramerate());
2190
2191 // Insert 30fps frames for just a little more than the forced update period.
2192 const int kVcmTimerIntervalFrames =
2193 (vcm::VCMProcessTimer::kDefaultProcessIntervalMs * kHighFps) / 1000;
2194 const int kFrameIntervalMs = 1000 / kHighFps;
2195 max_framerate_ = kHighFps;
2196 for (int i = 0; i < kVcmTimerIntervalFrames + 2; ++i) {
2197 video_source_.IncomingCapturedFrame(
2198 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
2199 // Wait for encoded frame, but skip ahead if it doesn't arrive as it might
2200 // be dropped if the encoder hans't been updated with the new higher target
2201 // framerate yet, causing it to overshoot the target bitrate and then
2202 // suffering the wrath of the media optimizer.
2203 TimedWaitForEncodedFrame(timestamp_ms, 2 * kFrameIntervalMs);
2204 timestamp_ms += kFrameIntervalMs;
2205 }
2206
2207 // Don expect correct measurement just yet, but it should be higher than
2208 // before.
2209 EXPECT_GT(fake_encoder_.GetConfiguredInputFramerate(), kLowFps);
2210
2211 vie_encoder_->Stop();
2212 }
2213 } // namespace webrtc 2123 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/vie_encoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698