| 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;
|
|
|