1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <math.h>
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
15026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/common_video/libyuv/include/scaler.h"
16026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h"
17026d1ce6fc5608190aa5fd48f51278c60515c093pbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
18acb00f58442d54183500c472044768b6d757edb4henrike@webrtc.org#include "webrtc/test/testsupport/gtest_disable.h"
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass TestScaler : public ::testing::Test {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TestScaler();
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void SetUp();
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void TearDown();
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ScaleSequence(ScaleMethod method,
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     FILE* source_file, std::string out_name,
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     int src_width, int src_height,
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     int dst_width, int dst_height);
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Computes the sequence average PSNR between an input sequence in
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // |input_file| and an output sequence with filename |out_name|. |width| and
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // |height| are the frame sizes of both sequences.
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double ComputeAvgSequencePSNR(FILE* input_file, std::string out_name,
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                int width, int height);
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  Scaler test_scaler_;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FILE* source_file_;
403bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  I420VideoFrame test_frame_;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const int width_;
423bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  const int half_width_;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const int height_;
443bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  const int half_height_;
453bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  const int size_y_;
463bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  const int size_uv_;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const int frame_length_;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTestScaler::TestScaler()
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : source_file_(NULL),
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      width_(352),
533bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      half_width_(width_ / 2),
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      height_(288),
553bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      half_height_(height_ / 2),
563bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      size_y_(width_ * height_),
573bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      size_uv_(half_width_ * half_height_),
583bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      frame_length_(CalcBufferSize(kI420, width_, height_)) {
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid TestScaler::SetUp() {
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const std::string input_file_name =
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      webrtc::test::ResourcePath("foreman_cif", "yuv");
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file_  = fopen(input_file_name.c_str(), "rb");
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_TRUE(source_file_ != NULL) << "Cannot read file: "<<
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       input_file_name << "\n";
673bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  test_frame_.CreateEmptyFrame(width_, height_,
683bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                               width_, half_width_, half_width_);
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid TestScaler::TearDown() {
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (source_file_ != NULL) {
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ASSERT_EQ(0, fclose(source_file_));
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file_ = NULL;
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(TestScaler, ScaleWithoutSettingValues) {
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-2, test_scaler_.Scale(test_frame_, &test_frame_));
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(TestScaler, ScaleBadInitialValues) {
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, test_scaler_.Set(0, 288, 352, 288, kI420, kI420, kScalePoint));
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, test_scaler_.Set(704, 0, 352, 288, kI420, kI420, kScaleBox));
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, test_scaler_.Set(704, 576, 352, 0, kI420, kI420,
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 kScaleBilinear));
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, test_scaler_.Set(704, 576, 0, 288, kI420, kI420, kScalePoint));
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(TestScaler, ScaleSendingNullSourcePointer) {
913bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  I420VideoFrame null_src_frame;
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(-1, test_scaler_.Scale(null_src_frame, &test_frame_));
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(TestScaler, ScaleSendingBufferTooSmall) {
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Sending a buffer which is too small (should reallocate and update size)
973bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  EXPECT_EQ(0, test_scaler_.Set(width_, height_,
983bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                half_width_, half_height_,
993bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                kI420, kI420,
1003bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                kScalePoint));
1013bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  I420VideoFrame test_frame2;
102ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org  scoped_ptr<uint8_t[]> orig_buffer(new uint8_t[frame_length_]);
1033bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  EXPECT_GT(fread(orig_buffer.get(), 1, frame_length_, source_file_), 0U);
1043bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  test_frame_.CreateFrame(size_y_, orig_buffer.get(),
1053bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                          size_uv_, orig_buffer.get() + size_y_,
1063bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                          size_uv_, orig_buffer.get() + size_y_ + size_uv_,
1073bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                          width_, height_,
1083bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                          width_, half_width_, half_width_);
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, test_scaler_.Scale(test_frame_, &test_frame2));
1103bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  EXPECT_GT(width_ * height_, test_frame2.allocated_size(kYPlane));
1113bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  EXPECT_GT(size_uv_, test_frame2.allocated_size(kUPlane));
1123bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  EXPECT_GT(size_uv_, test_frame2.allocated_size(kVPlane));
1133bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  EXPECT_EQ(half_width_, test_frame2.width());
1143bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  EXPECT_EQ(half_height_, test_frame2.height());
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//TODO (mikhal): Converge the test into one function that accepts the method.
118acb00f58442d54183500c472044768b6d757edb4henrike@webrtc.orgTEST_F(TestScaler, DISABLED_ON_ANDROID(PointScaleTest)) {
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double avg_psnr;
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FILE* source_file2;
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleMethod method = kScalePoint;
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string out_name = webrtc::test::OutputPath() +
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         "LibYuvTest_PointScale_176_144.yuv";
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
1273bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                half_width_, half_height_);
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Upsample back up and check PSNR.
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_352_288_"
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "upfrom_176_144.yuv";
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                176, 144,
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                352, 288);
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 176, 144, avg_psnr);
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 27.9);
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_320_240.yuv";
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                320, 240);
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_704_576.yuv";
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_ * 2, height_ * 2);
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_300_200.yuv";
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                300, 200);
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_400_300.yuv";
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                400, 300);
1639787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  // Down-sample to odd size frame and scale back up.
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_282_231.yuv";
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                282, 231);
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_352_288_"
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "upfrom_282_231.yuv";
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                282, 231,
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                352, 288);
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 282, 231, avg_psnr);
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
18165952712c5e04c3a301a15ce7acfe8999a3686cafbarchard@google.com  ASSERT_GT(avg_psnr, 25.8);
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
1839787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  // Up-sample to odd size frame and scale back down.
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_699_531.yuv";
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                699, 531);
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_PointScale_352_288_"
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "downfrom_699_531.yuv";
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                699, 531,
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                352, 288);
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 699, 531, avg_psnr);
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 37.8);
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
205acb00f58442d54183500c472044768b6d757edb4henrike@webrtc.orgTEST_F(TestScaler, DISABLED_ON_ANDROID(BiLinearScaleTest)) {
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double avg_psnr;
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FILE* source_file2;
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleMethod method = kScaleBilinear;
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string out_name = webrtc::test::OutputPath() +
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         "LibYuvTest_BilinearScale_176_144.yuv";
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_ / 2, height_ / 2);
2159787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  // Up-sample back up and check PSNR.
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BilinearScale_352_288_"
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "upfrom_176_144.yuv";
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                176, 144,
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                352, 288);
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 176, 144, avg_psnr);
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 27.5);
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() +
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             "LibYuvTest_BilinearScale_320_240.yuv";
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                320, 240);
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() +
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             "LibYuvTest_BilinearScale_704_576.yuv";
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_ * 2, height_ * 2);
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() +
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             "LibYuvTest_BilinearScale_300_200.yuv";
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                300, 200);
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() +
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             "LibYuvTest_BilinearScale_400_300.yuv";
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                400, 300);
2559787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  // Down-sample to odd size frame and scale back up.
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() +
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "LibYuvTest_BilinearScale_282_231.yuv";
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                282, 231);
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BilinearScale_352_288_"
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "upfrom_282_231.yuv";
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                282, 231,
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_);
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 282, 231, avg_psnr);
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 29.7);
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Upsample to odd size frame and scale back down.
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() +
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "LibYuvTest_BilinearScale_699_531.yuv";
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                699, 531);
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BilinearScale_352_288_"
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "downfrom_699_531.yuv";
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                699, 531,
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_);
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 699, 531, avg_psnr);
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 31.4);
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
299acb00f58442d54183500c472044768b6d757edb4henrike@webrtc.orgTEST_F(TestScaler, DISABLED_ON_ANDROID(BoxScaleTest)) {
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double avg_psnr;
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FILE* source_file2;
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleMethod method = kScaleBox;
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string out_name = webrtc::test::OutputPath() +
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         "LibYuvTest_BoxScale_176_144.yuv";
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_ / 2, height_ / 2);
3099787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  // Up-sample back up and check PSNR.
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_352_288_"
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "upfrom_176_144.yuv";
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                176, 144,
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                352, 288);
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 176, 144, avg_psnr);
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 27.5);
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_320_240.yuv";
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                320, 240);
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_704_576.yuv";
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_ * 2, height_ * 2);
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_300_200.yuv";
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                300, 200);
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_400_300.yuv";
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                400, 300);
3449787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  // Down-sample to odd size frame and scale back up.
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_282_231.yuv";
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                282, 231);
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_352_288_"
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       "upfrom_282_231.yuv";
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                282, 231,
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_);
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "original size: %f \n", width_, height_, 282, 231, avg_psnr);
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 29.7);
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
3649787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  // Up-sample to odd size frame and scale back down.
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_699_531.yuv";
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file_, out_name,
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_,
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                699, 531);
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  source_file2 = fopen(out_name.c_str(), "rb");
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  out_name = webrtc::test::OutputPath() + "LibYuvTest_BoxScale_352_288_"
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       "downfrom_699_531.yuv";
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ScaleSequence(method,
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                source_file2, out_name,
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                699, 531,
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                width_, height_);
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = ComputeAvgSequencePSNR(source_file_, out_name, width_, height_);
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("PSNR for scaling from: %d %d, down/up to: %d %d, and back to "
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       "original size: %f \n", width_, height_, 699, 531, avg_psnr);
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Average PSNR for lower bound in assert is ~0.1dB lower than the actual
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // average PSNR under same conditions.
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_GT(avg_psnr, 31.4);
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(source_file2));
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgdouble TestScaler::ComputeAvgSequencePSNR(FILE* input_file,
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          std::string out_name,
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          int width, int height) {
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FILE* output_file;
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  output_file = fopen(out_name.c_str(), "rb");
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  assert(output_file != NULL);
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  rewind(input_file);
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  rewind(output_file);
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int required_size = CalcBufferSize(kI420, width, height);
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t* input_buffer = new uint8_t[required_size];
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t* output_buffer = new uint8_t[required_size];
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int frame_count = 0;
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double avg_psnr = 0;
4019787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org  I420VideoFrame in_frame, out_frame;
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  while (feof(input_file) == 0) {
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((size_t)required_size !=
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fread(input_buffer, 1, required_size, input_file)) {
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((size_t)required_size !=
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fread(output_buffer, 1, required_size, output_file)) {
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    frame_count++;
4129787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org    ConvertFromI420(in_frame, kI420, 0, input_buffer);
4139787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org    ConvertFromI420(out_frame, kI420, 0, output_buffer);
4149787291a1ad012d16ad07de4c3b22a331718effamikhal@webrtc.org    double psnr = I420PSNR(&in_frame, &out_frame);
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    avg_psnr += psnr;
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  avg_psnr = avg_psnr / frame_count;
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  assert(0 == fclose(output_file));
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  delete [] input_buffer;
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  delete [] output_buffer;
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return avg_psnr;
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO (mikhal): Move part to a separate scale test.
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid TestScaler::ScaleSequence(ScaleMethod method,
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   FILE* source_file, std::string out_name,
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   int src_width, int src_height,
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   int dst_width, int dst_height) {
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FILE* output_file;
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, test_scaler_.Set(src_width, src_height,
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               dst_width, dst_height,
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               kI420, kI420, method));
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  output_file = fopen(out_name.c_str(), "wb");
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_TRUE(output_file != NULL);
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  rewind(source_file);
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
4393bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  I420VideoFrame input_frame;
4403bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  I420VideoFrame output_frame;
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t start_clock, total_clock;
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  total_clock = 0;
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int frame_count = 0;
4443bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  int src_required_size = CalcBufferSize(kI420, src_width, src_height);
445ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org  scoped_ptr<uint8_t[]> frame_buffer(new uint8_t[src_required_size]);
4463bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  int size_y = src_width * src_height;
4473bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  int size_uv = ((src_width + 1) / 2) * ((src_height + 1) / 2);
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Running through entire sequence.
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  while (feof(source_file) == 0) {
4513bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    if ((size_t)src_required_size !=
4523bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      fread(frame_buffer.get(), 1, src_required_size, source_file))
4533bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      break;
4543bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org
4553bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    input_frame.CreateFrame(size_y, frame_buffer.get(),
4563bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                            size_uv, frame_buffer.get() + size_y,
4573bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                            size_uv, frame_buffer.get() + size_y + size_uv,
4583bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                            src_width, src_height,
4593bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                            src_width, (src_width + 1) / 2,
4603bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                            (src_width + 1) / 2);
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    start_clock = TickTime::MillisecondTimestamp();
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, test_scaler_.Scale(input_frame, &output_frame));
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    total_clock += TickTime::MillisecondTimestamp() - start_clock;
4653bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    if (PrintI420VideoFrame(output_frame, output_file) < 0) {
4663bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org        return;
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    frame_count++;
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (frame_count) {
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Scaling[%d %d] => [%d %d]: ",
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org           src_width, src_height, dst_width, dst_height);
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Average time per frame[ms]: %.2lf\n",
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             (static_cast<double>(total_clock) / frame_count));
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, fclose(output_file));
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
481