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