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

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

Issue 2398963003: Move usage of QualityScaler to ViEEncoder. (Closed)
Patch Set: Actually test something sensible Created 4 years 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') | webrtc/video_encoder.h » ('j') | 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
11 #include <limits> 11 #include <limits>
12 #include <utility> 12 #include <utility>
13 13
14 #include "webrtc/base/logging.h" 14 #include "webrtc/base/logging.h"
15 #include "webrtc/system_wrappers/include/metrics_default.h" 15 #include "webrtc/system_wrappers/include/metrics_default.h"
16 #include "webrtc/test/encoder_settings.h" 16 #include "webrtc/test/encoder_settings.h"
17 #include "webrtc/test/fake_encoder.h" 17 #include "webrtc/test/fake_encoder.h"
18 #include "webrtc/test/frame_generator.h" 18 #include "webrtc/test/frame_generator.h"
19 #include "webrtc/test/gtest.h" 19 #include "webrtc/test/gtest.h"
20 #include "webrtc/video/send_statistics_proxy.h" 20 #include "webrtc/video/send_statistics_proxy.h"
21 #include "webrtc/video/vie_encoder.h" 21 #include "webrtc/video/vie_encoder.h"
22 22
23 namespace webrtc { 23 namespace webrtc {
24 24
25 using DegredationPreference = VideoSendStream::DegradationPreference;
26 using ScaleReason = ScalingObserverInterface::ScaleReason;
27
25 namespace { 28 namespace {
26 class TestBuffer : public webrtc::I420Buffer { 29 class TestBuffer : public webrtc::I420Buffer {
27 public: 30 public:
28 TestBuffer(rtc::Event* event, int width, int height) 31 TestBuffer(rtc::Event* event, int width, int height)
29 : I420Buffer(width, height), event_(event) {} 32 : I420Buffer(width, height), event_(event) {}
30 33
31 private: 34 private:
32 friend class rtc::RefCountedObject<TestBuffer>; 35 friend class rtc::RefCountedObject<TestBuffer>;
33 ~TestBuffer() override { 36 ~TestBuffer() override {
34 if (event_) 37 if (event_)
35 event_->Set(); 38 event_->Set();
36 } 39 }
37 rtc::Event* const event_; 40 rtc::Event* const event_;
38 }; 41 };
39 42
40 class ViEEncoderUnderTest : public ViEEncoder { 43 class ViEEncoderUnderTest : public ViEEncoder {
41 public: 44 public:
42 ViEEncoderUnderTest( 45 ViEEncoderUnderTest(SendStatisticsProxy* stats_proxy,
43 SendStatisticsProxy* stats_proxy, 46 const VideoSendStream::Config::EncoderSettings& settings)
44 const webrtc::VideoSendStream::Config::EncoderSettings& settings)
45 : ViEEncoder(1 /* number_of_cores */, 47 : ViEEncoder(1 /* number_of_cores */,
46 stats_proxy, 48 stats_proxy,
47 settings, 49 settings,
48 nullptr /* pre_encode_callback */, 50 nullptr /* pre_encode_callback */,
49 nullptr /* encoder_timing */) {} 51 nullptr /* encoder_timing */) {}
50 52
51 void TriggerCpuOveruse() { 53 void PostTaskAndWait(bool down, ScaleReason reason) {
52 rtc::Event event(false, false); 54 rtc::Event event(false, false);
53 encoder_queue()->PostTask([this, &event] { 55 encoder_queue()->PostTask([this, &event, reason, down] {
54 OveruseDetected(); 56 down ? ScaleDown(reason) : ScaleUp(reason);
55 event.Set(); 57 event.Set();
56 }); 58 });
57 event.Wait(rtc::Event::kForever); 59 RTC_DCHECK(event.Wait(5000));
58 } 60 }
59 61
60 void TriggerCpuNormalUsage() { 62 void TriggerCpuOveruse() { PostTaskAndWait(true, ScaleReason::kCpu); }
61 rtc::Event event(false, false); 63
62 encoder_queue()->PostTask([this, &event] { 64 void TriggerCpuNormalUsage() { PostTaskAndWait(false, ScaleReason::kCpu); }
63 NormalUsage(); 65
64 event.Set(); 66 void TriggerQualityLow() { PostTaskAndWait(true, ScaleReason::kQuality); }
65 }); 67
66 event.Wait(rtc::Event::kForever); 68 void TriggerQualityHigh() { PostTaskAndWait(false, ScaleReason::kQuality); }
67 }
68 }; 69 };
69 70
70 } // namespace 71 } // namespace
71 72
72 class ViEEncoderTest : public ::testing::Test { 73 class ViEEncoderTest : public ::testing::Test {
73 public: 74 public:
74 static const int kDefaultTimeoutMs = 30 * 1000; 75 static const int kDefaultTimeoutMs = 30 * 1000;
75 76
76 ViEEncoderTest() 77 ViEEncoderTest()
77 : video_send_config_(VideoSendStream::Config(nullptr)), 78 : video_send_config_(VideoSendStream::Config(nullptr)),
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 VideoCodec codec_config() { 129 VideoCodec codec_config() {
129 rtc::CritScope lock(&crit_); 130 rtc::CritScope lock(&crit_);
130 return config_; 131 return config_;
131 } 132 }
132 133
133 void BlockNextEncode() { 134 void BlockNextEncode() {
134 rtc::CritScope lock(&crit_); 135 rtc::CritScope lock(&crit_);
135 block_next_encode_ = true; 136 block_next_encode_ = true;
136 } 137 }
137 138
139 VideoEncoder::ScalingSettings GetScalingSettings() const override {
140 return VideoEncoder::ScalingSettings(true, 1, 2);
141 }
142
138 void ContinueEncode() { continue_encode_event_.Set(); } 143 void ContinueEncode() { continue_encode_event_.Set(); }
139 144
140 void CheckLastTimeStampsMatch(int64_t ntp_time_ms, 145 void CheckLastTimeStampsMatch(int64_t ntp_time_ms,
141 uint32_t timestamp) const { 146 uint32_t timestamp) const {
142 rtc::CritScope lock(&crit_); 147 rtc::CritScope lock(&crit_);
143 EXPECT_EQ(timestamp_, timestamp); 148 EXPECT_EQ(timestamp_, timestamp);
144 EXPECT_EQ(ntp_time_ms_, ntp_time_ms); 149 EXPECT_EQ(ntp_time_ms_, ntp_time_ms);
145 } 150 }
146 151
147 private: 152 private:
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 427
423 EXPECT_LT(video_source_.sink_wants().max_pixel_count.value_or( 428 EXPECT_LT(video_source_.sink_wants().max_pixel_count.value_or(
424 std::numeric_limits<int>::max()), 429 std::numeric_limits<int>::max()),
425 frame_width * frame_height); 430 frame_width * frame_height);
426 EXPECT_FALSE(video_source_.sink_wants().max_pixel_count_step_up); 431 EXPECT_FALSE(video_source_.sink_wants().max_pixel_count_step_up);
427 432
428 frame_width /= 2; 433 frame_width /= 2;
429 frame_height /= 2; 434 frame_height /= 2;
430 } 435 }
431 436
432 // Trigger CPU overuse a one more time. This should not trigger request for 437 // Trigger CPU overuse one more time. This should not trigger a request for
433 // lower resolution. 438 // lower resolution.
434 rtc::VideoSinkWants current_wants = video_source_.sink_wants(); 439 rtc::VideoSinkWants current_wants = video_source_.sink_wants();
435 video_source_.IncomingCapturedFrame(CreateFrame( 440 video_source_.IncomingCapturedFrame(CreateFrame(
436 ViEEncoder::kMaxCpuDowngrades + 1, frame_width, frame_height)); 441 ViEEncoder::kMaxCpuDowngrades + 1, frame_width, frame_height));
437 sink_.WaitForEncodedFrame(ViEEncoder::kMaxCpuDowngrades + 1); 442 sink_.WaitForEncodedFrame(ViEEncoder::kMaxCpuDowngrades + 1);
438 vie_encoder_->TriggerCpuOveruse(); 443 vie_encoder_->TriggerCpuOveruse();
439 EXPECT_EQ(video_source_.sink_wants().max_pixel_count, 444 EXPECT_EQ(video_source_.sink_wants().max_pixel_count,
440 current_wants.max_pixel_count); 445 current_wants.max_pixel_count);
441 EXPECT_EQ(video_source_.sink_wants().max_pixel_count_step_up, 446 EXPECT_EQ(video_source_.sink_wants().max_pixel_count_step_up,
442 current_wants.max_pixel_count_step_up); 447 current_wants.max_pixel_count_step_up);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 CreateFrame(3, frame_width, frame_height)); 533 CreateFrame(3, frame_width, frame_height));
529 sink_.WaitForEncodedFrame(3); 534 sink_.WaitForEncodedFrame(3);
530 535
531 stats = stats_proxy_->GetStats(); 536 stats = stats_proxy_->GetStats();
532 EXPECT_FALSE(stats.cpu_limited_resolution); 537 EXPECT_FALSE(stats.cpu_limited_resolution);
533 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 538 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
534 539
535 vie_encoder_->Stop(); 540 vie_encoder_->Stop();
536 } 541 }
537 542
538 TEST_F(ViEEncoderTest, StatsTracksAdaptationStatsWhenSwitchingSource) { 543 TEST_F(ViEEncoderTest, SwitchingSourceKeepsCpuAdaptation) {
539 const int kTargetBitrateBps = 100000; 544 const int kTargetBitrateBps = 100000;
540 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 545 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
541 546
542 // Trigger CPU overuse.
543 vie_encoder_->TriggerCpuOveruse();
544 int frame_width = 1280; 547 int frame_width = 1280;
545 int frame_height = 720; 548 int frame_height = 720;
546
547 video_source_.IncomingCapturedFrame( 549 video_source_.IncomingCapturedFrame(
548 CreateFrame(1, frame_width, frame_height)); 550 CreateFrame(1, frame_width, frame_height));
549 sink_.WaitForEncodedFrame(1); 551 sink_.WaitForEncodedFrame(1);
550 552
551 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 553 VideoSendStream::Stats stats = stats_proxy_->GetStats();
554 EXPECT_FALSE(stats.cpu_limited_resolution);
555 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
556
557 vie_encoder_->TriggerCpuOveruse();
558
559 video_source_.IncomingCapturedFrame(
560 CreateFrame(2, frame_width, frame_height));
561 sink_.WaitForEncodedFrame(2);
562 stats = stats_proxy_->GetStats();
552 EXPECT_TRUE(stats.cpu_limited_resolution); 563 EXPECT_TRUE(stats.cpu_limited_resolution);
553 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 564 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
554 565
555 // Set new source with adaptation still enabled. 566 // Set new source with adaptation still enabled.
556 test::FrameForwarder new_video_source; 567 test::FrameForwarder new_video_source;
557 vie_encoder_->SetSource(&new_video_source, 568 vie_encoder_->SetSource(&new_video_source,
558 VideoSendStream::DegradationPreference::kBalanced); 569 VideoSendStream::DegradationPreference::kBalanced);
559 570
560 new_video_source.IncomingCapturedFrame( 571 new_video_source.IncomingCapturedFrame(
561 CreateFrame(2, frame_width, frame_height)); 572 CreateFrame(3, frame_width, frame_height));
562 sink_.WaitForEncodedFrame(2); 573 sink_.WaitForEncodedFrame(3);
563 stats = stats_proxy_->GetStats(); 574 stats = stats_proxy_->GetStats();
564 EXPECT_TRUE(stats.cpu_limited_resolution); 575 EXPECT_TRUE(stats.cpu_limited_resolution);
565 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 576 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
566 577
567 // Set adaptation disabled. 578 // Set adaptation disabled.
568 vie_encoder_->SetSource( 579 vie_encoder_->SetSource(
569 &new_video_source, 580 &new_video_source,
570 VideoSendStream::DegradationPreference::kMaintainResolution); 581 VideoSendStream::DegradationPreference::kMaintainResolution);
582
571 new_video_source.IncomingCapturedFrame( 583 new_video_source.IncomingCapturedFrame(
572 CreateFrame(3, frame_width, frame_height)); 584 CreateFrame(4, frame_width, frame_height));
573 sink_.WaitForEncodedFrame(3); 585 sink_.WaitForEncodedFrame(4);
574 stats = stats_proxy_->GetStats(); 586 stats = stats_proxy_->GetStats();
575 EXPECT_FALSE(stats.cpu_limited_resolution); 587 EXPECT_FALSE(stats.cpu_limited_resolution);
576 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 588 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
577 589
578 // Switch back the source with adaptation enabled. 590 // Set adaptation back to enabled.
579 vie_encoder_->SetSource(&video_source_, 591 vie_encoder_->SetSource(&new_video_source,
580 VideoSendStream::DegradationPreference::kBalanced); 592 VideoSendStream::DegradationPreference::kBalanced);
581 video_source_.IncomingCapturedFrame( 593
582 CreateFrame(4, frame_width, frame_height)); 594 new_video_source.IncomingCapturedFrame(
583 sink_.WaitForEncodedFrame(4); 595 CreateFrame(5, frame_width, frame_height));
596 sink_.WaitForEncodedFrame(5);
584 stats = stats_proxy_->GetStats(); 597 stats = stats_proxy_->GetStats();
585 EXPECT_TRUE(stats.cpu_limited_resolution); 598 EXPECT_TRUE(stats.cpu_limited_resolution);
586 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); 599 EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
587 600
588 // Trigger CPU normal usage.
589 vie_encoder_->TriggerCpuNormalUsage(); 601 vie_encoder_->TriggerCpuNormalUsage();
590 video_source_.IncomingCapturedFrame( 602
591 CreateFrame(5, frame_width, frame_height)); 603 new_video_source.IncomingCapturedFrame(
592 sink_.WaitForEncodedFrame(5); 604 CreateFrame(6, frame_width, frame_height));
605 sink_.WaitForEncodedFrame(6);
593 stats = stats_proxy_->GetStats(); 606 stats = stats_proxy_->GetStats();
594 EXPECT_FALSE(stats.cpu_limited_resolution); 607 EXPECT_FALSE(stats.cpu_limited_resolution);
595 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); 608 EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
596 609
597 vie_encoder_->Stop(); 610 vie_encoder_->Stop();
598 } 611 }
612
613 TEST_F(ViEEncoderTest, SwitchingSourceKeepsQualityAdaptation) {
614 const int kTargetBitrateBps = 100000;
615 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
616
617 int frame_width = 1280;
618 int frame_height = 720;
619 video_source_.IncomingCapturedFrame(
620 CreateFrame(1, frame_width, frame_height));
621 sink_.WaitForEncodedFrame(1);
622
623 VideoSendStream::Stats stats = stats_proxy_->GetStats();
624 EXPECT_FALSE(stats.cpu_limited_resolution);
625 EXPECT_FALSE(stats.bw_limited_resolution);
626 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
627
628 // Set new source with adaptation still enabled.
629 test::FrameForwarder new_video_source;
630 vie_encoder_->SetSource(&new_video_source,
631 VideoSendStream::DegradationPreference::kBalanced);
632
633 new_video_source.IncomingCapturedFrame(
634 CreateFrame(2, frame_width, frame_height));
635 sink_.WaitForEncodedFrame(2);
636 stats = stats_proxy_->GetStats();
637 EXPECT_FALSE(stats.cpu_limited_resolution);
638 EXPECT_FALSE(stats.bw_limited_resolution);
639 EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
640
641 vie_encoder_->TriggerQualityLow();
642
643 new_video_source.IncomingCapturedFrame(
644 CreateFrame(3, frame_width, frame_height));
645 sink_.WaitForEncodedFrame(3);
646 stats = stats_proxy_->GetStats();
647 EXPECT_FALSE(stats.cpu_limited_resolution);
648 EXPECT_TRUE(stats.bw_limited_resolution);
649
650 vie_encoder_->SetSource(&new_video_source,
651 VideoSendStream::DegradationPreference::kBalanced);
652
653 new_video_source.IncomingCapturedFrame(
654 CreateFrame(4, frame_width, frame_height));
655 sink_.WaitForEncodedFrame(4);
656 stats = stats_proxy_->GetStats();
657 EXPECT_FALSE(stats.cpu_limited_resolution);
658 EXPECT_TRUE(stats.bw_limited_resolution);
659
660 // Set adaptation disabled.
661 vie_encoder_->SetSource(
662 &new_video_source,
663 VideoSendStream::DegradationPreference::kMaintainResolution);
664
665 new_video_source.IncomingCapturedFrame(
666 CreateFrame(5, frame_width, frame_height));
667 sink_.WaitForEncodedFrame(5);
668 stats = stats_proxy_->GetStats();
669 EXPECT_FALSE(stats.cpu_limited_resolution);
670 EXPECT_FALSE(stats.bw_limited_resolution);
671
672 vie_encoder_->Stop();
673 }
599 674
600 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) { 675 TEST_F(ViEEncoderTest, StatsTracksPreferredBitrate) {
601 const int kTargetBitrateBps = 100000; 676 const int kTargetBitrateBps = 100000;
602 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 677 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
603 678
604 video_source_.IncomingCapturedFrame(CreateFrame(1, 1280, 720)); 679 video_source_.IncomingCapturedFrame(CreateFrame(1, 1280, 720));
605 sink_.WaitForEncodedFrame(1); 680 sink_.WaitForEncodedFrame(1);
606 681
607 VideoSendStream::Stats stats = stats_proxy_->GetStats(); 682 VideoSendStream::Stats stats = stats_proxy_->GetStats();
608 EXPECT_EQ(video_encoder_config_.max_bitrate_bps, 683 EXPECT_EQ(video_encoder_config_.max_bitrate_bps,
609 stats.preferred_media_bitrate_bps); 684 stats.preferred_media_bitrate_bps);
610 685
611 vie_encoder_->Stop(); 686 vie_encoder_->Stop();
612 } 687 }
613 688
689 TEST_F(ViEEncoderTest, ScalingUpAndDownDoesNothingWithMaintainResolution) {
690 const int kTargetBitrateBps = 100000;
691 int frame_width = 1280;
perkj_webrtc 2016/11/24 08:46:51 Can we remove line 691 to 707 and move the whole t
692 int frame_height = 720;
693 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
694
695 // Expect no scaling to begin with
696 EXPECT_FALSE(video_source_.sink_wants().max_pixel_count);
697 EXPECT_FALSE(video_source_.sink_wants().max_pixel_count_step_up);
698
699 // Trigger scale down
700 vie_encoder_->TriggerQualityLow();
701 video_source_.IncomingCapturedFrame(
702 CreateFrame(1, frame_width, frame_height));
703 sink_.WaitForEncodedFrame(1);
704
705 // Expect a scale down.
706 EXPECT_TRUE(video_source_.sink_wants().max_pixel_count);
707 EXPECT_LT(*video_source_.sink_wants().max_pixel_count,
708 frame_width * frame_height);
709
710 // Set adaptation disabled.
711 test::FrameForwarder new_video_source;
712 vie_encoder_->SetSource(
713 &new_video_source,
714 VideoSendStream::DegradationPreference::kMaintainResolution);
715
716 // Trigger scale down
717 vie_encoder_->TriggerQualityLow();
718 new_video_source.IncomingCapturedFrame(
719 CreateFrame(2, frame_width, frame_height));
720 sink_.WaitForEncodedFrame(2);
721
722 // Expect no scaling
723 EXPECT_FALSE(new_video_source.sink_wants().max_pixel_count);
724
725 // Trigger scale up
726 vie_encoder_->TriggerQualityHigh();
727 new_video_source.IncomingCapturedFrame(
728 CreateFrame(3, frame_width, frame_height));
729 sink_.WaitForEncodedFrame(3);
730
731 // Expect nothing to change, still no scaling
732 EXPECT_FALSE(new_video_source.sink_wants().max_pixel_count);
733
perkj_webrtc 2016/11/24 08:46:51 Also test that CPUadaptation does nothing when Vid
734 vie_encoder_->Stop();
735 }
736
614 TEST_F(ViEEncoderTest, UMACpuLimitedResolutionInPercent) { 737 TEST_F(ViEEncoderTest, UMACpuLimitedResolutionInPercent) {
615 const int kTargetBitrateBps = 100000; 738 const int kTargetBitrateBps = 100000;
616 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 739 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
617 740
618 int frame_width = 640; 741 int frame_width = 640;
619 int frame_height = 360; 742 int frame_height = 360;
620 743
621 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) { 744 for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
622 video_source_.IncomingCapturedFrame( 745 video_source_.IncomingCapturedFrame(
623 CreateFrame(i, frame_width, frame_height)); 746 CreateFrame(i, frame_width, frame_height));
(...skipping 12 matching lines...) Expand all
636 vie_encoder_->Stop(); 759 vie_encoder_->Stop();
637 760
638 stats_proxy_.reset(); 761 stats_proxy_.reset();
639 EXPECT_EQ(1, 762 EXPECT_EQ(1,
640 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent")); 763 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
641 EXPECT_EQ( 764 EXPECT_EQ(
642 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50)); 765 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50));
643 } 766 }
644 767
645 } // namespace webrtc 768 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/vie_encoder.cc ('k') | webrtc/video_encoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698