| 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 fdec081c9003a468265ff68e00e737b397d91e02..24a0fe1392feec58c0adee5fb155c8b6abc5f53a 100644
 | 
| --- a/webrtc/modules/video_coding/utility/quality_scaler_unittest.cc
 | 
| +++ b/webrtc/modules/video_coding/utility/quality_scaler_unittest.cc
 | 
| @@ -16,7 +16,6 @@ namespace webrtc {
 | 
|  namespace {
 | 
|  static const int kNumSeconds = 10;
 | 
|  static const int kWidth = 1920;
 | 
| -static const int kHalfWidth = kWidth / 2;
 | 
|  static const int kHeight = 1080;
 | 
|  static const int kFramerate = 30;
 | 
|  static const int kLowQp = 15;
 | 
| @@ -43,14 +42,14 @@ class QualityScalerTest : public ::testing::Test {
 | 
|    };
 | 
|  
 | 
|    QualityScalerTest() {
 | 
| -    input_frame_.CreateEmptyFrame(kWidth, kHeight, kWidth, kHalfWidth,
 | 
| -                                  kHalfWidth);
 | 
| +    input_frame_ = rtc::scoped_refptr<VideoFrameBuffer>(
 | 
| +        new rtc::RefCountedObject<I420Buffer>(kWidth, kHeight));
 | 
|      qs_.Init(kLowQpThreshold, kHighQp, 0, 0, 0, kFramerate);
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    }
 | 
|  
 | 
|    bool TriggerScale(ScaleDirection scale_direction) {
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|      int initial_width = qs_.GetScaledResolution().width;
 | 
|      for (int i = 0; i < kFramerate * kNumSeconds; ++i) {
 | 
|        switch (scale_direction) {
 | 
| @@ -67,7 +66,7 @@ class QualityScalerTest : public ::testing::Test {
 | 
|            qs_.ReportQP(kHighQp + 1);
 | 
|            break;
 | 
|        }
 | 
| -      qs_.OnEncodeFrame(input_frame_);
 | 
| +      qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|        if (qs_.GetScaledResolution().width != initial_width)
 | 
|          return true;
 | 
|      }
 | 
| @@ -76,16 +75,17 @@ class QualityScalerTest : public ::testing::Test {
 | 
|    }
 | 
|  
 | 
|    void ExpectOriginalFrame() {
 | 
| -    EXPECT_EQ(&input_frame_, &qs_.GetScaledFrame(input_frame_))
 | 
| +    EXPECT_EQ(input_frame_, qs_.GetScaledFrame(input_frame_))
 | 
|          << "Using scaled frame instead of original input.";
 | 
|    }
 | 
|  
 | 
|    void ExpectScaleUsingReportedResolution() {
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|      QualityScaler::Resolution res = qs_.GetScaledResolution();
 | 
| -    const VideoFrame& scaled_frame = qs_.GetScaledFrame(input_frame_);
 | 
| -    EXPECT_EQ(res.width, scaled_frame.width());
 | 
| -    EXPECT_EQ(res.height, scaled_frame.height());
 | 
| +    rtc::scoped_refptr<VideoFrameBuffer> scaled_frame =
 | 
| +        qs_.GetScaledFrame(input_frame_);
 | 
| +    EXPECT_EQ(res.width, scaled_frame->width());
 | 
| +    EXPECT_EQ(res.height, scaled_frame->height());
 | 
|    }
 | 
|  
 | 
|    void ContinuouslyDownscalesByHalfDimensionsAndBackUp();
 | 
| @@ -98,7 +98,7 @@ class QualityScalerTest : public ::testing::Test {
 | 
|                         int end_height);
 | 
|  
 | 
|    QualityScaler qs_;
 | 
| -  VideoFrame input_frame_;
 | 
| +  rtc::scoped_refptr<VideoFrameBuffer> input_frame_;
 | 
|  };
 | 
|  
 | 
|  TEST_F(QualityScalerTest, UsesOriginalFrameInitially) {
 | 
| @@ -106,34 +106,34 @@ TEST_F(QualityScalerTest, UsesOriginalFrameInitially) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(QualityScalerTest, ReportsOriginalResolutionInitially) {
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    QualityScaler::Resolution res = qs_.GetScaledResolution();
 | 
| -  EXPECT_EQ(input_frame_.width(), res.width);
 | 
| -  EXPECT_EQ(input_frame_.height(), res.height);
 | 
| +  EXPECT_EQ(input_frame_->width(), res.width);
 | 
| +  EXPECT_EQ(input_frame_->height(), res.height);
 | 
|  }
 | 
|  
 | 
|  TEST_F(QualityScalerTest, DownscalesAfterContinuousFramedrop) {
 | 
|    EXPECT_TRUE(TriggerScale(kScaleDown)) << "No downscale within " << kNumSeconds
 | 
|                                          << " seconds.";
 | 
|    QualityScaler::Resolution res = qs_.GetScaledResolution();
 | 
| -  EXPECT_LT(res.width, input_frame_.width());
 | 
| -  EXPECT_LT(res.height, input_frame_.height());
 | 
| +  EXPECT_LT(res.width, input_frame_->width());
 | 
| +  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());
 | 
| +  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());
 | 
| +  EXPECT_LT(res.width, input_frame_->width());
 | 
| +  EXPECT_LT(res.height, input_frame_->height());
 | 
|  }
 | 
|  
 | 
|  TEST_F(QualityScalerTest, DownscalesAfterTwoThirdsFramedrop) {
 | 
| @@ -141,8 +141,8 @@ TEST_F(QualityScalerTest, DownscalesAfterTwoThirdsFramedrop) {
 | 
|      qs_.ReportQP(kNormalQp);
 | 
|      qs_.ReportDroppedFrame();
 | 
|      qs_.ReportDroppedFrame();
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| -    if (qs_.GetScaledResolution().width < input_frame_.width())
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
| +    if (qs_.GetScaledResolution().width < input_frame_->width())
 | 
|        return;
 | 
|    }
 | 
|  
 | 
| @@ -152,8 +152,8 @@ TEST_F(QualityScalerTest, DownscalesAfterTwoThirdsFramedrop) {
 | 
|  TEST_F(QualityScalerTest, DoesNotDownscaleOnNormalQp) {
 | 
|    for (int i = 0; i < kFramerate * kNumSeconds; ++i) {
 | 
|      qs_.ReportQP(kNormalQp);
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| -    ASSERT_EQ(input_frame_.width(), qs_.GetScaledResolution().width)
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
| +    ASSERT_EQ(input_frame_->width(), qs_.GetScaledResolution().width)
 | 
|          << "Unexpected scale on half framedrop.";
 | 
|    }
 | 
|  }
 | 
| @@ -161,33 +161,33 @@ TEST_F(QualityScalerTest, DoesNotDownscaleOnNormalQp) {
 | 
|  TEST_F(QualityScalerTest, DoesNotDownscaleAfterHalfFramedrop) {
 | 
|    for (int i = 0; i < kFramerate * kNumSeconds / 2; ++i) {
 | 
|      qs_.ReportQP(kNormalQp);
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| -    ASSERT_EQ(input_frame_.width(), qs_.GetScaledResolution().width)
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
| +    ASSERT_EQ(input_frame_->width(), qs_.GetScaledResolution().width)
 | 
|          << "Unexpected scale on half framedrop.";
 | 
|  
 | 
|      qs_.ReportDroppedFrame();
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| -    ASSERT_EQ(input_frame_.width(), qs_.GetScaledResolution().width)
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
| +    ASSERT_EQ(input_frame_->width(), qs_.GetScaledResolution().width)
 | 
|          << "Unexpected scale on half framedrop.";
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  void QualityScalerTest::ContinuouslyDownscalesByHalfDimensionsAndBackUp() {
 | 
| -  const int initial_min_dimension = input_frame_.width() < input_frame_.height()
 | 
| -                                        ? input_frame_.width()
 | 
| -                                        : input_frame_.height();
 | 
| +  const int initial_min_dimension =
 | 
| +      input_frame_->width() < input_frame_->height() ? input_frame_->width()
 | 
| +                                                     : input_frame_->height();
 | 
|    int min_dimension = initial_min_dimension;
 | 
|    int current_shift = 0;
 | 
|    // Drop all frames to force-trigger downscaling.
 | 
|    while (min_dimension >= 2 * kMinDownscaleDimension) {
 | 
|      EXPECT_TRUE(TriggerScale(kScaleDown)) << "No downscale within "
 | 
|                                            << kNumSeconds << " seconds.";
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|      QualityScaler::Resolution res = qs_.GetScaledResolution();
 | 
|      min_dimension = res.width < res.height ? res.width : res.height;
 | 
|      ++current_shift;
 | 
| -    ASSERT_EQ(input_frame_.width() >> current_shift, res.width);
 | 
| -    ASSERT_EQ(input_frame_.height() >> current_shift, res.height);
 | 
| +    ASSERT_EQ(input_frame_->width() >> current_shift, res.width);
 | 
| +    ASSERT_EQ(input_frame_->height() >> current_shift, res.height);
 | 
|      ExpectScaleUsingReportedResolution();
 | 
|    }
 | 
|  
 | 
| @@ -195,12 +195,12 @@ void QualityScalerTest::ContinuouslyDownscalesByHalfDimensionsAndBackUp() {
 | 
|    while (min_dimension < initial_min_dimension) {
 | 
|      EXPECT_TRUE(TriggerScale(kScaleUp)) << "No upscale within " << kNumSeconds
 | 
|                                          << " seconds.";
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|      QualityScaler::Resolution res = qs_.GetScaledResolution();
 | 
|      min_dimension = res.width < res.height ? res.width : res.height;
 | 
|      --current_shift;
 | 
| -    ASSERT_EQ(input_frame_.width() >> current_shift, res.width);
 | 
| -    ASSERT_EQ(input_frame_.height() >> current_shift, res.height);
 | 
| +    ASSERT_EQ(input_frame_->width() >> current_shift, res.width);
 | 
| +    ASSERT_EQ(input_frame_->height() >> current_shift, res.height);
 | 
|      ExpectScaleUsingReportedResolution();
 | 
|    }
 | 
|  
 | 
| @@ -218,21 +218,20 @@ TEST_F(QualityScalerTest, ContinuouslyDownscalesByHalfDimensionsAndBackUp) {
 | 
|  TEST_F(QualityScalerTest,
 | 
|         ContinuouslyDownscalesOddResolutionsByHalfDimensionsAndBackUp) {
 | 
|    const int kOddWidth = 517;
 | 
| -  const int kHalfOddWidth = (kOddWidth + 1) / 2;
 | 
|    const int kOddHeight = 1239;
 | 
| -  input_frame_.CreateEmptyFrame(kOddWidth, kOddHeight, kOddWidth, kHalfOddWidth,
 | 
| -                                kHalfOddWidth);
 | 
| +  input_frame_ = rtc::scoped_refptr<VideoFrameBuffer>(
 | 
| +      new rtc::RefCountedObject<I420Buffer>(kOddWidth, kOddHeight));
 | 
|    ContinuouslyDownscalesByHalfDimensionsAndBackUp();
 | 
|  }
 | 
|  
 | 
|  void QualityScalerTest::DoesNotDownscaleFrameDimensions(int width, int height) {
 | 
| -  input_frame_.CreateEmptyFrame(width, height, width, (width + 1) / 2,
 | 
| -                                (width + 1) / 2);
 | 
| +  input_frame_ = rtc::scoped_refptr<VideoFrameBuffer>(
 | 
| +      new rtc::RefCountedObject<I420Buffer>(width, height));
 | 
|  
 | 
|    for (int i = 0; i < kFramerate * kNumSeconds; ++i) {
 | 
|      qs_.ReportDroppedFrame();
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| -    ASSERT_EQ(input_frame_.width(), qs_.GetScaledResolution().width)
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
| +    ASSERT_EQ(input_frame_->width(), qs_.GetScaledResolution().width)
 | 
|          << "Unexpected scale of minimal-size frame.";
 | 
|    }
 | 
|  }
 | 
| @@ -263,11 +262,11 @@ TEST_F(QualityScalerTest, DownscaleToVgaOnLowInitialBitrate) {
 | 
|    static const int kWidth720p = 1280;
 | 
|    static const int kHeight720p = 720;
 | 
|    static const int kInitialBitrateKbps = 300;
 | 
| -  input_frame_.CreateEmptyFrame(kWidth720p, kHeight720p, kWidth720p,
 | 
| -                                kWidth720p / 2, kWidth720p / 2);
 | 
| +  input_frame_ = rtc::scoped_refptr<VideoFrameBuffer>(
 | 
| +      new rtc::RefCountedObject<I420Buffer>(kWidth720p, kHeight720p));
 | 
|    qs_.Init(kLowQpThreshold, kDisabledBadQpThreshold, kInitialBitrateKbps,
 | 
|             kWidth720p, kHeight720p, kFramerate);
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    int init_width = qs_.GetScaledResolution().width;
 | 
|    int init_height = qs_.GetScaledResolution().height;
 | 
|    EXPECT_EQ(640, init_width);
 | 
| @@ -278,11 +277,11 @@ TEST_F(QualityScalerTest, DownscaleToQvgaOnLowerInitialBitrate) {
 | 
|    static const int kWidth720p = 1280;
 | 
|    static const int kHeight720p = 720;
 | 
|    static const int kInitialBitrateKbps = 200;
 | 
| -  input_frame_.CreateEmptyFrame(kWidth720p, kHeight720p, kWidth720p,
 | 
| -                                kWidth720p / 2, kWidth720p / 2);
 | 
| +  input_frame_ = rtc::scoped_refptr<VideoFrameBuffer>(
 | 
| +      new rtc::RefCountedObject<I420Buffer>(kWidth720p, kHeight720p));
 | 
|    qs_.Init(kLowQpThreshold, kDisabledBadQpThreshold, kInitialBitrateKbps,
 | 
|             kWidth720p, kHeight720p, kFramerate);
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    int init_width = qs_.GetScaledResolution().width;
 | 
|    int init_height = qs_.GetScaledResolution().height;
 | 
|    EXPECT_EQ(320, init_width);
 | 
| @@ -291,13 +290,13 @@ TEST_F(QualityScalerTest, DownscaleToQvgaOnLowerInitialBitrate) {
 | 
|  
 | 
|  TEST_F(QualityScalerTest, DownscaleAfterMeasuredSecondsThenSlowerBackUp) {
 | 
|    qs_.Init(kLowQpThreshold, kHighQp, 0, kWidth, kHeight, kFramerate);
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    QualityScaler::Resolution initial_res = qs_.GetScaledResolution();
 | 
|  
 | 
|    // Should not downscale if less than kMeasureSecondsDownscale seconds passed.
 | 
|    for (int i = 0; i < kFramerate * kMeasureSecondsDownscale - 1; ++i) {
 | 
|      qs_.ReportQP(kHighQp + 1);
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    }
 | 
|    EXPECT_EQ(initial_res.width, qs_.GetScaledResolution().width);
 | 
|    EXPECT_EQ(initial_res.height, qs_.GetScaledResolution().height);
 | 
| @@ -305,7 +304,7 @@ TEST_F(QualityScalerTest, DownscaleAfterMeasuredSecondsThenSlowerBackUp) {
 | 
|    // Should downscale if more than kMeasureSecondsDownscale seconds passed (add
 | 
|    // last frame).
 | 
|    qs_.ReportQP(kHighQp + 1);
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    EXPECT_GT(initial_res.width, qs_.GetScaledResolution().width);
 | 
|    EXPECT_GT(initial_res.height, qs_.GetScaledResolution().height);
 | 
|  
 | 
| @@ -313,7 +312,7 @@ TEST_F(QualityScalerTest, DownscaleAfterMeasuredSecondsThenSlowerBackUp) {
 | 
|    // we saw issues initially (have already gone down).
 | 
|    for (int i = 0; i < kFramerate * kMeasureSecondsUpscale - 1; ++i) {
 | 
|      qs_.ReportQP(kLowQp);
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    }
 | 
|    EXPECT_GT(initial_res.width, qs_.GetScaledResolution().width);
 | 
|    EXPECT_GT(initial_res.height, qs_.GetScaledResolution().height);
 | 
| @@ -321,7 +320,7 @@ TEST_F(QualityScalerTest, DownscaleAfterMeasuredSecondsThenSlowerBackUp) {
 | 
|    // Should upscale (back to initial) if kMeasureSecondsUpscale seconds passed
 | 
|    // (add last frame).
 | 
|    qs_.ReportQP(kLowQp);
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    EXPECT_EQ(initial_res.width, qs_.GetScaledResolution().width);
 | 
|    EXPECT_EQ(initial_res.height, qs_.GetScaledResolution().height);
 | 
|  }
 | 
| @@ -329,13 +328,13 @@ TEST_F(QualityScalerTest, DownscaleAfterMeasuredSecondsThenSlowerBackUp) {
 | 
|  TEST_F(QualityScalerTest, UpscaleQuicklyInitiallyAfterMeasuredSeconds) {
 | 
|    qs_.Init(kLowQpThreshold, kHighQp, kLowInitialBitrateKbps, kWidth, kHeight,
 | 
|             kFramerate);
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    QualityScaler::Resolution initial_res = qs_.GetScaledResolution();
 | 
|  
 | 
|    // Should not upscale if less than kMeasureSecondsFastUpscale seconds passed.
 | 
|    for (int i = 0; i < kFramerate * kMeasureSecondsFastUpscale - 1; ++i) {
 | 
|      qs_.ReportQP(kLowQp);
 | 
| -    qs_.OnEncodeFrame(input_frame_);
 | 
| +    qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    }
 | 
|    EXPECT_EQ(initial_res.width, qs_.GetScaledResolution().width);
 | 
|    EXPECT_EQ(initial_res.height, qs_.GetScaledResolution().height);
 | 
| @@ -343,7 +342,7 @@ TEST_F(QualityScalerTest, UpscaleQuicklyInitiallyAfterMeasuredSeconds) {
 | 
|    // Should upscale if kMeasureSecondsFastUpscale seconds passed (add last
 | 
|    // frame).
 | 
|    qs_.ReportQP(kLowQp);
 | 
| -  qs_.OnEncodeFrame(input_frame_);
 | 
| +  qs_.OnEncodeFrame(input_frame_->width(), input_frame_->height());
 | 
|    EXPECT_LT(initial_res.width, qs_.GetScaledResolution().width);
 | 
|    EXPECT_LT(initial_res.height, qs_.GetScaledResolution().height);
 | 
|  }
 | 
| @@ -354,8 +353,8 @@ void QualityScalerTest::DownscaleEndsAt(int input_width,
 | 
|                                          int end_height) {
 | 
|    // Create a frame with 2x expected end width/height to verify that we can
 | 
|    // scale down to expected end width/height.
 | 
| -  input_frame_.CreateEmptyFrame(input_width, input_height, input_width,
 | 
| -                                (input_width + 1) / 2, (input_width + 1) / 2);
 | 
| +  input_frame_ = rtc::scoped_refptr<VideoFrameBuffer>(
 | 
| +      new rtc::RefCountedObject<I420Buffer>(input_width, input_height));
 | 
|  
 | 
|    int last_width = input_width;
 | 
|    int last_height = input_height;
 | 
| 
 |