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

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

Issue 2554403006: Revert of Turn off error resilience for VP9 if no spatial or temporal layers are configured and NACK is enabl… (Closed)
Patch Set: 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/modules/video_coding/video_codec_initializer.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
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 namespace { 25 namespace {
26 const size_t kMaxPayloadLength = 1440; 26 const size_t kMaxPayloadLength = 1440;
27 const int kTargetBitrateBps = 100000; 27 const int kTargetBitrateBps = 100000;
28 const unsigned char kNumSlDummy = 0;
29 28
30 class TestBuffer : public webrtc::I420Buffer { 29 class TestBuffer : public webrtc::I420Buffer {
31 public: 30 public:
32 TestBuffer(rtc::Event* event, int width, int height) 31 TestBuffer(rtc::Event* event, int width, int height)
33 : I420Buffer(width, height), event_(event) {} 32 : I420Buffer(width, height), event_(event) {}
34 33
35 private: 34 private:
36 friend class rtc::RefCountedObject<TestBuffer>; 35 friend class rtc::RefCountedObject<TestBuffer>;
37 ~TestBuffer() override { 36 ~TestBuffer() override {
38 if (event_) 37 if (event_)
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 vie_encoder_->SetSource(&video_source_, 133 vie_encoder_->SetSource(&video_source_,
135 VideoSendStream::DegradationPreference::kBalanced); 134 VideoSendStream::DegradationPreference::kBalanced);
136 vie_encoder_->SetStartBitrate(10000); 135 vie_encoder_->SetStartBitrate(10000);
137 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config), 136 vie_encoder_->ConfigureEncoder(std::move(video_encoder_config),
138 kMaxPayloadLength, nack_enabled); 137 kMaxPayloadLength, nack_enabled);
139 } 138 }
140 139
141 void ResetEncoder(const std::string& payload_name, 140 void ResetEncoder(const std::string& payload_name,
142 size_t num_streams, 141 size_t num_streams,
143 size_t num_temporal_layers, 142 size_t num_temporal_layers,
144 unsigned char num_spatial_layers,
145 bool nack_enabled) { 143 bool nack_enabled) {
146 video_send_config_.encoder_settings.payload_name = payload_name; 144 video_send_config_.encoder_settings.payload_name = payload_name;
147 145
148 VideoEncoderConfig video_encoder_config; 146 VideoEncoderConfig video_encoder_config;
149 video_encoder_config.number_of_streams = num_streams; 147 video_encoder_config.number_of_streams = num_streams;
150 video_encoder_config.max_bitrate_bps = 1000000; 148 video_encoder_config.max_bitrate_bps = 1000000;
151 video_encoder_config.video_stream_factory = 149 video_encoder_config.video_stream_factory =
152 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers); 150 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers);
153 if (payload_name == "VP9") {
154 VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
155 vp9_settings.numberOfSpatialLayers = num_spatial_layers;
156 video_encoder_config.encoder_specific_settings =
157 new rtc::RefCountedObject<
158 VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
159 }
160 ConfigureEncoder(std::move(video_encoder_config), nack_enabled); 151 ConfigureEncoder(std::move(video_encoder_config), nack_enabled);
161 } 152 }
162 153
163 VideoFrame CreateFrame(int64_t ntp_ts, rtc::Event* destruction_event) const { 154 VideoFrame CreateFrame(int64_t ntp_ts, rtc::Event* destruction_event) const {
164 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>( 155 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>(
165 destruction_event, codec_width_, codec_height_), 156 destruction_event, codec_width_, codec_height_),
166 99, 99, kVideoRotation_0); 157 99, 99, kVideoRotation_0);
167 frame.set_ntp_time_ms(ntp_ts); 158 frame.set_ntp_time_ms(ntp_ts);
168 return frame; 159 return frame;
169 } 160 }
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height); 421 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height);
431 EXPECT_EQ(2, sink_.number_of_reconfigurations()); 422 EXPECT_EQ(2, sink_.number_of_reconfigurations());
432 423
433 vie_encoder_->Stop(); 424 vie_encoder_->Stop();
434 } 425 }
435 426
436 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) { 427 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) {
437 const bool kNackEnabled = true; 428 const bool kNackEnabled = true;
438 const size_t kNumStreams = 1; 429 const size_t kNumStreams = 1;
439 const size_t kNumTl = 1; 430 const size_t kNumTl = 1;
440 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled); 431 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
441 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 432 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
442 433
443 // Capture a frame and wait for it to synchronize with the encoder thread. 434 // Capture a frame and wait for it to synchronize with the encoder thread.
444 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 435 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
445 sink_.WaitForEncodedFrame(1); 436 sink_.WaitForEncodedFrame(1);
446 // The encoder have been configured once when the first frame is received. 437 // The encoder have been configured once when the first frame is received.
447 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 438 EXPECT_EQ(1, sink_.number_of_reconfigurations());
448 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 439 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
449 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 440 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
450 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 441 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
451 // Resilience is off for no temporal layers with nack on. 442 // Resilience is off for no temporal layers with nack on.
452 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); 443 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience);
453 vie_encoder_->Stop(); 444 vie_encoder_->Stop();
454 } 445 }
455 446
456 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) { 447 TEST_F(ViEEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) {
457 const bool kNackEnabled = true; 448 const bool kNackEnabled = true;
458 const size_t kNumStreams = 2; 449 const size_t kNumStreams = 2;
459 const size_t kNumTl = 1; 450 const size_t kNumTl = 1;
460 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled); 451 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
461 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 452 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
462 453
463 // Capture a frame and wait for it to synchronize with the encoder thread. 454 // Capture a frame and wait for it to synchronize with the encoder thread.
464 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 455 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
465 sink_.WaitForEncodedFrame(1); 456 sink_.WaitForEncodedFrame(1);
466 // The encoder have been configured once when the first frame is received. 457 // The encoder have been configured once when the first frame is received.
467 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 458 EXPECT_EQ(1, sink_.number_of_reconfigurations());
468 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 459 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
469 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 460 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
470 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 461 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
471 // Resilience is off for no temporal layers and >1 streams with nack on. 462 // Resilience is off for no temporal layers and >1 streams with nack on.
472 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); 463 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience);
473 vie_encoder_->Stop(); 464 vie_encoder_->Stop();
474 } 465 }
475 466
476 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) { 467 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) {
477 const bool kNackEnabled = false; 468 const bool kNackEnabled = false;
478 const size_t kNumStreams = 1; 469 const size_t kNumStreams = 1;
479 const size_t kNumTl = 1; 470 const size_t kNumTl = 1;
480 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled); 471 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
481 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 472 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
482 473
483 // Capture a frame and wait for it to synchronize with the encoder thread. 474 // Capture a frame and wait for it to synchronize with the encoder thread.
484 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 475 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
485 sink_.WaitForEncodedFrame(1); 476 sink_.WaitForEncodedFrame(1);
486 // The encoder have been configured once when the first frame is received. 477 // The encoder have been configured once when the first frame is received.
487 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 478 EXPECT_EQ(1, sink_.number_of_reconfigurations());
488 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 479 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
489 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 480 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
490 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 481 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
491 // Resilience is on for no temporal layers with nack off. 482 // Resilience is on for no temporal layers with nack off.
492 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); 483 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience);
493 vie_encoder_->Stop(); 484 vie_encoder_->Stop();
494 } 485 }
495 486
496 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) { 487 TEST_F(ViEEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) {
497 const bool kNackEnabled = true; 488 const bool kNackEnabled = true;
498 const size_t kNumStreams = 1; 489 const size_t kNumStreams = 1;
499 const size_t kNumTl = 2; 490 const size_t kNumTl = 2;
500 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled); 491 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled);
501 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); 492 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
502 493
503 // Capture a frame and wait for it to synchronize with the encoder thread. 494 // Capture a frame and wait for it to synchronize with the encoder thread.
504 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); 495 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
505 sink_.WaitForEncodedFrame(1); 496 sink_.WaitForEncodedFrame(1);
506 // The encoder have been configured once when the first frame is received. 497 // The encoder have been configured once when the first frame is received.
507 EXPECT_EQ(1, sink_.number_of_reconfigurations()); 498 EXPECT_EQ(1, sink_.number_of_reconfigurations());
508 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); 499 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
509 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); 500 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
510 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); 501 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
511 // Resilience is on for temporal layers. 502 // Resilience is on for temporal layers.
512 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); 503 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience);
513 vie_encoder_->Stop(); 504 vie_encoder_->Stop();
514 } 505 }
515 506
516 TEST_F(ViEEncoderTest, Vp9ResilienceIsOffFor1SL1TLWithNackEnabled) {
517 const bool kNackEnabled = true;
518 const size_t kNumStreams = 1;
519 const size_t kNumTl = 1;
520 const unsigned char kNumSl = 1;
521 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled);
522 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
523
524 // Capture a frame and wait for it to synchronize with the encoder thread.
525 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
526 sink_.WaitForEncodedFrame(1);
527 // The encoder have been configured once when the first frame is received.
528 EXPECT_EQ(1, sink_.number_of_reconfigurations());
529 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
530 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
531 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
532 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
533 // Resilience is off for no spatial and temporal layers with nack on.
534 EXPECT_FALSE(fake_encoder_.codec_config().VP9()->resilienceOn);
535 vie_encoder_->Stop();
536 }
537
538 TEST_F(ViEEncoderTest, Vp9ResilienceIsOnFor1SL1TLWithNackDisabled) {
539 const bool kNackEnabled = false;
540 const size_t kNumStreams = 1;
541 const size_t kNumTl = 1;
542 const unsigned char kNumSl = 1;
543 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled);
544 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
545
546 // Capture a frame and wait for it to synchronize with the encoder thread.
547 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
548 sink_.WaitForEncodedFrame(1);
549 // The encoder have been configured once when the first frame is received.
550 EXPECT_EQ(1, sink_.number_of_reconfigurations());
551 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
552 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
553 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
554 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
555 // Resilience is on if nack is off.
556 EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn);
557 vie_encoder_->Stop();
558 }
559
560 TEST_F(ViEEncoderTest, Vp9ResilienceIsOnFor2SL1TLWithNackEnabled) {
561 const bool kNackEnabled = true;
562 const size_t kNumStreams = 1;
563 const size_t kNumTl = 1;
564 const unsigned char kNumSl = 2;
565 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled);
566 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
567
568 // Capture a frame and wait for it to synchronize with the encoder thread.
569 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
570 sink_.WaitForEncodedFrame(1);
571 // The encoder have been configured once when the first frame is received.
572 EXPECT_EQ(1, sink_.number_of_reconfigurations());
573 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
574 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
575 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
576 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
577 // Resilience is on for spatial layers.
578 EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn);
579 vie_encoder_->Stop();
580 }
581
582 TEST_F(ViEEncoderTest, Vp9ResilienceIsOnFor1SL2TLWithNackEnabled) {
583 const bool kNackEnabled = true;
584 const size_t kNumStreams = 1;
585 const size_t kNumTl = 2;
586 const unsigned char kNumSl = 1;
587 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled);
588 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
589
590 // Capture a frame and wait for it to synchronize with the encoder thread.
591 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
592 sink_.WaitForEncodedFrame(1);
593 // The encoder have been configured once when the first frame is received.
594 EXPECT_EQ(1, sink_.number_of_reconfigurations());
595 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
596 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
597 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
598 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
599 // Resilience is on for temporal layers.
600 EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn);
601 vie_encoder_->Stop();
602 }
603
604 TEST_F(ViEEncoderTest, SwitchSourceDeregisterEncoderAsSink) { 507 TEST_F(ViEEncoderTest, SwitchSourceDeregisterEncoderAsSink) {
605 EXPECT_TRUE(video_source_.has_sinks()); 508 EXPECT_TRUE(video_source_.has_sinks());
606 test::FrameForwarder new_video_source; 509 test::FrameForwarder new_video_source;
607 vie_encoder_->SetSource(&new_video_source, 510 vie_encoder_->SetSource(&new_video_source,
608 VideoSendStream::DegradationPreference::kBalanced); 511 VideoSendStream::DegradationPreference::kBalanced);
609 EXPECT_FALSE(video_source_.has_sinks()); 512 EXPECT_FALSE(video_source_.has_sinks());
610 EXPECT_TRUE(new_video_source.has_sinks()); 513 EXPECT_TRUE(new_video_source.has_sinks());
611 514
612 vie_encoder_->Stop(); 515 vie_encoder_->Stop();
613 } 516 }
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 vie_encoder_->Stop(); 751 vie_encoder_->Stop();
849 752
850 stats_proxy_.reset(); 753 stats_proxy_.reset();
851 EXPECT_EQ(1, 754 EXPECT_EQ(1,
852 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent")); 755 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
853 EXPECT_EQ( 756 EXPECT_EQ(
854 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50)); 757 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50));
855 } 758 }
856 759
857 } // namespace webrtc 760 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/video_codec_initializer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698