xref: /aosp_15_r20/external/libgav1/src/dsp/convolve_test.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1 // Copyright 2021 The libgav1 Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/dsp/convolve.h"
16 
17 #include <algorithm>
18 #include <cassert>
19 #include <cstddef>
20 #include <cstdint>
21 #include <cstdio>
22 #include <cstring>
23 #include <ostream>
24 #include <string>
25 #include <tuple>
26 
27 #include "absl/strings/match.h"
28 #include "absl/strings/str_format.h"
29 #include "absl/strings/string_view.h"
30 #include "absl/time/clock.h"
31 #include "absl/time/time.h"
32 #include "gtest/gtest.h"
33 #include "src/dsp/constants.h"
34 #include "src/dsp/dsp.h"
35 #include "src/utils/common.h"
36 #include "src/utils/compiler_attributes.h"
37 #include "src/utils/constants.h"
38 #include "src/utils/cpu.h"
39 #include "src/utils/memory.h"
40 #include "tests/block_utils.h"
41 #include "tests/third_party/libvpx/acm_random.h"
42 #include "tests/third_party/libvpx/md5_helper.h"
43 #include "tests/utils.h"
44 
45 namespace libgav1 {
46 namespace dsp {
47 namespace {
48 
49 // The convolve function will access at most (block_height + 7) rows/columns
50 // from the beginning.
51 constexpr int kMaxBlockWidth = kMaxSuperBlockSizeInPixels + kSubPixelTaps;
52 constexpr int kMaxBlockHeight = kMaxSuperBlockSizeInPixels + kSubPixelTaps;
53 
54 // Test all the filters in |kSubPixelFilters|. There are 6 different filters but
55 // filters [4] and [5] are only reached through GetFilterIndex().
56 constexpr int kMinimumViableRuns = 4 * 16;
57 
58 struct ConvolveTestParam {
59   enum BlockSize {
60     kBlockSize2x2,
61     kBlockSize2x4,
62     kBlockSize4x2,
63     kBlockSize4x4,
64     kBlockSize4x8,
65     kBlockSize8x2,
66     kBlockSize8x4,
67     kBlockSize8x8,
68     kBlockSize8x16,
69     kBlockSize16x8,
70     kBlockSize16x16,
71     kBlockSize16x32,
72     kBlockSize32x16,
73     kBlockSize32x32,
74     kBlockSize32x64,
75     kBlockSize64x32,
76     kBlockSize64x64,
77     kBlockSize64x128,
78     kBlockSize128x64,
79     kBlockSize128x128,
80     kNumBlockSizes
81   };
82 
83   static constexpr int kBlockWidth[kNumBlockSizes] = {
84       2, 2, 4, 4, 4, 8, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64, 128, 128};
85   static constexpr int kBlockHeight[kNumBlockSizes] = {
86       2, 4, 2, 4, 8, 2, 4, 8, 16, 8, 16, 32, 16, 32, 64, 32, 64, 128, 64, 128};
87 
ConvolveTestParamlibgav1::dsp::__anon4b3d96e80111::ConvolveTestParam88   explicit ConvolveTestParam(BlockSize block_size)
89       : block_size(block_size),
90         width(kBlockWidth[block_size]),
91         height(kBlockHeight[block_size]) {}
92 
93   BlockSize block_size;
94   int width;
95   int height;
96 };
97 
98 #if !LIBGAV1_CXX17
99 constexpr int ConvolveTestParam::kBlockWidth[kNumBlockSizes];   // static.
100 constexpr int ConvolveTestParam::kBlockHeight[kNumBlockSizes];  // static.
101 #endif
102 
GetConvolveDigest8bpp(int id)103 const char* GetConvolveDigest8bpp(int id) {
104   // Entries containing 'XXXXX...' are skipped. See the test for details.
105   static const char* const kDigest[ConvolveTestParam::kNumBlockSizes * 16] = {
106       "ae5977a4ceffbac0cde72a04a43a9d57", "6cf5f791fe0d8dcd3526be3c6b814035",
107       "d905dfcad930aded7718587c05b48aaf", "6baf153feff04cc5b7e87c0bb60a905d",
108       "871ed5a69ca31e6444faa720895949bf", "c9cf1deba08dac5972b3b0a43eff8f98",
109       "68e2f90eaa0ab5da7e6f5776993f7eea", "f1f8282fb33c30eb68c0c315b7a4bc01",
110       "9412064b0eebf8123f23d74147d04dff", "cc08936effe309ab9a4fa1bf7e28e24e",
111       "36cbef36fa21b98df03536c918bf752a", "9d0da6321cf5311ea0bdd41271763030",
112       "55a10165ee8a660d7dddacf7de558cdd", "ac7fc9f9ea7213743fae5a023faaaf08",
113       "077e1b7b355c7ab3ca40230ee8efd8ea", "7a3e8de2a1caae206cf3e51a86dfd15a",
114       "1ddf9020f18fa7883355cf8c0881186a", "2377dd167ef2707978bed6f10ffd4e76",
115       "f918e0e4422967c6a7e47298135c7ae9", "b2264e129636368b5496760b39e64b7a",
116       "1168251e6261e2ff1fa69a93226dbd76", "4821befdf63f8c6da6440afeb57f320f",
117       "c30fc44d83821141e84cc4793e127301", "a8293b933d9f2e5d7f922ea40111d643",
118       "354a54861a94e8b027afd9931e61f997", "b384e9e3d81f9f4f9024028fbe451d8b",
119       "eeeb8589c1b31cbb565154736ca939ec", "f49dab626ddd977ed171f79295c24935",
120       "78d2f27e0d4708cb16856d7d40dc16fb", "9d2393ea156a1c2083f5b4207793064b",
121       "a9c62745b95c66fa497a524886af57e2", "2c614ec4463386ec075a0f1dbb587933",
122       "7a8856480d752153370240b066b90f6a", "beaef1dbffadc701fccb7c18a03e3a41",
123       "72b1e700c949d06eaf62d664dafdb5b6", "684f5c3a25a080edaf79add6e9137a8e",
124       "3be970f49e4288988818b087201d54da", "d2b9dba2968894a414756bb510ac389a",
125       "9a3215eb97aedbbddd76c7440837d040", "4e317feac6da46addf0e8b9d8d54304b",
126       "d2f5ca2b7958c332a3fb771f66da01f0", "7aec92c3b65e456b64ae285c12b03b0d",
127       "f72a99ad63f6a88c23724e898b705d21", "07a1f07f114c4a38ba08d2f44e1e1132",
128       "26b9de95edb45b31ac5aa19825831c7a", "4e4677a0623d44237eb8d6a622cdc526",
129       "c1b836a6ce023663b90db0e320389414", "5befcf222152ebc8d779fcc10b95320a",
130       "62adf407fc27d8682ced4dd7b55af14e", "35be0786a072bf2f1286989261bf6580",
131       "90562fc42dc5d879ae74c4909c1dec30", "a1427352f9e413975a0949e2b300c657",
132       "bcbc418bc2beb243e463851cd95335a9", "cb8fedcbecee3947358dc61f95e56530",
133       "0d0154a7d573685285a83a4cf201ac57", "b14bd8068f108905682b83cc15778065",
134       "c96c867d998473197dde9b587be14e3a", "f596c63c7b14cada0174e17124c83942",
135       "eb2822ad8204ed4ecbf0f30fcb210498", "538ce869ffd23b6963e61badfab7712b",
136       "6bbcc075f8b768a02cdc9149f150326d", "4ae70d9db2ec36885394db7d59bdd4f7",
137       "5fee162fe52c11c823db4d5ede370654", "9365186c59ef66d9def40f437022ad93",
138       "0f95fb0276c9c7910937fbdf75f2811d", "356d4003477283e157c8d2b5a79d913c",
139       "b355dab2dbb6f5869018563eece22862", "cf6ff8c43d8059cea6090a23ab66a0ef",
140       "a336f8b7bcf188840ca65c0d0e66518a", "de953f03895923359c6a719e6a537b89",
141       "8463ade9347ed602663e2cec5c4c3fe6", "392de11ffcd5c2ecf3db3480ee135340",
142       "bddd31e3e852712e6244b616622af83d", "30a36245c40d978fc8976b442a8600c3",
143       "93aa662b988b8502e5ea95659eafde59", "70440ba9ee7f9d16d297dbb49e54a56e",
144       "1eb2be4c05b50e427e29c72fa566bff5", "52c0980bae63e8459e82eee7d8af2334",
145       "75e57104d6058cd2bce1d3d8142d273d", "b4c735269ade44419169adbd852d5ddc",
146       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
147       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "a7305087fae23de53d21a6909009ff69",
148       "8dcce009395264379c1a51239f4bb22c", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
149       "8dcce009395264379c1a51239f4bb22c", "d90a69e7bae8aa46ed0e1e5f911d7a07",
150       "6ab4dc87be03be1dcc5d956ca819d938", "6ab4dc87be03be1dcc5d956ca819d938",
151       "8f2afdb2f03cd04ffacd421b958caaa0", "710ccecc103033088d898a2b924551fb",
152       "710ccecc103033088d898a2b924551fb", "a4093e3e5902dd659407ce6471635a4e",
153       "375d7f5358d7a088a498b8b3aaecc0d5", "375d7f5358d7a088a498b8b3aaecc0d5",
154       "08867ea5cc38c705ec52af821bc4736a", "2afb540e8063f58d1b03896486c5e89b",
155       "2afb540e8063f58d1b03896486c5e89b", "6ce47b11d2e60c5d183c84ce9f2e46cc",
156       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
157       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "a5a1ac658d7ce4a846a32b9fcfaa3475",
158       "2370f4e4a83edf91b7f504bbe4b00e90", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
159       "ae5464066a049622a7a264cdf9394b55", "45368b6db3d1fee739a64b0bc823ea9c",
160       "8dff0f28192d9f8c0bf7fb5405719dd8", "632738ef3ff3021cff45045c41978849",
161       "f7ec43384037e8d6c618e0df826ec029", "a6bc648197781a2dc99c487e66464320",
162       "1112ebd509007154c72c5a485b220b62", "9714c4ce636b6fb0ad05cba246d48c76",
163       "2c93dde8884f09fb5bb5ad6d95cde86d", "a49e6160b5d1b56bc2046963101cd606",
164       "7f084953976111e9f65b57876e7552b1", "0846ec82555b66197c5c45b08240fbcc",
165       "ca7471c126ccd22189e874f0a6e41960", "0802b6318fbd0969a33de8fdfcd07f10",
166       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
167       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "3b1ceebf0579fcbbfd6136938c595b91",
168       "ecafabcad1045f15d31ce2f3b13132f2", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
169       "5f211eba020e256a5781b203c5aa1d2e", "3b04497634364dd2cd3f2482b5d4b32f",
170       "a8ac7b5dc65ffb758b0643508a0e744e", "561ed8be43c221a561f8885a0d74c7ef",
171       "8159619fc234598c8c75154d80021fd4", "8f43645dce92cf7594aa4822aa53b17d",
172       "b6ccddb7dfa4eddc87b4eff08b5a3195", "b4e605327b28db573d88844a1a09db8d",
173       "15b00a15d1cc6cc96ca85d00b167e4dd", "7bf911888c11a9fefd604b8b9c82e9a1",
174       "bfb69b4d7d4aed73cfa75a0f55b66440", "034d1d62581bd0d840c4cf1e28227931",
175       "8cba849640e9e2859d509bc81ca94acd", "bc79acf2a0fe419194cdb4529bc7dcc8",
176       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
177       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "3bfad931bce82335219e0e29c15f2b21",
178       "68a701313d2247d2b32636ebc1f2a008", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
179       "05afe1f40d37a45a97a5e0aadd5066fb", "9e1f0e0bddb58d15d0925eeaede9b84c",
180       "03313cdaa593a1a7b4869010dcc7b241", "88a50d2b4107ee5b5074b2520183f8ac",
181       "ac50ea9f7306da95a5092709442989cf", "739b17591437edffd36799237b962658",
182       "b8a7eb7dd9c216e240517edfc6489397", "75b755f199dbf4a0e5ebbb86c2bd871d",
183       "31b0017ba1110e3d70b020901bc15564", "0a1aa8f5ecfd11ddba080af0051c576a",
184       "536181ee90de883cc383787aec089221", "29f82b0f3e4113944bd28aacd9b8489a",
185       "ee3e76371240d1f1ff811cea6a7d4f63", "17a20dbbf09feae557d40aa5818fbe76",
186       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
187       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "6baf153feff04cc5b7e87c0bb60a905d",
188       "871ed5a69ca31e6444faa720895949bf", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
189       "68e2f90eaa0ab5da7e6f5776993f7eea", "f1f8282fb33c30eb68c0c315b7a4bc01",
190       "9412064b0eebf8123f23d74147d04dff", "cc08936effe309ab9a4fa1bf7e28e24e",
191       "36cbef36fa21b98df03536c918bf752a", "9d0da6321cf5311ea0bdd41271763030",
192       "55a10165ee8a660d7dddacf7de558cdd", "ac7fc9f9ea7213743fae5a023faaaf08",
193       "077e1b7b355c7ab3ca40230ee8efd8ea", "7a3e8de2a1caae206cf3e51a86dfd15a",
194       "1ddf9020f18fa7883355cf8c0881186a", "2377dd167ef2707978bed6f10ffd4e76",
195       "f918e0e4422967c6a7e47298135c7ae9", "b2264e129636368b5496760b39e64b7a",
196       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
197       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "4cfad2c437084a93ea76913e21c2dd89",
198       "d372f0c17bce98855d6d59fbee814c3d", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
199       "d99ffd2579eb781c30bc0df7b76ad61e", "4e139e57cbb049a0f4ef816adc48d026",
200       "be53b2507048e7ff50226d15c0b28865", "b73f3c1a10405de89d1f9e812ff73b5a",
201       "c7d51b1f2df49ab83962257e8a5934e5", "159e443d79cc59b11ca4a80aa7aa09be",
202       "6ef14b14882e1465b0482b0e0b16d8ce", "22a8d287b425c870f40c64a50f91ce54",
203       "f1d96db5a2e0a2160df38bd96d28d19b", "637d1e5221422dfe9a6dbcfd7f62ebdd",
204       "f275af4f1f350ffaaf650310cb5dddec", "f81c4d6b001a14584528880fa6988a87",
205       "a5a2f9c2e7759d8a3dec1bc4b56be587", "2317c57ab69a36eb3bf278cf8a8795a3",
206       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
207       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "1a0bdfc96a3b9fd904e658f238ab1076",
208       "56d16e54afe205e97527902770e71c71", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
209       "1f7b5b8282ff3cf4d8e8c52d80ef5b4d", "79e9e260a2028c5fe320005c272064b9",
210       "2418ebcdf85551b9ae6e3725f04aae6d", "98bdf907ebacacb734c9eef1ee727c6e",
211       "4dd5672d53c8f359e8f80badaa843dfc", "a1bef519bbf07138e2eec5a91694de46",
212       "df1cb51fe1a937cd7834e973dc5cb814", "317fe65abf81ef3ea07976ef8667baeb",
213       "2da29da97806ae0ee300c5e69c35a4aa", "555475f5d1685638169ab904447e4f13",
214       "b3e3a6234e8045e6182cf90a09f767b2", "849dfeca59074525dea59681a7f88ab4",
215       "39a68af80be11e1682b6f3c4ede33530", "b22d765af176d87e7d3048b4b89b86ad",
216       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
217       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "b8a710baa6a9fc784909671d450ecd99",
218       "f9e6a56382d8d12da676d6631bb6ef75", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
219       "3bf8e11e18527b16f0d7c0361d74a52d", "b9ff54c6f1e3b41fc7fc0f3fa0e75cf2",
220       "06ef1504f31af5f173d3317866ca57cb", "635e8ee11cf04d73598549234ad732a0",
221       "fab693410d59ee88aa2895527efc31ac", "3041eb26c23a63a587fbec623919e2d2",
222       "c61d99d5daf575664fb7ad64976f4b03", "822f6c4eb5db760468d822b21f48d94d",
223       "3f6fcb9fae3666e085b9e29002a802fc", "d9b9fecd195736a6049c528d4cb886b5",
224       "fed17fc391e6c3db4aa14ea1d6596c87", "d0d3482d981989e117cbb32fc4550267",
225       "39561688bf6680054edbfae6035316ce", "087c5992ca6f829e1ba4ba5332d67947",
226   };
227   assert(id >= 0);
228   assert(id < sizeof(kDigest) / sizeof(kDigest[0]));
229   return kDigest[id];
230 }
231 
GetConvolveScaleDigest8bpp(int id)232 const char* GetConvolveScaleDigest8bpp(int id) {
233   // Entries containing 'XXXXX...' are skipped. See the test for details.
234   static const char* const kDigest[ConvolveTestParam::kNumBlockSizes * 2] = {
235       "0291a23f2ac4c40b5d8e957e63769904", "1d48447857472d6455af10d5526f6827",
236       "409b2278d6d372248f1891ca0dd12760", "9e416606a3f82fe5bb3f7182e4f42c2d",
237       "e126563f859ddd5c5ffde6f641168fad", "9bad4f1b7e1865f814b6fd5620816ebd",
238       "50e5e5a57185477cb2af83490c33b47c", "3d2fb301c61d7fbd0e21ac263f7ac552",
239       "5920032c6432c80c6e5e61b684018d13", "07ada64d24339488cdce492e6e0c6b0d",
240       "aaf1589aff6d062a87c627ab9ba20e3e", "91adf91bb24d2c4ea3f882bdf7396e33",
241       "1d17a932a68bb1f199f709e7725fe44b", "07716c63afda034cb386511ea25a63b5",
242       "cca17ef3324c41d189e674a059ef1255", "37d17e70619823a606c0b5f74bf2e33b",
243       "ba8ed5474c187c8e8d7f82a6a29ee860", "27663f037973ebe82ec10252a4d91299",
244       "24c27e187e8d5a2bbfa0fef9046d3eb0", "9854fdc91a48e3bd4639edcc940e5c09",
245       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
246       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "a71907c60a9f1f81972a2859ae54a805",
247       "817bc3bf0c77abc4186eac39f2320184", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
248       "4e7182a8b226982e2678abcf5f83325d", "50cef7c6e57544135f102226bb95bed9",
249       "225e054dbcfff05b1c8b0792c731449e", "16eb63f03839159f3af0e08be857170f",
250       "c8e5d111a2e3f4487330a8bd893cb894", "4fd99eaf9c160442aab35b9bdc5d275b",
251       "8b0f61bfb30747d4c9215618ac42557c", "1df78022da202cefb9a8100b114152d9",
252       "378466e1eda63dbc03565b78af8e723f", "28ea721411fbf5fc805035be9a384140",
253       "4fed5d4163a3bfcc6726a42f20410b0a", "55abfca0c820771bd926e4b94f66a499",
254       "6c8b8ef0a78859c768e629e1decc0019", "d0ead286b5ba3841d24dd114efbfef0a",
255   };
256   assert(id >= 0);
257   assert(id < sizeof(kDigest) / sizeof(kDigest[0]));
258   return kDigest[id];
259 }
260 
261 #if LIBGAV1_MAX_BITDEPTH >= 10
GetConvolveDigest10bpp(int id)262 const char* GetConvolveDigest10bpp(int id) {
263   // Entries containing 'XXXXX...' are skipped. See the test for details.
264   static const char* const kDigest[ConvolveTestParam::kNumBlockSizes * 16] = {
265       "b1b6903d60501c7bc11e5285beb26a52", "a7855ed75772d7fa815978a202bbcd9f",
266       "bde291a4e8087c085fe8b3632f4d7351", "238980eebc9e63ae3eea2771c7a70f12",
267       "0eac13431bd7d8a573318408a72246d5", "d05a237ed7a9ca877256b71555b1b8e4",
268       "73438155feb62595e3e406921102d748", "5871e0e88a776840d619670fbf107858",
269       "1c6376ce55c9ee9e35d432edb1ffb3b7", "d675e0195c9feca956e637f3f1959f40",
270       "b5681673903ade13d69e295f82fdd009", "3c43020105ae93a301404b4cd6238654",
271       "dd2c5880a94ed3758bfea0b0e8c78286", "4ebb1a7b25a39d8b9868ec8a1243103f",
272       "d34ec07845cd8523651e5f5112984a14", "2ce55308d873f4cd244f16da2b06e06e",
273       "a4bb5d5ff4b25f391265b5231049a09a", "c9106e0c820b03bcdde3aa94efc11a3e",
274       "7ec2eae9e118506da8b33440b399511a", "78de867c8ee947ed6d29055747f26949",
275       "a693b4bd0334a3b98d45e67d3985bb63", "156de3172d9acf3c7f251cd7a18ad461",
276       "e545b8a3ff958f8363c7968cbae96732", "7842b2047356c1417d9d88219707f1a1",
277       "1a487c658d684314d91bb6d961a94672", "94b3e5bcd6b849b66a4571ec3d23f9be",
278       "0635a296be01b7e641de98ee27c33cd2", "82dc120bf8c2043bc5eee81007309ebf",
279       "58c826cad3c14cdf26a649265758c58b", "f166254037c0dfb140f54cd7b08bddfe",
280       "74ab206f14ac5f62653cd3dd71a7916d", "5621caef7cc1d6522903290ccc5c2cb8",
281       "78ec6cf42cce4b1feb65e076c78ca241", "42188e2dbb4e02cd353552ea147ad03f",
282       "f9813870fc27941a7c00a0443d7c2fe7", "20b14a6b5af7aa356963bcaaf23d230d",
283       "9c9c41435697f75fa118b6d6464ee7cb", "38816245ed832ba313fefafcbed1e5c8",
284       "5d34137cc8ddba75347b0fa1d0a91791", "465dcb046a0449b9dfb3e0b297aa3863",
285       "3e787534dff83c22b3033750e448865a", "4c91f676a054d582bcae1ca9adb87a31",
286       "eab5894046a99ad0a1a12c91b0f37bd7", "765b4cfbfc1a4988878c412d53bcb597",
287       "bc63b29ec78c1efec5543885a45bb822", "91d6bdbc62d4bb80c9b371d9704e3c9e",
288       "cecd57396a0033456408f3f3554c6912", "5b37f94ef136c1eb9a6181c19491459c",
289       "716ba3a25b454e44b46caa42622c128c", "9076f58c4ab20f2f06d701a6b53b1c4f",
290       "d3212ab3922f147c3cf126c3b1aa17f6", "b55fea77f0e14a8bf8b6562b766fe91f",
291       "59b578268ff26a1e21c5b4273f73f852", "16761e7c8ba2645718153bed83ae78f6",
292       "a9e9805769fe1baf5c7933793ccca0d8", "553a2c24939dff18ec5833c77f556cfb",
293       "5c1ec75a160c444fa90abf106fa1140e", "2266840f11ac4c066d941ec473b1a54f",
294       "9e194755b2a37b615a517d5f8746dfbb", "bbf86f8174334f0b8d869fd8d58bf92d",
295       "fd1da8d197cb385f7917cd296d67afb9", "a984202c527b757337c605443f376915",
296       "c347f4a58fd784c5e88c1a23e4ff15d2", "29cbaadbff9adf4a3d49bd9900a9dd0b",
297       "c5997b802a6ba1cf5ba1057ddc5baa7e", "4f750f6375524311d260306deb233861",
298       "59f33727e5beeb783a057770bec7b4cd", "0654d72f22306b28d9ae42515845240c",
299       "6c9d7d9e6ef81d76e775a85c53abe209", "a35f435ccc67717a49251a07e62ae204",
300       "c5325015cb0b7c42839ac4aa21803fa0", "f81f31f1585c0f70438c09e829416f20",
301       "ab10b22fb8dd8199040745565b28595d", "0d928d6111f86c60ccefc6c6604d5659",
302       "4ed1a6200912995d4f571bdb7822aa83", "92e31a45513582f386dc9c22a57bbbbd",
303       "6dbf310a9c8d85f76306d6a35545f8af", "80fce29dc82d5857c1ed5ef2aea16835",
304       "14f2c5b9d2cd621c178a39f1ec0c38eb", "da54cfb4530841bda29966cfa05f4879",
305       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
306       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "7e3fa9c03bc3dfbdeb67f24c5d9a49cd",
307       "f3454ca93cbb0c8c09b0695d90a0df3d", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
308       "f3454ca93cbb0c8c09b0695d90a0df3d", "1a77d2af4d2b6cf8737cfbcacacdc4e4",
309       "89bec831efea2f88129dedcad06bb3fa", "89bec831efea2f88129dedcad06bb3fa",
310       "dead0fe4030085c22e92d16bb110de9d", "306a2f5dfd675df4ed9af44fd5cac8c0",
311       "306a2f5dfd675df4ed9af44fd5cac8c0", "9d01c946a12f5ef9d9cebd9816e06014",
312       "768f63912e43148c13688d7f23281531", "768f63912e43148c13688d7f23281531",
313       "2e7927158e7b8e40e7269fc909fb584b", "123028e18c2bfb334e34adb5a4f67de4",
314       "123028e18c2bfb334e34adb5a4f67de4", "2c979c2bddef79a760e72a802f83cc76",
315       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
316       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "da1a6ff2be03ec8acde4cb1cd519a6f0",
317       "a4ca37cb869a0dbd1c4a2dcc449a8f31", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
318       "1b5d1d4c7be8d5ec00a42a49eecf918f", "98b77e88b0784baaea64c98c8707fe46",
319       "8148788044522edc3c497e1017efe2ce", "acf60abeda98bbea161139b915317423",
320       "262c96b1f2c4f85c86c0e9c77fedff1e", "f35a3d13516440f9168076d9b07c9e98",
321       "13782526fc2726100cb3cf375b3150ed", "13c07441b47b0c1ed80f015ac302d220",
322       "02880fde51ac991ad18d8986f4e5145c", "aa25073115bad49432953254e7dce0bc",
323       "69e3361b7199e10e75685b90fb0df623", "2f8ab35f6e7030e82ca922a68b29af4a",
324       "452f91b01833c57db4e909575a029ff6", "1fabf0655bedb671e4d7287fec8119ba",
325       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
326       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "d54206c34785cc3d8a06c2ceac46378c",
327       "85a11892ed884e3e74968435f6b16e64", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
328       "16434230d24b9522ae2680e8c37e1b95", "963dea92f3efbb99137d1de9c56728d3",
329       "b72fb6a9a073c2fe65013af1842dc9b0", "86fa0c299737eb499cbcdce94abe2d33",
330       "6b80af04470b83673d98f46925e678a5", "65baca6167fe5249f7a839ce5b2fd591",
331       "e47ded6c0eec1d5baadd02aff172f2b1", "c0950e609f278efb7050d319a9756bb3",
332       "9051290279237f9fb1389989b142d2dd", "34cdc1be291c95981c98812c5c343a15",
333       "5b64a6911cb7c3d60bb8f961ed9782a2", "7133de9d03a4b07716a12226b5e493e8",
334       "3594eff52d5ed875bd9655ddbf106fae", "90d7e13aa2f9a064493ff2b3b5b12109",
335       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
336       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "b1f26ee13df2e14a757416ba8a682278",
337       "996b6c166f9ed25bd07ea6acdf7597ff", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
338       "34895d4c69a6c3303693e6f431bcd5d8", "c9497b00cb1bc3363dd126ffdddadc8e",
339       "1e461869bb2ee9b6069c5e52cf817291", "8d7f1d7ea6a0dcc922ad5d2e77bc74dd",
340       "138855d9bf0ccd0c62ac14c7bff4fd37", "64035142864914d05a48ef8e013631d0",
341       "205904fa3c644433b46e01c11dd2fe40", "291425aaf8206b20e88db8ebf3cf7e7f",
342       "cb6238b8eb6b72980958e6fcceb2f2eb", "626321a6dfac542d0fc70321fac13ff3",
343       "1c6fda7501e0f8bdad972f7857cd9354", "4fd485dadcb570e5a0a5addaf9ba84da",
344       "d3f140aea9e8eabf4e1e5190e0148288", "e4938219593bbed5ae638a93f2f4a580",
345       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
346       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "238980eebc9e63ae3eea2771c7a70f12",
347       "0eac13431bd7d8a573318408a72246d5", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
348       "73438155feb62595e3e406921102d748", "5871e0e88a776840d619670fbf107858",
349       "1c6376ce55c9ee9e35d432edb1ffb3b7", "d675e0195c9feca956e637f3f1959f40",
350       "b5681673903ade13d69e295f82fdd009", "3c43020105ae93a301404b4cd6238654",
351       "dd2c5880a94ed3758bfea0b0e8c78286", "4ebb1a7b25a39d8b9868ec8a1243103f",
352       "d34ec07845cd8523651e5f5112984a14", "2ce55308d873f4cd244f16da2b06e06e",
353       "a4bb5d5ff4b25f391265b5231049a09a", "c9106e0c820b03bcdde3aa94efc11a3e",
354       "7ec2eae9e118506da8b33440b399511a", "78de867c8ee947ed6d29055747f26949",
355       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
356       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "e552466a4e7ff187251b8914b084d404",
357       "981b7c44b6f7b7ac2acf0cc4096e6bf4", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
358       "a4c75372af36162831cb872e24e1088c", "497271227a70a72f9ad25b415d41563f",
359       "c48bd7e11ec44ba7b2bc8b6a04592439", "0960a9af91250e9faa1eaac32227bf6f",
360       "746c2e0f96ae2246d534d67102be068c", "d6f6db079da9b8909a153c07cc9d0e63",
361       "7c8928a0d769f4264d195f39cb68a772", "db645c96fc8be04015e0eb538afec9ae",
362       "946af3a8f5362def5f4e27cb0fd4e754", "7ad78dfe7bbedf696dd58d9ad01bcfba",
363       "f0fd9c09d454e4ce918faa97e9ac10be", "af6ae5c0eb28417bd251184baf2eaba7",
364       "866f8df540dd3b58ab1339314d139cbd", "72803589b453a29501540aeddc23e6f4",
365       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
366       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "aba5d5ef5e96fe418e65d20e506ea834",
367       "d70bf16e2a31e90b7b3cdeaef1494cf9", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
368       "6df80bb7f264f4f285d09a4d61533fae", "c8831118d1004a7cca015a4fca140018",
369       "b7f82c140369067c105c7967c75b6f9e", "130f47aae365aabfec4360fa5b5ff554",
370       "92483ed631de21b685ffe6ccadbbec8f", "cbb6ab31547df6b91cfb48630fdffb48",
371       "1eea5e8a24d6aa11778eb3e5e5e9c9f2", "9e193b6b28ce798c44c744efde19eee9",
372       "885c384d90aaa34acd8303958033c252", "8110ed10e7234851dff3c7e4a51108a2",
373       "6fb9383302eb7e7a13387464d2634e03", "864d51fcc737bc73a3f588b67515039a",
374       "2ecb7890f00234bcb28c1d969f489012", "c4793d431dbf2d88826bb440bf027512",
375       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
376       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "972aeba65e8a6d20dd0f95279be2aa75",
377       "34165457282e2af2e9b3f5840e4dec5d", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
378       "b8c5582b9bbb789c45471f93be83b41f", "257bf5467db570974d7cf2356bacf116",
379       "5255dded79f56b0078543b5a1814a668", "ef745100f5f34c8ff841b2b0b57eb33f",
380       "edae8ed67286ca6a31573a541b3deb6f", "01adcd8bf15fbf70df47fbf3a953aa14",
381       "ba539808a8501609ce052a1562a62b25", "ac8e6391200cec2abdebb00744a2ba82",
382       "54b17120f7d71ddb4d70590ecd231cc1", "f6e36446a97611a4db4425df926974b2",
383       "a82f4080699300b659bbe1b5c4463147", "ecedb178f7cad3dc1b921eca67f9efb6",
384       "0609ca0ff3ca90069e8b48829b4b0891", "839e86c681e97359f7819c766000dd1c",
385   };
386   assert(id >= 0);
387   assert(id < sizeof(kDigest) / sizeof(kDigest[0]));
388   return kDigest[id];
389 }
390 
GetConvolveScaleDigest10bpp(int id)391 const char* GetConvolveScaleDigest10bpp(int id) {
392   // Entries containing 'XXXXX...' are skipped. See the test for details.
393   static const char* const kDigest[ConvolveTestParam::kNumBlockSizes * 2] = {
394       "27e21eb31687f9fbd0a66865fa8d7c8a", "9bff726c8e1d0998451a3b9cf2b3d8c8",
395       "661d74cfef36f12ed8d9b4c3ccb7fe0d", "5fc365fd1fcc9599dd97a885ba0c2eec",
396       "acdba2c82a6268e3c0ae8fc32be1b41f", "a5db60bbeaf56ab030ed21c42d553cf3",
397       "1228bb633f9fd63fdb998b775ca79e98", "07812c97f9f43a2a8ae07329dc488699",
398       "903525fb782119c4dfaf61b98a310c9f", "f38b51cef38b929e317861ccbc73ecd8",
399       "b78b05138e1d5fbf089144c42ce03058", "f2e227664cbf2d821b242a34fcbc9835",
400       "cb992dac70591e7d3663588ae13b9adc", "f2292d33657d939fa85ea5bacdfe39a3",
401       "7049dc742d6d8ad6f5d4309968ff281c", "e4beebde1ac335a4d92e4af94653a2ce",
402       "cc77875f98f54b9b26b5f7d9fcbc828d", "fb623f7b9e1ffcf2ae361599728a5589",
403       "c33847e47a7eda214734084640818df9", "ab3e1aec3d720c0c89c46a8d5b161b44",
404       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
405       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "efe4de861dcf0f7458b6208cae7e3584",
406       "814751c55fa84f0fed94ff15fc30fc24", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
407       "31a63fe47297102937acbe7a328588b7", "b804a0a24633243f7da48d7a5f51c0bf",
408       "cb492672b005fc378cccc8c03003cd4a", "1d18732bcf2ea487e84579489cc59a22",
409       "457c4b3ec38a8d6c210584ade1a9fae2", "a3afdd468e6a5238a3dbd2cc21c11c9e",
410       "6ff8a16f21d6e8a9741dacf0734ae563", "3ffa29ef7e54e51f6849c9a3d3c79d03",
411       "af89899b083cf269ac1bd988aeb15b15", "3365d8411c11081fb228436238b9a671",
412       "3ba56d30f5f81d7098f356635a58b9af", "b3013776900c6520bd30f868e8c963b6",
413       "81febaa7342692483040f500ba2e5e2b", "4a51ff1d9a4a68687d590b41aa7835a3",
414   };
415   assert(id >= 0);
416   assert(id < sizeof(kDigest) / sizeof(kDigest[0]));
417   return kDigest[id];
418 }
419 #endif  // LIBGAV1_MAX_BITDEPTH >= 10
420 
421 #if LIBGAV1_MAX_BITDEPTH == 12
GetConvolveDigest12bpp(int id)422 const char* GetConvolveDigest12bpp(int id) {
423   // Entries containing 'XXXXX...' are skipped. See the test for details.
424   static const char* const kDigest[ConvolveTestParam::kNumBlockSizes * 16] = {
425       "e25031afae184cc4d186cde7e3d51e33", "6fb55dec2506dae6c229469cdf2e7d83",
426       "9df34d27f5bd040d1ed1455b151cd1ff", "7f6829458f00edb88f78851dd1a08739",
427       "a8bbe9b6b9eaf6f681d91c981b994949", "21f74980b36cb246426f4bc3fe7c08c3",
428       "403c2ccced3b5b141a4c7559c0cd841b", "1c3c4c6cd8a3e79cd95d6038531b47e5",
429       "f18d6950d36619086ac0055bab528cb1", "37d9c5babddf24fe8cb061297297b769",
430       "c111000d4021381f3d18ea0e24a1b5f5", "4e1e4f0a592ff028e35f8187627d6e68",
431       "0ca9ad4614d32da05746f8712a46d861", "8a122ab194e2fdb7089b29be50af8c86",
432       "3c21326e22a80982d1b0ffc09be4beae", "f6c8d1fe2c1fb19604c49c6a49bd26a8",
433       "d3eda9d7aa80e4ea1f18bf565b143e57", "fe21bd1cb8e90466dc727f2223ea7aed",
434       "01efe3df83c715325aaddd4d4ce130ad", "ecaa751360121d3746b72932415fb998",
435       "291e67095399651dc5c8a033390f255f", "66b26828e434faf37ddc57d3e0abb6db",
436       "e9cd69e9ba70864e3d0b175ac0a177d6", "64e4db895a843cb05384f5997b1ba978",
437       "f305161c82de999d2c93eac65f609cfe", "4762b2bd27983ad916ec0a930c0eca6b",
438       "1631495ffae43a927267ebd476015ef1", "b0f22de7b10057e07af71f9bce4615ce",
439       "6fa29dc4be1a46d246a41d66a3d35cb4", "734601c2185bdf30ba9ded8b07003a05",
440       "524e4553d92c69e7e4ed934f7b806c6b", "3709c8950bc5fcc4a2b3ec68fc78bf7e",
441       "69c274d9f8e0fd6790495e9695251f1f", "ee30cc1232c27494ef53edd383568f25",
442       "e525dbeb0b4341952a92270dcfc51730", "b3685c9e783d3402497bbd49d28c7dd7",
443       "d1c9f02dc818e6b974794dfb7749aac8", "bdb9e4961f9aa8c25568d3394e968518",
444       "f5f74555adcad85f3ebd3cb85dc7b770", "737e2a0be806dbd701014f2078be7898",
445       "20a18294e3a9422193aa0a219fd80ede", "7106648ecb9ae24a54d1dbabf2a9e318",
446       "20f39cbd6b5ed87a6ae4f818932325c0", "a99666e3157e32a07c87b01e52091a76",
447       "123e4d533d478c3089c975323c85396b", "d2a8021f7683a0cdf2658418fa90a6fc",
448       "1437e192a3349db8702d5b90eb88dbc1", "fe097fc4aeed7cda0b0f405124efb19d",
449       "1988227c51fa589db1307fd890bb5972", "537e25a6c30b240dc1e3bddd1c3a0a03",
450       "aebe5cffaae448db5a08987a3375a428", "7127ae9bdc63df4459590dc02ca95403",
451       "7ad281903a210f2b1f39f7c40c8df272", "d4b97ba21f7b400ba9f9cd8bb1a576df",
452       "0884a824203aaf72c78f73fdaf2b23a2", "63d60388605c92daee55d517de622a9e",
453       "171ec49a779de1efa69510eefbd09bba", "541cf051579c5a10b9debd3bfdcb7f32",
454       "91c14451ad93ed88e96b5d639ce408de", "3b0313ec0e043d19744bf88c90e875a1",
455       "6adcb3cee91fe3a83b36deb11c5ad6dd", "c6d4bfad24616a88222681992a99d782",
456       "515dc0f2a41730d5c434e4f3c81b02c3", "1c69abdee3b9608a6094034badc2bec0",
457       "1785a0f321d7dd90aa8846961737a767", "dd12c5b8c341f2423d0d5db4f285d199",
458       "5741fb69aae1ca8a0fbe4f1478df88ef", "a4390ceb4e4e9f5cf6a47a9b11a97015",
459       "6778eb25df902092b440c3402e7f0f80", "5ad9d6b36f8898bb55e901c1c0c523da",
460       "73969b6c03bb5a7345a8b968b542668e", "f48192947e66d70f116193a4186d0186",
461       "53f60d0e89d7d994ec6d6131fb7e75ae", "c75f6f8813839ae3cf192baa29039265",
462       "9ff0852ebbad56663250f86ac3a3bf9b", "668938580a770ea7ace8bbf7d349e89f",
463       "5b06bb0a15ac465a250d9b209f05289f", "a2128f5c8692fed7e7c1c7af22ce9f72",
464       "f80f1d7a58869ec794258c0f7df14620", "ed1e03a35924c92ed2fc9808dc3f06f3",
465       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
466       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "35ef89c35d2e8e46feb856c554c21c9f",
467       "b98ce33a1bf4fab840b7ef261b30dbc4", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
468       "b98ce33a1bf4fab840b7ef261b30dbc4", "42263fb359c4fdf1c7cdb4980b3e97f2",
469       "1e7071b7db3144188bdcf5d199fe5355", "1e7071b7db3144188bdcf5d199fe5355",
470       "30d367304a87bd25f0ad2ff8e4b5eb41", "4abe6dbb3198219015838dbedf07297a",
471       "4abe6dbb3198219015838dbedf07297a", "acec349a95b5bba98bb830372fa15e73",
472       "a73ad8661256ce2fdf5110425eb260b2", "a73ad8661256ce2fdf5110425eb260b2",
473       "8ff2f049d3f972867f14775188fe589b", "87f5f9a07aea75c325e6d7ff6c96c7c2",
474       "87f5f9a07aea75c325e6d7ff6c96c7c2", "325fcde7d415d7aa4929a3ea013fb9cc",
475       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
476       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "05aa29814d5ce35389dbcf20368850da",
477       "fbb89f907a040e70953e3364dbe1feda", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
478       "44ac511baf45032078cc0b45e41dba79", "efb98974adc58d88e122293436bb9184",
479       "7eee18c1a16bcb4e7ef7b27f68ba884f", "b0904c9b118dd9a1f9f034c0ff82d1c1",
480       "54436deb5183dd9669dd4f5feadb3850", "4db1c310b7d9a8bd3e2b5d20fa820e3b",
481       "c40abc6b2d67527f48a287cd7e157428", "48ec3fcf509805f484c8e0948c3469be",
482       "cb7d4a76fa7de52ed2fe889785327b38", "f57983346815fa41e969c195c1c03774",
483       "7dba59b0de2c877666ded6bdaefdcc30", "4837f8ba2f67f17f28a38c5e2a434c73",
484       "09e06fe9dc7ef7818f2a96895235afd4", "002976970ec62b360f956b9c091782d4",
485       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
486       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "78673b1084367e97b8dd83990adc5219",
487       "06b5d4a30b9efb6c1d95ef7957f49e76", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
488       "ce460146922cd53970b510d460aa4062", "6fd051938b8efcec9ece042f1edc177a",
489       "f5ff0dcfe3c1a56e3856549d8ded416b", "b69bc2cfc17c6b4313264db96831f0d1",
490       "38a5e65bd71934becfb376eb3b9bc513", "32c1163aa4ca6b6c69d950aba7b06d48",
491       "0c22a6c014c6347983de4ca863f3b53f", "a80c5ee9eb2dfb9a0d56e92eb3f85d91",
492       "a9719722a150a81175427bc161b95d7a", "8237befd456131a488cc5b8b63f4aca5",
493       "51616abcd0beea53a78ffce106b974fc", "6c47b22270f01d27b404da07e1be1202",
494       "356268298d3887edaabd0169a912c94e", "d2b00216e106cb8c5450e2eff1f8481a",
495       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
496       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "c2de3a582c79aee811076211c497d2bc",
497       "d1b6d9c73da41def26dd4f85fbd1bde8", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
498       "d8374eb7825081b89f74b05c66bccd63", "d5f7d68c10b5eaf0fba6f93ee26266e6",
499       "94d19cb65f29db65e6656b588f431ade", "5126e95f0249024a6f6d426714bd5b20",
500       "d7d3654b9c2dabe13239875984770acd", "6491afd5d651aab80aa179b579b74341",
501       "037a5de0de89983808f8e8f6dc39110f", "5980073b7685c5c9b2ec027e06be2cbc",
502       "0abb9d035aca426b62ca0f3fab063bab", "fe002a902bb4ec24dfe3ea0fe381a472",
503       "1ac15726df1aa2cd8855162a91893379", "0758c3ac16467605d73c725a697c3dc1",
504       "97d894d85f6ccfa4ff81e0e8fdf03da1", "c3c7b362f063a18244ea542a42d2873c",
505       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
506       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "7f6829458f00edb88f78851dd1a08739",
507       "a8bbe9b6b9eaf6f681d91c981b994949", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
508       "403c2ccced3b5b141a4c7559c0cd841b", "1c3c4c6cd8a3e79cd95d6038531b47e5",
509       "f18d6950d36619086ac0055bab528cb1", "37d9c5babddf24fe8cb061297297b769",
510       "c111000d4021381f3d18ea0e24a1b5f5", "4e1e4f0a592ff028e35f8187627d6e68",
511       "0ca9ad4614d32da05746f8712a46d861", "8a122ab194e2fdb7089b29be50af8c86",
512       "3c21326e22a80982d1b0ffc09be4beae", "f6c8d1fe2c1fb19604c49c6a49bd26a8",
513       "d3eda9d7aa80e4ea1f18bf565b143e57", "fe21bd1cb8e90466dc727f2223ea7aed",
514       "01efe3df83c715325aaddd4d4ce130ad", "ecaa751360121d3746b72932415fb998",
515       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
516       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "67b2ea94cc4d0b32db3ae3c29eee4d46",
517       "bcfec99ad75988fa1efc1733204f17f2", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
518       "79c222c5796e50119f1921e7bc534a25", "ae3f7c189458f044e9c52399d37a55e2",
519       "fd6dde45bd2937331428de9ef4f8e869", "b384d065423f3d271b85781d76a73218",
520       "466ea0680c06f59e8b3bb293608731fb", "360541ba94f42d115fe687a97a457ffb",
521       "e5a0794d37af40c40a4d2c6d3f7d2aa2", "4eed285651a75614bd60adebbe2e185c",
522       "bbdbf93942282d7b9c4f07591a1764a6", "1288a9ec3e6f79213b6745e6e7568c44",
523       "4ff1310bfd656d69ed5c108a91a9b01a", "3380806b5f67eb3ebce42f8e7c05b256",
524       "09c4bdf0f30aca6812fb55a5ac06b1bd", "722c86ba6bf21f40742ee33b4edc17c4",
525       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
526       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "f5303c96d1630f9840eaaba058cd818b",
527       "c20cd45782b2f52c05e4189912047570", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
528       "d6360f96fe15a3ee1e903b0a53dcaaeb", "4b18995cdf2f5d18410d3a732c5932b1",
529       "6f62bf7395c3dfccc1565ba8424f20e8", "c9987ed30491cd28bbc711dd57228247",
530       "8e277ec837cbecf529ae2eb0578fddc1", "c0c132386f23c5f0fba055a12fb79547",
531       "6b5617ab78dd0916690dfa358298b7b3", "394abedca37f60d1a5148a4c975305ed",
532       "bb88881e0e4cf2d88c2d2b38b5833f20", "bef10806be8d58ea8e97870a813b075e",
533       "b4b017d1f792bea69d3b773db7c80c7c", "0660bc63041213a8a4d74724a3bc4291",
534       "5050c8c5388a561691fd414b00c041df", "9ed40c68de6a8008a902d7224f8b620f",
535       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
536       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "ec10ce4a674424478a401847f744251d",
537       "bdd897eafc8ef2651a7bba5e523a6ac2", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
538       "2745de4a6b29abb85ee513e22ad362c3", "8aaad384b7cd349b4b968e657ec15523",
539       "fb6c0723432bcd2246d51a90f5fb5826", "f8104ed5921ebd48c6eed16150ffe028",
540       "85c2e236b3e32bf731601237cf0594cd", "8bd6eefff9640766cdf64ab082cb1485",
541       "78b5cd9dde6c6a5900f3040c57172091", "aaa980506bd7bb1d75924a8025698d1a",
542       "90050a411d501f7166f6741832b0c342", "d6ec88b2c38e32511f3359e1d5f9d85b",
543       "96506b8b39274c8fe687ea39761997f1", "3322ea83995c2762fb60db993b401658",
544       "151b6e4ce60392639982fca5a73ac3d3", "d52a1038e135bef233674a843f8c7cb6",
545   };
546   assert(id >= 0);
547   assert(id < sizeof(kDigest) / sizeof(kDigest[0]));
548   return kDigest[id];
549 }
550 
GetConvolveScaleDigest12bpp(int id)551 const char* GetConvolveScaleDigest12bpp(int id) {
552   // Entries containing 'XXXXX...' are skipped. See the test for details.
553   static const char* const kDigest[ConvolveTestParam::kNumBlockSizes * 2] = {
554       "aea59b7a638f27acad2b90fd2b8c9fee", "be87ba981a0af25611a7d5f0970be9b3",
555       "7c81f1486cd607376d776bf2c6e81dec", "f683ba2a9b353bea35f26c1ed730f3c5",
556       "11e2d70daff1726093cb4fcae33ce0d6", "567575eac0dea2f379019b2d4bafe444",
557       "216479ed580d6e0d7c1d523015394814", "dcabbe5f5709a4b6634d77cc514e863a",
558       "4e888207fe917faeea2b44383ac16caf", "d617c5608fae3b01c507c7e88040fee3",
559       "eeac5d9b3dc005e76f13dfc7483eae48", "8ff0a82811f77303c4516bb8c761336f",
560       "95a7c315aaa208097b6ab006f1d07654", "da63527ee80e6772435cff8321a29a95",
561       "404457f72e7113d1f3797a39319fd3fe", "43cbccfe2663ec11c157319acfe629a5",
562       "1dc5b8dee4542f3d7fcf6b0fa325dfde", "16d4506674f2fcedfcd1e006eb097141",
563       "4fcf329ddb405cd6bbb0a6fb87e29eb3", "de77a781957653ea1750f79995605cdc",
564       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
565       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "436f6fdc008d94a94bc6f516f98f402f",
566       "b436bd9036f08ba7e50cfc536911dbbd", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
567       "720a01018856bd83f4d89a9024b14728", "b7e01a3f161007712ce342f59b2c51f2",
568       "922420ebe5dec4f19c259ebdf8a3259a", "979aaba579556207a7bbcc939123c1b2",
569       "89a30898cbaa4d64f9072173e8365864", "0586ff961f2e4228f4e38299fb25ae07",
570       "adb27a03f8b1b50fe2a52b5ca8d4fc28", "4f91cd92aab2e09f4b123251a8d2f219",
571       "620fba0fff163d96a1cd663d1af4a4c5", "bf7a0fa65b1a90ba34c834558fa2c86e",
572       "c21f7d7d16d047a27b871a7bf8476e2d", "a94b17c81f3ce2b47081bd8dd762a2e5",
573       "9078d20f59bc24862af3856acb8c0357", "ee510ce6b3d22de9e4bd7920a26fd69a",
574   };
575   assert(id >= 0);
576   assert(id < sizeof(kDigest) / sizeof(kDigest[0]));
577   return kDigest[id];
578 }
579 #endif  // LIBGAV1_MAX_BITDEPTH == 12
580 
581 struct ConvolveTypeParam {
ConvolveTypeParamlibgav1::dsp::__anon4b3d96e80111::ConvolveTypeParam582   ConvolveTypeParam(bool is_intra_block_copy, bool is_compound,
583                     bool has_vertical_filter, bool has_horizontal_filter)
584       : is_intra_block_copy(is_intra_block_copy),
585         is_compound(is_compound),
586         has_vertical_filter(has_vertical_filter),
587         has_horizontal_filter(has_horizontal_filter) {}
588   bool is_intra_block_copy;
589   bool is_compound;
590   bool has_vertical_filter;
591   bool has_horizontal_filter;
592 };
593 
operator <<(std::ostream & os,const ConvolveTestParam & param)594 std::ostream& operator<<(std::ostream& os, const ConvolveTestParam& param) {
595   return os << "BlockSize" << param.width << "x" << param.height;
596 }
597 
operator <<(std::ostream & os,const ConvolveTypeParam & param)598 std::ostream& operator<<(std::ostream& os, const ConvolveTypeParam& param) {
599   return os << "is_intra_block_copy: " << param.is_intra_block_copy
600             << ", is_compound: " << param.is_compound
601             << ", has_(vertical/horizontal)_filter: "
602             << param.has_vertical_filter << "/" << param.has_horizontal_filter;
603 }
604 
605 //------------------------------------------------------------------------------
606 template <int bitdepth, typename Pixel>
607 class ConvolveTest : public testing::TestWithParam<
608                          std::tuple<ConvolveTypeParam, ConvolveTestParam>> {
609  public:
610   static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
611   ConvolveTest() = default;
612   ~ConvolveTest() override = default;
613 
SetUp()614   void SetUp() override {
615     ConvolveInit_C();
616 
617     const Dsp* const dsp = GetDspTable(bitdepth);
618     ASSERT_NE(dsp, nullptr);
619     GetConvolveFunc(dsp, &base_convolve_func_);
620 
621     const testing::TestInfo* const test_info =
622         testing::UnitTest::GetInstance()->current_test_info();
623     const absl::string_view test_case = test_info->test_suite_name();
624     if (absl::StartsWith(test_case, "C/")) {
625       base_convolve_func_ = nullptr;
626     } else if (absl::StartsWith(test_case, "SSE41/")) {
627       if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
628       ConvolveInit_SSE4_1();
629     } else if (absl::StartsWith(test_case, "AVX2/")) {
630       if ((GetCpuInfo() & kAVX2) == 0) GTEST_SKIP() << "No AVX2 support!";
631       ConvolveInit_AVX2();
632     } else if (absl::StartsWith(test_case, "NEON/")) {
633       ConvolveInit_NEON();
634 #if LIBGAV1_MAX_BITDEPTH >= 10
635       ConvolveInit10bpp_NEON();
636 #endif
637     } else {
638       FAIL() << "Unrecognized architecture prefix in test case name: "
639              << test_case;
640     }
641 
642     GetConvolveFunc(dsp, &cur_convolve_func_);
643 
644     // Skip functions that have not been specialized for this particular
645     // architecture.
646     if (cur_convolve_func_ == base_convolve_func_) {
647       cur_convolve_func_ = nullptr;
648     }
649   }
650 
651  protected:
GetDigestId() const652   int GetDigestId() const {
653     int id = param_.block_size;
654     id += param_.kNumBlockSizes *
655           static_cast<int>(type_param_.has_horizontal_filter);
656     id += 2 * param_.kNumBlockSizes *
657           static_cast<int>(type_param_.has_vertical_filter);
658     id += 4 * param_.kNumBlockSizes * static_cast<int>(type_param_.is_compound);
659     id += 8 * param_.kNumBlockSizes *
660           static_cast<int>(type_param_.is_intra_block_copy);
661     return id;
662   }
663 
664   void GetConvolveFunc(const Dsp* dsp, ConvolveFunc* func);
665   void SetInputData(bool use_fixed_values, int value);
666   void Check(bool use_fixed_values, const Pixel* src, const Pixel* dest,
667              libvpx_test::MD5* md5_digest);
668   void Check16Bit(bool use_fixed_values, const uint16_t* src,
669                   const uint16_t* dest, libvpx_test::MD5* md5_digest);
670   // |num_runs| covers the categories of filters (6) and the number of filters
671   // under each category (16).
672   void Test(bool use_fixed_values, int value,
673             int num_runs = kMinimumViableRuns);
674 
675   const ConvolveTypeParam type_param_ = std::get<0>(GetParam());
676   const ConvolveTestParam param_ = std::get<1>(GetParam());
677 
678  private:
679   ConvolveFunc base_convolve_func_;
680   ConvolveFunc cur_convolve_func_;
681   // Convolve filters are 7-tap, which need 3 pixels
682   // (kRestorationHorizontalBorder) padding.
683   Pixel source_[kMaxBlockHeight * kMaxBlockWidth] = {};
684   uint16_t source_16bit_[kMaxBlockHeight * kMaxBlockWidth] = {};
685   uint16_t dest_16bit_[kMaxBlockHeight * kMaxBlockWidth] = {};
686   Pixel dest_clipped_[kMaxBlockHeight * kMaxBlockWidth] = {};
687 
688   const int source_stride_ = kMaxBlockWidth;
689   const int source_height_ = kMaxBlockHeight;
690 };
691 
692 template <int bitdepth, typename Pixel>
GetConvolveFunc(const Dsp * const dsp,ConvolveFunc * func)693 void ConvolveTest<bitdepth, Pixel>::GetConvolveFunc(const Dsp* const dsp,
694                                                     ConvolveFunc* func) {
695   *func =
696       dsp->convolve[type_param_.is_intra_block_copy][type_param_.is_compound]
697                    [type_param_.has_vertical_filter]
698                    [type_param_.has_horizontal_filter];
699 }
700 
701 template <int bitdepth, typename Pixel>
SetInputData(bool use_fixed_values,int value)702 void ConvolveTest<bitdepth, Pixel>::SetInputData(bool use_fixed_values,
703                                                  int value) {
704   if (use_fixed_values) {
705     std::fill(source_, source_ + source_height_ * source_stride_, value);
706   } else {
707     const int offset =
708         kConvolveBorderLeftTop * source_stride_ + kConvolveBorderLeftTop;
709     const int mask = (1 << bitdepth) - 1;
710     libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
711     const int height = param_.height;
712     const int width = param_.width;
713     for (int y = 0; y < height; ++y) {
714       for (int x = 0; x < width; ++x) {
715         source_[y * source_stride_ + x + offset] = rnd.Rand16() & mask;
716       }
717     }
718     // Copy border pixels to the left and right borders.
719     for (int y = 0; y < height; ++y) {
720       Memset(&source_[(y + kConvolveBorderLeftTop) * source_stride_],
721              source_[y * source_stride_ + offset], kConvolveBorderLeftTop);
722       Memset(&source_[y * source_stride_ + offset + width],
723              source_[y * source_stride_ + offset + width - 1],
724              kConvolveBorderLeftTop);
725     }
726     // Copy border pixels to the top and bottom borders.
727     for (int y = 0; y < kConvolveBorderLeftTop; ++y) {
728       memcpy(&source_[y * source_stride_],
729              &source_[kConvolveBorderLeftTop * source_stride_],
730              source_stride_ * sizeof(Pixel));
731       memcpy(&source_[(y + kConvolveBorderLeftTop + height) * source_stride_],
732              &source_[(kConvolveBorderLeftTop + height - 1) * source_stride_],
733              source_stride_ * sizeof(Pixel));
734     }
735   }
736 }
737 
738 template <int bitdepth, typename Pixel>
Check(bool use_fixed_values,const Pixel * src,const Pixel * dest,libvpx_test::MD5 * md5_digest)739 void ConvolveTest<bitdepth, Pixel>::Check(bool use_fixed_values,
740                                           const Pixel* src, const Pixel* dest,
741                                           libvpx_test::MD5* md5_digest) {
742   if (use_fixed_values) {
743     // For fixed values, input and output are identical.
744     const bool success =
745         test_utils::CompareBlocks(src, dest, param_.width, param_.height,
746                                   kMaxBlockWidth, kMaxBlockWidth, false, false);
747     EXPECT_TRUE(success);
748   } else {
749     // For random input, compare md5.
750     const int offset =
751         kConvolveBorderLeftTop * kMaxBlockWidth + kConvolveBorderLeftTop;
752     const size_t size = sizeof(dest_clipped_) - offset * sizeof(Pixel);
753     md5_digest->Add(reinterpret_cast<const uint8_t*>(dest), size);
754   }
755 }
756 
757 template <int bitdepth, typename Pixel>
Check16Bit(bool use_fixed_values,const uint16_t * src,const uint16_t * dest,libvpx_test::MD5 * md5_digest)758 void ConvolveTest<bitdepth, Pixel>::Check16Bit(bool use_fixed_values,
759                                                const uint16_t* src,
760                                                const uint16_t* dest,
761                                                libvpx_test::MD5* md5_digest) {
762   if (use_fixed_values) {
763     // For fixed values, input and output are identical.
764     const bool success =
765         test_utils::CompareBlocks(src, dest, param_.width, param_.height,
766                                   kMaxBlockWidth, kMaxBlockWidth, false);
767     EXPECT_TRUE(success);
768   } else {
769     // For random input, compare md5.
770     const int offset =
771         kConvolveBorderLeftTop * kMaxBlockWidth + kConvolveBorderLeftTop;
772     const size_t size = sizeof(dest_16bit_) - offset * sizeof(uint16_t);
773     md5_digest->Add(reinterpret_cast<const uint8_t*>(dest), size);
774   }
775 }
776 
777 template <int bitdepth, typename Pixel>
Test(bool use_fixed_values,int value,int num_runs)778 void ConvolveTest<bitdepth, Pixel>::Test(
779     bool use_fixed_values, int value, int num_runs /*= kMinimumViableRuns*/) {
780   // There's no meaning testing fixed input in compound convolve.
781   if (type_param_.is_compound && use_fixed_values) return;
782 
783   // There should not be any function set for this combination.
784   if (type_param_.is_intra_block_copy && type_param_.is_compound) {
785     ASSERT_EQ(cur_convolve_func_, nullptr);
786     return;
787   }
788 
789   // Compound and intra block copy functions are only used for blocks 4x4 or
790   // greater.
791   if (type_param_.is_compound || type_param_.is_intra_block_copy) {
792     if (param_.width < 4 || param_.height < 4) {
793       GTEST_SKIP();
794     }
795   }
796 
797   // Skip unspecialized functions.
798   if (cur_convolve_func_ == nullptr) {
799     GTEST_SKIP();
800   }
801 
802   SetInputData(use_fixed_values, value);
803   int subpixel_x = 0;
804   int subpixel_y = 0;
805   int vertical_index = 0;
806   int horizontal_index = 0;
807   const int offset =
808       kConvolveBorderLeftTop * kMaxBlockWidth + kConvolveBorderLeftTop;
809   const Pixel* const src = source_ + offset;
810   const ptrdiff_t src_stride = source_stride_ * sizeof(Pixel);
811   const ptrdiff_t src_stride_16 = source_stride_;
812   const ptrdiff_t dst_stride = kMaxBlockWidth * sizeof(Pixel);
813   // Pack Compound output since we control the predictor buffer.
814   const ptrdiff_t dst_stride_compound = param_.width;
815 
816   // Output is always 16 bits regardless of |bitdepth|.
817   uint16_t* dst_16 = dest_16bit_ + offset;
818   // Output depends on |bitdepth|.
819   Pixel* dst_pixel = dest_clipped_ + offset;
820 
821   // Collect the first |kMinimumViableRuns| into one md5 buffer.
822   libvpx_test::MD5 md5_digest;
823 
824   absl::Duration elapsed_time;
825   for (int i = 0; i < num_runs; ++i) {
826     // Test every filter.
827     // Because of masking |subpixel_{x,y}| values roll over every 16 iterations.
828     subpixel_x += 1 << 6;
829     subpixel_y += 1 << 6;
830 
831     const int horizontal_filter_id = (subpixel_x >> 6) & 0xF;
832     const int vertical_filter_id = (subpixel_y >> 6) & 0xF;
833 
834     // |filter_id| == 0 (copy) must be handled by the appropriate 1D or copy
835     // function.
836     if (horizontal_filter_id == 0 || vertical_filter_id == 0) {
837       continue;
838     }
839 
840     // For focused speed testing these can be set to the desired filter. Want
841     // only 8 tap filters? Set |{vertical,horizontal}_index| to 2.
842     vertical_index += static_cast<int>(i % 16 == 0);
843     vertical_index %= 4;
844     horizontal_index += static_cast<int>(i % 16 == 0);
845     horizontal_index %= 4;
846 
847     if (type_param_.is_compound) {
848       // Output type is uint16_t.
849       const absl::Time start = absl::Now();
850       cur_convolve_func_(src, src_stride, horizontal_index, vertical_index,
851                          horizontal_filter_id, vertical_filter_id, param_.width,
852                          param_.height, dst_16, dst_stride_compound);
853       elapsed_time += absl::Now() - start;
854     } else {
855       // Output type is Pixel.
856       const absl::Time start = absl::Now();
857       cur_convolve_func_(src, src_stride, horizontal_index, vertical_index,
858                          horizontal_filter_id, vertical_filter_id, param_.width,
859                          param_.height, dst_pixel, dst_stride);
860       elapsed_time += absl::Now() - start;
861     }
862 
863     // Only check the output for the first set. After that it's just repeated
864     // runs for speed timing.
865     if (i >= kMinimumViableRuns) continue;
866 
867     if (type_param_.is_compound) {
868       // Need to copy source to a uint16_t buffer for comparison.
869       Pixel* src_ptr = source_;
870       uint16_t* src_ptr_16 = source_16bit_;
871       for (int y = 0; y < kMaxBlockHeight; ++y) {
872         for (int x = 0; x < kMaxBlockWidth; ++x) {
873           src_ptr_16[x] = src_ptr[x];
874         }
875         src_ptr += src_stride_16;
876         src_ptr_16 += src_stride_16;
877       }
878 
879       Check16Bit(use_fixed_values, source_16bit_ + offset, dst_16, &md5_digest);
880     } else {
881       Check(use_fixed_values, src, dst_pixel, &md5_digest);
882     }
883   }
884 
885   if (!use_fixed_values) {
886     // md5 sums are only calculated for random input.
887     const char* ref_digest = nullptr;
888     switch (bitdepth) {
889       case 8:
890         ref_digest = GetConvolveDigest8bpp(GetDigestId());
891         break;
892 #if LIBGAV1_MAX_BITDEPTH >= 10
893       case 10:
894         ref_digest = GetConvolveDigest10bpp(GetDigestId());
895         break;
896 #endif
897 #if LIBGAV1_MAX_BITDEPTH == 12
898       case 12:
899         ref_digest = GetConvolveDigest12bpp(GetDigestId());
900         break;
901 #endif
902     }
903     ASSERT_NE(ref_digest, nullptr);
904 
905     const char* direction;
906     if (type_param_.has_vertical_filter && type_param_.has_horizontal_filter) {
907       direction = "2D";
908     } else if (type_param_.has_vertical_filter) {
909       direction = "Vertical";
910     } else if (type_param_.has_horizontal_filter) {
911       direction = "Horizontal";
912     } else {
913       direction = "Copy";
914     }
915     const auto elapsed_time_us =
916         static_cast<int>(absl::ToInt64Microseconds(elapsed_time));
917     printf("Mode Convolve%s%s%s[%25s]: %5d us MD5: %s\n",
918            type_param_.is_compound ? "Compound" : "",
919            type_param_.is_intra_block_copy ? "IntraBlockCopy" : "", direction,
920            absl::StrFormat("%dx%d", param_.width, param_.height).c_str(),
921            elapsed_time_us, md5_digest.Get());
922     EXPECT_STREQ(ref_digest, md5_digest.Get());
923   }
924 }
925 
ApplyFilterToSignedInput(const int min_input,const int max_input,const int8_t filter[kSubPixelTaps],int * min_output,int * max_output)926 void ApplyFilterToSignedInput(const int min_input, const int max_input,
927                               const int8_t filter[kSubPixelTaps],
928                               int* min_output, int* max_output) {
929   int min = 0, max = 0;
930   for (int i = 0; i < kSubPixelTaps; ++i) {
931     const int tap = filter[i];
932     if (tap > 0) {
933       max += max_input * tap;
934       min += min_input * tap;
935     } else {
936       min += max_input * tap;
937       max += min_input * tap;
938     }
939   }
940   *min_output = min;
941   *max_output = max;
942 }
943 
ApplyFilterToUnsignedInput(const int max_input,const int8_t filter[kSubPixelTaps],int * min_output,int * max_output)944 void ApplyFilterToUnsignedInput(const int max_input,
945                                 const int8_t filter[kSubPixelTaps],
946                                 int* min_output, int* max_output) {
947   ApplyFilterToSignedInput(0, max_input, filter, min_output, max_output);
948 }
949 
950 // Validate the maximum ranges for different parts of the Convolve process.
951 template <int bitdepth>
ShowRange()952 void ShowRange() {
953   // Subtract one from the shift bits because the filter is pre-shifted by 1.
954   constexpr int horizontal_bits = (bitdepth == kBitdepth12)
955                                       ? kInterRoundBitsHorizontal12bpp - 1
956                                       : kInterRoundBitsHorizontal - 1;
957   constexpr int vertical_bits = (bitdepth == kBitdepth12)
958                                     ? kInterRoundBitsVertical12bpp - 1
959                                     : kInterRoundBitsVertical - 1;
960   constexpr int compound_vertical_bits = kInterRoundBitsCompoundVertical - 1;
961 
962   constexpr int compound_offset = (bitdepth == 8) ? 0 : kCompoundOffset;
963 
964   constexpr int max_input = (1 << bitdepth) - 1;
965 
966   const int8_t* worst_convolve_filter = kHalfSubPixelFilters[2][8];
967 
968   // First pass.
969   printf("Bitdepth: %2d Input range:            [%8d, %8d]\n", bitdepth, 0,
970          max_input);
971 
972   int min, max;
973   ApplyFilterToUnsignedInput(max_input, worst_convolve_filter, &min, &max);
974 
975   if (bitdepth == 8) {
976     // 8bpp can use int16_t for sums.
977     assert(min > INT16_MIN);
978     assert(max < INT16_MAX);
979   } else {
980     // 10bpp and 12bpp require int32_t.
981     assert(min > INT32_MIN);
982     assert(max > INT16_MAX && max < INT32_MAX);
983   }
984 
985   printf("  Horizontal upscaled range:         [%8d, %8d]\n", min, max);
986 
987   const int first_pass_min = RightShiftWithRounding(min, horizontal_bits);
988   const int first_pass_max = RightShiftWithRounding(max, horizontal_bits);
989 
990   // All bitdepths can use int16_t for first pass output.
991   assert(first_pass_min > INT16_MIN);
992   assert(first_pass_max < INT16_MAX);
993 
994   printf("  Horizontal downscaled range:       [%8d, %8d]\n", first_pass_min,
995          first_pass_max);
996 
997   // Second pass.
998   ApplyFilterToSignedInput(first_pass_min, first_pass_max,
999                            worst_convolve_filter, &min, &max);
1000 
1001   // All bitdepths require int32_t for second pass sums.
1002   assert(min < INT16_MIN && min > INT32_MIN);
1003   assert(max > INT16_MAX && max < INT32_MAX);
1004 
1005   printf("  Vertical upscaled range:           [%8d, %8d]\n", min, max);
1006 
1007   // Second pass non-compound output is clipped to Pixel values.
1008   const int second_pass_min =
1009       Clip3(RightShiftWithRounding(min, vertical_bits), 0, max_input);
1010   const int second_pass_max =
1011       Clip3(RightShiftWithRounding(max, vertical_bits), 0, max_input);
1012   printf("  Pixel output range:                [%8d, %8d]\n", second_pass_min,
1013          second_pass_max);
1014 
1015   // Output is Pixel so matches Pixel values.
1016   assert(second_pass_min == 0);
1017   assert(second_pass_max == max_input);
1018 
1019   const int compound_second_pass_min =
1020       RightShiftWithRounding(min, compound_vertical_bits) + compound_offset;
1021   const int compound_second_pass_max =
1022       RightShiftWithRounding(max, compound_vertical_bits) + compound_offset;
1023 
1024   printf("  Compound output range:             [%8d, %8d]\n",
1025          compound_second_pass_min, compound_second_pass_max);
1026 
1027   if (bitdepth == 8) {
1028     // 8bpp output is int16_t without an offset.
1029     assert(compound_second_pass_min > INT16_MIN);
1030     assert(compound_second_pass_max < INT16_MAX);
1031   } else {
1032     // 10bpp and 12bpp use the offset to fit inside uint16_t.
1033     assert(compound_second_pass_min > 0);
1034     assert(compound_second_pass_max < UINT16_MAX);
1035   }
1036 
1037   printf("\n");
1038 }
1039 
TEST(ConvolveTest,ShowRange)1040 TEST(ConvolveTest, ShowRange) {
1041   ShowRange<kBitdepth8>();
1042   ShowRange<kBitdepth10>();
1043   ShowRange<kBitdepth12>();
1044 }
1045 
1046 using ConvolveTest8bpp = ConvolveTest<8, uint8_t>;
1047 
TEST_P(ConvolveTest8bpp,FixedValues)1048 TEST_P(ConvolveTest8bpp, FixedValues) {
1049   Test(true, 0);
1050   Test(true, 1);
1051   Test(true, 128);
1052   Test(true, 255);
1053 }
1054 
TEST_P(ConvolveTest8bpp,RandomValues)1055 TEST_P(ConvolveTest8bpp, RandomValues) { Test(false, 0); }
1056 
TEST_P(ConvolveTest8bpp,DISABLED_Speed)1057 TEST_P(ConvolveTest8bpp, DISABLED_Speed) {
1058   const int num_runs = static_cast<int>(1.0e7 / (param_.width * param_.height));
1059   Test(false, 0, num_runs);
1060 }
1061 
1062 //------------------------------------------------------------------------------
1063 template <int bitdepth, typename Pixel>
1064 class ConvolveScaleTest
1065     : public testing::TestWithParam<
1066           std::tuple<bool /*is_compound*/, ConvolveTestParam>> {
1067  public:
1068   static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
1069   ConvolveScaleTest() = default;
1070   ~ConvolveScaleTest() override = default;
1071 
SetUp()1072   void SetUp() override {
1073     ConvolveInit_C();
1074 
1075     const Dsp* const dsp = GetDspTable(bitdepth);
1076     ASSERT_NE(dsp, nullptr);
1077     base_convolve_scale_func_ = dsp->convolve_scale[is_compound_];
1078 
1079     const testing::TestInfo* const test_info =
1080         testing::UnitTest::GetInstance()->current_test_info();
1081     const absl::string_view test_case = test_info->test_suite_name();
1082     if (absl::StartsWith(test_case, "C/")) {
1083       base_convolve_scale_func_ = nullptr;
1084     } else if (absl::StartsWith(test_case, "SSE41/")) {
1085       if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
1086       ConvolveInit_SSE4_1();
1087     } else if (absl::StartsWith(test_case, "AVX2/")) {
1088       if ((GetCpuInfo() & kAVX2) == 0) GTEST_SKIP() << "No AVX2 support!";
1089       ConvolveInit_AVX2();
1090     } else if (absl::StartsWith(test_case, "NEON/")) {
1091       ConvolveInit_NEON();
1092 #if LIBGAV1_MAX_BITDEPTH >= 10
1093       ConvolveInit10bpp_NEON();
1094 #endif
1095     } else {
1096       FAIL() << "Unrecognized architecture prefix in test case name: "
1097              << test_case;
1098     }
1099 
1100     cur_convolve_scale_func_ = dsp->convolve_scale[is_compound_];
1101 
1102     // Skip functions that have not been specialized for this particular
1103     // architecture.
1104     if (cur_convolve_scale_func_ == base_convolve_scale_func_) {
1105       cur_convolve_scale_func_ = nullptr;
1106     }
1107   }
1108 
1109  protected:
GetDigestId() const1110   int GetDigestId() const {
1111     return param_.block_size +
1112            param_.kNumBlockSizes * static_cast<int>(is_compound_);
1113   }
1114 
1115   void SetInputData(bool use_fixed_values, int value);
1116   void Check(bool use_fixed_values, const Pixel* src, const Pixel* dest,
1117              libvpx_test::MD5* md5_digest);
1118   void Check16Bit(bool use_fixed_values, const uint16_t* src,
1119                   const uint16_t* dest, libvpx_test::MD5* md5_digest);
1120   // |num_runs| covers the categories of filters (6) and the number of filters
1121   // under each category (16).
1122   void Test(bool use_fixed_values, int value,
1123             int num_runs = kMinimumViableRuns);
1124 
1125   const bool is_compound_ = std::get<0>(GetParam());
1126   const ConvolveTestParam param_ = std::get<1>(GetParam());
1127 
1128  private:
1129   ConvolveScaleFunc base_convolve_scale_func_;
1130   ConvolveScaleFunc cur_convolve_scale_func_;
1131   // Convolve filters are 7-tap, which need 3 pixels
1132   // (kRestorationHorizontalBorder) padding.
1133   // The source can be at most 2 times of max width/height.
1134   Pixel source_[kMaxBlockHeight * kMaxBlockWidth * 4] = {};
1135   uint16_t source_16bit_[kMaxBlockHeight * kMaxBlockWidth * 4] = {};
1136   uint16_t dest_16bit_[kMaxBlockHeight * kMaxBlockWidth] = {};
1137   Pixel dest_clipped_[kMaxBlockHeight * kMaxBlockWidth] = {};
1138 
1139   const int source_stride_ = kMaxBlockWidth * 2;
1140   const int source_height_ = kMaxBlockHeight * 2;
1141 };
1142 
1143 template <int bitdepth, typename Pixel>
SetInputData(bool use_fixed_values,int value)1144 void ConvolveScaleTest<bitdepth, Pixel>::SetInputData(bool use_fixed_values,
1145                                                       int value) {
1146   if (use_fixed_values) {
1147     std::fill(source_, source_ + source_height_ * source_stride_, value);
1148   } else {
1149     const int offset =
1150         kConvolveBorderLeftTop * source_stride_ + kConvolveBorderLeftTop;
1151     const int mask = (1 << bitdepth) - 1;
1152     libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
1153     const int height = param_.height * 2;
1154     const int width = param_.width * 2;
1155     for (int y = 0; y < height; ++y) {
1156       for (int x = 0; x < width; ++x) {
1157         source_[y * source_stride_ + x + offset] = rnd.Rand16() & mask;
1158       }
1159     }
1160     // Copy border pixels to the left and right borders.
1161     for (int y = 0; y < height; ++y) {
1162       Memset(&source_[(y + kConvolveBorderLeftTop) * source_stride_],
1163              source_[y * source_stride_ + offset], kConvolveBorderLeftTop);
1164       Memset(&source_[y * source_stride_ + offset + width],
1165              source_[y * source_stride_ + offset + width - 1],
1166              kConvolveBorderLeftTop);
1167     }
1168     // Copy border pixels to the top and bottom borders.
1169     for (int y = 0; y < kConvolveBorderLeftTop; ++y) {
1170       memcpy(&source_[y * source_stride_],
1171              &source_[kConvolveBorderLeftTop * source_stride_],
1172              source_stride_ * sizeof(Pixel));
1173       memcpy(&source_[(y + kConvolveBorderLeftTop + height) * source_stride_],
1174              &source_[(kConvolveBorderLeftTop + height - 1) * source_stride_],
1175              source_stride_ * sizeof(Pixel));
1176     }
1177   }
1178 }
1179 
1180 template <int bitdepth, typename Pixel>
Check(bool use_fixed_values,const Pixel * src,const Pixel * dest,libvpx_test::MD5 * md5_digest)1181 void ConvolveScaleTest<bitdepth, Pixel>::Check(bool use_fixed_values,
1182                                                const Pixel* src,
1183                                                const Pixel* dest,
1184                                                libvpx_test::MD5* md5_digest) {
1185   if (use_fixed_values) {
1186     // For fixed values, input and output are identical.
1187     const bool success =
1188         test_utils::CompareBlocks(src, dest, param_.width, param_.height,
1189                                   kMaxBlockWidth, kMaxBlockWidth, false, false);
1190     EXPECT_TRUE(success);
1191   } else {
1192     // For random input, compare md5.
1193     const int offset =
1194         kConvolveBorderLeftTop * kMaxBlockWidth + kConvolveBorderLeftTop;
1195     const size_t size = sizeof(dest_clipped_) - offset * sizeof(Pixel);
1196     md5_digest->Add(reinterpret_cast<const uint8_t*>(dest), size);
1197   }
1198 }
1199 
1200 template <int bitdepth, typename Pixel>
Check16Bit(bool use_fixed_values,const uint16_t * src,const uint16_t * dest,libvpx_test::MD5 * md5_digest)1201 void ConvolveScaleTest<bitdepth, Pixel>::Check16Bit(
1202     bool use_fixed_values, const uint16_t* src, const uint16_t* dest,
1203     libvpx_test::MD5* md5_digest) {
1204   if (use_fixed_values) {
1205     // For fixed values, input and output are identical.
1206     const bool success =
1207         test_utils::CompareBlocks(src, dest, param_.width, param_.height,
1208                                   kMaxBlockWidth, kMaxBlockWidth, false);
1209     EXPECT_TRUE(success);
1210   } else {
1211     // For random input, compare md5.
1212     const int offset =
1213         kConvolveBorderLeftTop * kMaxBlockWidth + kConvolveBorderLeftTop;
1214     const size_t size = sizeof(dest_16bit_) - offset * sizeof(uint16_t);
1215     md5_digest->Add(reinterpret_cast<const uint8_t*>(dest), size);
1216   }
1217 }
1218 
1219 template <int bitdepth, typename Pixel>
Test(bool use_fixed_values,int value,int num_runs)1220 void ConvolveScaleTest<bitdepth, Pixel>::Test(
1221     bool use_fixed_values, int value, int num_runs /*= kMinimumViableRuns*/) {
1222   // There's no meaning testing fixed input in compound convolve.
1223   if (is_compound_ && use_fixed_values) return;
1224 
1225   // The compound function is only used for blocks 4x4 or greater.
1226   if (is_compound_) {
1227     if (param_.width < 4 || param_.height < 4) {
1228       GTEST_SKIP();
1229     }
1230   }
1231 
1232   // Skip unspecialized functions.
1233   if (cur_convolve_scale_func_ == nullptr) {
1234     GTEST_SKIP();
1235   }
1236 
1237   SetInputData(use_fixed_values, value);
1238   libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed() +
1239                              GetDigestId());
1240   // [1,2048] for |step_[xy]|. This covers a scaling range of 1/1024 to 2x.
1241   const int step_x = (rnd.Rand16() & ((1 << 11) - 1)) + 1;
1242   const int step_y = (rnd.Rand16() & ((1 << 11) - 1)) + 1;
1243   int subpixel_x = 0;
1244   int subpixel_y = 0;
1245   int vertical_index = 0;
1246   int horizontal_index = 0;
1247   const int offset =
1248       kConvolveBorderLeftTop * kMaxBlockWidth + kConvolveBorderLeftTop;
1249   const int offset_scale =
1250       kConvolveBorderLeftTop * source_stride_ + kConvolveBorderLeftTop;
1251   const Pixel* const src_scale = source_ + offset_scale;
1252   const ptrdiff_t src_stride = source_stride_ * sizeof(Pixel);
1253   const ptrdiff_t dst_stride = kMaxBlockWidth * sizeof(Pixel);
1254   // Pack Compound output since we control the predictor buffer.
1255   const ptrdiff_t dst_stride_compound = param_.width;
1256 
1257   // Output is always 16 bits regardless of |bitdepth|.
1258   uint16_t* dst_16 = dest_16bit_ + offset;
1259   // Output depends on |bitdepth|.
1260   Pixel* dst_pixel = dest_clipped_ + offset;
1261 
1262   // Collect the first |kMinimumViableRuns| into one md5 buffer.
1263   libvpx_test::MD5 md5_digest;
1264 
1265   absl::Duration elapsed_time;
1266   for (int i = 0; i < num_runs; ++i) {
1267     // Test every filter.
1268     // Because of masking |subpixel_{x,y}| values roll over every 16 iterations.
1269     subpixel_x += 1 << 6;
1270     subpixel_y += 1 << 6;
1271 
1272     const int horizontal_filter_id = (subpixel_x >> 6) & 0xF;
1273     const int vertical_filter_id = (subpixel_y >> 6) & 0xF;
1274 
1275     // |filter_id| == 0 (copy) must be handled by the appropriate 1D or copy
1276     // function.
1277     if (horizontal_filter_id == 0 || vertical_filter_id == 0) {
1278       continue;
1279     }
1280 
1281     // For focused speed testing these can be set to the desired filter. Want
1282     // only 8 tap filters? Set |{vertical,horizontal}_index| to 2.
1283     vertical_index += static_cast<int>(i % 16 == 0);
1284     vertical_index %= 4;
1285     horizontal_index += static_cast<int>(i % 16 == 0);
1286     horizontal_index %= 4;
1287 
1288     // Output type is uint16_t.
1289     const absl::Time start = absl::Now();
1290     if (is_compound_) {
1291       cur_convolve_scale_func_(
1292           source_, src_stride, horizontal_index, vertical_index, 0, 0, step_x,
1293           step_y, param_.width, param_.height, dst_16, dst_stride_compound);
1294     } else {
1295       cur_convolve_scale_func_(
1296           source_, src_stride, horizontal_index, vertical_index, 0, 0, step_x,
1297           step_y, param_.width, param_.height, dst_pixel, dst_stride);
1298     }
1299     elapsed_time += absl::Now() - start;
1300 
1301     // Only check the output for the first set. After that it's just repeated
1302     // runs for speed timing.
1303     if (i >= kMinimumViableRuns) continue;
1304 
1305     // Convolve function does not clip the output. The clipping is applied
1306     // later, but libaom clips the output. So we apply clipping to match
1307     // libaom in tests.
1308     if (is_compound_) {
1309       const int single_round_offset = (1 << bitdepth) + (1 << (bitdepth - 1));
1310       Pixel* dest_row = dest_clipped_;
1311       for (int y = 0; y < kMaxBlockHeight; ++y) {
1312         for (int x = 0; x < kMaxBlockWidth; ++x) {
1313           dest_row[x] = static_cast<Pixel>(Clip3(
1314               dest_16bit_[y * dst_stride_compound + x] - single_round_offset, 0,
1315               (1 << bitdepth) - 1));
1316         }
1317         dest_row += kMaxBlockWidth;
1318       }
1319     }
1320 
1321     if (is_compound_) {
1322       Check16Bit(use_fixed_values, source_16bit_ + offset_scale, dst_16,
1323                  &md5_digest);
1324     } else {
1325       Check(use_fixed_values, src_scale, dst_pixel, &md5_digest);
1326     }
1327   }
1328 
1329   if (!use_fixed_values) {
1330     // md5 sums are only calculated for random input.
1331     const char* ref_digest = nullptr;
1332     switch (bitdepth) {
1333       case 8:
1334         ref_digest = GetConvolveScaleDigest8bpp(GetDigestId());
1335         break;
1336 #if LIBGAV1_MAX_BITDEPTH >= 10
1337       case 10:
1338         ref_digest = GetConvolveScaleDigest10bpp(GetDigestId());
1339         break;
1340 #endif
1341 #if LIBGAV1_MAX_BITDEPTH == 12
1342       case 12:
1343         ref_digest = GetConvolveScaleDigest12bpp(GetDigestId());
1344         break;
1345 #endif
1346     }
1347     ASSERT_NE(ref_digest, nullptr);
1348 
1349     const auto elapsed_time_us =
1350         static_cast<int>(absl::ToInt64Microseconds(elapsed_time));
1351     printf("Mode Convolve%sScale2D[%25s]: %5d us MD5: %s\n",
1352            is_compound_ ? "Compound" : "",
1353            absl::StrFormat("%dx%d", param_.width, param_.height).c_str(),
1354            elapsed_time_us, md5_digest.Get());
1355     EXPECT_STREQ(ref_digest, md5_digest.Get());
1356   }
1357 }
1358 
1359 using ConvolveScaleTest8bpp = ConvolveScaleTest<8, uint8_t>;
1360 
TEST_P(ConvolveScaleTest8bpp,FixedValues)1361 TEST_P(ConvolveScaleTest8bpp, FixedValues) {
1362   Test(true, 0);
1363   Test(true, 1);
1364   Test(true, 128);
1365   Test(true, 255);
1366 }
1367 
TEST_P(ConvolveScaleTest8bpp,RandomValues)1368 TEST_P(ConvolveScaleTest8bpp, RandomValues) { Test(false, 0); }
1369 
TEST_P(ConvolveScaleTest8bpp,DISABLED_Speed)1370 TEST_P(ConvolveScaleTest8bpp, DISABLED_Speed) {
1371   const int num_runs = static_cast<int>(1.0e7 / (param_.width * param_.height));
1372   Test(false, 0, num_runs);
1373 }
1374 
1375 //------------------------------------------------------------------------------
1376 const ConvolveTestParam kConvolveParam[] = {
1377     ConvolveTestParam(ConvolveTestParam::kBlockSize2x2),
1378     ConvolveTestParam(ConvolveTestParam::kBlockSize2x4),
1379     ConvolveTestParam(ConvolveTestParam::kBlockSize4x2),
1380     ConvolveTestParam(ConvolveTestParam::kBlockSize4x4),
1381     ConvolveTestParam(ConvolveTestParam::kBlockSize4x8),
1382     ConvolveTestParam(ConvolveTestParam::kBlockSize8x2),
1383     ConvolveTestParam(ConvolveTestParam::kBlockSize8x4),
1384     ConvolveTestParam(ConvolveTestParam::kBlockSize8x8),
1385     ConvolveTestParam(ConvolveTestParam::kBlockSize8x16),
1386     ConvolveTestParam(ConvolveTestParam::kBlockSize16x8),
1387     ConvolveTestParam(ConvolveTestParam::kBlockSize16x16),
1388     ConvolveTestParam(ConvolveTestParam::kBlockSize16x32),
1389     ConvolveTestParam(ConvolveTestParam::kBlockSize32x16),
1390     ConvolveTestParam(ConvolveTestParam::kBlockSize32x32),
1391     ConvolveTestParam(ConvolveTestParam::kBlockSize32x64),
1392     ConvolveTestParam(ConvolveTestParam::kBlockSize64x32),
1393     ConvolveTestParam(ConvolveTestParam::kBlockSize64x64),
1394     ConvolveTestParam(ConvolveTestParam::kBlockSize64x128),
1395     ConvolveTestParam(ConvolveTestParam::kBlockSize128x64),
1396     ConvolveTestParam(ConvolveTestParam::kBlockSize128x128),
1397 };
1398 
1399 const ConvolveTypeParam kConvolveTypeParam[] = {
1400     ConvolveTypeParam(false, false, false, false),
1401     ConvolveTypeParam(false, false, false, true),
1402     ConvolveTypeParam(false, false, true, false),
1403     ConvolveTypeParam(false, false, true, true),
1404     ConvolveTypeParam(false, true, false, false),
1405     ConvolveTypeParam(false, true, false, true),
1406     ConvolveTypeParam(false, true, true, false),
1407     ConvolveTypeParam(false, true, true, true),
1408     ConvolveTypeParam(true, false, false, false),
1409     ConvolveTypeParam(true, false, false, true),
1410     ConvolveTypeParam(true, false, true, false),
1411     ConvolveTypeParam(true, false, true, true),
1412     // This is left to ensure no function exists for |intra_block_copy| when
1413     // |is_compound| is true; all combinations aren't necessary.
1414     ConvolveTypeParam(true, true, false, false),
1415 };
1416 
1417 INSTANTIATE_TEST_SUITE_P(C, ConvolveTest8bpp,
1418                          testing::Combine(testing::ValuesIn(kConvolveTypeParam),
1419                                           testing::ValuesIn(kConvolveParam)));
1420 INSTANTIATE_TEST_SUITE_P(C, ConvolveScaleTest8bpp,
1421                          testing::Combine(testing::Bool(),
1422                                           testing::ValuesIn(kConvolveParam)));
1423 
1424 #if LIBGAV1_ENABLE_NEON
1425 INSTANTIATE_TEST_SUITE_P(NEON, ConvolveTest8bpp,
1426                          testing::Combine(testing::ValuesIn(kConvolveTypeParam),
1427                                           testing::ValuesIn(kConvolveParam)));
1428 INSTANTIATE_TEST_SUITE_P(NEON, ConvolveScaleTest8bpp,
1429                          testing::Combine(testing::Bool(),
1430                                           testing::ValuesIn(kConvolveParam)));
1431 #endif  // LIBGAV1_ENABLE_NEON
1432 
1433 #if LIBGAV1_ENABLE_SSE4_1
1434 INSTANTIATE_TEST_SUITE_P(SSE41, ConvolveTest8bpp,
1435                          testing::Combine(testing::ValuesIn(kConvolveTypeParam),
1436                                           testing::ValuesIn(kConvolveParam)));
1437 INSTANTIATE_TEST_SUITE_P(SSE41, ConvolveScaleTest8bpp,
1438                          testing::Combine(testing::Bool(),
1439                                           testing::ValuesIn(kConvolveParam)));
1440 #endif  // LIBGAV1_ENABLE_SSE4_1
1441 
1442 #if LIBGAV1_ENABLE_AVX2
1443 INSTANTIATE_TEST_SUITE_P(AVX2, ConvolveTest8bpp,
1444                          testing::Combine(testing::ValuesIn(kConvolveTypeParam),
1445                                           testing::ValuesIn(kConvolveParam)));
1446 INSTANTIATE_TEST_SUITE_P(AVX2, ConvolveScaleTest8bpp,
1447                          testing::Combine(testing::Bool(),
1448                                           testing::ValuesIn(kConvolveParam)));
1449 #endif  // LIBGAV1_ENABLE_AVX2
1450 
1451 #if LIBGAV1_MAX_BITDEPTH >= 10
1452 using ConvolveTest10bpp = ConvolveTest<10, uint16_t>;
1453 
TEST_P(ConvolveTest10bpp,FixedValues)1454 TEST_P(ConvolveTest10bpp, FixedValues) {
1455   Test(true, 0);
1456   Test(true, 1);
1457   Test(true, 128);
1458   Test(true, (1 << 10) - 1);
1459 }
1460 
TEST_P(ConvolveTest10bpp,RandomValues)1461 TEST_P(ConvolveTest10bpp, RandomValues) { Test(false, 0); }
1462 
TEST_P(ConvolveTest10bpp,DISABLED_Speed)1463 TEST_P(ConvolveTest10bpp, DISABLED_Speed) {
1464   const int num_runs = static_cast<int>(1.0e7 / (param_.width * param_.height));
1465   Test(false, 0, num_runs);
1466 }
1467 
1468 using ConvolveScaleTest10bpp = ConvolveScaleTest<10, uint16_t>;
1469 
TEST_P(ConvolveScaleTest10bpp,FixedValues)1470 TEST_P(ConvolveScaleTest10bpp, FixedValues) {
1471   Test(true, 0);
1472   Test(true, 1);
1473   Test(true, 128);
1474   Test(true, (1 << 10) - 1);
1475 }
1476 
TEST_P(ConvolveScaleTest10bpp,RandomValues)1477 TEST_P(ConvolveScaleTest10bpp, RandomValues) { Test(false, 0); }
1478 
TEST_P(ConvolveScaleTest10bpp,DISABLED_Speed)1479 TEST_P(ConvolveScaleTest10bpp, DISABLED_Speed) {
1480   const int num_runs = static_cast<int>(1.0e7 / (param_.width * param_.height));
1481   Test(false, 0, num_runs);
1482 }
1483 
1484 INSTANTIATE_TEST_SUITE_P(C, ConvolveTest10bpp,
1485                          testing::Combine(testing::ValuesIn(kConvolveTypeParam),
1486                                           testing::ValuesIn(kConvolveParam)));
1487 INSTANTIATE_TEST_SUITE_P(C, ConvolveScaleTest10bpp,
1488                          testing::Combine(testing::Bool(),
1489                                           testing::ValuesIn(kConvolveParam)));
1490 
1491 #if LIBGAV1_ENABLE_NEON
1492 INSTANTIATE_TEST_SUITE_P(NEON, ConvolveTest10bpp,
1493                          testing::Combine(testing::ValuesIn(kConvolveTypeParam),
1494                                           testing::ValuesIn(kConvolveParam)));
1495 INSTANTIATE_TEST_SUITE_P(NEON, ConvolveScaleTest10bpp,
1496                          testing::Combine(testing::Bool(),
1497                                           testing::ValuesIn(kConvolveParam)));
1498 #endif  // LIBGAV1_ENABLE_NEON
1499 
1500 #endif  // LIBGAV1_MAX_BITDEPTH >= 10
1501 
1502 #if LIBGAV1_MAX_BITDEPTH == 12
1503 using ConvolveTest12bpp = ConvolveTest<12, uint16_t>;
1504 
TEST_P(ConvolveTest12bpp,FixedValues)1505 TEST_P(ConvolveTest12bpp, FixedValues) {
1506   Test(true, 0);
1507   Test(true, 1);
1508   Test(true, 128);
1509   Test(true, (1 << 12) - 1);
1510 }
1511 
TEST_P(ConvolveTest12bpp,RandomValues)1512 TEST_P(ConvolveTest12bpp, RandomValues) { Test(false, 0); }
1513 
TEST_P(ConvolveTest12bpp,DISABLED_Speed)1514 TEST_P(ConvolveTest12bpp, DISABLED_Speed) {
1515   const int num_runs = static_cast<int>(1.0e7 / (param_.width * param_.height));
1516   Test(false, 0, num_runs);
1517 }
1518 
1519 using ConvolveScaleTest12bpp = ConvolveScaleTest<12, uint16_t>;
1520 
TEST_P(ConvolveScaleTest12bpp,FixedValues)1521 TEST_P(ConvolveScaleTest12bpp, FixedValues) {
1522   Test(true, 0);
1523   Test(true, 1);
1524   Test(true, 128);
1525   Test(true, (1 << 12) - 1);
1526 }
1527 
TEST_P(ConvolveScaleTest12bpp,RandomValues)1528 TEST_P(ConvolveScaleTest12bpp, RandomValues) { Test(false, 0); }
1529 
TEST_P(ConvolveScaleTest12bpp,DISABLED_Speed)1530 TEST_P(ConvolveScaleTest12bpp, DISABLED_Speed) {
1531   const int num_runs = static_cast<int>(1.0e7 / (param_.width * param_.height));
1532   Test(false, 0, num_runs);
1533 }
1534 
1535 INSTANTIATE_TEST_SUITE_P(C, ConvolveTest12bpp,
1536                          testing::Combine(testing::ValuesIn(kConvolveTypeParam),
1537                                           testing::ValuesIn(kConvolveParam)));
1538 INSTANTIATE_TEST_SUITE_P(C, ConvolveScaleTest12bpp,
1539                          testing::Combine(testing::Bool(),
1540                                           testing::ValuesIn(kConvolveParam)));
1541 #endif  // LIBGAV1_MAX_BITDEPTH == 12
1542 
1543 }  // namespace
1544 }  // namespace dsp
1545 }  // namespace libgav1
1546