621 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			621 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
 | |
|  *
 | |
|  *  Use of this source code is governed by a BSD-style license
 | |
|  *  that can be found in the LICENSE file in the root of the source
 | |
|  *  tree. An additional intellectual property rights grant can be found
 | |
|  *  in the file PATENTS.  All contributing project authors may
 | |
|  *  be found in the AUTHORS file in the root of the source tree.
 | |
|  */
 | |
| 
 | |
| #include "rtc_base/experiments/balanced_degradation_settings.h"
 | |
| 
 | |
| #include <limits>
 | |
| 
 | |
| #include "rtc_base/gunit.h"
 | |
| #include "test/field_trial.h"
 | |
| #include "test/gmock.h"
 | |
| 
 | |
| namespace webrtc {
 | |
| namespace {
 | |
| 
 | |
| void VerifyIsDefault(
 | |
|     const std::vector<BalancedDegradationSettings::Config>& config) {
 | |
|   EXPECT_THAT(config, ::testing::ElementsAre(
 | |
|                           BalancedDegradationSettings::Config{
 | |
|                               320 * 240,
 | |
|                               7,
 | |
|                               0,
 | |
|                               0,
 | |
|                               BalancedDegradationSettings::kNoFpsDiff,
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0}},
 | |
|                           BalancedDegradationSettings::Config{
 | |
|                               480 * 270,
 | |
|                               10,
 | |
|                               0,
 | |
|                               0,
 | |
|                               BalancedDegradationSettings::kNoFpsDiff,
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0}},
 | |
|                           BalancedDegradationSettings::Config{
 | |
|                               640 * 480,
 | |
|                               15,
 | |
|                               0,
 | |
|                               0,
 | |
|                               BalancedDegradationSettings::kNoFpsDiff,
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0},
 | |
|                               {0, 0, 0, 0, 0}}));
 | |
| }
 | |
| }  // namespace
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfNoList) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials("");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
|   EXPECT_TRUE(settings.CanAdaptUp(kVideoCodecVP8, 1, /*bitrate_bps*/ 1));
 | |
|   EXPECT_TRUE(
 | |
|       settings.CanAdaptUpResolution(kVideoCodecVP8, 1, /*bitrate_bps*/ 1));
 | |
|   EXPECT_FALSE(settings.MinFpsDiff(1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecVP8, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecVP9, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecH264, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecAV1, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecGeneric, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecMultiplex, 1));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsConfig) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:11|22|33,fps:5|15|25,other:4|5|6/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_THAT(settings.GetConfigs(),
 | |
|               ::testing::ElementsAre(
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       11,
 | |
|                       5,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       22,
 | |
|                       15,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       33,
 | |
|                       25,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0},
 | |
|                       {0, 0, 0, 0, 0}}));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigForZeroFpsValue) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:0|15|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfPixelsDecreases) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|999|3000,fps:5|15|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfFramerateDecreases) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|4|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsConfigWithSpecificFps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,vp8_fps:7|8|9,vp9_fps:9|10|11,"
 | |
|       "h264_fps:11|12|13,av1_fps:1|2|3,generic_fps:13|14|15/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_THAT(settings.GetConfigs(),
 | |
|               ::testing::ElementsAre(
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       1000,
 | |
|                       5,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 7, 0, 0},
 | |
|                       {0, 0, 9, 0, 0},
 | |
|                       {0, 0, 11, 0, 0},
 | |
|                       {0, 0, 1, 0, 0},
 | |
|                       {0, 0, 13, 0, 0}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       2000,
 | |
|                       15,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 8, 0, 0},
 | |
|                       {0, 0, 10, 0, 0},
 | |
|                       {0, 0, 12, 0, 0},
 | |
|                       {0, 0, 2, 0, 0},
 | |
|                       {0, 0, 14, 0, 0}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       3000,
 | |
|                       25,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 9, 0, 0},
 | |
|                       {0, 0, 11, 0, 0},
 | |
|                       {0, 0, 13, 0, 0},
 | |
|                       {0, 0, 3, 0, 0},
 | |
|                       {0, 0, 15, 0, 0}}));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigForZeroVp8FpsValue) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:7|15|25,vp8_fps:0|15|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigForInvalidFpsValue) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:7|15|25,vp8_fps:10|15|2000/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfVp8FramerateDecreases) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:4|5|25,vp8_fps:5|4|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsMinFps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(5, settings.MinFps(kVideoCodecVP8, 1));
 | |
|   EXPECT_EQ(5, settings.MinFps(kVideoCodecVP8, 1000));
 | |
|   EXPECT_EQ(15, settings.MinFps(kVideoCodecVP8, 1001));
 | |
|   EXPECT_EQ(15, settings.MinFps(kVideoCodecVP8, 2000));
 | |
|   EXPECT_EQ(25, settings.MinFps(kVideoCodecVP8, 2001));
 | |
|   EXPECT_EQ(25, settings.MinFps(kVideoCodecVP8, 3000));
 | |
|   EXPECT_EQ(std::numeric_limits<int>::max(),
 | |
|             settings.MinFps(kVideoCodecVP8, 3001));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsVp8MinFps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,vp8_fps:7|10|12/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(7, settings.MinFps(kVideoCodecVP8, 1));
 | |
|   EXPECT_EQ(7, settings.MinFps(kVideoCodecVP8, 1000));
 | |
|   EXPECT_EQ(10, settings.MinFps(kVideoCodecVP8, 1001));
 | |
|   EXPECT_EQ(10, settings.MinFps(kVideoCodecVP8, 2000));
 | |
|   EXPECT_EQ(12, settings.MinFps(kVideoCodecVP8, 2001));
 | |
|   EXPECT_EQ(12, settings.MinFps(kVideoCodecVP8, 3000));
 | |
|   EXPECT_EQ(std::numeric_limits<int>::max(),
 | |
|             settings.MinFps(kVideoCodecVP8, 3001));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsMaxFps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(15, settings.MaxFps(kVideoCodecVP8, 1));
 | |
|   EXPECT_EQ(15, settings.MaxFps(kVideoCodecVP8, 1000));
 | |
|   EXPECT_EQ(25, settings.MaxFps(kVideoCodecVP8, 1001));
 | |
|   EXPECT_EQ(25, settings.MaxFps(kVideoCodecVP8, 2000));
 | |
|   EXPECT_EQ(std::numeric_limits<int>::max(),
 | |
|             settings.MaxFps(kVideoCodecVP8, 2001));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsVp8MaxFps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,vp8_fps:7|10|12/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(10, settings.MaxFps(kVideoCodecVP8, 1));
 | |
|   EXPECT_EQ(10, settings.MaxFps(kVideoCodecVP8, 1000));
 | |
|   EXPECT_EQ(12, settings.MaxFps(kVideoCodecVP8, 1001));
 | |
|   EXPECT_EQ(12, settings.MaxFps(kVideoCodecVP8, 2000));
 | |
|   EXPECT_EQ(std::numeric_limits<int>::max(),
 | |
|             settings.MaxFps(kVideoCodecVP8, 2001));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsVp9Fps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,vp9_fps:7|10|12/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(7, settings.MinFps(kVideoCodecVP9, 1000));
 | |
|   EXPECT_EQ(10, settings.MaxFps(kVideoCodecVP9, 1000));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsH264Fps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,h264_fps:8|11|13/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(11, settings.MinFps(kVideoCodecH264, 2000));
 | |
|   EXPECT_EQ(13, settings.MaxFps(kVideoCodecH264, 2000));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsGenericFps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,generic_fps:9|12|14/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(14, settings.MinFps(kVideoCodecGeneric, 3000));
 | |
|   EXPECT_EQ(std::numeric_limits<int>::max(),
 | |
|             settings.MaxFps(kVideoCodecGeneric, 3000));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsUnlimitedForMaxValidFps) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|100,vp8_fps:30|100|100/");
 | |
|   const int kUnlimitedFps = std::numeric_limits<int>::max();
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(15, settings.MinFps(kVideoCodecH264, 2000));
 | |
|   EXPECT_EQ(kUnlimitedFps, settings.MinFps(kVideoCodecH264, 2001));
 | |
|   EXPECT_EQ(30, settings.MinFps(kVideoCodecVP8, 1000));
 | |
|   EXPECT_EQ(kUnlimitedFps, settings.MinFps(kVideoCodecVP8, 1001));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsConfigWithBitrate) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:11|22|33,fps:5|15|25,kbps:44|88|99,kbps_res:55|111|222,"
 | |
|       "vp8_kbps:11|12|13,vp8_kbps_res:14|15|16,"
 | |
|       "vp9_kbps:21|22|23,vp9_kbps_res:24|25|26,"
 | |
|       "h264_kbps:31|32|33,h264_kbps_res:34|35|36,"
 | |
|       "av1_kbps:41|42|43,av1_kbps_res:44|45|46,"
 | |
|       "generic_kbps:51|52|53,generic_kbps_res:54|55|56/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_THAT(settings.GetConfigs(),
 | |
|               ::testing::ElementsAre(
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       11,
 | |
|                       5,
 | |
|                       44,
 | |
|                       55,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 0, 11, 14},
 | |
|                       {0, 0, 0, 21, 24},
 | |
|                       {0, 0, 0, 31, 34},
 | |
|                       {0, 0, 0, 41, 44},
 | |
|                       {0, 0, 0, 51, 54}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       22,
 | |
|                       15,
 | |
|                       88,
 | |
|                       111,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 0, 12, 15},
 | |
|                       {0, 0, 0, 22, 25},
 | |
|                       {0, 0, 0, 32, 35},
 | |
|                       {0, 0, 0, 42, 45},
 | |
|                       {0, 0, 0, 52, 55}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       33,
 | |
|                       25,
 | |
|                       99,
 | |
|                       222,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {0, 0, 0, 13, 16},
 | |
|                       {0, 0, 0, 23, 26},
 | |
|                       {0, 0, 0, 33, 36},
 | |
|                       {0, 0, 0, 43, 46},
 | |
|                       {0, 0, 0, 53, 56}}));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfBitrateDecreases) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:11|22|33,fps:5|15|25,kbps:44|43|99/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings,
 | |
|      GetsDefaultConfigIfBitrateDecreasesWithUnsetValue) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:11|22|33,fps:5|15|25,kbps:44|0|43/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, CanAdaptUp) {
 | |
|   VideoCodecType vp8 = kVideoCodecVP8;
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000|4000,fps:5|15|25|30,kbps:0|80|0|90,"
 | |
|       "vp9_kbps:40|50|60|70/");
 | |
|   BalancedDegradationSettings s;
 | |
|   EXPECT_TRUE(s.CanAdaptUp(vp8, 1000, 0));  // No bitrate provided.
 | |
|   EXPECT_FALSE(s.CanAdaptUp(vp8, 1000, 79000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(vp8, 1000, 80000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(vp8, 1001, 1));  // No limit configured.
 | |
|   EXPECT_FALSE(s.CanAdaptUp(vp8, 3000, 89000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(vp8, 3000, 90000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(vp8, 3001, 1));  // No limit.
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, CanAdaptUpWithCodecType) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000|4000,fps:5|15|25|30,vp8_kbps:0|30|40|50,"
 | |
|       "vp9_kbps:0|60|70|80,h264_kbps:0|55|65|75,av1_kbps:0|77|88|99,"
 | |
|       "generic_kbps:0|25|35|45/");
 | |
|   BalancedDegradationSettings s;
 | |
|   EXPECT_FALSE(s.CanAdaptUp(kVideoCodecVP8, 1000, 29000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(kVideoCodecVP8, 1000, 30000));
 | |
|   EXPECT_FALSE(s.CanAdaptUp(kVideoCodecVP9, 1000, 59000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(kVideoCodecVP9, 1000, 60000));
 | |
|   EXPECT_FALSE(s.CanAdaptUp(kVideoCodecH264, 1000, 54000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(kVideoCodecH264, 1000, 55000));
 | |
|   EXPECT_FALSE(s.CanAdaptUp(kVideoCodecAV1, 1000, 76000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(kVideoCodecAV1, 1000, 77000));
 | |
|   EXPECT_FALSE(s.CanAdaptUp(kVideoCodecGeneric, 1000, 24000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(kVideoCodecGeneric, 1000, 25000));
 | |
|   EXPECT_TRUE(s.CanAdaptUp(kVideoCodecMultiplex, 1000, 1));  // Not configured.
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, CanAdaptUpResolution) {
 | |
|   VideoCodecType vp8 = kVideoCodecVP8;
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000|4000,fps:5|15|25|30,kbps_res:0|80|0|90,"
 | |
|       "vp9_kbps_res:40|50|60|70/");
 | |
|   BalancedDegradationSettings s;
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(vp8, 1000, 0));  // No bitrate provided.
 | |
|   EXPECT_FALSE(s.CanAdaptUpResolution(vp8, 1000, 79000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(vp8, 1000, 80000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(vp8, 1001, 1));  // No limit configured.
 | |
|   EXPECT_FALSE(s.CanAdaptUpResolution(vp8, 3000, 89000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(vp8, 3000, 90000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(vp8, 3001, 1));  // No limit.
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, CanAdaptUpResolutionWithCodecType) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000|4000,fps:5|15|25|30,vp8_kbps_res:0|30|40|50,"
 | |
|       "vp9_kbps_res:0|60|70|80,h264_kbps_res:0|55|65|75,"
 | |
|       "av1_kbps_res:0|77|88|99,generic_kbps_res:0|25|35|45/");
 | |
|   BalancedDegradationSettings s;
 | |
|   EXPECT_FALSE(s.CanAdaptUpResolution(kVideoCodecVP8, 1000, 29000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(kVideoCodecVP8, 1000, 30000));
 | |
|   EXPECT_FALSE(s.CanAdaptUpResolution(kVideoCodecVP9, 1000, 59000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(kVideoCodecVP9, 1000, 60000));
 | |
|   EXPECT_FALSE(s.CanAdaptUpResolution(kVideoCodecH264, 1000, 54000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(kVideoCodecH264, 1000, 55000));
 | |
|   EXPECT_FALSE(s.CanAdaptUpResolution(kVideoCodecAV1, 1000, 76000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(kVideoCodecAV1, 1000, 77000));
 | |
|   EXPECT_FALSE(s.CanAdaptUpResolution(kVideoCodecGeneric, 1000, 24000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(kVideoCodecGeneric, 1000, 25000));
 | |
|   EXPECT_TRUE(s.CanAdaptUpResolution(kVideoCodecMultiplex, 1000,
 | |
|                                      1));  // Not configured.
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsFpsDiff) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,fps_diff:0|-2|3/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(0, settings.MinFpsDiff(1));
 | |
|   EXPECT_EQ(0, settings.MinFpsDiff(1000));
 | |
|   EXPECT_EQ(-2, settings.MinFpsDiff(1001));
 | |
|   EXPECT_EQ(-2, settings.MinFpsDiff(2000));
 | |
|   EXPECT_EQ(3, settings.MinFpsDiff(2001));
 | |
|   EXPECT_EQ(3, settings.MinFpsDiff(3000));
 | |
|   EXPECT_FALSE(settings.MinFpsDiff(3001));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsNoFpsDiffIfValueBelowMinSetting) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,fps_diff:-100|-99|-101/");
 | |
|   // Min valid fps_diff setting: -99.
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_FALSE(settings.MinFpsDiff(1000));
 | |
|   EXPECT_EQ(-99, settings.MinFpsDiff(2000));
 | |
|   EXPECT_FALSE(settings.MinFpsDiff(3000));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, QpThresholdsNotSetByDefault) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecVP8, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecVP9, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecH264, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecAV1, 1));
 | |
|   EXPECT_FALSE(settings.GetQpThresholds(kVideoCodecGeneric, 1));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsConfigWithQpThresholds) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,vp8_qp_low:89|90|88,"
 | |
|       "vp8_qp_high:90|91|92,vp9_qp_low:27|28|29,vp9_qp_high:120|130|140,"
 | |
|       "h264_qp_low:12|13|14,h264_qp_high:20|30|40,av1_qp_low:2|3|4,"
 | |
|       "av1_qp_high:11|33|44,generic_qp_low:7|6|5,generic_qp_high:22|23|24/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_THAT(settings.GetConfigs(),
 | |
|               ::testing::ElementsAre(
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       1000,
 | |
|                       5,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {89, 90, 0, 0, 0},
 | |
|                       {27, 120, 0, 0, 0},
 | |
|                       {12, 20, 0, 0, 0},
 | |
|                       {2, 11, 0, 0, 0},
 | |
|                       {7, 22, 0, 0, 0}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       2000,
 | |
|                       15,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {90, 91, 0, 0, 0},
 | |
|                       {28, 130, 0, 0, 0},
 | |
|                       {13, 30, 0, 0, 0},
 | |
|                       {3, 33, 0, 0, 0},
 | |
|                       {6, 23, 0, 0, 0}},
 | |
|                   BalancedDegradationSettings::Config{
 | |
|                       3000,
 | |
|                       25,
 | |
|                       0,
 | |
|                       0,
 | |
|                       BalancedDegradationSettings::kNoFpsDiff,
 | |
|                       {88, 92, 0, 0, 0},
 | |
|                       {29, 140, 0, 0, 0},
 | |
|                       {14, 40, 0, 0, 0},
 | |
|                       {4, 44, 0, 0, 0},
 | |
|                       {5, 24, 0, 0, 0}}));
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfOnlyHasLowThreshold) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,vp8_qp_low:89|90|88/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfOnlyHasHighThreshold) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,vp8_qp_high:90|91|92/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfLowEqualsHigh) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,"
 | |
|       "vp8_qp_low:89|90|88,vp8_qp_high:90|91|88/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigIfLowGreaterThanHigh) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,"
 | |
|       "vp8_qp_low:89|90|88,vp8_qp_high:90|91|87/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsDefaultConfigForZeroQpValue) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,"
 | |
|       "vp8_qp_low:89|0|88,vp8_qp_high:90|91|92/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   VerifyIsDefault(settings.GetConfigs());
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsVp8QpThresholds) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,"
 | |
|       "vp8_qp_low:89|90|88,vp8_qp_high:90|91|92/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   EXPECT_EQ(89, settings.GetQpThresholds(kVideoCodecVP8, 1)->low);
 | |
|   EXPECT_EQ(90, settings.GetQpThresholds(kVideoCodecVP8, 1)->high);
 | |
|   EXPECT_EQ(90, settings.GetQpThresholds(kVideoCodecVP8, 1000)->high);
 | |
|   EXPECT_EQ(91, settings.GetQpThresholds(kVideoCodecVP8, 1001)->high);
 | |
|   EXPECT_EQ(91, settings.GetQpThresholds(kVideoCodecVP8, 2000)->high);
 | |
|   EXPECT_EQ(92, settings.GetQpThresholds(kVideoCodecVP8, 2001)->high);
 | |
|   EXPECT_EQ(92, settings.GetQpThresholds(kVideoCodecVP8, 3000)->high);
 | |
|   EXPECT_EQ(92, settings.GetQpThresholds(kVideoCodecVP8, 3001)->high);
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsVp9QpThresholds) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,"
 | |
|       "vp9_qp_low:55|56|57,vp9_qp_high:155|156|157/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   const auto thresholds = settings.GetQpThresholds(kVideoCodecVP9, 1000);
 | |
|   EXPECT_TRUE(thresholds);
 | |
|   EXPECT_EQ(55, thresholds->low);
 | |
|   EXPECT_EQ(155, thresholds->high);
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsH264QpThresholds) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,"
 | |
|       "h264_qp_low:21|22|23,h264_qp_high:41|43|42/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   const auto thresholds = settings.GetQpThresholds(kVideoCodecH264, 2000);
 | |
|   EXPECT_TRUE(thresholds);
 | |
|   EXPECT_EQ(22, thresholds->low);
 | |
|   EXPECT_EQ(43, thresholds->high);
 | |
| }
 | |
| 
 | |
| TEST(BalancedDegradationSettings, GetsGenericQpThresholds) {
 | |
|   webrtc::test::ScopedFieldTrials field_trials(
 | |
|       "WebRTC-Video-BalancedDegradationSettings/"
 | |
|       "pixels:1000|2000|3000,fps:5|15|25,"
 | |
|       "generic_qp_low:2|3|4,generic_qp_high:22|23|24/");
 | |
|   BalancedDegradationSettings settings;
 | |
|   const auto thresholds = settings.GetQpThresholds(kVideoCodecGeneric, 3000);
 | |
|   EXPECT_TRUE(thresholds);
 | |
|   EXPECT_EQ(4, thresholds->low);
 | |
|   EXPECT_EQ(24, thresholds->high);
 | |
| }
 | |
| 
 | |
| }  // namespace webrtc
 |