1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <math.h> 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <stdlib.h> 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <string.h> 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "third_party/googletest/src/include/gtest/gtest.h" 161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "test/acm_random.h" 171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "test/clear_system_state.h" 181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "test/register_state_check.h" 191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "test/util.h" 20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "./vp9_rtcd.h" 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/common/vp9_entropy.h" 23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/vpx_integer.h" 24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid vp9_idct16x16_256_add_c(const int16_t *input, uint8_t *output, int pitch); 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangusing libvpx_test::ACMRandom; 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangnamespace { 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef _MSC_VER 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int round(double x) { 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x < 0) 361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return static_cast<int>(ceil(x - 0.5)); 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return static_cast<int>(floor(x + 0.5)); 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 421184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst int kNumCoeffs = 256; 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst double PI = 3.1415926535898; 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid reference2_16x16_idct_2d(double *input, double *output) { 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double x; 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int l = 0; l < 16; ++l) { 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int k = 0; k < 16; ++k) { 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double s = 0; 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int i = 0; i < 16; ++i) { 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int j = 0; j < 16; ++j) { 511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang x = cos(PI * j * (l + 0.5) / 16.0) * 521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cos(PI * i * (k + 0.5) / 16.0) * 531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang input[i * 16 + j] / 256; 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (i != 0) 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x *= sqrt(2.0); 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (j != 0) 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x *= sqrt(2.0); 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang s += x; 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[k*16+l] = s; 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 671184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C1 = 0.995184726672197; 681184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C2 = 0.98078528040323; 691184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C3 = 0.956940335732209; 701184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C4 = 0.923879532511287; 711184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C5 = 0.881921264348355; 721184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C6 = 0.831469612302545; 731184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C7 = 0.773010453362737; 741184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C8 = 0.707106781186548; 751184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C9 = 0.634393284163646; 761184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C10 = 0.555570233019602; 771184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C11 = 0.471396736825998; 781184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C12 = 0.38268343236509; 791184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C13 = 0.290284677254462; 801184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C14 = 0.195090322016128; 811184aebb761cbeac9124c37189a80a1a58f04b6bhkuangconst double C15 = 0.098017140329561; 821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 831184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid butterfly_16x16_dct_1d(double input[16], double output[16]) { 84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double step[16]; 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double intermediate[16]; 86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double temp1, temp2; 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // step 1 89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 0] = input[0] + input[15]; 90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 1] = input[1] + input[14]; 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 2] = input[2] + input[13]; 92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 3] = input[3] + input[12]; 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 4] = input[4] + input[11]; 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 5] = input[5] + input[10]; 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 6] = input[6] + input[ 9]; 96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 7] = input[7] + input[ 8]; 97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 8] = input[7] - input[ 8]; 98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 9] = input[6] - input[ 9]; 99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[10] = input[5] - input[10]; 100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[11] = input[4] - input[11]; 101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[12] = input[3] - input[12]; 102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[13] = input[2] - input[13]; 103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[14] = input[1] - input[14]; 104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[15] = input[0] - input[15]; 105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // step 2 107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[0] = step[0] + step[7]; 108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[1] = step[1] + step[6]; 109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[2] = step[2] + step[5]; 110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[3] = step[3] + step[4]; 111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[4] = step[3] - step[4]; 112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[5] = step[2] - step[5]; 113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[6] = step[1] - step[6]; 114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[7] = step[0] - step[7]; 115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[ 8] * C7; 1171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[15] * C9; 118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[ 8] = temp1 + temp2; 119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[ 9] * C11; 1211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[14] * C5; 122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[ 9] = temp1 - temp2; 123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[10] * C3; 1251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[13] * C13; 126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[10] = temp1 + temp2; 127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[11] * C15; 1291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[12] * C1; 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[11] = temp1 - temp2; 131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[11] * C1; 1331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[12] * C15; 134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[12] = temp2 + temp1; 135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[10] * C13; 1371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[13] * C3; 138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[13] = temp2 - temp1; 139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[ 9] * C5; 1411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[14] * C11; 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[14] = temp2 + temp1; 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[ 8] * C9; 1451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[15] * C7; 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[15] = temp2 - temp1; 147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // step 3 149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 0] = output[0] + output[3]; 150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 1] = output[1] + output[2]; 151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 2] = output[1] - output[2]; 152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 3] = output[0] - output[3]; 153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = output[4] * C14; 1551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = output[7] * C2; 156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 4] = temp1 + temp2; 157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = output[5] * C10; 1591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = output[6] * C6; 160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 5] = temp1 + temp2; 161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = output[5] * C6; 1631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = output[6] * C10; 164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 6] = temp2 - temp1; 165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = output[4] * C2; 1671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = output[7] * C14; 168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 7] = temp2 - temp1; 169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 8] = output[ 8] + output[11]; 171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[ 9] = output[ 9] + output[10]; 172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[10] = output[ 9] - output[10]; 173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[11] = output[ 8] - output[11]; 174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[12] = output[12] + output[15]; 176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[13] = output[13] + output[14]; 177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[14] = output[13] - output[14]; 178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang step[15] = output[12] - output[15]; 179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // step 4 181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[ 0] = (step[ 0] + step[ 1]); 182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[ 8] = (step[ 0] - step[ 1]); 183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[2] * C12; 1851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[3] * C4; 186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp1 = temp1 + temp2; 1871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[ 4] = 2*(temp1 * C8); 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = step[2] * C4; 1901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = step[3] * C12; 191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp1 = temp2 - temp1; 1921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[12] = 2 * (temp1 * C8); 193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[ 2] = 2 * ((step[4] + step[ 5]) * C8); 1951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[14] = 2 * ((step[7] - step[ 6]) * C8); 196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp1 = step[4] - step[5]; 198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp2 = step[6] + step[7]; 199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[ 6] = (temp1 + temp2); 200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[10] = (temp1 - temp2); 201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang intermediate[8] = step[8] + step[14]; 203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang intermediate[9] = step[9] + step[15]; 204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = intermediate[8] * C12; 2061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = intermediate[9] * C4; 207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp1 = temp1 - temp2; 2081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[3] = 2 * (temp1 * C8); 209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = intermediate[8] * C4; 2111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = intermediate[9] * C12; 212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp1 = temp2 + temp1; 2131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[13] = 2 * (temp1 * C8); 214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[ 9] = 2 * ((step[10] + step[11]) * C8); 216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang intermediate[11] = step[10] - step[11]; 218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang intermediate[12] = step[12] + step[13]; 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang intermediate[13] = step[12] - step[13]; 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang intermediate[14] = step[ 8] - step[14]; 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang intermediate[15] = step[ 9] - step[15]; 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[15] = (intermediate[11] + intermediate[12]); 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang output[ 1] = -(intermediate[11] - intermediate[12]); 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[ 7] = 2 * (intermediate[13] * C8); 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = intermediate[14] * C12; 2291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = intermediate[15] * C4; 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp1 = temp1 - temp2; 2311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[11] = -2 * (temp1 * C8); 232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp1 = intermediate[14] * C4; 2341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp2 = intermediate[15] * C12; 235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp1 = temp2 + temp1; 2361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[ 5] = 2 * (temp1 * C8); 237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2391184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid reference_16x16_dct_2d(int16_t input[256], double output[256]) { 240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // First transform columns 241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int i = 0; i < 16; ++i) { 242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double temp_in[16], temp_out[16]; 243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int j = 0; j < 16; ++j) 2441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp_in[j] = input[j * 16 + i]; 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang butterfly_16x16_dct_1d(temp_in, temp_out); 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int j = 0; j < 16; ++j) 2471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[j * 16 + i] = temp_out[j]; 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Then transform rows 250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int i = 0; i < 16; ++i) { 251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double temp_in[16], temp_out[16]; 252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int j = 0; j < 16; ++j) 2531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang temp_in[j] = output[j + i * 16]; 254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang butterfly_16x16_dct_1d(temp_in, temp_out); 255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Scale by some magic number 256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (int j = 0; j < 16; ++j) 2571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output[j + i * 16] = temp_out[j]/2; 258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef void (*fdct_t)(const int16_t *in, int16_t *out, int stride); 2625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef void (*idct_t)(const int16_t *in, uint8_t *out, int stride); 2635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef void (*fht_t) (const int16_t *in, int16_t *out, int stride, 2645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int tx_type); 2655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef void (*iht_t) (const int16_t *in, uint8_t *out, int stride, 2665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int tx_type); 2671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 268b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef std::tr1::tuple<fdct_t, idct_t, int> dct_16x16_param_t; 269b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef std::tr1::tuple<fht_t, iht_t, int> ht_16x16_param_t; 270b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid fdct16x16_ref(const int16_t *in, int16_t *out, int stride, int tx_type) { 2725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_fdct16x16_c(in, out, stride); 27391037db265ecdd914a26e056cf69207b4f50924ehkuang} 2741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 2755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid fht16x16_ref(const int16_t *in, int16_t *out, int stride, int tx_type) { 276b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_fht16x16_c(in, out, stride, tx_type); 27791037db265ecdd914a26e056cf69207b4f50924ehkuang} 278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2791184aebb761cbeac9124c37189a80a1a58f04b6bhkuangclass Trans16x16TestBase { 28091037db265ecdd914a26e056cf69207b4f50924ehkuang public: 2811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual ~Trans16x16TestBase() {} 28291037db265ecdd914a26e056cf69207b4f50924ehkuang 2831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang protected: 2841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual void RunFwdTxfm(int16_t *in, int16_t *out, int stride) = 0; 2851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 2861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) = 0; 2871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 2881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunAccuracyCheck() { 2891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ACMRandom rnd(ACMRandom::DeterministicSeed()); 2901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang uint32_t max_error = 0; 2911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int64_t total_error = 0; 2921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int count_test_block = 10000; 2931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int i = 0; i < count_test_block; ++i) { 2941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, kNumCoeffs); 2951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, test_temp_block, kNumCoeffs); 2961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs); 2971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs); 2981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 2991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Initialize a test block with input range [-255, 255]. 3001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) { 3011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang src[j] = rnd.Rand8(); 3021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang dst[j] = rnd.Rand8(); 3031184aebb761cbeac9124c37189a80a1a58f04b6bhkuang test_input_block[j] = src[j] - dst[j]; 3041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 3051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block, 3071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang test_temp_block, pitch_)); 3081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); 3091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) { 3111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint32_t diff = dst[j] - src[j]; 3121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint32_t error = diff * diff; 3131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (max_error < error) 3141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang max_error = error; 3151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang total_error += error; 3161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang EXPECT_GE(1u, max_error) 3201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang << "Error: 16x16 FHT/IHT has an individual round trip error > 1"; 3211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang EXPECT_GE(count_test_block , total_error) 3231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang << "Error: 16x16 FHT/IHT has average round trip error > 1 per block"; 32491037db265ecdd914a26e056cf69207b4f50924ehkuang } 32591037db265ecdd914a26e056cf69207b4f50924ehkuang 3261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunCoeffCheck() { 3271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ACMRandom rnd(ACMRandom::DeterministicSeed()); 3281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int count_test_block = 1000; 3291184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs); 3301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs); 3311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs); 332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int i = 0; i < count_test_block; ++i) { 33491037db265ecdd914a26e056cf69207b4f50924ehkuang // Initialize a test block with input range [-255, 255]. 3351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) 3361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang input_block[j] = rnd.Rand8() - rnd.Rand8(); 3371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_); 3391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_)); 3401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // The minimum quant value is 4. 3421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) 3431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang EXPECT_EQ(output_block[j], output_ref_block[j]); 34491037db265ecdd914a26e056cf69207b4f50924ehkuang } 3451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunMemCheck() { 3481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ACMRandom rnd(ACMRandom::DeterministicSeed()); 3491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int count_test_block = 1000; 3501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs); 3511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, input_extreme_block, kNumCoeffs); 3521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs); 3531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs); 354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int i = 0; i < count_test_block; ++i) { 3561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Initialize a test block with input range [-255, 255]. 3571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) { 3581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang input_block[j] = rnd.Rand8() - rnd.Rand8(); 3591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang input_extreme_block[j] = rnd.Rand8() % 2 ? 255 : -255; 3601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 3611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (i == 0) 3621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) 3631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang input_extreme_block[j] = 255; 3641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (i == 1) 3651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) 3661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang input_extreme_block[j] = -255; 3671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_); 3691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block, 3701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang output_block, pitch_)); 3711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // The minimum quant value is 4. 3731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) { 3741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang EXPECT_EQ(output_block[j], output_ref_block[j]); 3751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang EXPECT_GE(4 * DCT_MAX_VALUE, abs(output_block[j])) 3761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang << "Error: 16x16 FDCT has coefficient larger than 4*DCT_MAX_VALUE"; 3771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunInvAccuracyCheck() { 3821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ACMRandom rnd(ACMRandom::DeterministicSeed()); 3831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int count_test_block = 1000; 3841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs); 3851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, int16_t, coeff, kNumCoeffs); 3861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs); 3871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs); 388ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3891184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int i = 0; i < count_test_block; ++i) { 3901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang double out_r[kNumCoeffs]; 391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Initialize a test block with input range [-255, 255]. 3931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) { 3941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang src[j] = rnd.Rand8(); 3951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang dst[j] = rnd.Rand8(); 3961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang in[j] = src[j] - dst[j]; 3971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 3981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 3991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang reference_16x16_dct_2d(in, out_r); 4001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) 4011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang coeff[j] = round(out_r[j]); 4021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, 16)); 4041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (int j = 0; j < kNumCoeffs; ++j) { 4061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint32_t diff = dst[j] - src[j]; 4071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const uint32_t error = diff * diff; 4081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang EXPECT_GE(1u, error) 4091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang << "Error: 16x16 IDCT has error " << error 4101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang << " at index " << j; 4111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 41291037db265ecdd914a26e056cf69207b4f50924ehkuang } 41391037db265ecdd914a26e056cf69207b4f50924ehkuang } 4141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int pitch_; 4151184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int tx_type_; 4161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fht_t fwd_txfm_ref; 4171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 4181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 419b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianclass Trans16x16DCT 420b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian : public Trans16x16TestBase, 421b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian public ::testing::TestWithParam<dct_16x16_param_t> { 4221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang public: 4231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual ~Trans16x16DCT() {} 4241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual void SetUp() { 4261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_ = GET_PARAM(0); 4271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang inv_txfm_ = GET_PARAM(1); 4281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang tx_type_ = GET_PARAM(2); 4295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang pitch_ = 16; 4301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_ref = fdct16x16_ref; 4311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 4321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual void TearDown() { libvpx_test::ClearSystemState(); } 4331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4341184aebb761cbeac9124c37189a80a1a58f04b6bhkuang protected: 4351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunFwdTxfm(int16_t *in, int16_t *out, int stride) { 4361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_(in, out, stride); 4371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 4381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) { 4395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang inv_txfm_(out, dst, stride); 4401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 4411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fdct_t fwd_txfm_; 4431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang idct_t inv_txfm_; 4441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 4451184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4461184aebb761cbeac9124c37189a80a1a58f04b6bhkuangTEST_P(Trans16x16DCT, AccuracyCheck) { 4471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang RunAccuracyCheck(); 44891037db265ecdd914a26e056cf69207b4f50924ehkuang} 44991037db265ecdd914a26e056cf69207b4f50924ehkuang 4501184aebb761cbeac9124c37189a80a1a58f04b6bhkuangTEST_P(Trans16x16DCT, CoeffCheck) { 4511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang RunCoeffCheck(); 4521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 45391037db265ecdd914a26e056cf69207b4f50924ehkuang 4541184aebb761cbeac9124c37189a80a1a58f04b6bhkuangTEST_P(Trans16x16DCT, MemCheck) { 4551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang RunMemCheck(); 4561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 45791037db265ecdd914a26e056cf69207b4f50924ehkuang 4581184aebb761cbeac9124c37189a80a1a58f04b6bhkuangTEST_P(Trans16x16DCT, InvAccuracyCheck) { 4591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang RunInvAccuracyCheck(); 4601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 4611184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 462b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianclass Trans16x16HT 463b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian : public Trans16x16TestBase, 464b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian public ::testing::TestWithParam<ht_16x16_param_t> { 4651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang public: 4661184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual ~Trans16x16HT() {} 4671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual void SetUp() { 4691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_ = GET_PARAM(0); 4701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang inv_txfm_ = GET_PARAM(1); 4711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang tx_type_ = GET_PARAM(2); 4721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang pitch_ = 16; 4731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_ref = fht16x16_ref; 4741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 4751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang virtual void TearDown() { libvpx_test::ClearSystemState(); } 4761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang protected: 4781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunFwdTxfm(int16_t *in, int16_t *out, int stride) { 4791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fwd_txfm_(in, out, stride, tx_type_); 4801184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 4811184aebb761cbeac9124c37189a80a1a58f04b6bhkuang void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) { 4821184aebb761cbeac9124c37189a80a1a58f04b6bhkuang inv_txfm_(out, dst, stride, tx_type_); 483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 4841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang fht_t fwd_txfm_; 4861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang iht_t inv_txfm_; 4871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}; 4881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4891184aebb761cbeac9124c37189a80a1a58f04b6bhkuangTEST_P(Trans16x16HT, AccuracyCheck) { 4901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang RunAccuracyCheck(); 4911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 4921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4931184aebb761cbeac9124c37189a80a1a58f04b6bhkuangTEST_P(Trans16x16HT, CoeffCheck) { 4941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang RunCoeffCheck(); 4951184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 4961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 4971184aebb761cbeac9124c37189a80a1a58f04b6bhkuangTEST_P(Trans16x16HT, MemCheck) { 4981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang RunMemCheck(); 499ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 50091037db265ecdd914a26e056cf69207b4f50924ehkuang 5011184aebb761cbeac9124c37189a80a1a58f04b6bhkuangusing std::tr1::make_tuple; 5021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5031184aebb761cbeac9124c37189a80a1a58f04b6bhkuangINSTANTIATE_TEST_CASE_P( 5041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang C, Trans16x16DCT, 5051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ::testing::Values( 5065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang make_tuple(&vp9_fdct16x16_c, &vp9_idct16x16_256_add_c, 0))); 5071184aebb761cbeac9124c37189a80a1a58f04b6bhkuangINSTANTIATE_TEST_CASE_P( 5081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang C, Trans16x16HT, 5091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ::testing::Values( 510b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 0), 511b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 1), 512b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 2), 513b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 3))); 514b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 515b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if HAVE_NEON 516b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P( 517b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian NEON, Trans16x16DCT, 518b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ::testing::Values( 519b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fdct16x16_c, 520b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &vp9_idct16x16_256_add_neon, 0))); 521b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 5221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 5231184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if HAVE_SSE2 5241184aebb761cbeac9124c37189a80a1a58f04b6bhkuangINSTANTIATE_TEST_CASE_P( 5251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang SSE2, Trans16x16DCT, 5261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ::testing::Values( 5275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang make_tuple(&vp9_fdct16x16_sse2, 5285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang &vp9_idct16x16_256_add_sse2, 0))); 5291184aebb761cbeac9124c37189a80a1a58f04b6bhkuangINSTANTIATE_TEST_CASE_P( 5301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang SSE2, Trans16x16HT, 5311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ::testing::Values( 532b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 0), 533b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 1), 534b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 2), 535b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 3))); 5361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif 537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} // namespace 538