blob: 67e8faf33b46d4c9b9c48b13eb23c3877ac4de32 [file] [log] [blame]
Yi Luo267f73a2016-02-29 09:53:42 -08001/*
Yaowu Xubde4ac82016-11-28 15:26:06 -08002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yi Luo267f73a2016-02-29 09:53:42 -08003 *
Yaowu Xubde4ac82016-11-28 15:26:06 -08004 * 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.
Yi Luo267f73a2016-02-29 09:53:42 -080010 */
Yaowu Xubde4ac82016-11-28 15:26:06 -080011
Yi Luo267f73a2016-02-29 09:53:42 -080012#ifndef TEST_TRANSFORM_TEST_BASE_H_
13#define TEST_TRANSFORM_TEST_BASE_H_
14
Tom Finegan60e653d2018-05-22 11:34:58 -070015#include "config/aom_config.h"
16
Yaowu Xuf883b422016-08-30 14:01:10 -070017#include "aom_mem/aom_mem.h"
18#include "aom/aom_codec.h"
Lester Lu27319b62017-07-10 16:57:15 -070019#include "aom_dsp/txfm_common.h"
Yi Luo267f73a2016-02-29 09:53:42 -080020
Yaowu Xuc27fc142016-08-22 16:08:15 -070021namespace libaom_test {
Yi Luo267f73a2016-02-29 09:53:42 -080022
23// Note:
Yaowu Xuf883b422016-08-30 14:01:10 -070024// Same constant are defined in av1/common/av1_entropy.h and
Yaowu Xuc27fc142016-08-22 16:08:15 -070025// av1/common/entropy.h. Goal is to make this base class
Yi Luo267f73a2016-02-29 09:53:42 -080026// to use for future codec transform testing. But including
27// either of them would lead to compiling error when we do
28// unit test for another codec. Suggest to move the definition
Yaowu Xuf883b422016-08-30 14:01:10 -070029// to a aom header file.
Yi Luo267f73a2016-02-29 09:53:42 -080030const int kDctMaxValue = 16384;
31
32typedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride,
Lester Lu27319b62017-07-10 16:57:15 -070033 TxfmParam *txfm_param);
Yi Luo267f73a2016-02-29 09:53:42 -080034
Peter de Rivaz1baecfe2016-09-29 09:14:54 +010035typedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride,
Lester Lu27319b62017-07-10 16:57:15 -070036 const TxfmParam *txfm_param);
Peter de Rivaz1baecfe2016-09-29 09:14:54 +010037
Yi Luo267f73a2016-02-29 09:53:42 -080038class TransformTestBase {
39 public:
40 virtual ~TransformTestBase() {}
41
42 protected:
43 virtual void RunFwdTxfm(const int16_t *in, tran_low_t *out, int stride) = 0;
44
45 virtual void RunInvTxfm(const tran_low_t *out, uint8_t *dst, int stride) = 0;
46
Angie Chiange6aece82017-01-09 17:27:56 -080047 void RunAccuracyCheck(uint32_t ref_max_error, double ref_avg_error) {
Yi Luo267f73a2016-02-29 09:53:42 -080048 ACMRandom rnd(ACMRandom::DeterministicSeed());
49 uint32_t max_error = 0;
50 int64_t total_error = 0;
51 const int count_test_block = 10000;
52
clang-format3a826f12016-08-11 17:46:05 -070053 int16_t *test_input_block = reinterpret_cast<int16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -070054 aom_memalign(16, sizeof(int16_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -070055 tran_low_t *test_temp_block = reinterpret_cast<tran_low_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -070056 aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -070057 uint8_t *dst = reinterpret_cast<uint8_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -070058 aom_memalign(16, sizeof(uint8_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -070059 uint8_t *src = reinterpret_cast<uint8_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -070060 aom_memalign(16, sizeof(uint8_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -070061 uint16_t *dst16 = reinterpret_cast<uint16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -070062 aom_memalign(16, sizeof(uint16_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -070063 uint16_t *src16 = reinterpret_cast<uint16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -070064 aom_memalign(16, sizeof(uint16_t) * num_coeffs_));
Yi Luo267f73a2016-02-29 09:53:42 -080065
66 for (int i = 0; i < count_test_block; ++i) {
67 // Initialize a test block with input range [-255, 255].
68 for (int j = 0; j < num_coeffs_; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -070069 if (bit_depth_ == AOM_BITS_8) {
Yi Luo267f73a2016-02-29 09:53:42 -080070 src[j] = rnd.Rand8();
71 dst[j] = rnd.Rand8();
72 test_input_block[j] = src[j] - dst[j];
Yi Luo267f73a2016-02-29 09:53:42 -080073 } else {
74 src16[j] = rnd.Rand16() & mask_;
75 dst16[j] = rnd.Rand16() & mask_;
76 test_input_block[j] = src16[j] - dst16[j];
Yi Luo267f73a2016-02-29 09:53:42 -080077 }
78 }
79
clang-format3a826f12016-08-11 17:46:05 -070080 ASM_REGISTER_STATE_CHECK(
81 RunFwdTxfm(test_input_block, test_temp_block, pitch_));
Yaowu Xuf883b422016-08-30 14:01:10 -070082 if (bit_depth_ == AOM_BITS_8) {
Yi Luo267f73a2016-02-29 09:53:42 -080083 ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_));
Yi Luo267f73a2016-02-29 09:53:42 -080084 } else {
clang-format3a826f12016-08-11 17:46:05 -070085 ASM_REGISTER_STATE_CHECK(
86 RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_));
Yi Luo267f73a2016-02-29 09:53:42 -080087 }
88
89 for (int j = 0; j < num_coeffs_; ++j) {
Yaowu Xu59b969d2016-10-24 09:21:09 -070090 const int diff =
Yaowu Xuf883b422016-08-30 14:01:10 -070091 bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
Yi Luo267f73a2016-02-29 09:53:42 -080092 const uint32_t error = diff * diff;
clang-format3a826f12016-08-11 17:46:05 -070093 if (max_error < error) max_error = error;
Yi Luo267f73a2016-02-29 09:53:42 -080094 total_error += error;
95 }
96 }
97
Angie Chiange6aece82017-01-09 17:27:56 -080098 double avg_error = total_error * 1. / count_test_block / num_coeffs_;
Yi Luo267f73a2016-02-29 09:53:42 -080099
Angie Chiange6aece82017-01-09 17:27:56 -0800100 EXPECT_GE(ref_max_error, max_error)
101 << "Error: FHT/IHT has an individual round trip error > "
102 << ref_max_error;
103
104 EXPECT_GE(ref_avg_error, avg_error)
105 << "Error: FHT/IHT has average round trip error > " << ref_avg_error
Yi Luo267f73a2016-02-29 09:53:42 -0800106 << " per block";
107
Yaowu Xuf883b422016-08-30 14:01:10 -0700108 aom_free(test_input_block);
109 aom_free(test_temp_block);
110 aom_free(dst);
111 aom_free(src);
Yaowu Xuf883b422016-08-30 14:01:10 -0700112 aom_free(dst16);
113 aom_free(src16);
Yi Luo267f73a2016-02-29 09:53:42 -0800114 }
115
116 void RunCoeffCheck() {
117 ACMRandom rnd(ACMRandom::DeterministicSeed());
118 const int count_test_block = 5000;
119
David Barker78250222016-10-13 15:10:14 +0100120 // Use a stride value which is not the width of any transform, to catch
121 // cases where the transforms use the stride incorrectly.
122 int stride = 96;
123
clang-format3a826f12016-08-11 17:46:05 -0700124 int16_t *input_block = reinterpret_cast<int16_t *>(
David Barker78250222016-10-13 15:10:14 +0100125 aom_memalign(16, sizeof(int16_t) * stride * height_));
clang-format3a826f12016-08-11 17:46:05 -0700126 tran_low_t *output_ref_block = reinterpret_cast<tran_low_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700127 aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -0700128 tran_low_t *output_block = reinterpret_cast<tran_low_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700129 aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
Yi Luo267f73a2016-02-29 09:53:42 -0800130
131 for (int i = 0; i < count_test_block; ++i) {
David Barker78250222016-10-13 15:10:14 +0100132 int j, k;
133 for (j = 0; j < height_; ++j) {
134 for (k = 0; k < pitch_; ++k) {
135 int in_idx = j * stride + k;
136 int out_idx = j * pitch_ + k;
137 input_block[in_idx] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
138 if (bit_depth_ == AOM_BITS_8) {
139 output_block[out_idx] = output_ref_block[out_idx] = rnd.Rand8();
David Barker78250222016-10-13 15:10:14 +0100140 } else {
141 output_block[out_idx] = output_ref_block[out_idx] =
142 rnd.Rand16() & mask_;
David Barker78250222016-10-13 15:10:14 +0100143 }
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100144 }
145 }
Yi Luo267f73a2016-02-29 09:53:42 -0800146
Lester Lu27319b62017-07-10 16:57:15 -0700147 fwd_txfm_ref(input_block, output_ref_block, stride, &txfm_param_);
David Barker78250222016-10-13 15:10:14 +0100148 ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, stride));
Yi Luo267f73a2016-02-29 09:53:42 -0800149
150 // The minimum quant value is 4.
David Barker78250222016-10-13 15:10:14 +0100151 for (j = 0; j < height_; ++j) {
152 for (k = 0; k < pitch_; ++k) {
153 int out_idx = j * pitch_ + k;
154 ASSERT_EQ(output_block[out_idx], output_ref_block[out_idx])
155 << "Error: not bit-exact result at index: " << out_idx
156 << " at test block: " << i;
157 }
Yi Luo267f73a2016-02-29 09:53:42 -0800158 }
159 }
Yaowu Xuf883b422016-08-30 14:01:10 -0700160 aom_free(input_block);
161 aom_free(output_ref_block);
162 aom_free(output_block);
Yi Luo267f73a2016-02-29 09:53:42 -0800163 }
164
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100165 void RunInvCoeffCheck() {
166 ACMRandom rnd(ACMRandom::DeterministicSeed());
167 const int count_test_block = 5000;
168
David Barker78250222016-10-13 15:10:14 +0100169 // Use a stride value which is not the width of any transform, to catch
170 // cases where the transforms use the stride incorrectly.
171 int stride = 96;
172
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100173 int16_t *input_block = reinterpret_cast<int16_t *>(
174 aom_memalign(16, sizeof(int16_t) * num_coeffs_));
175 tran_low_t *trans_block = reinterpret_cast<tran_low_t *>(
176 aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
177 uint8_t *output_block = reinterpret_cast<uint8_t *>(
David Barker78250222016-10-13 15:10:14 +0100178 aom_memalign(16, sizeof(uint8_t) * stride * height_));
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100179 uint8_t *output_ref_block = reinterpret_cast<uint8_t *>(
David Barker78250222016-10-13 15:10:14 +0100180 aom_memalign(16, sizeof(uint8_t) * stride * height_));
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100181
182 for (int i = 0; i < count_test_block; ++i) {
183 // Initialize a test block with input range [-mask_, mask_].
David Barker78250222016-10-13 15:10:14 +0100184 int j, k;
185 for (j = 0; j < height_; ++j) {
186 for (k = 0; k < pitch_; ++k) {
187 int in_idx = j * pitch_ + k;
188 int out_idx = j * stride + k;
189 input_block[in_idx] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
190 output_ref_block[out_idx] = rnd.Rand16() & mask_;
191 output_block[out_idx] = output_ref_block[out_idx];
192 }
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100193 }
194
Lester Lu27319b62017-07-10 16:57:15 -0700195 fwd_txfm_ref(input_block, trans_block, pitch_, &txfm_param_);
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100196
Lester Lu27319b62017-07-10 16:57:15 -0700197 inv_txfm_ref(trans_block, output_ref_block, stride, &txfm_param_);
David Barker78250222016-10-13 15:10:14 +0100198 ASM_REGISTER_STATE_CHECK(RunInvTxfm(trans_block, output_block, stride));
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100199
David Barker78250222016-10-13 15:10:14 +0100200 for (j = 0; j < height_; ++j) {
201 for (k = 0; k < pitch_; ++k) {
202 int out_idx = j * stride + k;
203 ASSERT_EQ(output_block[out_idx], output_ref_block[out_idx])
204 << "Error: not bit-exact result at index: " << out_idx
Yi Luo73172002016-10-28 10:52:04 -0700205 << " j = " << j << " k = " << k << " at test block: " << i;
David Barker78250222016-10-13 15:10:14 +0100206 }
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100207 }
208 }
209 aom_free(input_block);
210 aom_free(trans_block);
211 aom_free(output_ref_block);
212 aom_free(output_block);
213 }
214
Yi Luo267f73a2016-02-29 09:53:42 -0800215 void RunMemCheck() {
216 ACMRandom rnd(ACMRandom::DeterministicSeed());
217 const int count_test_block = 5000;
218
clang-format3a826f12016-08-11 17:46:05 -0700219 int16_t *input_extreme_block = reinterpret_cast<int16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700220 aom_memalign(16, sizeof(int16_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -0700221 tran_low_t *output_ref_block = reinterpret_cast<tran_low_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700222 aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -0700223 tran_low_t *output_block = reinterpret_cast<tran_low_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700224 aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
Yi Luo267f73a2016-02-29 09:53:42 -0800225
226 for (int i = 0; i < count_test_block; ++i) {
227 // Initialize a test block with input range [-mask_, mask_].
228 for (int j = 0; j < num_coeffs_; ++j) {
229 input_extreme_block[j] = rnd.Rand8() % 2 ? mask_ : -mask_;
230 }
231 if (i == 0) {
clang-format3a826f12016-08-11 17:46:05 -0700232 for (int j = 0; j < num_coeffs_; ++j) input_extreme_block[j] = mask_;
Yi Luo267f73a2016-02-29 09:53:42 -0800233 } else if (i == 1) {
clang-format3a826f12016-08-11 17:46:05 -0700234 for (int j = 0; j < num_coeffs_; ++j) input_extreme_block[j] = -mask_;
Yi Luo267f73a2016-02-29 09:53:42 -0800235 }
236
Lester Lu27319b62017-07-10 16:57:15 -0700237 fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, &txfm_param_);
clang-format3a826f12016-08-11 17:46:05 -0700238 ASM_REGISTER_STATE_CHECK(
239 RunFwdTxfm(input_extreme_block, output_block, pitch_));
Yi Luo267f73a2016-02-29 09:53:42 -0800240
241 int row_length = FindRowLength();
242 // The minimum quant value is 4.
243 for (int j = 0; j < num_coeffs_; ++j) {
Urvang Joshi4d5cf532017-12-20 16:54:10 -0800244 ASSERT_EQ(output_block[j], output_ref_block[j])
Yi Luo63bd6dc2016-11-17 09:13:39 -0800245 << "Not bit-exact at test index: " << i << ", "
246 << "j = " << j << std::endl;
Yi Luo267f73a2016-02-29 09:53:42 -0800247 EXPECT_GE(row_length * kDctMaxValue << (bit_depth_ - 8),
248 abs(output_block[j]))
249 << "Error: NxN FDCT has coefficient larger than N*DCT_MAX_VALUE";
250 }
251 }
Yaowu Xuf883b422016-08-30 14:01:10 -0700252 aom_free(input_extreme_block);
253 aom_free(output_ref_block);
254 aom_free(output_block);
Yi Luo267f73a2016-02-29 09:53:42 -0800255 }
256
257 void RunInvAccuracyCheck(int limit) {
258 ACMRandom rnd(ACMRandom::DeterministicSeed());
259 const int count_test_block = 1000;
260
clang-format3a826f12016-08-11 17:46:05 -0700261 int16_t *in = reinterpret_cast<int16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700262 aom_memalign(16, sizeof(int16_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -0700263 tran_low_t *coeff = reinterpret_cast<tran_low_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700264 aom_memalign(16, sizeof(tran_low_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -0700265 uint8_t *dst = reinterpret_cast<uint8_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700266 aom_memalign(16, sizeof(uint8_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -0700267 uint8_t *src = reinterpret_cast<uint8_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700268 aom_memalign(16, sizeof(uint8_t) * num_coeffs_));
Yi Luo267f73a2016-02-29 09:53:42 -0800269
clang-format3a826f12016-08-11 17:46:05 -0700270 uint16_t *dst16 = reinterpret_cast<uint16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700271 aom_memalign(16, sizeof(uint16_t) * num_coeffs_));
clang-format3a826f12016-08-11 17:46:05 -0700272 uint16_t *src16 = reinterpret_cast<uint16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700273 aom_memalign(16, sizeof(uint16_t) * num_coeffs_));
Yi Luo267f73a2016-02-29 09:53:42 -0800274
275 for (int i = 0; i < count_test_block; ++i) {
276 // Initialize a test block with input range [-mask_, mask_].
277 for (int j = 0; j < num_coeffs_; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700278 if (bit_depth_ == AOM_BITS_8) {
Yi Luo267f73a2016-02-29 09:53:42 -0800279 src[j] = rnd.Rand8();
280 dst[j] = rnd.Rand8();
281 in[j] = src[j] - dst[j];
Yi Luo267f73a2016-02-29 09:53:42 -0800282 } else {
283 src16[j] = rnd.Rand16() & mask_;
284 dst16[j] = rnd.Rand16() & mask_;
285 in[j] = src16[j] - dst16[j];
Yi Luo267f73a2016-02-29 09:53:42 -0800286 }
287 }
288
Lester Lu27319b62017-07-10 16:57:15 -0700289 fwd_txfm_ref(in, coeff, pitch_, &txfm_param_);
Yi Luo267f73a2016-02-29 09:53:42 -0800290
Yaowu Xuf883b422016-08-30 14:01:10 -0700291 if (bit_depth_ == AOM_BITS_8) {
Yi Luo267f73a2016-02-29 09:53:42 -0800292 ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
Yi Luo267f73a2016-02-29 09:53:42 -0800293 } else {
clang-format3a826f12016-08-11 17:46:05 -0700294 ASM_REGISTER_STATE_CHECK(
295 RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16), pitch_));
Yi Luo267f73a2016-02-29 09:53:42 -0800296 }
297
298 for (int j = 0; j < num_coeffs_; ++j) {
Yaowu Xu59b969d2016-10-24 09:21:09 -0700299 const int diff =
Yaowu Xuf883b422016-08-30 14:01:10 -0700300 bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
Yi Luo267f73a2016-02-29 09:53:42 -0800301 const uint32_t error = diff * diff;
Urvang Joshi4d5cf532017-12-20 16:54:10 -0800302 ASSERT_GE(static_cast<uint32_t>(limit), error)
clang-format3a826f12016-08-11 17:46:05 -0700303 << "Error: 4x4 IDCT has error " << error << " at index " << j;
Yi Luo267f73a2016-02-29 09:53:42 -0800304 }
305 }
Yaowu Xuf883b422016-08-30 14:01:10 -0700306 aom_free(in);
307 aom_free(coeff);
308 aom_free(dst);
309 aom_free(src);
Yaowu Xuf883b422016-08-30 14:01:10 -0700310 aom_free(src16);
311 aom_free(dst16);
Yi Luo267f73a2016-02-29 09:53:42 -0800312 }
313
314 int pitch_;
David Barker78250222016-10-13 15:10:14 +0100315 int height_;
Yi Luo267f73a2016-02-29 09:53:42 -0800316 FhtFunc fwd_txfm_ref;
Peter de Rivaz1baecfe2016-09-29 09:14:54 +0100317 IhtFunc inv_txfm_ref;
Yaowu Xuf883b422016-08-30 14:01:10 -0700318 aom_bit_depth_t bit_depth_;
Yi Luo267f73a2016-02-29 09:53:42 -0800319 int mask_;
320 int num_coeffs_;
Lester Lu27319b62017-07-10 16:57:15 -0700321 TxfmParam txfm_param_;
Yi Luo267f73a2016-02-29 09:53:42 -0800322
323 private:
324 // Assume transform size is 4x4, 8x8, 16x16,...
325 int FindRowLength() const {
326 int row = 4;
327 if (16 == num_coeffs_) {
328 row = 4;
329 } else if (64 == num_coeffs_) {
330 row = 8;
331 } else if (256 == num_coeffs_) {
332 row = 16;
333 } else if (1024 == num_coeffs_) {
334 row = 32;
335 }
336 return row;
337 }
338};
339
Yaowu Xuc27fc142016-08-22 16:08:15 -0700340} // namespace libaom_test
Yi Luo267f73a2016-02-29 09:53:42 -0800341
342#endif // TEST_TRANSFORM_TEST_BASE_H_