blob: cb2fbd538e449258a0cec402f8c2b8cfea3b119e [file] [log] [blame]
Ronald S. Bultjec456b352012-12-07 14:45:05 -08001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Ronald S. Bultjec456b352012-12-07 14:45:05 -08003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * 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*/
Ronald S. Bultjec456b352012-12-07 14:45:05 -080011
12#include <math.h>
13#include <stdlib.h>
14#include <string.h>
15
Jingning Hana6a46592015-07-27 16:05:15 -070016#include "third_party/googletest/src/include/gtest/gtest.h"
Ronald S. Bultjec456b352012-12-07 14:45:05 -080017
Yaowu Xuf883b422016-08-30 14:01:10 -070018#include "./av1_rtcd.h"
19#include "./aom_config.h"
20#include "./aom_dsp_rtcd.h"
Jingning Han097d59c2015-07-29 14:51:36 -070021#include "test/acm_random.h"
22#include "test/clear_system_state.h"
23#include "test/register_state_check.h"
24#include "test/util.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070025#include "av1/common/entropy.h"
Yaowu Xuf883b422016-08-30 14:01:10 -070026#include "aom/aom_codec.h"
27#include "aom/aom_integer.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070028#include "aom_ports/mem.h"
29#include "aom_ports/msvc.h" // for round()
Ronald S. Bultjec456b352012-12-07 14:45:05 -080030
Yaowu Xuc27fc142016-08-22 16:08:15 -070031using libaom_test::ACMRandom;
Ronald S. Bultjec456b352012-12-07 14:45:05 -080032
33namespace {
Ronald S. Bultjec456b352012-12-07 14:45:05 -080034
Jingning Han4ad52a82013-09-03 11:57:34 -070035const int kNumCoeffs = 1024;
36const double kPi = 3.141592653589793238462643383279502884;
James Zerneb2f0002014-08-22 12:29:37 -070037void reference_32x32_dct_1d(const double in[32], double out[32]) {
Ronald S. Bultjec456b352012-12-07 14:45:05 -080038 const double kInvSqrt2 = 0.707106781186547524400844362104;
39 for (int k = 0; k < 32; k++) {
40 out[k] = 0.0;
41 for (int n = 0; n < 32; n++)
42 out[k] += in[n] * cos(kPi * (2 * n + 1) * k / 64.0);
clang-format3a826f12016-08-11 17:46:05 -070043 if (k == 0) out[k] = out[k] * kInvSqrt2;
Ronald S. Bultjec456b352012-12-07 14:45:05 -080044 }
45}
46
Jingning Han4ad52a82013-09-03 11:57:34 -070047void reference_32x32_dct_2d(const int16_t input[kNumCoeffs],
48 double output[kNumCoeffs]) {
Ronald S. Bultjec456b352012-12-07 14:45:05 -080049 // First transform columns
50 for (int i = 0; i < 32; ++i) {
51 double temp_in[32], temp_out[32];
clang-format3a826f12016-08-11 17:46:05 -070052 for (int j = 0; j < 32; ++j) temp_in[j] = input[j * 32 + i];
James Zerneb2f0002014-08-22 12:29:37 -070053 reference_32x32_dct_1d(temp_in, temp_out);
clang-format3a826f12016-08-11 17:46:05 -070054 for (int j = 0; j < 32; ++j) output[j * 32 + i] = temp_out[j];
Ronald S. Bultjec456b352012-12-07 14:45:05 -080055 }
56 // Then transform rows
57 for (int i = 0; i < 32; ++i) {
58 double temp_in[32], temp_out[32];
clang-format3a826f12016-08-11 17:46:05 -070059 for (int j = 0; j < 32; ++j) temp_in[j] = output[j + i * 32];
James Zerneb2f0002014-08-22 12:29:37 -070060 reference_32x32_dct_1d(temp_in, temp_out);
Ronald S. Bultjec456b352012-12-07 14:45:05 -080061 // Scale by some magic number
clang-format3a826f12016-08-11 17:46:05 -070062 for (int j = 0; j < 32; ++j) output[j + i * 32] = temp_out[j] / 4;
Ronald S. Bultjec456b352012-12-07 14:45:05 -080063 }
64}
65
Deb Mukherjee10783d42014-09-02 16:34:09 -070066typedef void (*FwdTxfmFunc)(const int16_t *in, tran_low_t *out, int stride);
67typedef void (*InvTxfmFunc)(const tran_low_t *in, uint8_t *out, int stride);
Ronald S. Bultjec456b352012-12-07 14:45:05 -080068
Yaowu Xuf883b422016-08-30 14:01:10 -070069typedef std::tr1::tuple<FwdTxfmFunc, InvTxfmFunc, int, aom_bit_depth_t>
Deb Mukherjee10783d42014-09-02 16:34:09 -070070 Trans32x32Param;
71
Yaowu Xuf883b422016-08-30 14:01:10 -070072#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee10783d42014-09-02 16:34:09 -070073void idct32x32_10(const tran_low_t *in, uint8_t *out, int stride) {
Yaowu Xuf883b422016-08-30 14:01:10 -070074 aom_highbd_idct32x32_1024_add_c(in, out, stride, 10);
Deb Mukherjee10783d42014-09-02 16:34:09 -070075}
76
77void idct32x32_12(const tran_low_t *in, uint8_t *out, int stride) {
Yaowu Xuf883b422016-08-30 14:01:10 -070078 aom_highbd_idct32x32_1024_add_c(in, out, stride, 12);
Deb Mukherjee10783d42014-09-02 16:34:09 -070079}
Yaowu Xuf883b422016-08-30 14:01:10 -070080#endif // CONFIG_AOM_HIGHBITDEPTH
Joshua Litt51490e52013-11-18 17:07:55 -080081
James Zernfd38e702014-07-16 18:54:31 -070082class Trans32x32Test : public ::testing::TestWithParam<Trans32x32Param> {
Jingning Han4ad52a82013-09-03 11:57:34 -070083 public:
84 virtual ~Trans32x32Test() {}
85 virtual void SetUp() {
86 fwd_txfm_ = GET_PARAM(0);
87 inv_txfm_ = GET_PARAM(1);
clang-format3a826f12016-08-11 17:46:05 -070088 version_ = GET_PARAM(2); // 0: high precision forward transform
89 // 1: low precision version for rd loop
Deb Mukherjee10783d42014-09-02 16:34:09 -070090 bit_depth_ = GET_PARAM(3);
91 mask_ = (1 << bit_depth_) - 1;
Jingning Han4ad52a82013-09-03 11:57:34 -070092 }
93
Yaowu Xuc27fc142016-08-22 16:08:15 -070094 virtual void TearDown() { libaom_test::ClearSystemState(); }
Jingning Han4ad52a82013-09-03 11:57:34 -070095
96 protected:
97 int version_;
Yaowu Xuf883b422016-08-30 14:01:10 -070098 aom_bit_depth_t bit_depth_;
Deb Mukherjee10783d42014-09-02 16:34:09 -070099 int mask_;
James Zernfd38e702014-07-16 18:54:31 -0700100 FwdTxfmFunc fwd_txfm_;
101 InvTxfmFunc inv_txfm_;
Jingning Han4ad52a82013-09-03 11:57:34 -0700102};
103
104TEST_P(Trans32x32Test, AccuracyCheck) {
105 ACMRandom rnd(ACMRandom::DeterministicSeed());
106 uint32_t max_error = 0;
107 int64_t total_error = 0;
Peter de Rivaz7e40a552014-10-24 08:48:02 +0100108 const int count_test_block = 10000;
James Zernfd3658b2015-05-02 13:24:16 -0700109 DECLARE_ALIGNED(16, int16_t, test_input_block[kNumCoeffs]);
110 DECLARE_ALIGNED(16, tran_low_t, test_temp_block[kNumCoeffs]);
111 DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
112 DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
Yaowu Xuf883b422016-08-30 14:01:10 -0700113#if CONFIG_AOM_HIGHBITDEPTH
James Zernfd3658b2015-05-02 13:24:16 -0700114 DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
115 DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
Deb Mukherjee10783d42014-09-02 16:34:09 -0700116#endif
Jingning Han4ad52a82013-09-03 11:57:34 -0700117
118 for (int i = 0; i < count_test_block; ++i) {
Deb Mukherjee10783d42014-09-02 16:34:09 -0700119 // Initialize a test block with input range [-mask_, mask_].
Jingning Han4ad52a82013-09-03 11:57:34 -0700120 for (int j = 0; j < kNumCoeffs; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700121 if (bit_depth_ == AOM_BITS_8) {
Deb Mukherjee10783d42014-09-02 16:34:09 -0700122 src[j] = rnd.Rand8();
123 dst[j] = rnd.Rand8();
124 test_input_block[j] = src[j] - dst[j];
Yaowu Xuf883b422016-08-30 14:01:10 -0700125#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee10783d42014-09-02 16:34:09 -0700126 } else {
127 src16[j] = rnd.Rand16() & mask_;
128 dst16[j] = rnd.Rand16() & mask_;
129 test_input_block[j] = src16[j] - dst16[j];
130#endif
131 }
Scott LaVarnway2cf0d4b2013-05-14 11:58:13 -0400132 }
Jingning Han4ad52a82013-09-03 11:57:34 -0700133
James Zern29e1b1a2014-07-09 21:02:02 -0700134 ASM_REGISTER_STATE_CHECK(fwd_txfm_(test_input_block, test_temp_block, 32));
Yaowu Xuf883b422016-08-30 14:01:10 -0700135 if (bit_depth_ == AOM_BITS_8) {
Deb Mukherjee10783d42014-09-02 16:34:09 -0700136 ASM_REGISTER_STATE_CHECK(inv_txfm_(test_temp_block, dst, 32));
Yaowu Xuf883b422016-08-30 14:01:10 -0700137#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee10783d42014-09-02 16:34:09 -0700138 } else {
clang-format3a826f12016-08-11 17:46:05 -0700139 ASM_REGISTER_STATE_CHECK(
140 inv_txfm_(test_temp_block, CONVERT_TO_BYTEPTR(dst16), 32));
Deb Mukherjee10783d42014-09-02 16:34:09 -0700141#endif
142 }
Jingning Han4ad52a82013-09-03 11:57:34 -0700143
144 for (int j = 0; j < kNumCoeffs; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700145#if CONFIG_AOM_HIGHBITDEPTH
Yaowu Xu63827272016-05-31 16:54:58 -0700146 const int32_t diff =
Yaowu Xuf883b422016-08-30 14:01:10 -0700147 bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
Deb Mukherjee10783d42014-09-02 16:34:09 -0700148#else
Yaowu Xu63827272016-05-31 16:54:58 -0700149 const int32_t diff = dst[j] - src[j];
Deb Mukherjee10783d42014-09-02 16:34:09 -0700150#endif
Jingning Han4ad52a82013-09-03 11:57:34 -0700151 const uint32_t error = diff * diff;
clang-format3a826f12016-08-11 17:46:05 -0700152 if (max_error < error) max_error = error;
Jingning Han4ad52a82013-09-03 11:57:34 -0700153 total_error += error;
154 }
155 }
156
157 if (version_ == 1) {
158 max_error /= 2;
159 total_error /= 45;
160 }
161
Deb Mukherjee10783d42014-09-02 16:34:09 -0700162 EXPECT_GE(1u << 2 * (bit_depth_ - 8), max_error)
Jingning Han4ad52a82013-09-03 11:57:34 -0700163 << "Error: 32x32 FDCT/IDCT has an individual round-trip error > 1";
164
Deb Mukherjee10783d42014-09-02 16:34:09 -0700165 EXPECT_GE(count_test_block << 2 * (bit_depth_ - 8), total_error)
Jingning Han4ad52a82013-09-03 11:57:34 -0700166 << "Error: 32x32 FDCT/IDCT has average round-trip error > 1 per block";
167}
168
169TEST_P(Trans32x32Test, CoeffCheck) {
170 ACMRandom rnd(ACMRandom::DeterministicSeed());
171 const int count_test_block = 1000;
172
James Zernfd3658b2015-05-02 13:24:16 -0700173 DECLARE_ALIGNED(16, int16_t, input_block[kNumCoeffs]);
174 DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]);
175 DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]);
Jingning Han4ad52a82013-09-03 11:57:34 -0700176
177 for (int i = 0; i < count_test_block; ++i) {
178 for (int j = 0; j < kNumCoeffs; ++j)
Deb Mukherjee10783d42014-09-02 16:34:09 -0700179 input_block[j] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
Jingning Han4ad52a82013-09-03 11:57:34 -0700180
Dmitry Kovaleve05412f2013-10-17 13:02:28 -0700181 const int stride = 32;
Yaowu Xuf883b422016-08-30 14:01:10 -0700182 aom_fdct32x32_c(input_block, output_ref_block, stride);
James Zern29e1b1a2014-07-09 21:02:02 -0700183 ASM_REGISTER_STATE_CHECK(fwd_txfm_(input_block, output_block, stride));
Jingning Han4ad52a82013-09-03 11:57:34 -0700184
185 if (version_ == 0) {
186 for (int j = 0; j < kNumCoeffs; ++j)
187 EXPECT_EQ(output_block[j], output_ref_block[j])
188 << "Error: 32x32 FDCT versions have mismatched coefficients";
189 } else {
190 for (int j = 0; j < kNumCoeffs; ++j)
191 EXPECT_GE(6, abs(output_block[j] - output_ref_block[j]))
192 << "Error: 32x32 FDCT rd has mismatched coefficients";
193 }
194 }
195}
196
197TEST_P(Trans32x32Test, MemCheck) {
198 ACMRandom rnd(ACMRandom::DeterministicSeed());
199 const int count_test_block = 2000;
200
James Zernfd3658b2015-05-02 13:24:16 -0700201 DECLARE_ALIGNED(16, int16_t, input_extreme_block[kNumCoeffs]);
202 DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]);
203 DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]);
Jingning Han4ad52a82013-09-03 11:57:34 -0700204
205 for (int i = 0; i < count_test_block; ++i) {
Deb Mukherjee10783d42014-09-02 16:34:09 -0700206 // Initialize a test block with input range [-mask_, mask_].
Jingning Han4ad52a82013-09-03 11:57:34 -0700207 for (int j = 0; j < kNumCoeffs; ++j) {
Deb Mukherjee10783d42014-09-02 16:34:09 -0700208 input_extreme_block[j] = rnd.Rand8() & 1 ? mask_ : -mask_;
Jingning Han4ad52a82013-09-03 11:57:34 -0700209 }
Jingning Han5c2696c2014-06-02 16:40:01 -0700210 if (i == 0) {
clang-format3a826f12016-08-11 17:46:05 -0700211 for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = mask_;
Jingning Han5c2696c2014-06-02 16:40:01 -0700212 } else if (i == 1) {
clang-format3a826f12016-08-11 17:46:05 -0700213 for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = -mask_;
Jingning Han5c2696c2014-06-02 16:40:01 -0700214 }
Jingning Han4ad52a82013-09-03 11:57:34 -0700215
Dmitry Kovaleve05412f2013-10-17 13:02:28 -0700216 const int stride = 32;
Yaowu Xuf883b422016-08-30 14:01:10 -0700217 aom_fdct32x32_c(input_extreme_block, output_ref_block, stride);
James Zern29e1b1a2014-07-09 21:02:02 -0700218 ASM_REGISTER_STATE_CHECK(
219 fwd_txfm_(input_extreme_block, output_block, stride));
Jingning Han4ad52a82013-09-03 11:57:34 -0700220
221 // The minimum quant value is 4.
222 for (int j = 0; j < kNumCoeffs; ++j) {
223 if (version_ == 0) {
224 EXPECT_EQ(output_block[j], output_ref_block[j])
225 << "Error: 32x32 FDCT versions have mismatched coefficients";
226 } else {
227 EXPECT_GE(6, abs(output_block[j] - output_ref_block[j]))
228 << "Error: 32x32 FDCT rd has mismatched coefficients";
229 }
Deb Mukherjee10783d42014-09-02 16:34:09 -0700230 EXPECT_GE(4 * DCT_MAX_VALUE << (bit_depth_ - 8), abs(output_ref_block[j]))
Jingning Han4ad52a82013-09-03 11:57:34 -0700231 << "Error: 32x32 FDCT C has coefficient larger than 4*DCT_MAX_VALUE";
Deb Mukherjee10783d42014-09-02 16:34:09 -0700232 EXPECT_GE(4 * DCT_MAX_VALUE << (bit_depth_ - 8), abs(output_block[j]))
Jingning Han4ad52a82013-09-03 11:57:34 -0700233 << "Error: 32x32 FDCT has coefficient larger than "
234 << "4*DCT_MAX_VALUE";
235 }
236 }
237}
238
239TEST_P(Trans32x32Test, InverseAccuracy) {
240 ACMRandom rnd(ACMRandom::DeterministicSeed());
241 const int count_test_block = 1000;
James Zernfd3658b2015-05-02 13:24:16 -0700242 DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]);
243 DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
244 DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
245 DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
Yaowu Xuf883b422016-08-30 14:01:10 -0700246#if CONFIG_AOM_HIGHBITDEPTH
James Zernfd3658b2015-05-02 13:24:16 -0700247 DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
248 DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
Deb Mukherjee10783d42014-09-02 16:34:09 -0700249#endif
Jingning Han4ad52a82013-09-03 11:57:34 -0700250
251 for (int i = 0; i < count_test_block; ++i) {
252 double out_r[kNumCoeffs];
253
254 // Initialize a test block with input range [-255, 255]
255 for (int j = 0; j < kNumCoeffs; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700256 if (bit_depth_ == AOM_BITS_8) {
Deb Mukherjee10783d42014-09-02 16:34:09 -0700257 src[j] = rnd.Rand8();
258 dst[j] = rnd.Rand8();
259 in[j] = src[j] - dst[j];
Yaowu Xuf883b422016-08-30 14:01:10 -0700260#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee10783d42014-09-02 16:34:09 -0700261 } else {
262 src16[j] = rnd.Rand16() & mask_;
263 dst16[j] = rnd.Rand16() & mask_;
264 in[j] = src16[j] - dst16[j];
265#endif
266 }
Jingning Han4ad52a82013-09-03 11:57:34 -0700267 }
Ronald S. Bultjec456b352012-12-07 14:45:05 -0800268
269 reference_32x32_dct_2d(in, out_r);
Jingning Han4ad52a82013-09-03 11:57:34 -0700270 for (int j = 0; j < kNumCoeffs; ++j)
Peter de Rivaz7e40a552014-10-24 08:48:02 +0100271 coeff[j] = static_cast<tran_low_t>(round(out_r[j]));
Yaowu Xuf883b422016-08-30 14:01:10 -0700272 if (bit_depth_ == AOM_BITS_8) {
Deb Mukherjee10783d42014-09-02 16:34:09 -0700273 ASM_REGISTER_STATE_CHECK(inv_txfm_(coeff, dst, 32));
Yaowu Xuf883b422016-08-30 14:01:10 -0700274#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee10783d42014-09-02 16:34:09 -0700275 } else {
276 ASM_REGISTER_STATE_CHECK(inv_txfm_(coeff, CONVERT_TO_BYTEPTR(dst16), 32));
277#endif
278 }
Jingning Han4ad52a82013-09-03 11:57:34 -0700279 for (int j = 0; j < kNumCoeffs; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700280#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee10783d42014-09-02 16:34:09 -0700281 const int diff =
Yaowu Xuf883b422016-08-30 14:01:10 -0700282 bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
Deb Mukherjee10783d42014-09-02 16:34:09 -0700283#else
Scott LaVarnway2cf0d4b2013-05-14 11:58:13 -0400284 const int diff = dst[j] - src[j];
Deb Mukherjee10783d42014-09-02 16:34:09 -0700285#endif
Ronald S. Bultjec456b352012-12-07 14:45:05 -0800286 const int error = diff * diff;
clang-format3a826f12016-08-11 17:46:05 -0700287 EXPECT_GE(1, error) << "Error: 32x32 IDCT has error " << error
288 << " at index " << j;
Ronald S. Bultjec456b352012-12-07 14:45:05 -0800289 }
Ronald S. Bultjec456b352012-12-07 14:45:05 -0800290 }
291}
Paul Wilkins649be942013-02-11 12:35:28 +0000292
James Zern0269df42016-03-29 21:04:38 -0700293class PartialTrans32x32Test
294 : public ::testing::TestWithParam<
Yaowu Xuf883b422016-08-30 14:01:10 -0700295 std::tr1::tuple<FwdTxfmFunc, aom_bit_depth_t> > {
James Zern0269df42016-03-29 21:04:38 -0700296 public:
297 virtual ~PartialTrans32x32Test() {}
298 virtual void SetUp() {
299 fwd_txfm_ = GET_PARAM(0);
300 bit_depth_ = GET_PARAM(1);
301 }
302
Yaowu Xuc27fc142016-08-22 16:08:15 -0700303 virtual void TearDown() { libaom_test::ClearSystemState(); }
James Zern0269df42016-03-29 21:04:38 -0700304
305 protected:
Yaowu Xuf883b422016-08-30 14:01:10 -0700306 aom_bit_depth_t bit_depth_;
James Zern0269df42016-03-29 21:04:38 -0700307 FwdTxfmFunc fwd_txfm_;
308};
309
310TEST_P(PartialTrans32x32Test, Extremes) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700311#if CONFIG_AOM_HIGHBITDEPTH
James Zern0269df42016-03-29 21:04:38 -0700312 const int16_t maxval =
313 static_cast<int16_t>(clip_pixel_highbd(1 << 30, bit_depth_));
314#else
315 const int16_t maxval = 255;
316#endif
317 const int minval = -maxval;
318 DECLARE_ALIGNED(16, int16_t, input[kNumCoeffs]);
319 DECLARE_ALIGNED(16, tran_low_t, output[kNumCoeffs]);
320
321 for (int i = 0; i < kNumCoeffs; ++i) input[i] = maxval;
322 output[0] = 0;
323 ASM_REGISTER_STATE_CHECK(fwd_txfm_(input, output, 32));
324 EXPECT_EQ((maxval * kNumCoeffs) >> 3, output[0]);
325
326 for (int i = 0; i < kNumCoeffs; ++i) input[i] = minval;
327 output[0] = 0;
328 ASM_REGISTER_STATE_CHECK(fwd_txfm_(input, output, 32));
329 EXPECT_EQ((minval * kNumCoeffs) >> 3, output[0]);
330}
331
James Zernc98f8e02016-04-01 19:44:23 -0700332TEST_P(PartialTrans32x32Test, Random) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700333#if CONFIG_AOM_HIGHBITDEPTH
James Zernc98f8e02016-04-01 19:44:23 -0700334 const int16_t maxval =
335 static_cast<int16_t>(clip_pixel_highbd(1 << 30, bit_depth_));
336#else
337 const int16_t maxval = 255;
338#endif
339 DECLARE_ALIGNED(16, int16_t, input[kNumCoeffs]);
340 DECLARE_ALIGNED(16, tran_low_t, output[kNumCoeffs]);
341 ACMRandom rnd(ACMRandom::DeterministicSeed());
342
343 int sum = 0;
344 for (int i = 0; i < kNumCoeffs; ++i) {
345 const int val = (i & 1) ? -rnd(maxval + 1) : rnd(maxval + 1);
346 input[i] = val;
347 sum += val;
348 }
349 output[0] = 0;
350 ASM_REGISTER_STATE_CHECK(fwd_txfm_(input, output, 32));
351 EXPECT_EQ(sum >> 3, output[0]);
352}
353
Jingning Han4ad52a82013-09-03 11:57:34 -0700354using std::tr1::make_tuple;
Ronald S. Bultjec456b352012-12-07 14:45:05 -0800355
Yaowu Xuf883b422016-08-30 14:01:10 -0700356#if CONFIG_AOM_HIGHBITDEPTH
Jingning Han4ad52a82013-09-03 11:57:34 -0700357INSTANTIATE_TEST_CASE_P(
358 C, Trans32x32Test,
359 ::testing::Values(
Yaowu Xuf883b422016-08-30 14:01:10 -0700360 make_tuple(&aom_highbd_fdct32x32_c, &idct32x32_10, 0, AOM_BITS_10),
361 make_tuple(&aom_highbd_fdct32x32_rd_c, &idct32x32_10, 1, AOM_BITS_10),
362 make_tuple(&aom_highbd_fdct32x32_c, &idct32x32_12, 0, AOM_BITS_12),
363 make_tuple(&aom_highbd_fdct32x32_rd_c, &idct32x32_12, 1, AOM_BITS_12),
364 make_tuple(&aom_fdct32x32_c, &aom_idct32x32_1024_add_c, 0, AOM_BITS_8),
365 make_tuple(&aom_fdct32x32_rd_c, &aom_idct32x32_1024_add_c, 1,
366 AOM_BITS_8)));
James Zern0269df42016-03-29 21:04:38 -0700367INSTANTIATE_TEST_CASE_P(
368 C, PartialTrans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700369 ::testing::Values(make_tuple(&aom_highbd_fdct32x32_1_c, AOM_BITS_8),
370 make_tuple(&aom_highbd_fdct32x32_1_c, AOM_BITS_10),
371 make_tuple(&aom_highbd_fdct32x32_1_c, AOM_BITS_12)));
Deb Mukherjee10783d42014-09-02 16:34:09 -0700372#else
373INSTANTIATE_TEST_CASE_P(
374 C, Trans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700375 ::testing::Values(make_tuple(&aom_fdct32x32_c, &aom_idct32x32_1024_add_c, 0,
376 AOM_BITS_8),
377 make_tuple(&aom_fdct32x32_rd_c, &aom_idct32x32_1024_add_c,
378 1, AOM_BITS_8)));
James Zern0269df42016-03-29 21:04:38 -0700379INSTANTIATE_TEST_CASE_P(C, PartialTrans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700380 ::testing::Values(make_tuple(&aom_fdct32x32_1_c,
381 AOM_BITS_8)));
382#endif // CONFIG_AOM_HIGHBITDEPTH
Ronald S. Bultjec456b352012-12-07 14:45:05 -0800383
Yaowu Xuf883b422016-08-30 14:01:10 -0700384#if HAVE_NEON && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
James Zerna6effda2014-02-25 23:11:49 -0800385INSTANTIATE_TEST_CASE_P(
386 NEON, Trans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700387 ::testing::Values(make_tuple(&aom_fdct32x32_c, &aom_idct32x32_1024_add_neon,
388 0, AOM_BITS_8),
389 make_tuple(&aom_fdct32x32_rd_c,
390 &aom_idct32x32_1024_add_neon, 1, AOM_BITS_8)));
391#endif // HAVE_NEON && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
James Zerna6effda2014-02-25 23:11:49 -0800392
Yaowu Xuf883b422016-08-30 14:01:10 -0700393#if HAVE_SSE2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
Jingning Han4ad52a82013-09-03 11:57:34 -0700394INSTANTIATE_TEST_CASE_P(
395 SSE2, Trans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700396 ::testing::Values(make_tuple(&aom_fdct32x32_sse2,
397 &aom_idct32x32_1024_add_sse2, 0, AOM_BITS_8),
398 make_tuple(&aom_fdct32x32_rd_sse2,
399 &aom_idct32x32_1024_add_sse2, 1, AOM_BITS_8)));
James Zern0269df42016-03-29 21:04:38 -0700400INSTANTIATE_TEST_CASE_P(SSE2, PartialTrans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700401 ::testing::Values(make_tuple(&aom_fdct32x32_1_sse2,
402 AOM_BITS_8)));
403#endif // HAVE_SSE2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
Peter de Rivaz7e40a552014-10-24 08:48:02 +0100404
Yi Luofed8e1c2016-10-07 09:46:05 -0700405#if HAVE_AVX2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
406INSTANTIATE_TEST_CASE_P(AVX2, PartialTrans32x32Test,
407 ::testing::Values(make_tuple(&aom_fdct32x32_1_avx2,
408 AOM_BITS_8)));
409#endif // HAVE_AVX2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
410
Yaowu Xuf883b422016-08-30 14:01:10 -0700411#if HAVE_SSE2 && CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
Peter de Rivaz7e40a552014-10-24 08:48:02 +0100412INSTANTIATE_TEST_CASE_P(
413 SSE2, Trans32x32Test,
414 ::testing::Values(
Yaowu Xuf883b422016-08-30 14:01:10 -0700415 make_tuple(&aom_highbd_fdct32x32_sse2, &idct32x32_10, 0, AOM_BITS_10),
416 make_tuple(&aom_highbd_fdct32x32_rd_sse2, &idct32x32_10, 1,
417 AOM_BITS_10),
418 make_tuple(&aom_highbd_fdct32x32_sse2, &idct32x32_12, 0, AOM_BITS_12),
419 make_tuple(&aom_highbd_fdct32x32_rd_sse2, &idct32x32_12, 1,
420 AOM_BITS_12),
421 make_tuple(&aom_fdct32x32_sse2, &aom_idct32x32_1024_add_c, 0,
422 AOM_BITS_8),
423 make_tuple(&aom_fdct32x32_rd_sse2, &aom_idct32x32_1024_add_c, 1,
424 AOM_BITS_8)));
James Zern0269df42016-03-29 21:04:38 -0700425INSTANTIATE_TEST_CASE_P(SSE2, PartialTrans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700426 ::testing::Values(make_tuple(&aom_fdct32x32_1_sse2,
427 AOM_BITS_8)));
428#endif // HAVE_SSE2 && CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
levytamar828def7662013-11-21 12:31:10 -0700429
Yaowu Xuf883b422016-08-30 14:01:10 -0700430#if HAVE_AVX2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
levytamar828def7662013-11-21 12:31:10 -0700431INSTANTIATE_TEST_CASE_P(
432 AVX2, Trans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700433 ::testing::Values(make_tuple(&aom_fdct32x32_avx2,
434 &aom_idct32x32_1024_add_sse2, 0, AOM_BITS_8),
435 make_tuple(&aom_fdct32x32_rd_avx2,
436 &aom_idct32x32_1024_add_sse2, 1, AOM_BITS_8)));
437#endif // HAVE_AVX2 && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
Parag Salasakar1601c132015-05-06 12:37:38 +0530438
Yi Luo0c552df2016-10-24 16:30:55 -0700439#if HAVE_AVX2 && CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
440INSTANTIATE_TEST_CASE_P(
441 AVX2, Trans32x32Test,
442 ::testing::Values(make_tuple(&aom_fdct32x32_avx2,
443 &aom_idct32x32_1024_add_sse2, 0, AOM_BITS_8),
444 make_tuple(&aom_fdct32x32_rd_avx2,
445 &aom_idct32x32_1024_add_sse2, 1, AOM_BITS_8)));
446#endif // HAVE_AVX2 && CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
447
Yaowu Xuf883b422016-08-30 14:01:10 -0700448#if HAVE_MSA && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
Parag Salasakar1601c132015-05-06 12:37:38 +0530449INSTANTIATE_TEST_CASE_P(
450 MSA, Trans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700451 ::testing::Values(make_tuple(&aom_fdct32x32_msa,
452 &aom_idct32x32_1024_add_msa, 0, AOM_BITS_8),
453 make_tuple(&aom_fdct32x32_rd_msa,
454 &aom_idct32x32_1024_add_msa, 1, AOM_BITS_8)));
James Zern0269df42016-03-29 21:04:38 -0700455INSTANTIATE_TEST_CASE_P(MSA, PartialTrans32x32Test,
Yaowu Xuf883b422016-08-30 14:01:10 -0700456 ::testing::Values(make_tuple(&aom_fdct32x32_1_msa,
457 AOM_BITS_8)));
458#endif // HAVE_MSA && !CONFIG_AOM_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
Ronald S. Bultjec456b352012-12-07 14:45:05 -0800459} // namespace