blob: 837b28231c631389ce558ca44b0ddd8a013896a0 [file] [log] [blame]
John Koleszar5ca6a362013-01-25 09:47:09 -08001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
John Koleszar5ca6a362013-01-25 09:47:09 -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*/
John Koleszar5ca6a362013-01-25 09:47:09 -080011
Tero Rintaluomae326cec2013-08-22 11:29:19 +030012#include <string.h>
Jingning Han097d59c2015-07-29 14:51:36 -070013
James Zern8fb48af2013-05-02 13:08:19 -070014#include "third_party/googletest/src/include/gtest/gtest.h"
John Koleszar5ca6a362013-01-25 09:47:09 -080015
Yaowu Xuf883b422016-08-30 14:01:10 -070016#include "./aom_config.h"
17#include "./aom_dsp_rtcd.h"
Jingning Han097d59c2015-07-29 14:51:36 -070018#include "test/acm_random.h"
19#include "test/clear_system_state.h"
20#include "test/register_state_check.h"
21#include "test/util.h"
Yaowu Xuf883b422016-08-30 14:01:10 -070022#include "aom_dsp/aom_dsp_common.h"
23#include "aom_dsp/aom_filter.h"
24#include "aom_mem/aom_mem.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070025#include "aom_ports/mem.h"
John Koleszar5ca6a362013-01-25 09:47:09 -080026
27namespace {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -070028
Geza Lore552d5cd2016-03-07 13:46:39 +000029static const unsigned int kMaxDimension = MAX_SB_SIZE;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -070030
James Zerndfc4e8f2014-07-16 18:48:20 -070031typedef void (*ConvolveFunc)(const uint8_t *src, ptrdiff_t src_stride,
32 uint8_t *dst, ptrdiff_t dst_stride,
33 const int16_t *filter_x, int filter_x_stride,
34 const int16_t *filter_y, int filter_y_stride,
35 int w, int h);
John Koleszar5ca6a362013-01-25 09:47:09 -080036
37struct ConvolveFunctions {
clang-format3a826f12016-08-11 17:46:05 -070038 ConvolveFunctions(ConvolveFunc copy, ConvolveFunc avg, ConvolveFunc h8,
39 ConvolveFunc h8_avg, ConvolveFunc v8, ConvolveFunc v8_avg,
40 ConvolveFunc hv8, ConvolveFunc hv8_avg, ConvolveFunc sh8,
41 ConvolveFunc sh8_avg, ConvolveFunc sv8,
42 ConvolveFunc sv8_avg, ConvolveFunc shv8,
43 ConvolveFunc shv8_avg, int bd)
Johann1c3594c2014-12-09 12:05:15 -080044 : copy_(copy), avg_(avg), h8_(h8), v8_(v8), hv8_(hv8), h8_avg_(h8_avg),
Scott LaVarnway4e6b5072015-08-05 10:47:06 -070045 v8_avg_(v8_avg), hv8_avg_(hv8_avg), sh8_(sh8), sv8_(sv8), shv8_(shv8),
46 sh8_avg_(sh8_avg), sv8_avg_(sv8_avg), shv8_avg_(shv8_avg),
47 use_highbd_(bd) {}
John Koleszar5ca6a362013-01-25 09:47:09 -080048
Johann1c3594c2014-12-09 12:05:15 -080049 ConvolveFunc copy_;
50 ConvolveFunc avg_;
James Zerndfc4e8f2014-07-16 18:48:20 -070051 ConvolveFunc h8_;
52 ConvolveFunc v8_;
53 ConvolveFunc hv8_;
54 ConvolveFunc h8_avg_;
55 ConvolveFunc v8_avg_;
56 ConvolveFunc hv8_avg_;
clang-format3a826f12016-08-11 17:46:05 -070057 ConvolveFunc sh8_; // scaled horiz
58 ConvolveFunc sv8_; // scaled vert
59 ConvolveFunc shv8_; // scaled horiz/vert
60 ConvolveFunc sh8_avg_; // scaled avg horiz
61 ConvolveFunc sv8_avg_; // scaled avg vert
62 ConvolveFunc shv8_avg_; // scaled avg horiz/vert
Deb Mukherjee1929c9b2014-10-08 12:43:22 -070063 int use_highbd_; // 0 if high bitdepth not used, else the actual bit depth.
John Koleszar5ca6a362013-01-25 09:47:09 -080064};
65
James Zerndfc4e8f2014-07-16 18:48:20 -070066typedef std::tr1::tuple<int, int, const ConvolveFunctions *> ConvolveParam;
Joshua Litt51490e52013-11-18 17:07:55 -080067
Yaowu Xuf883b422016-08-30 14:01:10 -070068#if CONFIG_AV1 && CONFIG_EXT_PARTITION
clang-format3a826f12016-08-11 17:46:05 -070069#define ALL_SIZES(convolve_fn) \
70 make_tuple(128, 64, &convolve_fn), make_tuple(64, 128, &convolve_fn), \
71 make_tuple(128, 128, &convolve_fn), make_tuple(4, 4, &convolve_fn), \
72 make_tuple(8, 4, &convolve_fn), make_tuple(4, 8, &convolve_fn), \
73 make_tuple(8, 8, &convolve_fn), make_tuple(16, 8, &convolve_fn), \
74 make_tuple(8, 16, &convolve_fn), make_tuple(16, 16, &convolve_fn), \
75 make_tuple(32, 16, &convolve_fn), make_tuple(16, 32, &convolve_fn), \
76 make_tuple(32, 32, &convolve_fn), make_tuple(64, 32, &convolve_fn), \
77 make_tuple(32, 64, &convolve_fn), make_tuple(64, 64, &convolve_fn)
Alex Conversef03e2382016-04-26 18:09:40 -070078#else
clang-format3a826f12016-08-11 17:46:05 -070079#define ALL_SIZES(convolve_fn) \
80 make_tuple(4, 4, &convolve_fn), make_tuple(8, 4, &convolve_fn), \
81 make_tuple(4, 8, &convolve_fn), make_tuple(8, 8, &convolve_fn), \
82 make_tuple(16, 8, &convolve_fn), make_tuple(8, 16, &convolve_fn), \
83 make_tuple(16, 16, &convolve_fn), make_tuple(32, 16, &convolve_fn), \
84 make_tuple(16, 32, &convolve_fn), make_tuple(32, 32, &convolve_fn), \
85 make_tuple(64, 32, &convolve_fn), make_tuple(32, 64, &convolve_fn), \
86 make_tuple(64, 64, &convolve_fn)
Yaowu Xuf883b422016-08-30 14:01:10 -070087#endif // CONFIG_AV1 && CONFIG_EXT_PARTITION
Alex Conversef03e2382016-04-26 18:09:40 -070088
John Koleszar5ca6a362013-01-25 09:47:09 -080089// Reference 8-tap subpixel filter, slightly modified to fit into this test.
Yaowu Xuf883b422016-08-30 14:01:10 -070090#define AV1_FILTER_WEIGHT 128
91#define AV1_FILTER_SHIFT 7
clang-format3a826f12016-08-11 17:46:05 -070092uint8_t clip_pixel(int x) { return x < 0 ? 0 : x > 255 ? 255 : x; }
John Koleszar5ca6a362013-01-25 09:47:09 -080093
clang-format3a826f12016-08-11 17:46:05 -070094void filter_block2d_8_c(const uint8_t *src_ptr, const unsigned int src_stride,
95 const int16_t *HFilter, const int16_t *VFilter,
96 uint8_t *dst_ptr, unsigned int dst_stride,
97 unsigned int output_width, unsigned int output_height) {
John Koleszar5ca6a362013-01-25 09:47:09 -080098 // Between passes, we use an intermediate buffer whose height is extended to
99 // have enough horizontally filtered values as input for the vertical pass.
100 // This buffer is allocated to be big enough for the largest block type we
101 // support.
102 const int kInterp_Extend = 4;
103 const unsigned int intermediate_height =
James Zern8fb48af2013-05-02 13:08:19 -0700104 (kInterp_Extend - 1) + output_height + kInterp_Extend;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700105 unsigned int i, j;
John Koleszar5ca6a362013-01-25 09:47:09 -0800106
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700107 // Size of intermediate_buffer is max_intermediate_height * filter_max_width,
108 // where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
109 // + kInterp_Extend
110 // = 3 + 16 + 4
111 // = 23
112 // and filter_max_width = 16
113 //
clang-format3a826f12016-08-11 17:46:05 -0700114 uint8_t intermediate_buffer[(kMaxDimension + 8) * kMaxDimension];
Tom Finegan6042d682016-05-06 09:43:37 -0700115 const int intermediate_next_stride =
116 1 - static_cast<int>(intermediate_height * output_width);
John Koleszar5ca6a362013-01-25 09:47:09 -0800117
118 // Horizontal pass (src -> transposed intermediate).
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700119 uint8_t *output_ptr = intermediate_buffer;
120 const int src_next_row_stride = src_stride - output_width;
121 src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
122 for (i = 0; i < intermediate_height; ++i) {
123 for (j = 0; j < output_width; ++j) {
124 // Apply filter...
clang-format3a826f12016-08-11 17:46:05 -0700125 const int temp = (src_ptr[0] * HFilter[0]) + (src_ptr[1] * HFilter[1]) +
126 (src_ptr[2] * HFilter[2]) + (src_ptr[3] * HFilter[3]) +
127 (src_ptr[4] * HFilter[4]) + (src_ptr[5] * HFilter[5]) +
128 (src_ptr[6] * HFilter[6]) + (src_ptr[7] * HFilter[7]) +
Yaowu Xuf883b422016-08-30 14:01:10 -0700129 (AV1_FILTER_WEIGHT >> 1); // Rounding
John Koleszar5ca6a362013-01-25 09:47:09 -0800130
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700131 // Normalize back to 0-255...
Yaowu Xuf883b422016-08-30 14:01:10 -0700132 *output_ptr = clip_pixel(temp >> AV1_FILTER_SHIFT);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700133 ++src_ptr;
134 output_ptr += intermediate_height;
John Koleszar5ca6a362013-01-25 09:47:09 -0800135 }
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700136 src_ptr += src_next_row_stride;
137 output_ptr += intermediate_next_stride;
John Koleszar5ca6a362013-01-25 09:47:09 -0800138 }
139
140 // Vertical pass (transposed intermediate -> dst).
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700141 src_ptr = intermediate_buffer;
142 const int dst_next_row_stride = dst_stride - output_width;
143 for (i = 0; i < output_height; ++i) {
144 for (j = 0; j < output_width; ++j) {
145 // Apply filter...
clang-format3a826f12016-08-11 17:46:05 -0700146 const int temp = (src_ptr[0] * VFilter[0]) + (src_ptr[1] * VFilter[1]) +
147 (src_ptr[2] * VFilter[2]) + (src_ptr[3] * VFilter[3]) +
148 (src_ptr[4] * VFilter[4]) + (src_ptr[5] * VFilter[5]) +
149 (src_ptr[6] * VFilter[6]) + (src_ptr[7] * VFilter[7]) +
Yaowu Xuf883b422016-08-30 14:01:10 -0700150 (AV1_FILTER_WEIGHT >> 1); // Rounding
John Koleszar5ca6a362013-01-25 09:47:09 -0800151
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700152 // Normalize back to 0-255...
Yaowu Xuf883b422016-08-30 14:01:10 -0700153 *dst_ptr++ = clip_pixel(temp >> AV1_FILTER_SHIFT);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700154 src_ptr += intermediate_height;
John Koleszar5ca6a362013-01-25 09:47:09 -0800155 }
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700156 src_ptr += intermediate_next_stride;
157 dst_ptr += dst_next_row_stride;
John Koleszar5ca6a362013-01-25 09:47:09 -0800158 }
159}
160
clang-format3a826f12016-08-11 17:46:05 -0700161void block2d_average_c(uint8_t *src, unsigned int src_stride,
162 uint8_t *output_ptr, unsigned int output_stride,
163 unsigned int output_width, unsigned int output_height) {
John Koleszar5ca6a362013-01-25 09:47:09 -0800164 unsigned int i, j;
165 for (i = 0; i < output_height; ++i) {
166 for (j = 0; j < output_width; ++j) {
167 output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1;
168 }
169 output_ptr += output_stride;
170 }
171}
172
James Zern8fb48af2013-05-02 13:08:19 -0700173void filter_average_block2d_8_c(const uint8_t *src_ptr,
174 const unsigned int src_stride,
clang-format3a826f12016-08-11 17:46:05 -0700175 const int16_t *HFilter, const int16_t *VFilter,
176 uint8_t *dst_ptr, unsigned int dst_stride,
James Zern8fb48af2013-05-02 13:08:19 -0700177 unsigned int output_width,
178 unsigned int output_height) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700179 uint8_t tmp[kMaxDimension * kMaxDimension];
John Koleszar5ca6a362013-01-25 09:47:09 -0800180
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700181 assert(output_width <= kMaxDimension);
182 assert(output_height <= kMaxDimension);
Geza Lore938b8df2016-03-04 15:55:48 +0000183 filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, tmp, kMaxDimension,
John Koleszar5ca6a362013-01-25 09:47:09 -0800184 output_width, output_height);
clang-format3a826f12016-08-11 17:46:05 -0700185 block2d_average_c(tmp, kMaxDimension, dst_ptr, dst_stride, output_width,
186 output_height);
John Koleszar5ca6a362013-01-25 09:47:09 -0800187}
188
Yaowu Xuf883b422016-08-30 14:01:10 -0700189#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700190void highbd_filter_block2d_8_c(const uint16_t *src_ptr,
191 const unsigned int src_stride,
clang-format3a826f12016-08-11 17:46:05 -0700192 const int16_t *HFilter, const int16_t *VFilter,
193 uint16_t *dst_ptr, unsigned int dst_stride,
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700194 unsigned int output_width,
clang-format3a826f12016-08-11 17:46:05 -0700195 unsigned int output_height, int bd) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700196 // Between passes, we use an intermediate buffer whose height is extended to
197 // have enough horizontally filtered values as input for the vertical pass.
198 // This buffer is allocated to be big enough for the largest block type we
199 // support.
200 const int kInterp_Extend = 4;
201 const unsigned int intermediate_height =
202 (kInterp_Extend - 1) + output_height + kInterp_Extend;
203
204 /* Size of intermediate_buffer is max_intermediate_height * filter_max_width,
205 * where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
206 * + kInterp_Extend
207 * = 3 + 16 + 4
208 * = 23
209 * and filter_max_width = 16
210 */
clang-format3a826f12016-08-11 17:46:05 -0700211 uint16_t intermediate_buffer[(kMaxDimension + 8) * kMaxDimension];
Tom Finegan9a56a5e2016-05-13 09:42:58 -0700212 const int intermediate_next_stride =
213 1 - static_cast<int>(intermediate_height * output_width);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700214
215 // Horizontal pass (src -> transposed intermediate).
216 {
217 uint16_t *output_ptr = intermediate_buffer;
218 const int src_next_row_stride = src_stride - output_width;
219 unsigned int i, j;
220 src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
221 for (i = 0; i < intermediate_height; ++i) {
222 for (j = 0; j < output_width; ++j) {
223 // Apply filter...
clang-format3a826f12016-08-11 17:46:05 -0700224 const int temp = (src_ptr[0] * HFilter[0]) + (src_ptr[1] * HFilter[1]) +
225 (src_ptr[2] * HFilter[2]) + (src_ptr[3] * HFilter[3]) +
226 (src_ptr[4] * HFilter[4]) + (src_ptr[5] * HFilter[5]) +
227 (src_ptr[6] * HFilter[6]) + (src_ptr[7] * HFilter[7]) +
Yaowu Xuf883b422016-08-30 14:01:10 -0700228 (AV1_FILTER_WEIGHT >> 1); // Rounding
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700229
230 // Normalize back to 0-255...
Yaowu Xuf883b422016-08-30 14:01:10 -0700231 *output_ptr = clip_pixel_highbd(temp >> AV1_FILTER_SHIFT, bd);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700232 ++src_ptr;
233 output_ptr += intermediate_height;
234 }
235 src_ptr += src_next_row_stride;
236 output_ptr += intermediate_next_stride;
237 }
238 }
239
240 // Vertical pass (transposed intermediate -> dst).
241 {
Urvang Joshi88a03bb2016-10-17 14:34:48 -0700242 const uint16_t *interm_ptr = intermediate_buffer;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700243 const int dst_next_row_stride = dst_stride - output_width;
244 unsigned int i, j;
245 for (i = 0; i < output_height; ++i) {
246 for (j = 0; j < output_width; ++j) {
247 // Apply filter...
Urvang Joshi88a03bb2016-10-17 14:34:48 -0700248 const int temp =
249 (interm_ptr[0] * VFilter[0]) + (interm_ptr[1] * VFilter[1]) +
250 (interm_ptr[2] * VFilter[2]) + (interm_ptr[3] * VFilter[3]) +
251 (interm_ptr[4] * VFilter[4]) + (interm_ptr[5] * VFilter[5]) +
252 (interm_ptr[6] * VFilter[6]) + (interm_ptr[7] * VFilter[7]) +
253 (AV1_FILTER_WEIGHT >> 1); // Rounding
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700254
255 // Normalize back to 0-255...
Yaowu Xuf883b422016-08-30 14:01:10 -0700256 *dst_ptr++ = clip_pixel_highbd(temp >> AV1_FILTER_SHIFT, bd);
Urvang Joshi88a03bb2016-10-17 14:34:48 -0700257 interm_ptr += intermediate_height;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700258 }
Urvang Joshi88a03bb2016-10-17 14:34:48 -0700259 interm_ptr += intermediate_next_stride;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700260 dst_ptr += dst_next_row_stride;
261 }
262 }
263}
264
clang-format3a826f12016-08-11 17:46:05 -0700265void highbd_block2d_average_c(uint16_t *src, unsigned int src_stride,
266 uint16_t *output_ptr, unsigned int output_stride,
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700267 unsigned int output_width,
James Zerncffef112016-02-11 18:27:00 -0800268 unsigned int output_height) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700269 unsigned int i, j;
270 for (i = 0; i < output_height; ++i) {
271 for (j = 0; j < output_width; ++j) {
272 output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1;
273 }
274 output_ptr += output_stride;
275 }
276}
277
clang-format3a826f12016-08-11 17:46:05 -0700278void highbd_filter_average_block2d_8_c(
279 const uint16_t *src_ptr, const unsigned int src_stride,
280 const int16_t *HFilter, const int16_t *VFilter, uint16_t *dst_ptr,
281 unsigned int dst_stride, unsigned int output_width,
282 unsigned int output_height, int bd) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700283 uint16_t tmp[kMaxDimension * kMaxDimension];
284
285 assert(output_width <= kMaxDimension);
286 assert(output_height <= kMaxDimension);
clang-format3a826f12016-08-11 17:46:05 -0700287 highbd_filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, tmp,
288 kMaxDimension, output_width, output_height, bd);
Geza Lore938b8df2016-03-04 15:55:48 +0000289 highbd_block2d_average_c(tmp, kMaxDimension, dst_ptr, dst_stride,
James Zerncffef112016-02-11 18:27:00 -0800290 output_width, output_height);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700291}
Yaowu Xuf883b422016-08-30 14:01:10 -0700292#endif // CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700293
James Zerndfc4e8f2014-07-16 18:48:20 -0700294class ConvolveTest : public ::testing::TestWithParam<ConvolveParam> {
John Koleszar29d47ac2013-02-07 17:00:37 -0800295 public:
296 static void SetUpTestCase() {
297 // Force input_ to be unaligned, output to be 16 byte aligned.
clang-format3a826f12016-08-11 17:46:05 -0700298 input_ = reinterpret_cast<uint8_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700299 aom_memalign(kDataAlignment, kInputBufferSize + 1)) +
clang-format3a826f12016-08-11 17:46:05 -0700300 1;
301 output_ = reinterpret_cast<uint8_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700302 aom_memalign(kDataAlignment, kOutputBufferSize));
clang-format3a826f12016-08-11 17:46:05 -0700303 output_ref_ = reinterpret_cast<uint8_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700304 aom_memalign(kDataAlignment, kOutputBufferSize));
305#if CONFIG_AOM_HIGHBITDEPTH
306 input16_ = reinterpret_cast<uint16_t *>(aom_memalign(
clang-format3a826f12016-08-11 17:46:05 -0700307 kDataAlignment, (kInputBufferSize + 1) * sizeof(uint16_t))) +
308 1;
309 output16_ = reinterpret_cast<uint16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700310 aom_memalign(kDataAlignment, (kOutputBufferSize) * sizeof(uint16_t)));
clang-format3a826f12016-08-11 17:46:05 -0700311 output16_ref_ = reinterpret_cast<uint16_t *>(
Yaowu Xuf883b422016-08-30 14:01:10 -0700312 aom_memalign(kDataAlignment, (kOutputBufferSize) * sizeof(uint16_t)));
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700313#endif
John Koleszar29d47ac2013-02-07 17:00:37 -0800314 }
315
Yaowu Xuc27fc142016-08-22 16:08:15 -0700316 virtual void TearDown() { libaom_test::ClearSystemState(); }
Jim Bankoski18d32362014-12-12 06:18:56 -0800317
John Koleszar29d47ac2013-02-07 17:00:37 -0800318 static void TearDownTestCase() {
Yaowu Xuf883b422016-08-30 14:01:10 -0700319 aom_free(input_ - 1);
John Koleszar29d47ac2013-02-07 17:00:37 -0800320 input_ = NULL;
Yaowu Xuf883b422016-08-30 14:01:10 -0700321 aom_free(output_);
John Koleszar29d47ac2013-02-07 17:00:37 -0800322 output_ = NULL;
Yaowu Xuf883b422016-08-30 14:01:10 -0700323 aom_free(output_ref_);
Johann1c3594c2014-12-09 12:05:15 -0800324 output_ref_ = NULL;
Yaowu Xuf883b422016-08-30 14:01:10 -0700325#if CONFIG_AOM_HIGHBITDEPTH
326 aom_free(input16_ - 1);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700327 input16_ = NULL;
Yaowu Xuf883b422016-08-30 14:01:10 -0700328 aom_free(output16_);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700329 output16_ = NULL;
Yaowu Xuf883b422016-08-30 14:01:10 -0700330 aom_free(output16_ref_);
Johann1c3594c2014-12-09 12:05:15 -0800331 output16_ref_ = NULL;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700332#endif
John Koleszar29d47ac2013-02-07 17:00:37 -0800333 }
334
James Zern8fb48af2013-05-02 13:08:19 -0700335 protected:
336 static const int kDataAlignment = 16;
clang-format3a826f12016-08-11 17:46:05 -0700337 static const int kOuterBlockSize = 4 * kMaxDimension;
James Zern8fb48af2013-05-02 13:08:19 -0700338 static const int kInputStride = kOuterBlockSize;
339 static const int kOutputStride = kOuterBlockSize;
James Zern8fb48af2013-05-02 13:08:19 -0700340 static const int kInputBufferSize = kOuterBlockSize * kOuterBlockSize;
341 static const int kOutputBufferSize = kOuterBlockSize * kOuterBlockSize;
John Koleszar5ca6a362013-01-25 09:47:09 -0800342
James Zern8fb48af2013-05-02 13:08:19 -0700343 int Width() const { return GET_PARAM(0); }
344 int Height() const { return GET_PARAM(1); }
345 int BorderLeft() const {
346 const int center = (kOuterBlockSize - Width()) / 2;
347 return (center + (kDataAlignment - 1)) & ~(kDataAlignment - 1);
348 }
349 int BorderTop() const { return (kOuterBlockSize - Height()) / 2; }
John Koleszar5ca6a362013-01-25 09:47:09 -0800350
James Zern8fb48af2013-05-02 13:08:19 -0700351 bool IsIndexInBorder(int i) {
352 return (i < BorderTop() * kOuterBlockSize ||
353 i >= (BorderTop() + Height()) * kOuterBlockSize ||
354 i % kOuterBlockSize < BorderLeft() ||
355 i % kOuterBlockSize >= (BorderLeft() + Width()));
356 }
357
358 virtual void SetUp() {
359 UUT_ = GET_PARAM(2);
Yaowu Xuf883b422016-08-30 14:01:10 -0700360#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700361 if (UUT_->use_highbd_ != 0)
362 mask_ = (1 << UUT_->use_highbd_) - 1;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700363 else
364 mask_ = 255;
365#endif
Johann158c80c2013-05-23 12:50:41 -0700366 /* Set up guard blocks for an inner block centered in the outer block */
James Zern8fb48af2013-05-02 13:08:19 -0700367 for (int i = 0; i < kOutputBufferSize; ++i) {
368 if (IsIndexInBorder(i))
369 output_[i] = 255;
370 else
371 output_[i] = 0;
John Koleszar5ca6a362013-01-25 09:47:09 -0800372 }
373
Yaowu Xuc27fc142016-08-22 16:08:15 -0700374 ::libaom_test::ACMRandom prng;
Yaowu Xu077144d2014-05-23 12:23:29 -0700375 for (int i = 0; i < kInputBufferSize; ++i) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700376 if (i & 1) {
Yaowu Xu077144d2014-05-23 12:23:29 -0700377 input_[i] = 255;
Yaowu Xuf883b422016-08-30 14:01:10 -0700378#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700379 input16_[i] = mask_;
380#endif
381 } else {
Yaowu Xu077144d2014-05-23 12:23:29 -0700382 input_[i] = prng.Rand8Extremes();
Yaowu Xuf883b422016-08-30 14:01:10 -0700383#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700384 input16_[i] = prng.Rand16() & mask_;
385#endif
386 }
Yaowu Xu077144d2014-05-23 12:23:29 -0700387 }
James Zern8fb48af2013-05-02 13:08:19 -0700388 }
John Koleszar5ca6a362013-01-25 09:47:09 -0800389
Tero Rintaluomae326cec2013-08-22 11:29:19 +0300390 void SetConstantInput(int value) {
391 memset(input_, value, kInputBufferSize);
Yaowu Xuf883b422016-08-30 14:01:10 -0700392#if CONFIG_AOM_HIGHBITDEPTH
393 aom_memset16(input16_, value, kInputBufferSize);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700394#endif
Tero Rintaluomae326cec2013-08-22 11:29:19 +0300395 }
396
Johann1c3594c2014-12-09 12:05:15 -0800397 void CopyOutputToRef() {
James Zernf274c212015-04-23 20:42:19 -0700398 memcpy(output_ref_, output_, kOutputBufferSize);
Yaowu Xuf883b422016-08-30 14:01:10 -0700399#if CONFIG_AOM_HIGHBITDEPTH
Yaowu Xuc648a9f2016-10-10 17:39:29 -0700400 // Copy 16-bit pixels values. The effective number of bytes is double.
401 memcpy(output16_ref_, output16_, sizeof(output16_[0]) * kOutputBufferSize);
Johann1c3594c2014-12-09 12:05:15 -0800402#endif
403 }
404
James Zern8fb48af2013-05-02 13:08:19 -0700405 void CheckGuardBlocks() {
406 for (int i = 0; i < kOutputBufferSize; ++i) {
clang-format3a826f12016-08-11 17:46:05 -0700407 if (IsIndexInBorder(i)) EXPECT_EQ(255, output_[i]);
John Koleszar5ca6a362013-01-25 09:47:09 -0800408 }
James Zern8fb48af2013-05-02 13:08:19 -0700409 }
John Koleszar5ca6a362013-01-25 09:47:09 -0800410
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700411 uint8_t *input() const {
Johann2967bf32016-06-22 16:08:10 -0700412 const int offset = BorderTop() * kOuterBlockSize + BorderLeft();
Yaowu Xuf883b422016-08-30 14:01:10 -0700413#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700414 if (UUT_->use_highbd_ == 0) {
Johann2967bf32016-06-22 16:08:10 -0700415 return input_ + offset;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700416 } else {
Johann2967bf32016-06-22 16:08:10 -0700417 return CONVERT_TO_BYTEPTR(input16_) + offset;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700418 }
419#else
Johann2967bf32016-06-22 16:08:10 -0700420 return input_ + offset;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700421#endif
James Zern8fb48af2013-05-02 13:08:19 -0700422 }
John Koleszar5ca6a362013-01-25 09:47:09 -0800423
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700424 uint8_t *output() const {
Johann2967bf32016-06-22 16:08:10 -0700425 const int offset = BorderTop() * kOuterBlockSize + BorderLeft();
Yaowu Xuf883b422016-08-30 14:01:10 -0700426#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700427 if (UUT_->use_highbd_ == 0) {
Johann2967bf32016-06-22 16:08:10 -0700428 return output_ + offset;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700429 } else {
Johann2967bf32016-06-22 16:08:10 -0700430 return CONVERT_TO_BYTEPTR(output16_) + offset;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700431 }
432#else
Johann2967bf32016-06-22 16:08:10 -0700433 return output_ + offset;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700434#endif
435 }
436
Johann1c3594c2014-12-09 12:05:15 -0800437 uint8_t *output_ref() const {
Johann2967bf32016-06-22 16:08:10 -0700438 const int offset = BorderTop() * kOuterBlockSize + BorderLeft();
Yaowu Xuf883b422016-08-30 14:01:10 -0700439#if CONFIG_AOM_HIGHBITDEPTH
Johann1c3594c2014-12-09 12:05:15 -0800440 if (UUT_->use_highbd_ == 0) {
Johann2967bf32016-06-22 16:08:10 -0700441 return output_ref_ + offset;
Johann1c3594c2014-12-09 12:05:15 -0800442 } else {
Johann2967bf32016-06-22 16:08:10 -0700443 return CONVERT_TO_BYTEPTR(output16_ref_) + offset;
Johann1c3594c2014-12-09 12:05:15 -0800444 }
445#else
Johann2967bf32016-06-22 16:08:10 -0700446 return output_ref_ + offset;
Johann1c3594c2014-12-09 12:05:15 -0800447#endif
448 }
449
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700450 uint16_t lookup(uint8_t *list, int index) const {
Yaowu Xuf883b422016-08-30 14:01:10 -0700451#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700452 if (UUT_->use_highbd_ == 0) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700453 return list[index];
454 } else {
455 return CONVERT_TO_SHORTPTR(list)[index];
456 }
457#else
458 return list[index];
459#endif
460 }
461
462 void assign_val(uint8_t *list, int index, uint16_t val) const {
Yaowu Xuf883b422016-08-30 14:01:10 -0700463#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700464 if (UUT_->use_highbd_ == 0) {
clang-format3a826f12016-08-11 17:46:05 -0700465 list[index] = (uint8_t)val;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700466 } else {
467 CONVERT_TO_SHORTPTR(list)[index] = val;
468 }
469#else
clang-format3a826f12016-08-11 17:46:05 -0700470 list[index] = (uint8_t)val;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700471#endif
472 }
473
clang-format3a826f12016-08-11 17:46:05 -0700474 void wrapper_filter_average_block2d_8_c(
475 const uint8_t *src_ptr, const unsigned int src_stride,
476 const int16_t *HFilter, const int16_t *VFilter, uint8_t *dst_ptr,
477 unsigned int dst_stride, unsigned int output_width,
478 unsigned int output_height) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700479#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700480 if (UUT_->use_highbd_ == 0) {
clang-format3a826f12016-08-11 17:46:05 -0700481 filter_average_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, dst_ptr,
482 dst_stride, output_width, output_height);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700483 } else {
clang-format3a826f12016-08-11 17:46:05 -0700484 highbd_filter_average_block2d_8_c(
485 CONVERT_TO_SHORTPTR(src_ptr), src_stride, HFilter, VFilter,
486 CONVERT_TO_SHORTPTR(dst_ptr), dst_stride, output_width, output_height,
487 UUT_->use_highbd_);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700488 }
489#else
clang-format3a826f12016-08-11 17:46:05 -0700490 filter_average_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, dst_ptr,
491 dst_stride, output_width, output_height);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700492#endif
493 }
494
495 void wrapper_filter_block2d_8_c(const uint8_t *src_ptr,
496 const unsigned int src_stride,
497 const int16_t *HFilter,
clang-format3a826f12016-08-11 17:46:05 -0700498 const int16_t *VFilter, uint8_t *dst_ptr,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700499 unsigned int dst_stride,
500 unsigned int output_width,
501 unsigned int output_height) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700502#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700503 if (UUT_->use_highbd_ == 0) {
clang-format3a826f12016-08-11 17:46:05 -0700504 filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, dst_ptr,
505 dst_stride, output_width, output_height);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700506 } else {
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700507 highbd_filter_block2d_8_c(CONVERT_TO_SHORTPTR(src_ptr), src_stride,
clang-format3a826f12016-08-11 17:46:05 -0700508 HFilter, VFilter, CONVERT_TO_SHORTPTR(dst_ptr),
509 dst_stride, output_width, output_height,
510 UUT_->use_highbd_);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700511 }
512#else
clang-format3a826f12016-08-11 17:46:05 -0700513 filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, dst_ptr,
514 dst_stride, output_width, output_height);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700515#endif
James Zern8fb48af2013-05-02 13:08:19 -0700516 }
John Koleszar5ca6a362013-01-25 09:47:09 -0800517
clang-format3a826f12016-08-11 17:46:05 -0700518 const ConvolveFunctions *UUT_;
519 static uint8_t *input_;
520 static uint8_t *output_;
521 static uint8_t *output_ref_;
Yaowu Xuf883b422016-08-30 14:01:10 -0700522#if CONFIG_AOM_HIGHBITDEPTH
clang-format3a826f12016-08-11 17:46:05 -0700523 static uint16_t *input16_;
524 static uint16_t *output16_;
525 static uint16_t *output16_ref_;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700526 int mask_;
527#endif
John Koleszar5ca6a362013-01-25 09:47:09 -0800528};
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700529
clang-format3a826f12016-08-11 17:46:05 -0700530uint8_t *ConvolveTest::input_ = NULL;
531uint8_t *ConvolveTest::output_ = NULL;
532uint8_t *ConvolveTest::output_ref_ = NULL;
Yaowu Xuf883b422016-08-30 14:01:10 -0700533#if CONFIG_AOM_HIGHBITDEPTH
clang-format3a826f12016-08-11 17:46:05 -0700534uint16_t *ConvolveTest::input16_ = NULL;
535uint16_t *ConvolveTest::output16_ = NULL;
536uint16_t *ConvolveTest::output16_ref_ = NULL;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700537#endif
John Koleszar5ca6a362013-01-25 09:47:09 -0800538
clang-format3a826f12016-08-11 17:46:05 -0700539TEST_P(ConvolveTest, GuardBlocks) { CheckGuardBlocks(); }
John Koleszar5ca6a362013-01-25 09:47:09 -0800540
Johann1c3594c2014-12-09 12:05:15 -0800541TEST_P(ConvolveTest, Copy) {
clang-format3a826f12016-08-11 17:46:05 -0700542 uint8_t *const in = input();
543 uint8_t *const out = output();
Johann1c3594c2014-12-09 12:05:15 -0800544
clang-format3a826f12016-08-11 17:46:05 -0700545 ASM_REGISTER_STATE_CHECK(UUT_->copy_(in, kInputStride, out, kOutputStride,
546 NULL, 0, NULL, 0, Width(), Height()));
Johann1c3594c2014-12-09 12:05:15 -0800547
548 CheckGuardBlocks();
549
550 for (int y = 0; y < Height(); ++y)
551 for (int x = 0; x < Width(); ++x)
552 ASSERT_EQ(lookup(out, y * kOutputStride + x),
553 lookup(in, y * kInputStride + x))
554 << "(" << x << "," << y << ")";
555}
556
557TEST_P(ConvolveTest, Avg) {
clang-format3a826f12016-08-11 17:46:05 -0700558 uint8_t *const in = input();
559 uint8_t *const out = output();
560 uint8_t *const out_ref = output_ref();
Johann1c3594c2014-12-09 12:05:15 -0800561 CopyOutputToRef();
562
clang-format3a826f12016-08-11 17:46:05 -0700563 ASM_REGISTER_STATE_CHECK(UUT_->avg_(in, kInputStride, out, kOutputStride,
564 NULL, 0, NULL, 0, Width(), Height()));
Johann1c3594c2014-12-09 12:05:15 -0800565
566 CheckGuardBlocks();
567
568 for (int y = 0; y < Height(); ++y)
569 for (int x = 0; x < Width(); ++x)
570 ASSERT_EQ(lookup(out, y * kOutputStride + x),
571 ROUND_POWER_OF_TWO(lookup(in, y * kInputStride + x) +
clang-format3a826f12016-08-11 17:46:05 -0700572 lookup(out_ref, y * kOutputStride + x),
573 1))
Johann1c3594c2014-12-09 12:05:15 -0800574 << "(" << x << "," << y << ")";
575}
576
John Koleszar5ca6a362013-01-25 09:47:09 -0800577TEST_P(ConvolveTest, CopyHoriz) {
clang-format3a826f12016-08-11 17:46:05 -0700578 uint8_t *const in = input();
579 uint8_t *const out = output();
580 DECLARE_ALIGNED(256, const int16_t,
581 filter8[8]) = { 0, 0, 0, 128, 0, 0, 0, 0 };
John Koleszar5ca6a362013-01-25 09:47:09 -0800582
clang-format3a826f12016-08-11 17:46:05 -0700583 ASM_REGISTER_STATE_CHECK(UUT_->sh8_(in, kInputStride, out, kOutputStride,
584 filter8, 16, filter8, 16, Width(),
585 Height()));
John Koleszar5ca6a362013-01-25 09:47:09 -0800586
587 CheckGuardBlocks();
588
589 for (int y = 0; y < Height(); ++y)
590 for (int x = 0; x < Width(); ++x)
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700591 ASSERT_EQ(lookup(out, y * kOutputStride + x),
592 lookup(in, y * kInputStride + x))
John Koleszar5ca6a362013-01-25 09:47:09 -0800593 << "(" << x << "," << y << ")";
594}
595
596TEST_P(ConvolveTest, CopyVert) {
clang-format3a826f12016-08-11 17:46:05 -0700597 uint8_t *const in = input();
598 uint8_t *const out = output();
599 DECLARE_ALIGNED(256, const int16_t,
600 filter8[8]) = { 0, 0, 0, 128, 0, 0, 0, 0 };
John Koleszar5ca6a362013-01-25 09:47:09 -0800601
clang-format3a826f12016-08-11 17:46:05 -0700602 ASM_REGISTER_STATE_CHECK(UUT_->sv8_(in, kInputStride, out, kOutputStride,
603 filter8, 16, filter8, 16, Width(),
604 Height()));
John Koleszar5ca6a362013-01-25 09:47:09 -0800605
606 CheckGuardBlocks();
607
608 for (int y = 0; y < Height(); ++y)
609 for (int x = 0; x < Width(); ++x)
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700610 ASSERT_EQ(lookup(out, y * kOutputStride + x),
611 lookup(in, y * kInputStride + x))
John Koleszar5ca6a362013-01-25 09:47:09 -0800612 << "(" << x << "," << y << ")";
613}
614
615TEST_P(ConvolveTest, Copy2D) {
clang-format3a826f12016-08-11 17:46:05 -0700616 uint8_t *const in = input();
617 uint8_t *const out = output();
618 DECLARE_ALIGNED(256, const int16_t,
619 filter8[8]) = { 0, 0, 0, 128, 0, 0, 0, 0 };
John Koleszar5ca6a362013-01-25 09:47:09 -0800620
clang-format3a826f12016-08-11 17:46:05 -0700621 ASM_REGISTER_STATE_CHECK(UUT_->shv8_(in, kInputStride, out, kOutputStride,
622 filter8, 16, filter8, 16, Width(),
623 Height()));
John Koleszar5ca6a362013-01-25 09:47:09 -0800624
625 CheckGuardBlocks();
626
627 for (int y = 0; y < Height(); ++y)
628 for (int x = 0; x < Width(); ++x)
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700629 ASSERT_EQ(lookup(out, y * kOutputStride + x),
630 lookup(in, y * kInputStride + x))
John Koleszar5ca6a362013-01-25 09:47:09 -0800631 << "(" << x << "," << y << ")";
632}
633
Dmitry Kovalev3d4ed272014-04-21 14:15:35 -0700634const int kNumFilterBanks = 4;
John Koleszara9ebbcc2013-04-18 13:05:38 -0700635const int kNumFilters = 16;
636
637TEST(ConvolveTest, FiltersWontSaturateWhenAddedPairwise) {
638 for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
Dmitry Kovalev3d4ed272014-04-21 14:15:35 -0700639 const InterpKernel *filters =
James Zern7b9407a2016-05-18 23:48:05 -0700640 av1_filter_kernels[static_cast<InterpFilter>(filter_bank)];
John Koleszara9ebbcc2013-04-18 13:05:38 -0700641 for (int i = 0; i < kNumFilters; i++) {
642 const int p0 = filters[i][0] + filters[i][1];
643 const int p1 = filters[i][2] + filters[i][3];
644 const int p2 = filters[i][4] + filters[i][5];
645 const int p3 = filters[i][6] + filters[i][7];
646 EXPECT_LE(p0, 128);
647 EXPECT_LE(p1, 128);
648 EXPECT_LE(p2, 128);
649 EXPECT_LE(p3, 128);
650 EXPECT_LE(p0 + p3, 128);
651 EXPECT_LE(p0 + p3 + p1, 128);
652 EXPECT_LE(p0 + p3 + p1 + p2, 128);
653 EXPECT_EQ(p0 + p1 + p2 + p3, 128);
654 }
655 }
656}
John Koleszar557a1b22013-02-20 16:13:01 -0800657
John Koleszar04c24072013-02-20 16:32:02 -0800658const int16_t kInvalidFilter[8] = { 0 };
659
John Koleszar5ca6a362013-01-25 09:47:09 -0800660TEST_P(ConvolveTest, MatchesReferenceSubpixelFilter) {
clang-format3a826f12016-08-11 17:46:05 -0700661 uint8_t *const in = input();
662 uint8_t *const out = output();
Yaowu Xuf883b422016-08-30 14:01:10 -0700663#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700664 uint8_t ref8[kOutputStride * kMaxDimension];
665 uint16_t ref16[kOutputStride * kMaxDimension];
clang-format3a826f12016-08-11 17:46:05 -0700666 uint8_t *ref;
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700667 if (UUT_->use_highbd_ == 0) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700668 ref = ref8;
669 } else {
670 ref = CONVERT_TO_BYTEPTR(ref16);
671 }
672#else
John Koleszar5ca6a362013-01-25 09:47:09 -0800673 uint8_t ref[kOutputStride * kMaxDimension];
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700674#endif
John Koleszar5ca6a362013-01-25 09:47:09 -0800675
John Koleszar557a1b22013-02-20 16:13:01 -0800676 for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
Dmitry Kovalev3d4ed272014-04-21 14:15:35 -0700677 const InterpKernel *filters =
James Zern7b9407a2016-05-18 23:48:05 -0700678 av1_filter_kernels[static_cast<InterpFilter>(filter_bank)];
Dmitry Kovalev021eaab2014-05-14 16:21:41 -0700679
John Koleszar557a1b22013-02-20 16:13:01 -0800680 for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
681 for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
clang-format3a826f12016-08-11 17:46:05 -0700682 wrapper_filter_block2d_8_c(in, kInputStride, filters[filter_x],
683 filters[filter_y], ref, kOutputStride,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700684 Width(), Height());
John Koleszar5ca6a362013-01-25 09:47:09 -0800685
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700686 if (filter_x && filter_y)
clang-format3a826f12016-08-11 17:46:05 -0700687 ASM_REGISTER_STATE_CHECK(UUT_->hv8_(
688 in, kInputStride, out, kOutputStride, filters[filter_x], 16,
689 filters[filter_y], 16, Width(), Height()));
John Koleszar557a1b22013-02-20 16:13:01 -0800690 else if (filter_y)
James Zern29e1b1a2014-07-09 21:02:02 -0700691 ASM_REGISTER_STATE_CHECK(
clang-format3a826f12016-08-11 17:46:05 -0700692 UUT_->v8_(in, kInputStride, out, kOutputStride, kInvalidFilter,
693 16, filters[filter_y], 16, Width(), Height()));
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700694 else if (filter_x)
James Zern29e1b1a2014-07-09 21:02:02 -0700695 ASM_REGISTER_STATE_CHECK(
clang-format3a826f12016-08-11 17:46:05 -0700696 UUT_->h8_(in, kInputStride, out, kOutputStride, filters[filter_x],
697 16, kInvalidFilter, 16, Width(), Height()));
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700698 else
699 ASM_REGISTER_STATE_CHECK(
clang-format3a826f12016-08-11 17:46:05 -0700700 UUT_->copy_(in, kInputStride, out, kOutputStride, kInvalidFilter,
701 0, kInvalidFilter, 0, Width(), Height()));
John Koleszar5ca6a362013-01-25 09:47:09 -0800702
John Koleszar557a1b22013-02-20 16:13:01 -0800703 CheckGuardBlocks();
John Koleszar5ca6a362013-01-25 09:47:09 -0800704
John Koleszar557a1b22013-02-20 16:13:01 -0800705 for (int y = 0; y < Height(); ++y)
706 for (int x = 0; x < Width(); ++x)
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700707 ASSERT_EQ(lookup(ref, y * kOutputStride + x),
708 lookup(out, y * kOutputStride + x))
John Koleszar557a1b22013-02-20 16:13:01 -0800709 << "mismatch at (" << x << "," << y << "), "
clang-format3a826f12016-08-11 17:46:05 -0700710 << "filters (" << filter_bank << "," << filter_x << ","
711 << filter_y << ")";
John Koleszar557a1b22013-02-20 16:13:01 -0800712 }
John Koleszar5ca6a362013-01-25 09:47:09 -0800713 }
714 }
715}
716
717TEST_P(ConvolveTest, MatchesReferenceAveragingSubpixelFilter) {
clang-format3a826f12016-08-11 17:46:05 -0700718 uint8_t *const in = input();
719 uint8_t *const out = output();
Yaowu Xuf883b422016-08-30 14:01:10 -0700720#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700721 uint8_t ref8[kOutputStride * kMaxDimension];
722 uint16_t ref16[kOutputStride * kMaxDimension];
clang-format3a826f12016-08-11 17:46:05 -0700723 uint8_t *ref;
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700724 if (UUT_->use_highbd_ == 0) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700725 ref = ref8;
726 } else {
727 ref = CONVERT_TO_BYTEPTR(ref16);
728 }
729#else
John Koleszar5ca6a362013-01-25 09:47:09 -0800730 uint8_t ref[kOutputStride * kMaxDimension];
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700731#endif
John Koleszar5ca6a362013-01-25 09:47:09 -0800732
733 // Populate ref and out with some random data
Yaowu Xuc27fc142016-08-22 16:08:15 -0700734 ::libaom_test::ACMRandom prng;
John Koleszar5ca6a362013-01-25 09:47:09 -0800735 for (int y = 0; y < Height(); ++y) {
736 for (int x = 0; x < Width(); ++x) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700737 uint16_t r;
Yaowu Xuf883b422016-08-30 14:01:10 -0700738#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700739 if (UUT_->use_highbd_ == 0 || UUT_->use_highbd_ == 8) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700740 r = prng.Rand8Extremes();
741 } else {
742 r = prng.Rand16() & mask_;
743 }
744#else
745 r = prng.Rand8Extremes();
746#endif
John Koleszar5ca6a362013-01-25 09:47:09 -0800747
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700748 assign_val(out, y * kOutputStride + x, r);
749 assign_val(ref, y * kOutputStride + x, r);
John Koleszar5ca6a362013-01-25 09:47:09 -0800750 }
751 }
752
John Koleszar557a1b22013-02-20 16:13:01 -0800753 for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
Dmitry Kovalev3d4ed272014-04-21 14:15:35 -0700754 const InterpKernel *filters =
James Zern7b9407a2016-05-18 23:48:05 -0700755 av1_filter_kernels[static_cast<InterpFilter>(filter_bank)];
John Koleszar5ca6a362013-01-25 09:47:09 -0800756
John Koleszar557a1b22013-02-20 16:13:01 -0800757 for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
758 for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
clang-format3a826f12016-08-11 17:46:05 -0700759 wrapper_filter_average_block2d_8_c(in, kInputStride, filters[filter_x],
760 filters[filter_y], ref,
761 kOutputStride, Width(), Height());
John Koleszar5ca6a362013-01-25 09:47:09 -0800762
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700763 if (filter_x && filter_y)
clang-format3a826f12016-08-11 17:46:05 -0700764 ASM_REGISTER_STATE_CHECK(UUT_->hv8_avg_(
765 in, kInputStride, out, kOutputStride, filters[filter_x], 16,
766 filters[filter_y], 16, Width(), Height()));
John Koleszar557a1b22013-02-20 16:13:01 -0800767 else if (filter_y)
clang-format3a826f12016-08-11 17:46:05 -0700768 ASM_REGISTER_STATE_CHECK(UUT_->v8_avg_(
769 in, kInputStride, out, kOutputStride, kInvalidFilter, 16,
770 filters[filter_y], 16, Width(), Height()));
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700771 else if (filter_x)
clang-format3a826f12016-08-11 17:46:05 -0700772 ASM_REGISTER_STATE_CHECK(UUT_->h8_avg_(
773 in, kInputStride, out, kOutputStride, filters[filter_x], 16,
774 kInvalidFilter, 16, Width(), Height()));
John Koleszar557a1b22013-02-20 16:13:01 -0800775 else
James Zern29e1b1a2014-07-09 21:02:02 -0700776 ASM_REGISTER_STATE_CHECK(
clang-format3a826f12016-08-11 17:46:05 -0700777 UUT_->avg_(in, kInputStride, out, kOutputStride, kInvalidFilter,
778 0, kInvalidFilter, 0, Width(), Height()));
John Koleszar5ca6a362013-01-25 09:47:09 -0800779
John Koleszar557a1b22013-02-20 16:13:01 -0800780 CheckGuardBlocks();
John Koleszar5ca6a362013-01-25 09:47:09 -0800781
John Koleszar557a1b22013-02-20 16:13:01 -0800782 for (int y = 0; y < Height(); ++y)
783 for (int x = 0; x < Width(); ++x)
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700784 ASSERT_EQ(lookup(ref, y * kOutputStride + x),
785 lookup(out, y * kOutputStride + x))
John Koleszar557a1b22013-02-20 16:13:01 -0800786 << "mismatch at (" << x << "," << y << "), "
clang-format3a826f12016-08-11 17:46:05 -0700787 << "filters (" << filter_bank << "," << filter_x << ","
788 << filter_y << ")";
John Koleszar557a1b22013-02-20 16:13:01 -0800789 }
John Koleszar5ca6a362013-01-25 09:47:09 -0800790 }
791 }
792}
793
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700794TEST_P(ConvolveTest, FilterExtremes) {
795 uint8_t *const in = input();
796 uint8_t *const out = output();
Yaowu Xuf883b422016-08-30 14:01:10 -0700797#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700798 uint8_t ref8[kOutputStride * kMaxDimension];
799 uint16_t ref16[kOutputStride * kMaxDimension];
800 uint8_t *ref;
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700801 if (UUT_->use_highbd_ == 0) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700802 ref = ref8;
803 } else {
804 ref = CONVERT_TO_BYTEPTR(ref16);
805 }
806#else
807 uint8_t ref[kOutputStride * kMaxDimension];
808#endif
809
810 // Populate ref and out with some random data
Yaowu Xuc27fc142016-08-22 16:08:15 -0700811 ::libaom_test::ACMRandom prng;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700812 for (int y = 0; y < Height(); ++y) {
813 for (int x = 0; x < Width(); ++x) {
814 uint16_t r;
Yaowu Xuf883b422016-08-30 14:01:10 -0700815#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee1929c9b2014-10-08 12:43:22 -0700816 if (UUT_->use_highbd_ == 0 || UUT_->use_highbd_ == 8) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700817 r = prng.Rand8Extremes();
818 } else {
819 r = prng.Rand16() & mask_;
820 }
821#else
822 r = prng.Rand8Extremes();
823#endif
824 assign_val(out, y * kOutputStride + x, r);
825 assign_val(ref, y * kOutputStride + x, r);
826 }
827 }
828
829 for (int axis = 0; axis < 2; axis++) {
830 int seed_val = 0;
831 while (seed_val < 256) {
832 for (int y = 0; y < 8; ++y) {
833 for (int x = 0; x < 8; ++x) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700834#if CONFIG_AOM_HIGHBITDEPTH
clang-format3a826f12016-08-11 17:46:05 -0700835 assign_val(in, y * kOutputStride + x - SUBPEL_TAPS / 2 + 1,
836 ((seed_val >> (axis ? y : x)) & 1) * mask_);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700837#else
clang-format3a826f12016-08-11 17:46:05 -0700838 assign_val(in, y * kOutputStride + x - SUBPEL_TAPS / 2 + 1,
839 ((seed_val >> (axis ? y : x)) & 1) * 255);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700840#endif
841 if (axis) seed_val++;
842 }
843 if (axis)
clang-format3a826f12016-08-11 17:46:05 -0700844 seed_val -= 8;
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700845 else
846 seed_val++;
847 }
848 if (axis) seed_val += 8;
849
850 for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
851 const InterpKernel *filters =
James Zern7b9407a2016-05-18 23:48:05 -0700852 av1_filter_kernels[static_cast<InterpFilter>(filter_bank)];
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700853 for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
854 for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
clang-format3a826f12016-08-11 17:46:05 -0700855 wrapper_filter_block2d_8_c(in, kInputStride, filters[filter_x],
856 filters[filter_y], ref, kOutputStride,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700857 Width(), Height());
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700858 if (filter_x && filter_y)
clang-format3a826f12016-08-11 17:46:05 -0700859 ASM_REGISTER_STATE_CHECK(UUT_->hv8_(
860 in, kInputStride, out, kOutputStride, filters[filter_x], 16,
861 filters[filter_y], 16, Width(), Height()));
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700862 else if (filter_y)
clang-format3a826f12016-08-11 17:46:05 -0700863 ASM_REGISTER_STATE_CHECK(UUT_->v8_(
864 in, kInputStride, out, kOutputStride, kInvalidFilter, 16,
865 filters[filter_y], 16, Width(), Height()));
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700866 else if (filter_x)
clang-format3a826f12016-08-11 17:46:05 -0700867 ASM_REGISTER_STATE_CHECK(UUT_->h8_(
868 in, kInputStride, out, kOutputStride, filters[filter_x], 16,
869 kInvalidFilter, 16, Width(), Height()));
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700870 else
clang-format3a826f12016-08-11 17:46:05 -0700871 ASM_REGISTER_STATE_CHECK(UUT_->copy_(
872 in, kInputStride, out, kOutputStride, kInvalidFilter, 0,
873 kInvalidFilter, 0, Width(), Height()));
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700874
875 for (int y = 0; y < Height(); ++y)
876 for (int x = 0; x < Width(); ++x)
877 ASSERT_EQ(lookup(ref, y * kOutputStride + x),
878 lookup(out, y * kOutputStride + x))
879 << "mismatch at (" << x << "," << y << "), "
clang-format3a826f12016-08-11 17:46:05 -0700880 << "filters (" << filter_bank << "," << filter_x << ","
881 << filter_y << ")";
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700882 }
883 }
884 }
885 }
886 }
887}
888
Tero Rintaluomae326cec2013-08-22 11:29:19 +0300889/* This test exercises that enough rows and columns are filtered with every
890 possible initial fractional positions and scaling steps. */
891TEST_P(ConvolveTest, CheckScalingFiltering) {
clang-format3a826f12016-08-11 17:46:05 -0700892 uint8_t *const in = input();
893 uint8_t *const out = output();
Yaowu Xuf883b422016-08-30 14:01:10 -0700894 const InterpKernel *const eighttap = av1_filter_kernels[EIGHTTAP];
Tero Rintaluomae326cec2013-08-22 11:29:19 +0300895
896 SetConstantInput(127);
897
898 for (int frac = 0; frac < 16; ++frac) {
899 for (int step = 1; step <= 32; ++step) {
900 /* Test the horizontal and vertical filters in combination. */
Scott LaVarnway4e6b5072015-08-05 10:47:06 -0700901 ASM_REGISTER_STATE_CHECK(UUT_->shv8_(in, kInputStride, out, kOutputStride,
clang-format3a826f12016-08-11 17:46:05 -0700902 eighttap[frac], step, eighttap[frac],
903 step, Width(), Height()));
Tero Rintaluomae326cec2013-08-22 11:29:19 +0300904
905 CheckGuardBlocks();
906
907 for (int y = 0; y < Height(); ++y) {
908 for (int x = 0; x < Width(); ++x) {
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700909 ASSERT_EQ(lookup(in, y * kInputStride + x),
910 lookup(out, y * kOutputStride + x))
clang-format3a826f12016-08-11 17:46:05 -0700911 << "x == " << x << ", y == " << y << ", frac == " << frac
912 << ", step == " << step;
Tero Rintaluomae326cec2013-08-22 11:29:19 +0300913 }
914 }
915 }
916 }
917}
918
John Koleszar5ca6a362013-01-25 09:47:09 -0800919using std::tr1::make_tuple;
920
Yaowu Xuf883b422016-08-30 14:01:10 -0700921#if CONFIG_AOM_HIGHBITDEPTH
clang-format3a826f12016-08-11 17:46:05 -0700922#define WRAP(func, bd) \
923 void wrap_##func##_##bd( \
924 const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, \
925 ptrdiff_t dst_stride, const int16_t *filter_x, int filter_x_stride, \
926 const int16_t *filter_y, int filter_y_stride, int w, int h) { \
Yaowu Xuf883b422016-08-30 14:01:10 -0700927 aom_highbd_##func(src, src_stride, dst, dst_stride, filter_x, \
clang-format3a826f12016-08-11 17:46:05 -0700928 filter_x_stride, filter_y, filter_y_stride, w, h, bd); \
929 }
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700930#if HAVE_SSE2 && ARCH_X86_64
Alex Converse0c00af12015-10-06 15:59:03 -0700931WRAP(convolve_copy_sse2, 8)
932WRAP(convolve_avg_sse2, 8)
933WRAP(convolve_copy_sse2, 10)
934WRAP(convolve_avg_sse2, 10)
935WRAP(convolve_copy_sse2, 12)
936WRAP(convolve_avg_sse2, 12)
Alex Converse7e779382015-10-09 11:42:05 -0700937WRAP(convolve8_horiz_sse2, 8)
938WRAP(convolve8_avg_horiz_sse2, 8)
939WRAP(convolve8_vert_sse2, 8)
940WRAP(convolve8_avg_vert_sse2, 8)
941WRAP(convolve8_sse2, 8)
942WRAP(convolve8_avg_sse2, 8)
943WRAP(convolve8_horiz_sse2, 10)
944WRAP(convolve8_avg_horiz_sse2, 10)
945WRAP(convolve8_vert_sse2, 10)
946WRAP(convolve8_avg_vert_sse2, 10)
947WRAP(convolve8_sse2, 10)
948WRAP(convolve8_avg_sse2, 10)
949WRAP(convolve8_horiz_sse2, 12)
950WRAP(convolve8_avg_horiz_sse2, 12)
951WRAP(convolve8_vert_sse2, 12)
952WRAP(convolve8_avg_vert_sse2, 12)
953WRAP(convolve8_sse2, 12)
954WRAP(convolve8_avg_sse2, 12)
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700955#endif // HAVE_SSE2 && ARCH_X86_64
956
Alex Converse7e779382015-10-09 11:42:05 -0700957WRAP(convolve_copy_c, 8)
958WRAP(convolve_avg_c, 8)
959WRAP(convolve8_horiz_c, 8)
960WRAP(convolve8_avg_horiz_c, 8)
961WRAP(convolve8_vert_c, 8)
962WRAP(convolve8_avg_vert_c, 8)
963WRAP(convolve8_c, 8)
964WRAP(convolve8_avg_c, 8)
965WRAP(convolve_copy_c, 10)
966WRAP(convolve_avg_c, 10)
967WRAP(convolve8_horiz_c, 10)
968WRAP(convolve8_avg_horiz_c, 10)
969WRAP(convolve8_vert_c, 10)
970WRAP(convolve8_avg_vert_c, 10)
971WRAP(convolve8_c, 10)
972WRAP(convolve8_avg_c, 10)
973WRAP(convolve_copy_c, 12)
974WRAP(convolve_avg_c, 12)
975WRAP(convolve8_horiz_c, 12)
976WRAP(convolve8_avg_horiz_c, 12)
977WRAP(convolve8_vert_c, 12)
978WRAP(convolve8_avg_vert_c, 12)
979WRAP(convolve8_c, 12)
980WRAP(convolve8_avg_c, 12)
981#undef WRAP
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700982
983const ConvolveFunctions convolve8_c(
clang-format3a826f12016-08-11 17:46:05 -0700984 wrap_convolve_copy_c_8, wrap_convolve_avg_c_8, wrap_convolve8_horiz_c_8,
985 wrap_convolve8_avg_horiz_c_8, wrap_convolve8_vert_c_8,
986 wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8, wrap_convolve8_avg_c_8,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700987 wrap_convolve8_horiz_c_8, wrap_convolve8_avg_horiz_c_8,
clang-format3a826f12016-08-11 17:46:05 -0700988 wrap_convolve8_vert_c_8, wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8,
989 wrap_convolve8_avg_c_8, 8);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700990const ConvolveFunctions convolve10_c(
clang-format3a826f12016-08-11 17:46:05 -0700991 wrap_convolve_copy_c_10, wrap_convolve_avg_c_10, wrap_convolve8_horiz_c_10,
992 wrap_convolve8_avg_horiz_c_10, wrap_convolve8_vert_c_10,
993 wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10, wrap_convolve8_avg_c_10,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700994 wrap_convolve8_horiz_c_10, wrap_convolve8_avg_horiz_c_10,
clang-format3a826f12016-08-11 17:46:05 -0700995 wrap_convolve8_vert_c_10, wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10,
996 wrap_convolve8_avg_c_10, 10);
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -0700997const ConvolveFunctions convolve12_c(
clang-format3a826f12016-08-11 17:46:05 -0700998 wrap_convolve_copy_c_12, wrap_convolve_avg_c_12, wrap_convolve8_horiz_c_12,
999 wrap_convolve8_avg_horiz_c_12, wrap_convolve8_vert_c_12,
1000 wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12, wrap_convolve8_avg_c_12,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -07001001 wrap_convolve8_horiz_c_12, wrap_convolve8_avg_horiz_c_12,
clang-format3a826f12016-08-11 17:46:05 -07001002 wrap_convolve8_vert_c_12, wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12,
1003 wrap_convolve8_avg_c_12, 12);
Alex Conversef03e2382016-04-26 18:09:40 -07001004const ConvolveParam kArrayConvolve_c[] = {
clang-format3a826f12016-08-11 17:46:05 -07001005 ALL_SIZES(convolve8_c), ALL_SIZES(convolve10_c), ALL_SIZES(convolve12_c)
Alex Conversef03e2382016-04-26 18:09:40 -07001006};
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -07001007
Deb Mukherjee10783d42014-09-02 16:34:09 -07001008#else
John Koleszar5ca6a362013-01-25 09:47:09 -08001009const ConvolveFunctions convolve8_c(
Yaowu Xuf883b422016-08-30 14:01:10 -07001010 aom_convolve_copy_c, aom_convolve_avg_c, aom_convolve8_horiz_c,
1011 aom_convolve8_avg_horiz_c, aom_convolve8_vert_c, aom_convolve8_avg_vert_c,
1012 aom_convolve8_c, aom_convolve8_avg_c, aom_scaled_horiz_c,
1013 aom_scaled_avg_horiz_c, aom_scaled_vert_c, aom_scaled_avg_vert_c,
1014 aom_scaled_2d_c, aom_scaled_avg_2d_c, 0);
Alex Conversef03e2382016-04-26 18:09:40 -07001015const ConvolveParam kArrayConvolve_c[] = { ALL_SIZES(convolve8_c) };
Deb Mukherjee10783d42014-09-02 16:34:09 -07001016#endif
clang-format3a826f12016-08-11 17:46:05 -07001017INSTANTIATE_TEST_CASE_P(C, ConvolveTest, ::testing::ValuesIn(kArrayConvolve_c));
John Koleszar29d47ac2013-02-07 17:00:37 -08001018
Deb Mukherjee10783d42014-09-02 16:34:09 -07001019#if HAVE_SSE2 && ARCH_X86_64
Yaowu Xuf883b422016-08-30 14:01:10 -07001020#if CONFIG_AOM_HIGHBITDEPTH
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -07001021const ConvolveFunctions convolve8_sse2(
Alex Converse0c00af12015-10-06 15:59:03 -07001022 wrap_convolve_copy_sse2_8, wrap_convolve_avg_sse2_8,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -07001023 wrap_convolve8_horiz_sse2_8, wrap_convolve8_avg_horiz_sse2_8,
1024 wrap_convolve8_vert_sse2_8, wrap_convolve8_avg_vert_sse2_8,
Scott LaVarnway4e6b5072015-08-05 10:47:06 -07001025 wrap_convolve8_sse2_8, wrap_convolve8_avg_sse2_8,
1026 wrap_convolve8_horiz_sse2_8, wrap_convolve8_avg_horiz_sse2_8,
1027 wrap_convolve8_vert_sse2_8, wrap_convolve8_avg_vert_sse2_8,
Deb Mukherjee0d3c3d32014-09-16 12:47:18 -07001028 wrap_convolve8_sse2_8, wrap_convolve8_avg_sse2_8, 8);
Deb Mukherjee27dce0f2014-11-07 10:19:46 -08001029const ConvolveFunctions convolve10_sse2(
Alex Converse0c00af12015-10-06 15:59:03 -07001030 wrap_convolve_copy_sse2_10, wrap_convolve_avg_sse2_10,
Deb Mukherjee27dce0f2014-11-07 10:19:46 -08001031 wrap_convolve8_horiz_sse2_10, wrap_convolve8_avg_horiz_sse2_10,
1032 wrap_convolve8_vert_sse2_10, wrap_convolve8_avg_vert_sse2_10,
Scott LaVarnway4e6b5072015-08-05 10:47:06 -07001033 wrap_convolve8_sse2_10, wrap_convolve8_avg_sse2_10,
1034 wrap_convolve8_horiz_sse2_10, wrap_convolve8_avg_horiz_sse2_10,
1035 wrap_convolve8_vert_sse2_10, wrap_convolve8_avg_vert_sse2_10,
Deb Mukherjee27dce0f2014-11-07 10:19:46 -08001036 wrap_convolve8_sse2_10, wrap_convolve8_avg_sse2_10, 10);
1037const ConvolveFunctions convolve12_sse2(
Alex Converse0c00af12015-10-06 15:59:03 -07001038 wrap_convolve_copy_sse2_12, wrap_convolve_avg_sse2_12,
Deb Mukherjee27dce0f2014-11-07 10:19:46 -08001039 wrap_convolve8_horiz_sse2_12, wrap_convolve8_avg_horiz_sse2_12,
1040 wrap_convolve8_vert_sse2_12, wrap_convolve8_avg_vert_sse2_12,
Scott LaVarnway4e6b5072015-08-05 10:47:06 -07001041 wrap_convolve8_sse2_12, wrap_convolve8_avg_sse2_12,
1042 wrap_convolve8_horiz_sse2_12, wrap_convolve8_avg_horiz_sse2_12,
1043 wrap_convolve8_vert_sse2_12, wrap_convolve8_avg_vert_sse2_12,
Deb Mukherjee27dce0f2014-11-07 10:19:46 -08001044 wrap_convolve8_sse2_12, wrap_convolve8_avg_sse2_12, 12);
clang-format3a826f12016-08-11 17:46:05 -07001045const ConvolveParam kArrayConvolve_sse2[] = { ALL_SIZES(convolve8_sse2),
1046 ALL_SIZES(convolve10_sse2),
1047 ALL_SIZES(convolve12_sse2) };
Deb Mukherjee10783d42014-09-02 16:34:09 -07001048#else
Yunqing Wang3fb728c2013-10-10 13:51:35 -07001049const ConvolveFunctions convolve8_sse2(
Yaowu Xuf883b422016-08-30 14:01:10 -07001050 aom_convolve_copy_sse2, aom_convolve_avg_sse2, aom_convolve8_horiz_sse2,
1051 aom_convolve8_avg_horiz_sse2, aom_convolve8_vert_sse2,
1052 aom_convolve8_avg_vert_sse2, aom_convolve8_sse2, aom_convolve8_avg_sse2,
1053 aom_scaled_horiz_c, aom_scaled_avg_horiz_c, aom_scaled_vert_c,
1054 aom_scaled_avg_vert_c, aom_scaled_2d_c, aom_scaled_avg_2d_c, 0);
Yunqing Wang3fb728c2013-10-10 13:51:35 -07001055
Alex Conversef03e2382016-04-26 18:09:40 -07001056const ConvolveParam kArrayConvolve_sse2[] = { ALL_SIZES(convolve8_sse2) };
Yaowu Xuf883b422016-08-30 14:01:10 -07001057#endif // CONFIG_AOM_HIGHBITDEPTH
Alex Conversef03e2382016-04-26 18:09:40 -07001058INSTANTIATE_TEST_CASE_P(SSE2, ConvolveTest,
1059 ::testing::ValuesIn(kArrayConvolve_sse2));
Deb Mukherjee10783d42014-09-02 16:34:09 -07001060#endif
Yunqing Wang3fb728c2013-10-10 13:51:35 -07001061
John Koleszar29d47ac2013-02-07 17:00:37 -08001062#if HAVE_SSSE3
1063const ConvolveFunctions convolve8_ssse3(
Yaowu Xuf883b422016-08-30 14:01:10 -07001064 aom_convolve_copy_c, aom_convolve_avg_c, aom_convolve8_horiz_ssse3,
1065 aom_convolve8_avg_horiz_ssse3, aom_convolve8_vert_ssse3,
1066 aom_convolve8_avg_vert_ssse3, aom_convolve8_ssse3, aom_convolve8_avg_ssse3,
1067 aom_scaled_horiz_c, aom_scaled_avg_horiz_c, aom_scaled_vert_c,
1068 aom_scaled_avg_vert_c, aom_scaled_2d_ssse3, aom_scaled_avg_2d_c, 0);
John Koleszar29d47ac2013-02-07 17:00:37 -08001069
Alex Conversef03e2382016-04-26 18:09:40 -07001070const ConvolveParam kArrayConvolve8_ssse3[] = { ALL_SIZES(convolve8_ssse3) };
1071INSTANTIATE_TEST_CASE_P(SSSE3, ConvolveTest,
1072 ::testing::ValuesIn(kArrayConvolve8_ssse3));
John Koleszar29d47ac2013-02-07 17:00:37 -08001073#endif
Johann158c80c2013-05-23 12:50:41 -07001074
Johann8645a532014-09-10 10:27:58 -07001075#if HAVE_AVX2 && HAVE_SSSE3
Yunqing Wang4f0943b2014-05-27 10:36:56 -07001076const ConvolveFunctions convolve8_avx2(
Yaowu Xuf883b422016-08-30 14:01:10 -07001077 aom_convolve_copy_c, aom_convolve_avg_c, aom_convolve8_horiz_avx2,
1078 aom_convolve8_avg_horiz_ssse3, aom_convolve8_vert_avx2,
1079 aom_convolve8_avg_vert_ssse3, aom_convolve8_avx2, aom_convolve8_avg_ssse3,
1080 aom_scaled_horiz_c, aom_scaled_avg_horiz_c, aom_scaled_vert_c,
1081 aom_scaled_avg_vert_c, aom_scaled_2d_c, aom_scaled_avg_2d_c, 0);
Yunqing Wang4f0943b2014-05-27 10:36:56 -07001082
Alex Conversef03e2382016-04-26 18:09:40 -07001083const ConvolveParam kArrayConvolve8_avx2[] = { ALL_SIZES(convolve8_avx2) };
1084INSTANTIATE_TEST_CASE_P(AVX2, ConvolveTest,
1085 ::testing::ValuesIn(kArrayConvolve8_avx2));
Johann8645a532014-09-10 10:27:58 -07001086#endif // HAVE_AVX2 && HAVE_SSSE3
Yunqing Wang4f0943b2014-05-27 10:36:56 -07001087
Geza Lore938b8df2016-03-04 15:55:48 +00001088// TODO(any): Make NEON versions support 128x128 128x64 64x128 block sizes
Yaowu Xuf883b422016-08-30 14:01:10 -07001089#if HAVE_NEON && !(CONFIG_AV1 && CONFIG_EXT_PARTITION)
Johannce239312014-05-07 11:01:31 -07001090#if HAVE_NEON_ASM
Johann158c80c2013-05-23 12:50:41 -07001091const ConvolveFunctions convolve8_neon(
Yaowu Xuf883b422016-08-30 14:01:10 -07001092 aom_convolve_copy_neon, aom_convolve_avg_neon, aom_convolve8_horiz_neon,
1093 aom_convolve8_avg_horiz_neon, aom_convolve8_vert_neon,
1094 aom_convolve8_avg_vert_neon, aom_convolve8_neon, aom_convolve8_avg_neon,
1095 aom_scaled_horiz_c, aom_scaled_avg_horiz_c, aom_scaled_vert_c,
1096 aom_scaled_avg_vert_c, aom_scaled_2d_c, aom_scaled_avg_2d_c, 0);
clang-format3a826f12016-08-11 17:46:05 -07001097#else // HAVE_NEON
Scott LaVarnway617382a2014-09-10 09:49:34 -07001098const ConvolveFunctions convolve8_neon(
Yaowu Xuf883b422016-08-30 14:01:10 -07001099 aom_convolve_copy_neon, aom_convolve_avg_neon, aom_convolve8_horiz_neon,
1100 aom_convolve8_avg_horiz_neon, aom_convolve8_vert_neon,
1101 aom_convolve8_avg_vert_neon, aom_convolve8_neon, aom_convolve8_avg_neon,
1102 aom_scaled_horiz_c, aom_scaled_avg_horiz_c, aom_scaled_vert_c,
1103 aom_scaled_avg_vert_c, aom_scaled_2d_c, aom_scaled_avg_2d_c, 0);
Scott LaVarnway617382a2014-09-10 09:49:34 -07001104#endif // HAVE_NEON_ASM
Johann158c80c2013-05-23 12:50:41 -07001105
Alex Conversef03e2382016-04-26 18:09:40 -07001106const ConvolveParam kArrayConvolve8_neon[] = { ALL_SIZES(convolve8_neon) };
1107INSTANTIATE_TEST_CASE_P(NEON, ConvolveTest,
1108 ::testing::ValuesIn(kArrayConvolve8_neon));
Scott LaVarnway617382a2014-09-10 09:49:34 -07001109#endif // HAVE_NEON
Parag Salasakar40edab52013-09-13 15:18:32 +05301110
Geza Lore938b8df2016-03-04 15:55:48 +00001111// TODO(any): Make DSPR2 versions support 128x128 128x64 64x128 block sizes
Yaowu Xuf883b422016-08-30 14:01:10 -07001112#if HAVE_DSPR2 && !(CONFIG_AV1 && CONFIG_EXT_PARTITION)
Parag Salasakar40edab52013-09-13 15:18:32 +05301113const ConvolveFunctions convolve8_dspr2(
Yaowu Xuf883b422016-08-30 14:01:10 -07001114 aom_convolve_copy_dspr2, aom_convolve_avg_dspr2, aom_convolve8_horiz_dspr2,
1115 aom_convolve8_avg_horiz_dspr2, aom_convolve8_vert_dspr2,
1116 aom_convolve8_avg_vert_dspr2, aom_convolve8_dspr2, aom_convolve8_avg_dspr2,
1117 aom_scaled_horiz_c, aom_scaled_avg_horiz_c, aom_scaled_vert_c,
1118 aom_scaled_avg_vert_c, aom_scaled_2d_c, aom_scaled_avg_2d_c, 0);
Parag Salasakar40edab52013-09-13 15:18:32 +05301119
Alex Conversef03e2382016-04-26 18:09:40 -07001120const ConvolveParam kArrayConvolve8_dspr2[] = { ALL_SIZES(convolve8_dspr2) };
1121INSTANTIATE_TEST_CASE_P(DSPR2, ConvolveTest,
1122 ::testing::ValuesIn(kArrayConvolve8_dspr2));
1123#endif // HAVE_DSPR2
Parag Salasakar27d083c2015-04-16 11:03:24 +05301124
Geza Lore938b8df2016-03-04 15:55:48 +00001125// TODO(any): Make MSA versions support 128x128 128x64 64x128 block sizes
Yaowu Xuf883b422016-08-30 14:01:10 -07001126#if HAVE_MSA && !(CONFIG_AV1 && CONFIG_EXT_PARTITION)
Parag Salasakar27d083c2015-04-16 11:03:24 +05301127const ConvolveFunctions convolve8_msa(
Yaowu Xuf883b422016-08-30 14:01:10 -07001128 aom_convolve_copy_msa, aom_convolve_avg_msa, aom_convolve8_horiz_msa,
1129 aom_convolve8_avg_horiz_msa, aom_convolve8_vert_msa,
1130 aom_convolve8_avg_vert_msa, aom_convolve8_msa, aom_convolve8_avg_msa,
1131 aom_scaled_horiz_c, aom_scaled_avg_horiz_c, aom_scaled_vert_c,
1132 aom_scaled_avg_vert_c, aom_scaled_2d_c, aom_scaled_avg_2d_c, 0);
Parag Salasakar27d083c2015-04-16 11:03:24 +05301133
Alex Conversef03e2382016-04-26 18:09:40 -07001134const ConvolveParam kArrayConvolve8_msa[] = { ALL_SIZES(convolve8_msa) };
1135INSTANTIATE_TEST_CASE_P(MSA, ConvolveTest,
1136 ::testing::ValuesIn(kArrayConvolve8_msa));
Parag Salasakar27d083c2015-04-16 11:03:24 +05301137#endif // HAVE_MSA
James Zern8fb48af2013-05-02 13:08:19 -07001138} // namespace