Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 1 | /* |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 2 | * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 3 | * |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 4 | * This source code is subject to the terms of the BSD 2 Clause License and |
| 5 | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| 6 | * was not distributed with this source code in the LICENSE file, you can |
| 7 | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| 8 | * Media Patent License 1.0 was not distributed with this source code in the |
| 9 | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
| 10 | */ |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 11 | |
| 12 | #include <math.h> |
| 13 | #include <stdlib.h> |
| 14 | #include <string.h> |
| 15 | |
| 16 | #include "third_party/googletest/src/include/gtest/gtest.h" |
Jingning Han | 097d59c | 2015-07-29 14:51:36 -0700 | [diff] [blame] | 17 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 18 | #include "./av1_rtcd.h" |
| 19 | #include "./aom_dsp_rtcd.h" |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 20 | #include "test/acm_random.h" |
| 21 | #include "test/clear_system_state.h" |
| 22 | #include "test/register_state_check.h" |
| 23 | #include "test/util.h" |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 24 | #include "av1/common/entropy.h" |
| 25 | #include "av1/common/scan.h" |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 26 | #include "aom/aom_codec.h" |
| 27 | #include "aom/aom_integer.h" |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 28 | #include "aom_ports/mem.h" |
| 29 | #include "aom_ports/msvc.h" // for round() |
James Zern | 002ad40 | 2014-01-18 13:03:31 -0800 | [diff] [blame] | 30 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 31 | using libaom_test::ACMRandom; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 32 | |
| 33 | namespace { |
| 34 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 35 | const int kNumCoeffs = 256; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 36 | const double C1 = 0.995184726672197; |
| 37 | const double C2 = 0.98078528040323; |
| 38 | const double C3 = 0.956940335732209; |
| 39 | const double C4 = 0.923879532511287; |
| 40 | const double C5 = 0.881921264348355; |
| 41 | const double C6 = 0.831469612302545; |
| 42 | const double C7 = 0.773010453362737; |
| 43 | const double C8 = 0.707106781186548; |
| 44 | const double C9 = 0.634393284163646; |
| 45 | const double C10 = 0.555570233019602; |
| 46 | const double C11 = 0.471396736825998; |
| 47 | const double C12 = 0.38268343236509; |
| 48 | const double C13 = 0.290284677254462; |
| 49 | const double C14 = 0.195090322016128; |
| 50 | const double C15 = 0.098017140329561; |
Yaowu Xu | 0b17ea6 | 2012-08-07 13:55:49 -0700 | [diff] [blame] | 51 | |
Jingning Han | ec4b274 | 2013-08-27 17:03:46 -0700 | [diff] [blame] | 52 | void butterfly_16x16_dct_1d(double input[16], double output[16]) { |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 53 | double step[16]; |
| 54 | double intermediate[16]; |
| 55 | double temp1, temp2; |
| 56 | |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 57 | // step 1 |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 58 | step[0] = input[0] + input[15]; |
| 59 | step[1] = input[1] + input[14]; |
| 60 | step[2] = input[2] + input[13]; |
| 61 | step[3] = input[3] + input[12]; |
| 62 | step[4] = input[4] + input[11]; |
| 63 | step[5] = input[5] + input[10]; |
| 64 | step[6] = input[6] + input[9]; |
| 65 | step[7] = input[7] + input[8]; |
| 66 | step[8] = input[7] - input[8]; |
| 67 | step[9] = input[6] - input[9]; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 68 | step[10] = input[5] - input[10]; |
| 69 | step[11] = input[4] - input[11]; |
| 70 | step[12] = input[3] - input[12]; |
| 71 | step[13] = input[2] - input[13]; |
| 72 | step[14] = input[1] - input[14]; |
| 73 | step[15] = input[0] - input[15]; |
| 74 | |
| 75 | // step 2 |
| 76 | output[0] = step[0] + step[7]; |
| 77 | output[1] = step[1] + step[6]; |
| 78 | output[2] = step[2] + step[5]; |
| 79 | output[3] = step[3] + step[4]; |
| 80 | output[4] = step[3] - step[4]; |
| 81 | output[5] = step[2] - step[5]; |
| 82 | output[6] = step[1] - step[6]; |
| 83 | output[7] = step[0] - step[7]; |
| 84 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 85 | temp1 = step[8] * C7; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 86 | temp2 = step[15] * C9; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 87 | output[8] = temp1 + temp2; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 88 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 89 | temp1 = step[9] * C11; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 90 | temp2 = step[14] * C5; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 91 | output[9] = temp1 - temp2; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 92 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 93 | temp1 = step[10] * C3; |
| 94 | temp2 = step[13] * C13; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 95 | output[10] = temp1 + temp2; |
| 96 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 97 | temp1 = step[11] * C15; |
| 98 | temp2 = step[12] * C1; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 99 | output[11] = temp1 - temp2; |
| 100 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 101 | temp1 = step[11] * C1; |
| 102 | temp2 = step[12] * C15; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 103 | output[12] = temp2 + temp1; |
| 104 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 105 | temp1 = step[10] * C13; |
| 106 | temp2 = step[13] * C3; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 107 | output[13] = temp2 - temp1; |
| 108 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 109 | temp1 = step[9] * C5; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 110 | temp2 = step[14] * C11; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 111 | output[14] = temp2 + temp1; |
| 112 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 113 | temp1 = step[8] * C9; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 114 | temp2 = step[15] * C7; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 115 | output[15] = temp2 - temp1; |
| 116 | |
| 117 | // step 3 |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 118 | step[0] = output[0] + output[3]; |
| 119 | step[1] = output[1] + output[2]; |
| 120 | step[2] = output[1] - output[2]; |
| 121 | step[3] = output[0] - output[3]; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 122 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 123 | temp1 = output[4] * C14; |
| 124 | temp2 = output[7] * C2; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 125 | step[4] = temp1 + temp2; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 126 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 127 | temp1 = output[5] * C10; |
| 128 | temp2 = output[6] * C6; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 129 | step[5] = temp1 + temp2; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 130 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 131 | temp1 = output[5] * C6; |
| 132 | temp2 = output[6] * C10; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 133 | step[6] = temp2 - temp1; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 134 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 135 | temp1 = output[4] * C2; |
| 136 | temp2 = output[7] * C14; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 137 | step[7] = temp2 - temp1; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 138 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 139 | step[8] = output[8] + output[11]; |
| 140 | step[9] = output[9] + output[10]; |
| 141 | step[10] = output[9] - output[10]; |
| 142 | step[11] = output[8] - output[11]; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 143 | |
| 144 | step[12] = output[12] + output[15]; |
| 145 | step[13] = output[13] + output[14]; |
| 146 | step[14] = output[13] - output[14]; |
| 147 | step[15] = output[12] - output[15]; |
| 148 | |
| 149 | // step 4 |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 150 | output[0] = (step[0] + step[1]); |
| 151 | output[8] = (step[0] - step[1]); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 152 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 153 | temp1 = step[2] * C12; |
| 154 | temp2 = step[3] * C4; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 155 | temp1 = temp1 + temp2; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 156 | output[4] = 2 * (temp1 * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 157 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 158 | temp1 = step[2] * C4; |
| 159 | temp2 = step[3] * C12; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 160 | temp1 = temp2 - temp1; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 161 | output[12] = 2 * (temp1 * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 162 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 163 | output[2] = 2 * ((step[4] + step[5]) * C8); |
| 164 | output[14] = 2 * ((step[7] - step[6]) * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 165 | |
| 166 | temp1 = step[4] - step[5]; |
| 167 | temp2 = step[6] + step[7]; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 168 | output[6] = (temp1 + temp2); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 169 | output[10] = (temp1 - temp2); |
| 170 | |
| 171 | intermediate[8] = step[8] + step[14]; |
| 172 | intermediate[9] = step[9] + step[15]; |
| 173 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 174 | temp1 = intermediate[8] * C12; |
| 175 | temp2 = intermediate[9] * C4; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 176 | temp1 = temp1 - temp2; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 177 | output[3] = 2 * (temp1 * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 178 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 179 | temp1 = intermediate[8] * C4; |
| 180 | temp2 = intermediate[9] * C12; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 181 | temp1 = temp2 + temp1; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 182 | output[13] = 2 * (temp1 * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 183 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 184 | output[9] = 2 * ((step[10] + step[11]) * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 185 | |
| 186 | intermediate[11] = step[10] - step[11]; |
| 187 | intermediate[12] = step[12] + step[13]; |
| 188 | intermediate[13] = step[12] - step[13]; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 189 | intermediate[14] = step[8] - step[14]; |
| 190 | intermediate[15] = step[9] - step[15]; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 191 | |
| 192 | output[15] = (intermediate[11] + intermediate[12]); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 193 | output[1] = -(intermediate[11] - intermediate[12]); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 194 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 195 | output[7] = 2 * (intermediate[13] * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 196 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 197 | temp1 = intermediate[14] * C12; |
| 198 | temp2 = intermediate[15] * C4; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 199 | temp1 = temp1 - temp2; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 200 | output[11] = -2 * (temp1 * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 201 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 202 | temp1 = intermediate[14] * C4; |
| 203 | temp2 = intermediate[15] * C12; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 204 | temp1 = temp2 + temp1; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 205 | output[5] = 2 * (temp1 * C8); |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 206 | } |
| 207 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 208 | void reference_16x16_dct_2d(int16_t input[256], double output[256]) { |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 209 | // First transform columns |
| 210 | for (int i = 0; i < 16; ++i) { |
| 211 | double temp_in[16], temp_out[16]; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 212 | for (int j = 0; j < 16; ++j) temp_in[j] = input[j * 16 + i]; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 213 | butterfly_16x16_dct_1d(temp_in, temp_out); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 214 | for (int j = 0; j < 16; ++j) output[j * 16 + i] = temp_out[j]; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 215 | } |
| 216 | // Then transform rows |
| 217 | for (int i = 0; i < 16; ++i) { |
| 218 | double temp_in[16], temp_out[16]; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 219 | for (int j = 0; j < 16; ++j) temp_in[j] = output[j + i * 16]; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 220 | butterfly_16x16_dct_1d(temp_in, temp_out); |
| 221 | // Scale by some magic number |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 222 | for (int j = 0; j < 16; ++j) output[j + i * 16] = temp_out[j] / 2; |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 223 | } |
| 224 | } |
| 225 | |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 226 | typedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride); |
| 227 | typedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride); |
| 228 | typedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride, |
James Zern | 44f8484 | 2014-07-16 18:53:33 -0700 | [diff] [blame] | 229 | int tx_type); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 230 | typedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride, |
James Zern | 44f8484 | 2014-07-16 18:53:33 -0700 | [diff] [blame] | 231 | int tx_type); |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 232 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 233 | typedef std::tr1::tuple<FdctFunc, IdctFunc, int, aom_bit_depth_t> Dct16x16Param; |
| 234 | typedef std::tr1::tuple<FhtFunc, IhtFunc, int, aom_bit_depth_t> Ht16x16Param; |
| 235 | typedef std::tr1::tuple<IdctFunc, IdctFunc, int, aom_bit_depth_t> |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 236 | Idct16x16Param; |
Joshua Litt | 51490e5 | 2013-11-18 17:07:55 -0800 | [diff] [blame] | 237 | |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 238 | void fdct16x16_ref(const int16_t *in, tran_low_t *out, int stride, |
James Zern | 632e419 | 2014-08-22 12:11:42 -0700 | [diff] [blame] | 239 | int /*tx_type*/) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 240 | aom_fdct16x16_c(in, out, stride); |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 241 | } |
| 242 | |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 243 | void idct16x16_ref(const tran_low_t *in, uint8_t *dest, int stride, |
James Zern | 632e419 | 2014-08-22 12:11:42 -0700 | [diff] [blame] | 244 | int /*tx_type*/) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 245 | aom_idct16x16_256_add_c(in, dest, stride); |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 246 | } |
| 247 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 248 | void fht16x16_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 249 | av1_fht16x16_c(in, out, stride, tx_type); |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 250 | } |
| 251 | |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 252 | void iht16x16_ref(const tran_low_t *in, uint8_t *dest, int stride, |
| 253 | int tx_type) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 254 | av1_iht16x16_256_add_c(in, dest, stride, tx_type); |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 255 | } |
| 256 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 257 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 258 | void idct16x16_10(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 259 | aom_highbd_idct16x16_256_add_c(in, out, stride, 10); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 260 | } |
| 261 | |
| 262 | void idct16x16_12(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 263 | aom_highbd_idct16x16_256_add_c(in, out, stride, 12); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 264 | } |
| 265 | |
| 266 | void idct16x16_10_ref(const tran_low_t *in, uint8_t *out, int stride, |
Urvang Joshi | d71a231 | 2016-07-14 12:33:48 -0700 | [diff] [blame] | 267 | int /*tx_type*/) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 268 | idct16x16_10(in, out, stride); |
| 269 | } |
| 270 | |
| 271 | void idct16x16_12_ref(const tran_low_t *in, uint8_t *out, int stride, |
Urvang Joshi | d71a231 | 2016-07-14 12:33:48 -0700 | [diff] [blame] | 272 | int /*tx_type*/) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 273 | idct16x16_12(in, out, stride); |
| 274 | } |
| 275 | |
| 276 | void iht16x16_10(const tran_low_t *in, uint8_t *out, int stride, int tx_type) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 277 | av1_highbd_iht16x16_256_add_c(in, out, stride, tx_type, 10); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 278 | } |
| 279 | |
| 280 | void iht16x16_12(const tran_low_t *in, uint8_t *out, int stride, int tx_type) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 281 | av1_highbd_iht16x16_256_add_c(in, out, stride, tx_type, 12); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 282 | } |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 283 | |
James Zern | 81c1659 | 2016-02-02 19:42:19 -0800 | [diff] [blame] | 284 | #if HAVE_SSE2 |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 285 | void idct16x16_10_add_10_c(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 286 | aom_highbd_idct16x16_10_add_c(in, out, stride, 10); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 287 | } |
| 288 | |
| 289 | void idct16x16_10_add_12_c(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 290 | aom_highbd_idct16x16_10_add_c(in, out, stride, 12); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 291 | } |
| 292 | |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 293 | void idct16x16_256_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 294 | aom_highbd_idct16x16_256_add_sse2(in, out, stride, 10); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 295 | } |
| 296 | |
| 297 | void idct16x16_256_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 298 | aom_highbd_idct16x16_256_add_sse2(in, out, stride, 12); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 299 | } |
| 300 | |
| 301 | void idct16x16_10_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 302 | aom_highbd_idct16x16_10_add_sse2(in, out, stride, 10); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 303 | } |
| 304 | |
| 305 | void idct16x16_10_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 306 | aom_highbd_idct16x16_10_add_sse2(in, out, stride, 12); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 307 | } |
| 308 | #endif // HAVE_SSE2 |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 309 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 310 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 311 | class Trans16x16TestBase { |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 312 | public: |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 313 | virtual ~Trans16x16TestBase() {} |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 314 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 315 | protected: |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 316 | virtual void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) = 0; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 317 | |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 318 | virtual void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) = 0; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 319 | |
| 320 | void RunAccuracyCheck() { |
| 321 | ACMRandom rnd(ACMRandom::DeterministicSeed()); |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 322 | uint32_t max_error = 0; |
| 323 | int64_t total_error = 0; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 324 | const int count_test_block = 10000; |
| 325 | for (int i = 0; i < count_test_block; ++i) { |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 326 | DECLARE_ALIGNED(16, int16_t, test_input_block[kNumCoeffs]); |
| 327 | DECLARE_ALIGNED(16, tran_low_t, test_temp_block[kNumCoeffs]); |
| 328 | DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]); |
| 329 | DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 330 | #if CONFIG_AOM_HIGHBITDEPTH |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 331 | DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]); |
| 332 | DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 333 | #endif |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 334 | |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 335 | // Initialize a test block with input range [-mask_, mask_]. |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 336 | for (int j = 0; j < kNumCoeffs; ++j) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 337 | if (bit_depth_ == AOM_BITS_8) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 338 | src[j] = rnd.Rand8(); |
| 339 | dst[j] = rnd.Rand8(); |
| 340 | test_input_block[j] = src[j] - dst[j]; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 341 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 342 | } else { |
| 343 | src16[j] = rnd.Rand16() & mask_; |
| 344 | dst16[j] = rnd.Rand16() & mask_; |
| 345 | test_input_block[j] = src16[j] - dst16[j]; |
| 346 | #endif |
| 347 | } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 348 | } |
| 349 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 350 | ASM_REGISTER_STATE_CHECK( |
| 351 | RunFwdTxfm(test_input_block, test_temp_block, pitch_)); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 352 | if (bit_depth_ == AOM_BITS_8) { |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 353 | ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 354 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 355 | } else { |
| 356 | ASM_REGISTER_STATE_CHECK( |
| 357 | RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_)); |
| 358 | #endif |
| 359 | } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 360 | |
| 361 | for (int j = 0; j < kNumCoeffs; ++j) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 362 | #if CONFIG_AOM_HIGHBITDEPTH |
Yaowu Xu | 6382727 | 2016-05-31 16:54:58 -0700 | [diff] [blame] | 363 | const int32_t diff = |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 364 | bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j]; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 365 | #else |
Yaowu Xu | 6382727 | 2016-05-31 16:54:58 -0700 | [diff] [blame] | 366 | const int32_t diff = dst[j] - src[j]; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 367 | #endif |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 368 | const uint32_t error = diff * diff; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 369 | if (max_error < error) max_error = error; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 370 | total_error += error; |
| 371 | } |
| 372 | } |
| 373 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 374 | EXPECT_GE(1u << 2 * (bit_depth_ - 8), max_error) |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 375 | << "Error: 16x16 FHT/IHT has an individual round trip error > 1"; |
| 376 | |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 377 | EXPECT_GE(count_test_block << 2 * (bit_depth_ - 8), total_error) |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 378 | << "Error: 16x16 FHT/IHT has average round trip error > 1 per block"; |
| 379 | } |
| 380 | |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 381 | void RunCoeffCheck() { |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 382 | ACMRandom rnd(ACMRandom::DeterministicSeed()); |
| 383 | const int count_test_block = 1000; |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 384 | DECLARE_ALIGNED(16, int16_t, input_block[kNumCoeffs]); |
| 385 | DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]); |
| 386 | DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]); |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 387 | |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 388 | for (int i = 0; i < count_test_block; ++i) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 389 | // Initialize a test block with input range [-mask_, mask_]. |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 390 | for (int j = 0; j < kNumCoeffs; ++j) |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 391 | input_block[j] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_); |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 392 | |
| 393 | fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_); |
James Zern | 29e1b1a | 2014-07-09 21:02:02 -0700 | [diff] [blame] | 394 | ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_)); |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 395 | |
| 396 | // The minimum quant value is 4. |
| 397 | for (int j = 0; j < kNumCoeffs; ++j) |
| 398 | EXPECT_EQ(output_block[j], output_ref_block[j]); |
| 399 | } |
| 400 | } |
| 401 | |
| 402 | void RunMemCheck() { |
| 403 | ACMRandom rnd(ACMRandom::DeterministicSeed()); |
| 404 | const int count_test_block = 1000; |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 405 | DECLARE_ALIGNED(16, int16_t, input_extreme_block[kNumCoeffs]); |
| 406 | DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]); |
| 407 | DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]); |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 408 | |
| 409 | for (int i = 0; i < count_test_block; ++i) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 410 | // Initialize a test block with input range [-mask_, mask_]. |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 411 | for (int j = 0; j < kNumCoeffs; ++j) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 412 | input_extreme_block[j] = rnd.Rand8() % 2 ? mask_ : -mask_; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 413 | } |
Jingning Han | 5c2696c | 2014-06-02 16:40:01 -0700 | [diff] [blame] | 414 | if (i == 0) { |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 415 | for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = mask_; |
Jingning Han | 5c2696c | 2014-06-02 16:40:01 -0700 | [diff] [blame] | 416 | } else if (i == 1) { |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 417 | for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = -mask_; |
Jingning Han | 5c2696c | 2014-06-02 16:40:01 -0700 | [diff] [blame] | 418 | } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 419 | |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 420 | fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 421 | ASM_REGISTER_STATE_CHECK( |
| 422 | RunFwdTxfm(input_extreme_block, output_block, pitch_)); |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 423 | |
| 424 | // The minimum quant value is 4. |
| 425 | for (int j = 0; j < kNumCoeffs; ++j) { |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 426 | EXPECT_EQ(output_block[j], output_ref_block[j]); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 427 | EXPECT_GE(4 * DCT_MAX_VALUE << (bit_depth_ - 8), abs(output_block[j])) |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 428 | << "Error: 16x16 FDCT has coefficient larger than 4*DCT_MAX_VALUE"; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 429 | } |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 430 | } |
| 431 | } |
| 432 | |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 433 | void RunQuantCheck(int dc_thred, int ac_thred) { |
| 434 | ACMRandom rnd(ACMRandom::DeterministicSeed()); |
Jingning Han | 12344f2 | 2014-10-06 10:18:17 -0700 | [diff] [blame] | 435 | const int count_test_block = 100000; |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 436 | DECLARE_ALIGNED(16, int16_t, input_extreme_block[kNumCoeffs]); |
| 437 | DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]); |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 438 | |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 439 | DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]); |
| 440 | DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 441 | #if CONFIG_AOM_HIGHBITDEPTH |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 442 | DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]); |
| 443 | DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 444 | #endif |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 445 | |
| 446 | for (int i = 0; i < count_test_block; ++i) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 447 | // Initialize a test block with input range [-mask_, mask_]. |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 448 | for (int j = 0; j < kNumCoeffs; ++j) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 449 | input_extreme_block[j] = rnd.Rand8() % 2 ? mask_ : -mask_; |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 450 | } |
| 451 | if (i == 0) |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 452 | for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = mask_; |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 453 | if (i == 1) |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 454 | for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = -mask_; |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 455 | |
| 456 | fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_); |
| 457 | |
| 458 | // clear reconstructed pixel buffers |
James Zern | f58011a | 2015-04-23 20:47:40 -0700 | [diff] [blame] | 459 | memset(dst, 0, kNumCoeffs * sizeof(uint8_t)); |
| 460 | memset(ref, 0, kNumCoeffs * sizeof(uint8_t)); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 461 | #if CONFIG_AOM_HIGHBITDEPTH |
James Zern | f58011a | 2015-04-23 20:47:40 -0700 | [diff] [blame] | 462 | memset(dst16, 0, kNumCoeffs * sizeof(uint16_t)); |
| 463 | memset(ref16, 0, kNumCoeffs * sizeof(uint16_t)); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 464 | #endif |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 465 | |
| 466 | // quantization with maximum allowed step sizes |
| 467 | output_ref_block[0] = (output_ref_block[0] / dc_thred) * dc_thred; |
| 468 | for (int j = 1; j < kNumCoeffs; ++j) |
| 469 | output_ref_block[j] = (output_ref_block[j] / ac_thred) * ac_thred; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 470 | if (bit_depth_ == AOM_BITS_8) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 471 | inv_txfm_ref(output_ref_block, ref, pitch_, tx_type_); |
| 472 | ASM_REGISTER_STATE_CHECK(RunInvTxfm(output_ref_block, dst, pitch_)); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 473 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 474 | } else { |
| 475 | inv_txfm_ref(output_ref_block, CONVERT_TO_BYTEPTR(ref16), pitch_, |
| 476 | tx_type_); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 477 | ASM_REGISTER_STATE_CHECK( |
| 478 | RunInvTxfm(output_ref_block, CONVERT_TO_BYTEPTR(dst16), pitch_)); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 479 | #endif |
| 480 | } |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 481 | if (bit_depth_ == AOM_BITS_8) { |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 482 | for (int j = 0; j < kNumCoeffs; ++j) EXPECT_EQ(ref[j], dst[j]); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 483 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 484 | } else { |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 485 | for (int j = 0; j < kNumCoeffs; ++j) EXPECT_EQ(ref16[j], dst16[j]); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 486 | #endif |
| 487 | } |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 488 | } |
| 489 | } |
| 490 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 491 | void RunInvAccuracyCheck() { |
| 492 | ACMRandom rnd(ACMRandom::DeterministicSeed()); |
| 493 | const int count_test_block = 1000; |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 494 | DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]); |
| 495 | DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]); |
| 496 | DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]); |
| 497 | DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 498 | #if CONFIG_AOM_HIGHBITDEPTH |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 499 | DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]); |
| 500 | DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 501 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 502 | |
| 503 | for (int i = 0; i < count_test_block; ++i) { |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 504 | double out_r[kNumCoeffs]; |
| 505 | |
| 506 | // Initialize a test block with input range [-255, 255]. |
| 507 | for (int j = 0; j < kNumCoeffs; ++j) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 508 | if (bit_depth_ == AOM_BITS_8) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 509 | src[j] = rnd.Rand8(); |
| 510 | dst[j] = rnd.Rand8(); |
| 511 | in[j] = src[j] - dst[j]; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 512 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 513 | } else { |
| 514 | src16[j] = rnd.Rand16() & mask_; |
| 515 | dst16[j] = rnd.Rand16() & mask_; |
| 516 | in[j] = src16[j] - dst16[j]; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 517 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 518 | } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 519 | } |
| 520 | |
| 521 | reference_16x16_dct_2d(in, out_r); |
| 522 | for (int j = 0; j < kNumCoeffs; ++j) |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 523 | coeff[j] = static_cast<tran_low_t>(round(out_r[j])); |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 524 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 525 | if (bit_depth_ == AOM_BITS_8) { |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 526 | ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, 16)); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 527 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 528 | } else { |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 529 | ASM_REGISTER_STATE_CHECK( |
| 530 | RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16), 16)); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 531 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 532 | } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 533 | |
| 534 | for (int j = 0; j < kNumCoeffs; ++j) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 535 | #if CONFIG_AOM_HIGHBITDEPTH |
Yaowu Xu | 59b969d | 2016-10-24 09:21:09 -0700 | [diff] [blame] | 536 | const int diff = |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 537 | bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j]; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 538 | #else |
Yaowu Xu | 59b969d | 2016-10-24 09:21:09 -0700 | [diff] [blame] | 539 | const int diff = dst[j] - src[j]; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 540 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 541 | const uint32_t error = diff * diff; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 542 | EXPECT_GE(1u, error) << "Error: 16x16 IDCT has error " << error |
| 543 | << " at index " << j; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 544 | } |
| 545 | } |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 546 | } |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 547 | |
| 548 | void CompareInvReference(IdctFunc ref_txfm, int thresh) { |
| 549 | ACMRandom rnd(ACMRandom::DeterministicSeed()); |
| 550 | const int count_test_block = 10000; |
| 551 | const int eob = 10; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 552 | const int16_t *scan = av1_default_scan_orders[TX_16X16].scan; |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 553 | DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]); |
| 554 | DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]); |
| 555 | DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 556 | #if CONFIG_AOM_HIGHBITDEPTH |
James Zern | fd3658b | 2015-05-02 13:24:16 -0700 | [diff] [blame] | 557 | DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]); |
| 558 | DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 559 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 560 | |
| 561 | for (int i = 0; i < count_test_block; ++i) { |
| 562 | for (int j = 0; j < kNumCoeffs; ++j) { |
| 563 | if (j < eob) { |
| 564 | // Random values less than the threshold, either positive or negative |
| 565 | coeff[scan[j]] = rnd(thresh) * (1 - 2 * (i % 2)); |
| 566 | } else { |
| 567 | coeff[scan[j]] = 0; |
| 568 | } |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 569 | if (bit_depth_ == AOM_BITS_8) { |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 570 | dst[j] = 0; |
| 571 | ref[j] = 0; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 572 | #if CONFIG_AOM_HIGHBITDEPTH |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 573 | } else { |
| 574 | dst16[j] = 0; |
| 575 | ref16[j] = 0; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 576 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 577 | } |
| 578 | } |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 579 | if (bit_depth_ == AOM_BITS_8) { |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 580 | ref_txfm(coeff, ref, pitch_); |
| 581 | ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_)); |
| 582 | } else { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 583 | #if CONFIG_AOM_HIGHBITDEPTH |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 584 | ref_txfm(coeff, CONVERT_TO_BYTEPTR(ref16), pitch_); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 585 | ASM_REGISTER_STATE_CHECK( |
| 586 | RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16), pitch_)); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 587 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 588 | } |
| 589 | |
| 590 | for (int j = 0; j < kNumCoeffs; ++j) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 591 | #if CONFIG_AOM_HIGHBITDEPTH |
Yaowu Xu | 59b969d | 2016-10-24 09:21:09 -0700 | [diff] [blame] | 592 | const int diff = |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 593 | bit_depth_ == AOM_BITS_8 ? dst[j] - ref[j] : dst16[j] - ref16[j]; |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 594 | #else |
Yaowu Xu | 59b969d | 2016-10-24 09:21:09 -0700 | [diff] [blame] | 595 | const int diff = dst[j] - ref[j]; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 596 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 597 | const uint32_t error = diff * diff; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 598 | EXPECT_EQ(0u, error) << "Error: 16x16 IDCT Comparison has error " |
| 599 | << error << " at index " << j; |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 600 | } |
| 601 | } |
| 602 | } |
| 603 | |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 604 | int pitch_; |
| 605 | int tx_type_; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 606 | aom_bit_depth_t bit_depth_; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 607 | int mask_; |
James Zern | 44f8484 | 2014-07-16 18:53:33 -0700 | [diff] [blame] | 608 | FhtFunc fwd_txfm_ref; |
| 609 | IhtFunc inv_txfm_ref; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 610 | }; |
| 611 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 612 | class Trans16x16DCT : public Trans16x16TestBase, |
| 613 | public ::testing::TestWithParam<Dct16x16Param> { |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 614 | public: |
| 615 | virtual ~Trans16x16DCT() {} |
| 616 | |
| 617 | virtual void SetUp() { |
| 618 | fwd_txfm_ = GET_PARAM(0); |
| 619 | inv_txfm_ = GET_PARAM(1); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 620 | tx_type_ = GET_PARAM(2); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 621 | bit_depth_ = GET_PARAM(3); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 622 | pitch_ = 16; |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 623 | fwd_txfm_ref = fdct16x16_ref; |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 624 | inv_txfm_ref = idct16x16_ref; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 625 | mask_ = (1 << bit_depth_) - 1; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 626 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 627 | switch (bit_depth_) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 628 | case AOM_BITS_10: inv_txfm_ref = idct16x16_10_ref; break; |
| 629 | case AOM_BITS_12: inv_txfm_ref = idct16x16_12_ref; break; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 630 | default: inv_txfm_ref = idct16x16_ref; break; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 631 | } |
| 632 | #else |
| 633 | inv_txfm_ref = idct16x16_ref; |
| 634 | #endif |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 635 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 636 | virtual void TearDown() { libaom_test::ClearSystemState(); } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 637 | |
| 638 | protected: |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 639 | void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) { |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 640 | fwd_txfm_(in, out, stride); |
| 641 | } |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 642 | void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) { |
Dmitry Kovalev | 1aa7fd5 | 2013-10-18 11:49:33 -0700 | [diff] [blame] | 643 | inv_txfm_(out, dst, stride); |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 644 | } |
| 645 | |
James Zern | 44f8484 | 2014-07-16 18:53:33 -0700 | [diff] [blame] | 646 | FdctFunc fwd_txfm_; |
| 647 | IdctFunc inv_txfm_; |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 648 | }; |
| 649 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 650 | TEST_P(Trans16x16DCT, AccuracyCheck) { RunAccuracyCheck(); } |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 651 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 652 | TEST_P(Trans16x16DCT, CoeffCheck) { RunCoeffCheck(); } |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 653 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 654 | TEST_P(Trans16x16DCT, MemCheck) { RunMemCheck(); } |
Jingning Han | cf768b2 | 2013-07-09 16:16:49 -0700 | [diff] [blame] | 655 | |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 656 | TEST_P(Trans16x16DCT, QuantCheck) { |
| 657 | // Use maximally allowed quantization step sizes for DC and AC |
| 658 | // coefficients respectively. |
| 659 | RunQuantCheck(1336, 1828); |
| 660 | } |
| 661 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 662 | TEST_P(Trans16x16DCT, InvAccuracyCheck) { RunInvAccuracyCheck(); } |
Scott LaVarnway | a272ff2 | 2013-05-15 13:16:02 -0400 | [diff] [blame] | 663 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 664 | class Trans16x16HT : public Trans16x16TestBase, |
| 665 | public ::testing::TestWithParam<Ht16x16Param> { |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 666 | public: |
| 667 | virtual ~Trans16x16HT() {} |
| 668 | |
| 669 | virtual void SetUp() { |
| 670 | fwd_txfm_ = GET_PARAM(0); |
| 671 | inv_txfm_ = GET_PARAM(1); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 672 | tx_type_ = GET_PARAM(2); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 673 | bit_depth_ = GET_PARAM(3); |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 674 | pitch_ = 16; |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 675 | fwd_txfm_ref = fht16x16_ref; |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 676 | inv_txfm_ref = iht16x16_ref; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 677 | mask_ = (1 << bit_depth_) - 1; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 678 | #if CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 679 | switch (bit_depth_) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 680 | case AOM_BITS_10: inv_txfm_ref = iht16x16_10; break; |
| 681 | case AOM_BITS_12: inv_txfm_ref = iht16x16_12; break; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 682 | default: inv_txfm_ref = iht16x16_ref; break; |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 683 | } |
| 684 | #else |
| 685 | inv_txfm_ref = iht16x16_ref; |
| 686 | #endif |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 687 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 688 | virtual void TearDown() { libaom_test::ClearSystemState(); } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 689 | |
| 690 | protected: |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 691 | void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) { |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 692 | fwd_txfm_(in, out, stride, tx_type_); |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 693 | } |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 694 | void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) { |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 695 | inv_txfm_(out, dst, stride, tx_type_); |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 696 | } |
| 697 | |
James Zern | 44f8484 | 2014-07-16 18:53:33 -0700 | [diff] [blame] | 698 | FhtFunc fwd_txfm_; |
| 699 | IhtFunc inv_txfm_; |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 700 | }; |
| 701 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 702 | TEST_P(Trans16x16HT, AccuracyCheck) { RunAccuracyCheck(); } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 703 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 704 | TEST_P(Trans16x16HT, CoeffCheck) { RunCoeffCheck(); } |
Jingning Han | 37705a3 | 2013-09-09 17:07:55 -0700 | [diff] [blame] | 705 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 706 | TEST_P(Trans16x16HT, MemCheck) { RunMemCheck(); } |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 707 | |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 708 | TEST_P(Trans16x16HT, QuantCheck) { |
| 709 | // The encoder skips any non-DC intra prediction modes, |
| 710 | // when the quantization step size goes beyond 988. |
Jingning Han | 12344f2 | 2014-10-06 10:18:17 -0700 | [diff] [blame] | 711 | RunQuantCheck(429, 729); |
Jingning Han | 49b4a27 | 2014-05-29 12:50:54 -0700 | [diff] [blame] | 712 | } |
| 713 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 714 | class InvTrans16x16DCT : public Trans16x16TestBase, |
| 715 | public ::testing::TestWithParam<Idct16x16Param> { |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 716 | public: |
| 717 | virtual ~InvTrans16x16DCT() {} |
| 718 | |
| 719 | virtual void SetUp() { |
| 720 | ref_txfm_ = GET_PARAM(0); |
| 721 | inv_txfm_ = GET_PARAM(1); |
| 722 | thresh_ = GET_PARAM(2); |
| 723 | bit_depth_ = GET_PARAM(3); |
| 724 | pitch_ = 16; |
| 725 | mask_ = (1 << bit_depth_) - 1; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 726 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 727 | virtual void TearDown() { libaom_test::ClearSystemState(); } |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 728 | |
| 729 | protected: |
Urvang Joshi | d71a231 | 2016-07-14 12:33:48 -0700 | [diff] [blame] | 730 | void RunFwdTxfm(int16_t * /*in*/, tran_low_t * /*out*/, int /*stride*/) {} |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 731 | void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) { |
| 732 | inv_txfm_(out, dst, stride); |
| 733 | } |
| 734 | |
| 735 | IdctFunc ref_txfm_; |
| 736 | IdctFunc inv_txfm_; |
| 737 | int thresh_; |
| 738 | }; |
| 739 | |
| 740 | TEST_P(InvTrans16x16DCT, CompareReference) { |
| 741 | CompareInvReference(ref_txfm_, thresh_); |
| 742 | } |
| 743 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 744 | class PartialTrans16x16Test : public ::testing::TestWithParam< |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 745 | std::tr1::tuple<FdctFunc, aom_bit_depth_t> > { |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 746 | public: |
| 747 | virtual ~PartialTrans16x16Test() {} |
| 748 | virtual void SetUp() { |
| 749 | fwd_txfm_ = GET_PARAM(0); |
| 750 | bit_depth_ = GET_PARAM(1); |
| 751 | } |
| 752 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 753 | virtual void TearDown() { libaom_test::ClearSystemState(); } |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 754 | |
| 755 | protected: |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 756 | aom_bit_depth_t bit_depth_; |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 757 | FdctFunc fwd_txfm_; |
| 758 | }; |
| 759 | |
| 760 | TEST_P(PartialTrans16x16Test, Extremes) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 761 | #if CONFIG_AOM_HIGHBITDEPTH |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 762 | const int16_t maxval = |
| 763 | static_cast<int16_t>(clip_pixel_highbd(1 << 30, bit_depth_)); |
| 764 | #else |
| 765 | const int16_t maxval = 255; |
| 766 | #endif |
| 767 | const int minval = -maxval; |
| 768 | DECLARE_ALIGNED(16, int16_t, input[kNumCoeffs]); |
| 769 | DECLARE_ALIGNED(16, tran_low_t, output[kNumCoeffs]); |
| 770 | |
| 771 | for (int i = 0; i < kNumCoeffs; ++i) input[i] = maxval; |
| 772 | output[0] = 0; |
| 773 | ASM_REGISTER_STATE_CHECK(fwd_txfm_(input, output, 16)); |
| 774 | EXPECT_EQ((maxval * kNumCoeffs) >> 1, output[0]); |
| 775 | |
| 776 | for (int i = 0; i < kNumCoeffs; ++i) input[i] = minval; |
| 777 | output[0] = 0; |
| 778 | ASM_REGISTER_STATE_CHECK(fwd_txfm_(input, output, 16)); |
| 779 | EXPECT_EQ((minval * kNumCoeffs) >> 1, output[0]); |
| 780 | } |
| 781 | |
| 782 | TEST_P(PartialTrans16x16Test, Random) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 783 | #if CONFIG_AOM_HIGHBITDEPTH |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 784 | const int16_t maxval = |
| 785 | static_cast<int16_t>(clip_pixel_highbd(1 << 30, bit_depth_)); |
| 786 | #else |
| 787 | const int16_t maxval = 255; |
| 788 | #endif |
| 789 | DECLARE_ALIGNED(16, int16_t, input[kNumCoeffs]); |
| 790 | DECLARE_ALIGNED(16, tran_low_t, output[kNumCoeffs]); |
| 791 | ACMRandom rnd(ACMRandom::DeterministicSeed()); |
| 792 | |
| 793 | int sum = 0; |
| 794 | for (int i = 0; i < kNumCoeffs; ++i) { |
| 795 | const int val = (i & 1) ? -rnd(maxval + 1) : rnd(maxval + 1); |
| 796 | input[i] = val; |
| 797 | sum += val; |
| 798 | } |
| 799 | output[0] = 0; |
| 800 | ASM_REGISTER_STATE_CHECK(fwd_txfm_(input, output, 16)); |
| 801 | EXPECT_EQ(sum >> 1, output[0]); |
| 802 | } |
| 803 | |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 804 | using std::tr1::make_tuple; |
| 805 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 806 | #if CONFIG_AOM_HIGHBITDEPTH |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 807 | INSTANTIATE_TEST_CASE_P( |
| 808 | C, Trans16x16DCT, |
| 809 | ::testing::Values( |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 810 | make_tuple(&aom_highbd_fdct16x16_c, &idct16x16_10, 0, AOM_BITS_10), |
| 811 | make_tuple(&aom_highbd_fdct16x16_c, &idct16x16_12, 0, AOM_BITS_12), |
| 812 | make_tuple(&aom_fdct16x16_c, &aom_idct16x16_256_add_c, 0, AOM_BITS_8))); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 813 | #else |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 814 | INSTANTIATE_TEST_CASE_P(C, Trans16x16DCT, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 815 | ::testing::Values(make_tuple(&aom_fdct16x16_c, |
| 816 | &aom_idct16x16_256_add_c, |
| 817 | 0, AOM_BITS_8))); |
| 818 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 819 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 820 | #if CONFIG_AOM_HIGHBITDEPTH |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 821 | INSTANTIATE_TEST_CASE_P( |
| 822 | C, Trans16x16HT, |
| 823 | ::testing::Values( |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 824 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_10, 0, AOM_BITS_10), |
| 825 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_10, 1, AOM_BITS_10), |
| 826 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_10, 2, AOM_BITS_10), |
| 827 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_10, 3, AOM_BITS_10), |
| 828 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_12, 0, AOM_BITS_12), |
| 829 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_12, 1, AOM_BITS_12), |
| 830 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_12, 2, AOM_BITS_12), |
| 831 | make_tuple(&av1_highbd_fht16x16_c, &iht16x16_12, 3, AOM_BITS_12), |
| 832 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 0, AOM_BITS_8), |
| 833 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 1, AOM_BITS_8), |
| 834 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 2, AOM_BITS_8), |
| 835 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 3, AOM_BITS_8))); |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 836 | INSTANTIATE_TEST_CASE_P( |
| 837 | C, PartialTrans16x16Test, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 838 | ::testing::Values(make_tuple(&aom_highbd_fdct16x16_1_c, AOM_BITS_8), |
| 839 | make_tuple(&aom_highbd_fdct16x16_1_c, AOM_BITS_10), |
| 840 | make_tuple(&aom_highbd_fdct16x16_1_c, AOM_BITS_12))); |
Deb Mukherjee | 10783d4 | 2014-09-02 16:34:09 -0700 | [diff] [blame] | 841 | #else |
| 842 | INSTANTIATE_TEST_CASE_P( |
| 843 | C, Trans16x16HT, |
| 844 | ::testing::Values( |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 845 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 0, AOM_BITS_8), |
| 846 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 1, AOM_BITS_8), |
| 847 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 2, AOM_BITS_8), |
| 848 | make_tuple(&av1_fht16x16_c, &av1_iht16x16_256_add_c, 3, AOM_BITS_8))); |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 849 | INSTANTIATE_TEST_CASE_P(C, PartialTrans16x16Test, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 850 | ::testing::Values(make_tuple(&aom_fdct16x16_1_c, |
| 851 | AOM_BITS_8))); |
| 852 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 853 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 854 | #if HAVE_NEON_ASM && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
James Zern | adbb881 | 2014-02-25 23:11:49 -0800 | [diff] [blame] | 855 | INSTANTIATE_TEST_CASE_P( |
| 856 | NEON, Trans16x16DCT, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 857 | ::testing::Values(make_tuple(&aom_fdct16x16_c, &aom_idct16x16_256_add_neon, |
| 858 | 0, AOM_BITS_8))); |
James Zern | adbb881 | 2014-02-25 23:11:49 -0800 | [diff] [blame] | 859 | #endif |
| 860 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 861 | #if HAVE_SSE2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 862 | INSTANTIATE_TEST_CASE_P( |
| 863 | SSE2, Trans16x16DCT, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 864 | ::testing::Values(make_tuple(&aom_fdct16x16_sse2, |
| 865 | &aom_idct16x16_256_add_sse2, 0, AOM_BITS_8))); |
Jingning Han | 8f92a7e | 2013-09-05 12:44:03 -0700 | [diff] [blame] | 866 | INSTANTIATE_TEST_CASE_P( |
| 867 | SSE2, Trans16x16HT, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 868 | ::testing::Values(make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_sse2, |
| 869 | 0, AOM_BITS_8), |
| 870 | make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_sse2, |
| 871 | 1, AOM_BITS_8), |
| 872 | make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_sse2, |
| 873 | 2, AOM_BITS_8), |
| 874 | make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_sse2, |
| 875 | 3, AOM_BITS_8))); |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 876 | INSTANTIATE_TEST_CASE_P(SSE2, PartialTrans16x16Test, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 877 | ::testing::Values(make_tuple(&aom_fdct16x16_1_sse2, |
| 878 | AOM_BITS_8))); |
| 879 | #endif // HAVE_SSE2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 880 | |
Yi Luo | e8e8cd8 | 2016-09-21 10:45:01 -0700 | [diff] [blame] | 881 | #if HAVE_AVX2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
| 882 | INSTANTIATE_TEST_CASE_P(AVX2, PartialTrans16x16Test, |
| 883 | ::testing::Values(make_tuple(&aom_fdct16x16_1_avx2, |
| 884 | AOM_BITS_8))); |
| 885 | #endif // HAVE_AVX2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
| 886 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 887 | #if HAVE_SSE2 && CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 888 | INSTANTIATE_TEST_CASE_P( |
| 889 | SSE2, Trans16x16DCT, |
| 890 | ::testing::Values( |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 891 | make_tuple(&aom_highbd_fdct16x16_sse2, &idct16x16_10, 0, AOM_BITS_10), |
| 892 | make_tuple(&aom_highbd_fdct16x16_c, &idct16x16_256_add_10_sse2, 0, |
| 893 | AOM_BITS_10), |
| 894 | make_tuple(&aom_highbd_fdct16x16_sse2, &idct16x16_12, 0, AOM_BITS_12), |
| 895 | make_tuple(&aom_highbd_fdct16x16_c, &idct16x16_256_add_12_sse2, 0, |
| 896 | AOM_BITS_12), |
| 897 | make_tuple(&aom_fdct16x16_sse2, &aom_idct16x16_256_add_c, 0, |
| 898 | AOM_BITS_8))); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 899 | INSTANTIATE_TEST_CASE_P( |
| 900 | SSE2, Trans16x16HT, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 901 | ::testing::Values( |
| 902 | make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_c, 0, AOM_BITS_8), |
| 903 | make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_c, 1, AOM_BITS_8), |
| 904 | make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_c, 2, AOM_BITS_8), |
| 905 | make_tuple(&av1_fht16x16_sse2, &av1_iht16x16_256_add_c, 3, |
| 906 | AOM_BITS_8))); |
Peter de Rivaz | 7e40a55 | 2014-10-24 08:48:02 +0100 | [diff] [blame] | 907 | // Optimizations take effect at a threshold of 3155, so we use a value close to |
| 908 | // that to test both branches. |
| 909 | INSTANTIATE_TEST_CASE_P( |
| 910 | SSE2, InvTrans16x16DCT, |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 911 | ::testing::Values(make_tuple(&idct16x16_10_add_10_c, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 912 | &idct16x16_10_add_10_sse2, 3167, AOM_BITS_10), |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 913 | make_tuple(&idct16x16_10, &idct16x16_256_add_10_sse2, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 914 | 3167, AOM_BITS_10), |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 915 | make_tuple(&idct16x16_10_add_12_c, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 916 | &idct16x16_10_add_12_sse2, 3167, AOM_BITS_12), |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 917 | make_tuple(&idct16x16_12, &idct16x16_256_add_12_sse2, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 918 | 3167, AOM_BITS_12))); |
Yi Luo | fbf5681 | 2016-09-02 11:46:46 -0700 | [diff] [blame] | 919 | // TODO(luoyi): |
| 920 | // For this test case, we should test function: aom_highbd_fdct16x16_1_sse2. |
| 921 | // However this function is not available yet. if we mistakely test |
| 922 | // aom_fdct16x16_1_sse2, it could only pass AOM_BITS_8/AOM_BITS_10 but not |
| 923 | // AOM_BITS_12. |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 924 | INSTANTIATE_TEST_CASE_P(SSE2, PartialTrans16x16Test, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 925 | ::testing::Values(make_tuple(&aom_fdct16x16_1_sse2, |
| 926 | AOM_BITS_8))); |
| 927 | #endif // HAVE_SSE2 && CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
Parag Salasakar | 60052b6 | 2015-05-04 13:45:55 +0530 | [diff] [blame] | 928 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 929 | #if HAVE_MSA && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 930 | INSTANTIATE_TEST_CASE_P(MSA, Trans16x16DCT, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 931 | ::testing::Values(make_tuple(&aom_fdct16x16_msa, |
| 932 | &aom_idct16x16_256_add_msa, |
| 933 | 0, AOM_BITS_8))); |
James Zern | 1c25b7f | 2016-08-13 10:58:54 -0700 | [diff] [blame] | 934 | #if !CONFIG_EXT_TX |
Parag Salasakar | 60052b6 | 2015-05-04 13:45:55 +0530 | [diff] [blame] | 935 | INSTANTIATE_TEST_CASE_P( |
| 936 | MSA, Trans16x16HT, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 937 | ::testing::Values( |
| 938 | make_tuple(&av1_fht16x16_msa, &av1_iht16x16_256_add_msa, 0, AOM_BITS_8), |
| 939 | make_tuple(&av1_fht16x16_msa, &av1_iht16x16_256_add_msa, 1, AOM_BITS_8), |
| 940 | make_tuple(&av1_fht16x16_msa, &av1_iht16x16_256_add_msa, 2, AOM_BITS_8), |
| 941 | make_tuple(&av1_fht16x16_msa, &av1_iht16x16_256_add_msa, 3, |
| 942 | AOM_BITS_8))); |
James Zern | 1c25b7f | 2016-08-13 10:58:54 -0700 | [diff] [blame] | 943 | #endif // !CONFIG_EXT_TX |
James Zern | eb64ea3 | 2016-03-29 21:04:38 -0700 | [diff] [blame] | 944 | INSTANTIATE_TEST_CASE_P(MSA, PartialTrans16x16Test, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 945 | ::testing::Values(make_tuple(&aom_fdct16x16_1_msa, |
| 946 | AOM_BITS_8))); |
| 947 | #endif // HAVE_MSA && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE |
Daniel Kang | fed8a18 | 2012-08-02 17:03:14 -0700 | [diff] [blame] | 948 | } // namespace |