| Index: webrtc/modules/video_coding/utility/quality_scaler_unittest.cc
 | 
| diff --git a/webrtc/modules/video_coding/utility/quality_scaler_unittest.cc b/webrtc/modules/video_coding/utility/quality_scaler_unittest.cc
 | 
| index d1710b6dd7e83b5f2f26ef0daf8f746ecc8df60c..2ce1107472e9821740533c04bbea707ae971e008 100644
 | 
| --- a/webrtc/modules/video_coding/utility/quality_scaler_unittest.cc
 | 
| +++ b/webrtc/modules/video_coding/utility/quality_scaler_unittest.cc
 | 
| @@ -21,6 +21,7 @@ static const int kHeight = 1080;
 | 
|  static const int kFramerate = 30;
 | 
|  static const int kLowQp = 15;
 | 
|  static const int kNormalQp = 30;
 | 
| +static const int kHighQp = 40;
 | 
|  static const int kMaxQp = 56;
 | 
|  }  // namespace
 | 
|  
 | 
| @@ -33,13 +34,18 @@ class QualityScalerTest : public ::testing::Test {
 | 
|      int height;
 | 
|    };
 | 
|   protected:
 | 
| -  enum ScaleDirection { kScaleDown, kScaleUp };
 | 
| +  enum ScaleDirection {
 | 
| +    kKeepScaleAtHighQp,
 | 
| +    kScaleDown,
 | 
| +    kScaleDownAboveHighQp,
 | 
| +    kScaleUp
 | 
| +  };
 | 
|    enum BadQualityMetric { kDropFrame, kReportLowQP };
 | 
|  
 | 
|    QualityScalerTest() {
 | 
|      input_frame_.CreateEmptyFrame(
 | 
|          kWidth, kHeight, kWidth, kHalfWidth, kHalfWidth);
 | 
| -    qs_.Init(kMaxQp / QualityScaler::kDefaultLowQpDenominator, false);
 | 
| +    qs_.Init(kMaxQp / QualityScaler::kDefaultLowQpDenominator, kHighQp, false);
 | 
|      qs_.ReportFramerate(kFramerate);
 | 
|      qs_.OnEncodeFrame(input_frame_);
 | 
|    }
 | 
| @@ -55,6 +61,12 @@ class QualityScalerTest : public ::testing::Test {
 | 
|          case kScaleDown:
 | 
|            qs_.ReportDroppedFrame();
 | 
|            break;
 | 
| +        case kKeepScaleAtHighQp:
 | 
| +          qs_.ReportQP(kHighQp);
 | 
| +          break;
 | 
| +        case kScaleDownAboveHighQp:
 | 
| +          qs_.ReportQP(kHighQp + 1);
 | 
| +          break;
 | 
|        }
 | 
|        qs_.OnEncodeFrame(input_frame_);
 | 
|        if (qs_.GetScaledResolution().width != initial_width)
 | 
| @@ -117,6 +129,22 @@ TEST_F(QualityScalerTest, DownscalesAfterContinuousFramedrop) {
 | 
|    EXPECT_LT(res.height, input_frame_.height());
 | 
|  }
 | 
|  
 | 
| +TEST_F(QualityScalerTest, KeepsScaleAtHighQp) {
 | 
| +  EXPECT_FALSE(TriggerScale(kKeepScaleAtHighQp))
 | 
| +      << "Downscale at high threshold which should keep scale.";
 | 
| +  QualityScaler::Resolution res = qs_.GetScaledResolution();
 | 
| +  EXPECT_EQ(res.width, input_frame_.width());
 | 
| +  EXPECT_EQ(res.height, input_frame_.height());
 | 
| +}
 | 
| +
 | 
| +TEST_F(QualityScalerTest, DownscalesAboveHighQp) {
 | 
| +  EXPECT_TRUE(TriggerScale(kScaleDownAboveHighQp))
 | 
| +      << "No downscale within " << kNumSeconds << " seconds.";
 | 
| +  QualityScaler::Resolution res = qs_.GetScaledResolution();
 | 
| +  EXPECT_LT(res.width, input_frame_.width());
 | 
| +  EXPECT_LT(res.height, input_frame_.height());
 | 
| +}
 | 
| +
 | 
|  TEST_F(QualityScalerTest, DownscalesAfterTwoThirdsFramedrop) {
 | 
|    for (int i = 0; i < kFramerate * kNumSeconds / 3; ++i) {
 | 
|      qs_.ReportQP(kNormalQp);
 | 
| @@ -262,7 +290,9 @@ QualityScalerTest::Resolution QualityScalerTest::TriggerResolutionChange(
 | 
|  void QualityScalerTest::VerifyQualityAdaptation(
 | 
|      int initial_framerate, int seconds, bool expect_spatial_resize,
 | 
|      bool expect_framerate_reduction) {
 | 
| -  qs_.Init(kMaxQp / QualityScaler::kDefaultLowQpDenominator, true);
 | 
| +  const int kDisabledBadQpThreshold = kMaxQp + 1;
 | 
| +  qs_.Init(kMaxQp / QualityScaler::kDefaultLowQpDenominator,
 | 
| +           kDisabledBadQpThreshold, true);
 | 
|    qs_.OnEncodeFrame(input_frame_);
 | 
|    int init_width = qs_.GetScaledResolution().width;
 | 
|    int init_height = qs_.GetScaledResolution().height;
 | 
| 
 |