190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 111b362b15af34006e6a11974088a46d42b903418eJohann#ifndef TEST_UTIL_H_ 121b362b15af34006e6a11974088a46d42b903418eJohann#define TEST_UTIL_H_ 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <stdio.h> 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <math.h> 16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "third_party/googletest/src/include/gtest/gtest.h" 17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vpx_image.h" 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 191b362b15af34006e6a11974088a46d42b903418eJohann// Macros 207bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define GET_PARAM(k) std::tr1::get<k>(GetParam()) 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 222263fc984bdc858ee931d3e35c87c404de923950Johanninline double compute_psnr(const vpx_image_t *img1, const vpx_image_t *img2) { 237bc9febe8749e98a3812a0dc4380ceae75c29450Johann assert((img1->fmt == img2->fmt) && (img1->d_w == img2->d_w) && 24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (img1->d_h == img2->d_h)); 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 267bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned int width_y = img1->d_w; 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned int height_y = img1->d_h; 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int i, j; 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t sqrerr = 0; 317bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < height_y; ++i) { 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (j = 0; j < width_y; ++j) { 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t d = img1->planes[VPX_PLANE_Y][i * img1->stride[VPX_PLANE_Y] + j] - 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang img2->planes[VPX_PLANE_Y][i * img2->stride[VPX_PLANE_Y] + j]; 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sqrerr += d * d; 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 377bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3891037db265ecdd914a26e056cf69207b4f50924ehkuang double mse = static_cast<double>(sqrerr) / (width_y * height_y); 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double psnr = 100.0; 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (mse > 0.0) { 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang psnr = 10 * log10(255.0 * 255.0 / mse); 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return psnr; 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 461b362b15af34006e6a11974088a46d42b903418eJohann#endif // TEST_UTIL_H_ 47