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

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

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