1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h> 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/acm_random.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/clear_system_state.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/register_state_check.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/util.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vp9_rtcd.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropy.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_integer.h" 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan 25233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 26233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_idct16x16_256_add_c(const int16_t *input, uint8_t *output, int pitch); 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan 29233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing libvpx_test::ACMRandom; 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan 31233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace { 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER 34233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int round(double x) { 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x < 0) 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan return static_cast<int>(ceil(x - 0.5)); 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan return static_cast<int>(floor(x + 0.5)); 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst int kNumCoeffs = 256; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double PI = 3.1415926535898; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid reference2_16x16_idct_2d(double *input, double *output) { 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan double x; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int l = 0; l < 16; ++l) { 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int k = 0; k < 16; ++k) { 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan double s = 0; 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int i = 0; i < 16; ++i) { 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < 16; ++j) { 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan x = cos(PI * j * (l + 0.5) / 16.0) * 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan cos(PI * i * (k + 0.5) / 16.0) * 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan input[i * 16 + j] / 256; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i != 0) 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan x *= sqrt(2.0); 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (j != 0) 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan x *= sqrt(2.0); 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan s += x; 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[k*16+l] = s; 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C1 = 0.995184726672197; 68233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C2 = 0.98078528040323; 69233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C3 = 0.956940335732209; 70233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C4 = 0.923879532511287; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C5 = 0.881921264348355; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C6 = 0.831469612302545; 73233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C7 = 0.773010453362737; 74233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C8 = 0.707106781186548; 75233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C9 = 0.634393284163646; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C10 = 0.555570233019602; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C11 = 0.471396736825998; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C12 = 0.38268343236509; 79233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C13 = 0.290284677254462; 80233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C14 = 0.195090322016128; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst double C15 = 0.098017140329561; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan 83233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid butterfly_16x16_dct_1d(double input[16], double output[16]) { 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan double step[16]; 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan double intermediate[16]; 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan double temp1, temp2; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan // step 1 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 0] = input[0] + input[15]; 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 1] = input[1] + input[14]; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 2] = input[2] + input[13]; 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 3] = input[3] + input[12]; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 4] = input[4] + input[11]; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 5] = input[5] + input[10]; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 6] = input[6] + input[ 9]; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 7] = input[7] + input[ 8]; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 8] = input[7] - input[ 8]; 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 9] = input[6] - input[ 9]; 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[10] = input[5] - input[10]; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[11] = input[4] - input[11]; 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[12] = input[3] - input[12]; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[13] = input[2] - input[13]; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[14] = input[1] - input[14]; 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[15] = input[0] - input[15]; 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan // step 2 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[0] = step[0] + step[7]; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[1] = step[1] + step[6]; 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[2] = step[2] + step[5]; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[3] = step[3] + step[4]; 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[4] = step[3] - step[4]; 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[5] = step[2] - step[5]; 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[6] = step[1] - step[6]; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[7] = step[0] - step[7]; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[ 8] * C7; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[15] * C9; 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 8] = temp1 + temp2; 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[ 9] * C11; 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[14] * C5; 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 9] = temp1 - temp2; 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[10] * C3; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[13] * C13; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[10] = temp1 + temp2; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[11] * C15; 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[12] * C1; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[11] = temp1 - temp2; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[11] * C1; 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[12] * C15; 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[12] = temp2 + temp1; 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[10] * C13; 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[13] * C3; 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[13] = temp2 - temp1; 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[ 9] * C5; 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[14] * C11; 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[14] = temp2 + temp1; 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[ 8] * C9; 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[15] * C7; 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[15] = temp2 - temp1; 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan // step 3 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 0] = output[0] + output[3]; 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 1] = output[1] + output[2]; 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 2] = output[1] - output[2]; 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 3] = output[0] - output[3]; 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = output[4] * C14; 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = output[7] * C2; 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 4] = temp1 + temp2; 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = output[5] * C10; 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = output[6] * C6; 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 5] = temp1 + temp2; 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = output[5] * C6; 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = output[6] * C10; 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 6] = temp2 - temp1; 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = output[4] * C2; 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = output[7] * C14; 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 7] = temp2 - temp1; 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 8] = output[ 8] + output[11]; 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[ 9] = output[ 9] + output[10]; 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[10] = output[ 9] - output[10]; 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[11] = output[ 8] - output[11]; 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[12] = output[12] + output[15]; 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[13] = output[13] + output[14]; 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[14] = output[13] - output[14]; 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan step[15] = output[12] - output[15]; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan // step 4 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 0] = (step[ 0] + step[ 1]); 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 8] = (step[ 0] - step[ 1]); 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[2] * C12; 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[3] * C4; 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = temp1 + temp2; 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 4] = 2*(temp1 * C8); 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[2] * C4; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[3] * C12; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = temp2 - temp1; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[12] = 2 * (temp1 * C8); 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 2] = 2 * ((step[4] + step[ 5]) * C8); 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[14] = 2 * ((step[7] - step[ 6]) * C8); 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = step[4] - step[5]; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = step[6] + step[7]; 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 6] = (temp1 + temp2); 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[10] = (temp1 - temp2); 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan intermediate[8] = step[8] + step[14]; 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan intermediate[9] = step[9] + step[15]; 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = intermediate[8] * C12; 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = intermediate[9] * C4; 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = temp1 - temp2; 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[3] = 2 * (temp1 * C8); 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = intermediate[8] * C4; 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = intermediate[9] * C12; 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = temp2 + temp1; 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[13] = 2 * (temp1 * C8); 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 9] = 2 * ((step[10] + step[11]) * C8); 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan intermediate[11] = step[10] - step[11]; 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan intermediate[12] = step[12] + step[13]; 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan intermediate[13] = step[12] - step[13]; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan intermediate[14] = step[ 8] - step[14]; 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan intermediate[15] = step[ 9] - step[15]; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[15] = (intermediate[11] + intermediate[12]); 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 1] = -(intermediate[11] - intermediate[12]); 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 7] = 2 * (intermediate[13] * C8); 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = intermediate[14] * C12; 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = intermediate[15] * C4; 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = temp1 - temp2; 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[11] = -2 * (temp1 * C8); 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = intermediate[14] * C4; 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp2 = intermediate[15] * C12; 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp1 = temp2 + temp1; 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[ 5] = 2 * (temp1 * C8); 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan 239233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid reference_16x16_dct_2d(int16_t input[256], double output[256]) { 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan // First transform columns 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int i = 0; i < 16; ++i) { 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan double temp_in[16], temp_out[16]; 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < 16; ++j) 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp_in[j] = input[j * 16 + i]; 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan butterfly_16x16_dct_1d(temp_in, temp_out); 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < 16; ++j) 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[j * 16 + i] = temp_out[j]; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Then transform rows 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int i = 0; i < 16; ++i) { 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan double temp_in[16], temp_out[16]; 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < 16; ++j) 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp_in[j] = output[j + i * 16]; 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan butterfly_16x16_dct_1d(temp_in, temp_out); 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Scale by some magic number 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < 16; ++j) 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan output[j + i * 16] = temp_out[j]/2; 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan 261233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*fdct_t)(const int16_t *in, int16_t *out, int stride); 262233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*idct_t)(const int16_t *in, uint8_t *out, int stride); 263233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*fht_t) (const int16_t *in, int16_t *out, int stride, 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tx_type); 265233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*iht_t) (const int16_t *in, uint8_t *out, int stride, 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tx_type); 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan 268233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef std::tr1::tuple<fdct_t, idct_t, int> dct_16x16_param_t; 269233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef std::tr1::tuple<fht_t, iht_t, int> ht_16x16_param_t; 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan 271233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid fdct16x16_ref(const int16_t *in, int16_t *out, int stride, int tx_type) { 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_fdct16x16_c(in, out, stride); 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan 275233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid fht16x16_ref(const int16_t *in, int16_t *out, int stride, int tx_type) { 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_fht16x16_c(in, out, stride, tx_type); 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan 279233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Trans16x16TestBase { 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan public: 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~Trans16x16TestBase() {} 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void RunFwdTxfm(int16_t *in, int16_t *out, int stride) = 0; 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) = 0; 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunAccuracyCheck() { 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan ACMRandom rnd(ACMRandom::DeterministicSeed()); 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint32_t max_error = 0; 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t total_error = 0; 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int count_test_block = 10000; 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int i = 0; i < count_test_block; ++i) { 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, kNumCoeffs); 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, test_temp_block, kNumCoeffs); 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs); 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs); 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Initialize a test block with input range [-255, 255]. 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) { 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan src[j] = rnd.Rand8(); 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[j] = rnd.Rand8(); 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan test_input_block[j] = src[j] - dst[j]; 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block, 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan test_temp_block, pitch_)); 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) { 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint32_t diff = dst[j] - src[j]; 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint32_t error = diff * diff; 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (max_error < error) 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan max_error = error; 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan total_error += error; 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_GE(1u, max_error) 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan << "Error: 16x16 FHT/IHT has an individual round trip error > 1"; 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_GE(count_test_block , total_error) 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan << "Error: 16x16 FHT/IHT has average round trip error > 1 per block"; 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunCoeffCheck() { 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan ACMRandom rnd(ACMRandom::DeterministicSeed()); 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int count_test_block = 1000; 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs); 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs); 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs); 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int i = 0; i < count_test_block; ++i) { 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Initialize a test block with input range [-255, 255]. 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_block[j] = rnd.Rand8() - rnd.Rand8(); 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_); 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_)); 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan // The minimum quant value is 4. 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(output_block[j], output_ref_block[j]); 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunMemCheck() { 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan ACMRandom rnd(ACMRandom::DeterministicSeed()); 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int count_test_block = 1000; 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs); 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, input_extreme_block, kNumCoeffs); 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs); 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs); 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int i = 0; i < count_test_block; ++i) { 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Initialize a test block with input range [-255, 255]. 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) { 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_block[j] = rnd.Rand8() - rnd.Rand8(); 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_extreme_block[j] = rnd.Rand8() % 2 ? 255 : -255; 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i == 0) 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_extreme_block[j] = 255; 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i == 1) 365233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan input_extreme_block[j] = -255; 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_); 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block, 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan output_block, pitch_)); 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan // The minimum quant value is 4. 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) { 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(output_block[j], output_ref_block[j]); 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_GE(4 * DCT_MAX_VALUE, abs(output_block[j])) 376233d2500723e5594f3e7c70896ffeeef32b9c950ywan << "Error: 16x16 FDCT has coefficient larger than 4*DCT_MAX_VALUE"; 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 378233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunInvAccuracyCheck() { 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan ACMRandom rnd(ACMRandom::DeterministicSeed()); 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int count_test_block = 1000; 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs); 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, int16_t, coeff, kNumCoeffs); 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs); 387233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs); 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int i = 0; i < count_test_block; ++i) { 390233d2500723e5594f3e7c70896ffeeef32b9c950ywan double out_r[kNumCoeffs]; 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Initialize a test block with input range [-255, 255]. 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) { 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan src[j] = rnd.Rand8(); 395233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[j] = rnd.Rand8(); 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan in[j] = src[j] - dst[j]; 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan reference_16x16_dct_2d(in, out_r); 400233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan coeff[j] = round(out_r[j]); 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, 16)); 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan 405233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int j = 0; j < kNumCoeffs; ++j) { 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint32_t diff = dst[j] - src[j]; 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint32_t error = diff * diff; 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_GE(1u, error) 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan << "Error: 16x16 IDCT has error " << error 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan << " at index " << j; 411233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pitch_; 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tx_type_; 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan fht_t fwd_txfm_ref; 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan 419233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Trans16x16DCT 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan : public Trans16x16TestBase, 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan public ::testing::TestWithParam<dct_16x16_param_t> { 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan public: 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~Trans16x16DCT() {} 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void SetUp() { 426233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_ = GET_PARAM(0); 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan inv_txfm_ = GET_PARAM(1); 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan tx_type_ = GET_PARAM(2); 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan pitch_ = 16; 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_ref = fdct16x16_ref; 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 432233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void TearDown() { libvpx_test::ClearSystemState(); } 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 435233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunFwdTxfm(int16_t *in, int16_t *out, int stride) { 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_(in, out, stride); 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 438233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) { 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan inv_txfm_(out, dst, stride); 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan fdct_t fwd_txfm_; 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan idct_t inv_txfm_; 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan 446233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(Trans16x16DCT, AccuracyCheck) { 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan RunAccuracyCheck(); 448233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan 450233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(Trans16x16DCT, CoeffCheck) { 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan RunCoeffCheck(); 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan 454233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(Trans16x16DCT, MemCheck) { 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan RunMemCheck(); 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan 458233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(Trans16x16DCT, InvAccuracyCheck) { 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan RunInvAccuracyCheck(); 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 461233d2500723e5594f3e7c70896ffeeef32b9c950ywan 462233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Trans16x16HT 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan : public Trans16x16TestBase, 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan public ::testing::TestWithParam<ht_16x16_param_t> { 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan public: 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~Trans16x16HT() {} 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void SetUp() { 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_ = GET_PARAM(0); 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan inv_txfm_ = GET_PARAM(1); 471233d2500723e5594f3e7c70896ffeeef32b9c950ywan tx_type_ = GET_PARAM(2); 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan pitch_ = 16; 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_ref = fht16x16_ref; 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void TearDown() { libvpx_test::ClearSystemState(); } 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 478233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunFwdTxfm(int16_t *in, int16_t *out, int stride) { 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan fwd_txfm_(in, out, stride, tx_type_); 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 481233d2500723e5594f3e7c70896ffeeef32b9c950ywan void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) { 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan inv_txfm_(out, dst, stride, tx_type_); 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan fht_t fwd_txfm_; 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan iht_t inv_txfm_; 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan 489233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(Trans16x16HT, AccuracyCheck) { 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan RunAccuracyCheck(); 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan 493233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(Trans16x16HT, CoeffCheck) { 494233d2500723e5594f3e7c70896ffeeef32b9c950ywan RunCoeffCheck(); 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan 497233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(Trans16x16HT, MemCheck) { 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan RunMemCheck(); 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan 501233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing std::tr1::make_tuple; 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan 503233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P( 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan C, Trans16x16DCT, 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values( 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fdct16x16_c, &vp9_idct16x16_256_add_c, 0))); 507233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P( 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan C, Trans16x16HT, 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values( 510233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 0), 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 1), 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 2), 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 3))); 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_NEON 516233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P( 517233d2500723e5594f3e7c70896ffeeef32b9c950ywan NEON, Trans16x16DCT, 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values( 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fdct16x16_c, 520233d2500723e5594f3e7c70896ffeeef32b9c950ywan &vp9_idct16x16_256_add_neon, 0))); 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 522233d2500723e5594f3e7c70896ffeeef32b9c950ywan 523233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSE2 524233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P( 525233d2500723e5594f3e7c70896ffeeef32b9c950ywan SSE2, Trans16x16DCT, 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values( 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fdct16x16_sse2, 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan &vp9_idct16x16_256_add_sse2, 0))); 529233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P( 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan SSE2, Trans16x16HT, 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values( 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 0), 533233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 1), 534233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 2), 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 3))); 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 537233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // namespace 538