xref: /aosp_15_r20/external/libgav1/src/dsp/weight_mask_test.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1*09537850SAkhilesh Sanikop // Copyright 2020 The libgav1 Authors
2*09537850SAkhilesh Sanikop //
3*09537850SAkhilesh Sanikop // Licensed under the Apache License, Version 2.0 (the "License");
4*09537850SAkhilesh Sanikop // you may not use this file except in compliance with the License.
5*09537850SAkhilesh Sanikop // You may obtain a copy of the License at
6*09537850SAkhilesh Sanikop //
7*09537850SAkhilesh Sanikop //      http://www.apache.org/licenses/LICENSE-2.0
8*09537850SAkhilesh Sanikop //
9*09537850SAkhilesh Sanikop // Unless required by applicable law or agreed to in writing, software
10*09537850SAkhilesh Sanikop // distributed under the License is distributed on an "AS IS" BASIS,
11*09537850SAkhilesh Sanikop // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*09537850SAkhilesh Sanikop // See the License for the specific language governing permissions and
13*09537850SAkhilesh Sanikop // limitations under the License.
14*09537850SAkhilesh Sanikop 
15*09537850SAkhilesh Sanikop #include "src/dsp/weight_mask.h"
16*09537850SAkhilesh Sanikop 
17*09537850SAkhilesh Sanikop #include <algorithm>
18*09537850SAkhilesh Sanikop #include <cstdint>
19*09537850SAkhilesh Sanikop #include <ostream>
20*09537850SAkhilesh Sanikop #include <string>
21*09537850SAkhilesh Sanikop #include <type_traits>
22*09537850SAkhilesh Sanikop 
23*09537850SAkhilesh Sanikop #include "absl/strings/match.h"
24*09537850SAkhilesh Sanikop #include "absl/strings/str_format.h"
25*09537850SAkhilesh Sanikop #include "absl/time/clock.h"
26*09537850SAkhilesh Sanikop #include "absl/time/time.h"
27*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
28*09537850SAkhilesh Sanikop #include "src/dsp/dsp.h"
29*09537850SAkhilesh Sanikop #include "src/utils/common.h"
30*09537850SAkhilesh Sanikop #include "src/utils/constants.h"
31*09537850SAkhilesh Sanikop #include "src/utils/cpu.h"
32*09537850SAkhilesh Sanikop #include "src/utils/memory.h"
33*09537850SAkhilesh Sanikop #include "tests/third_party/libvpx/acm_random.h"
34*09537850SAkhilesh Sanikop #include "tests/utils.h"
35*09537850SAkhilesh Sanikop 
36*09537850SAkhilesh Sanikop namespace libgav1 {
37*09537850SAkhilesh Sanikop namespace dsp {
38*09537850SAkhilesh Sanikop namespace {
39*09537850SAkhilesh Sanikop 
40*09537850SAkhilesh Sanikop constexpr int kNumSpeedTests = 50000;
41*09537850SAkhilesh Sanikop constexpr int kMaxPredictionSize = 128;
42*09537850SAkhilesh Sanikop // weight_mask is only used with kCompoundPredictionTypeDiffWeighted with
43*09537850SAkhilesh Sanikop // convolve producing the most extreme ranges.
44*09537850SAkhilesh Sanikop // This includes kCompoundOffset in 10bpp and 12bpp.
45*09537850SAkhilesh Sanikop // see: src/dsp/convolve.cc & src/dsp/warp.cc.
46*09537850SAkhilesh Sanikop constexpr int kCompoundPredictionRange[3][2] = {
47*09537850SAkhilesh Sanikop     // 8bpp
48*09537850SAkhilesh Sanikop     {-5132, 9212},
49*09537850SAkhilesh Sanikop     // 10bpp
50*09537850SAkhilesh Sanikop     {3988, 61532},
51*09537850SAkhilesh Sanikop     // 12bpp
52*09537850SAkhilesh Sanikop     {3974, 61559},
53*09537850SAkhilesh Sanikop };
54*09537850SAkhilesh Sanikop 
GetDigest8bpp(int id)55*09537850SAkhilesh Sanikop const char* GetDigest8bpp(int id) {
56*09537850SAkhilesh Sanikop   static const char* const kDigest[] = {
57*09537850SAkhilesh Sanikop       "eaca5b6a96dcfe5e44f3926a071b48b3",
58*09537850SAkhilesh Sanikop       "1d82c75cfdf8e57925eb1d5301647538",
59*09537850SAkhilesh Sanikop       "25bd455d74fb891b97b133c528f8db60",
60*09537850SAkhilesh Sanikop       "" /*kBlock4x16*/,
61*09537850SAkhilesh Sanikop       "1d82c75cfdf8e57925eb1d5301647538",
62*09537850SAkhilesh Sanikop       "25bd455d74fb891b97b133c528f8db60",
63*09537850SAkhilesh Sanikop       "62a08776db35a186406a11ab92dee71c",
64*09537850SAkhilesh Sanikop       "95131d1dc0e05fcf4bd234d5ce9eea11",
65*09537850SAkhilesh Sanikop       "25bd455d74fb891b97b133c528f8db60",
66*09537850SAkhilesh Sanikop       "62a08776db35a186406a11ab92dee71c",
67*09537850SAkhilesh Sanikop       "95131d1dc0e05fcf4bd234d5ce9eea11",
68*09537850SAkhilesh Sanikop       "0b3c75272e0fb0747b9850145d340c4c",
69*09537850SAkhilesh Sanikop       "95131d1dc0e05fcf4bd234d5ce9eea11",
70*09537850SAkhilesh Sanikop       "0b3c75272e0fb0747b9850145d340c4c",
71*09537850SAkhilesh Sanikop       "f26c43d4bc823a89c1ed47ab8708bc06",
72*09537850SAkhilesh Sanikop       "0d99bbf31ecddc1c2d5063a68c0e9375",
73*09537850SAkhilesh Sanikop       "0d99bbf31ecddc1c2d5063a68c0e9375",
74*09537850SAkhilesh Sanikop       "5fb8ec5f582f0ebfe519ed55860f67c4",
75*09537850SAkhilesh Sanikop 
76*09537850SAkhilesh Sanikop       // mask_is_inverse = true.
77*09537850SAkhilesh Sanikop       "96811f3b192828ff679e4c9ad8069d7d",
78*09537850SAkhilesh Sanikop       "a04dc180c028d55af70240163445523a",
79*09537850SAkhilesh Sanikop       "8513e3988233d0a7de316a0179bb6139",
80*09537850SAkhilesh Sanikop       "" /*kBlock4x16*/,
81*09537850SAkhilesh Sanikop       "a04dc180c028d55af70240163445523a",
82*09537850SAkhilesh Sanikop       "8513e3988233d0a7de316a0179bb6139",
83*09537850SAkhilesh Sanikop       "f7356d42fb44a6ccb41253ba35b8b3c7",
84*09537850SAkhilesh Sanikop       "3d2d61ffc203ee64fe91c9d16168a19d",
85*09537850SAkhilesh Sanikop       "8513e3988233d0a7de316a0179bb6139",
86*09537850SAkhilesh Sanikop       "f7356d42fb44a6ccb41253ba35b8b3c7",
87*09537850SAkhilesh Sanikop       "3d2d61ffc203ee64fe91c9d16168a19d",
88*09537850SAkhilesh Sanikop       "87a2011ac69fb597ca4f71bb3c35ebb0",
89*09537850SAkhilesh Sanikop       "3d2d61ffc203ee64fe91c9d16168a19d",
90*09537850SAkhilesh Sanikop       "87a2011ac69fb597ca4f71bb3c35ebb0",
91*09537850SAkhilesh Sanikop       "97100a3639d567046dc8a99fcb84cb2e",
92*09537850SAkhilesh Sanikop       "9fabe05a6523da81a45150e19f75acff",
93*09537850SAkhilesh Sanikop       "9fabe05a6523da81a45150e19f75acff",
94*09537850SAkhilesh Sanikop       "7c0643e4d02421d06d7ca71822a94e1d",
95*09537850SAkhilesh Sanikop   };
96*09537850SAkhilesh Sanikop   return kDigest[id];
97*09537850SAkhilesh Sanikop }
98*09537850SAkhilesh Sanikop 
99*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
GetDigest10bpp(int id)100*09537850SAkhilesh Sanikop const char* GetDigest10bpp(int id) {
101*09537850SAkhilesh Sanikop   static const char* const kDigest[] = {
102*09537850SAkhilesh Sanikop       "5ae8d64b65a671301a457b8a73368ab5",
103*09537850SAkhilesh Sanikop       "61535217f179054d4b76a8d9352a223d",
104*09537850SAkhilesh Sanikop       "1aa6614773570e7b021cd509849c4180",
105*09537850SAkhilesh Sanikop       "" /*kBlock4x16*/,
106*09537850SAkhilesh Sanikop       "61535217f179054d4b76a8d9352a223d",
107*09537850SAkhilesh Sanikop       "1aa6614773570e7b021cd509849c4180",
108*09537850SAkhilesh Sanikop       "f04c2825cfb6408c7778658f71fa176e",
109*09537850SAkhilesh Sanikop       "e1694ea1f026dac7fe7e86a84482cf86",
110*09537850SAkhilesh Sanikop       "1aa6614773570e7b021cd509849c4180",
111*09537850SAkhilesh Sanikop       "f04c2825cfb6408c7778658f71fa176e",
112*09537850SAkhilesh Sanikop       "e1694ea1f026dac7fe7e86a84482cf86",
113*09537850SAkhilesh Sanikop       "9c4855d44c013fbddb373b2e9e311080",
114*09537850SAkhilesh Sanikop       "e1694ea1f026dac7fe7e86a84482cf86",
115*09537850SAkhilesh Sanikop       "9c4855d44c013fbddb373b2e9e311080",
116*09537850SAkhilesh Sanikop       "f510e743c3efe3b83374a98ef8a30838",
117*09537850SAkhilesh Sanikop       "b6e0bd03c521c5f00e90530daa7d4432",
118*09537850SAkhilesh Sanikop       "b6e0bd03c521c5f00e90530daa7d4432",
119*09537850SAkhilesh Sanikop       "3270d7f621d488aec5b76bcf121debd0",
120*09537850SAkhilesh Sanikop 
121*09537850SAkhilesh Sanikop       // mask_is_inverse = true.
122*09537850SAkhilesh Sanikop       "9aa00fcfe21b71e30c5393699122a020",
123*09537850SAkhilesh Sanikop       "4d8ce33262cf6b5375f363530815189a",
124*09537850SAkhilesh Sanikop       "428625c51ac1bd4585988f7b36dff1db",
125*09537850SAkhilesh Sanikop       "" /*kBlock4x16*/,
126*09537850SAkhilesh Sanikop       "4d8ce33262cf6b5375f363530815189a",
127*09537850SAkhilesh Sanikop       "428625c51ac1bd4585988f7b36dff1db",
128*09537850SAkhilesh Sanikop       "1ef63c06a2d9c42da293fdf924032981",
129*09537850SAkhilesh Sanikop       "5dd3f201d755d1c22c126a633bfbb3c0",
130*09537850SAkhilesh Sanikop       "428625c51ac1bd4585988f7b36dff1db",
131*09537850SAkhilesh Sanikop       "1ef63c06a2d9c42da293fdf924032981",
132*09537850SAkhilesh Sanikop       "5dd3f201d755d1c22c126a633bfbb3c0",
133*09537850SAkhilesh Sanikop       "fe1e6843e6f214939da516dcbea04a79",
134*09537850SAkhilesh Sanikop       "5dd3f201d755d1c22c126a633bfbb3c0",
135*09537850SAkhilesh Sanikop       "fe1e6843e6f214939da516dcbea04a79",
136*09537850SAkhilesh Sanikop       "240187f27389b5e89f9ec6bdbd7d20a7",
137*09537850SAkhilesh Sanikop       "44925dab01011a98b8ab1f0308fa852a",
138*09537850SAkhilesh Sanikop       "44925dab01011a98b8ab1f0308fa852a",
139*09537850SAkhilesh Sanikop       "6d984b2ccfa056278e2130771127a943",
140*09537850SAkhilesh Sanikop   };
141*09537850SAkhilesh Sanikop   return kDigest[id];
142*09537850SAkhilesh Sanikop }
143*09537850SAkhilesh Sanikop #endif  // LIBGAV1_MAX_BITDEPTH >= 10
144*09537850SAkhilesh Sanikop 
145*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
GetDigest12bpp(int id)146*09537850SAkhilesh Sanikop const char* GetDigest12bpp(int id) {
147*09537850SAkhilesh Sanikop   static const char* const kDigest[] = {
148*09537850SAkhilesh Sanikop       "57629d3872fd52ff4bbec439c5517ec5",
149*09537850SAkhilesh Sanikop       "dba421ceeb534756c77167e00ae91a2c",
150*09537850SAkhilesh Sanikop       "72e8ac1d450ef0c6c6b03e93856d5cc2",
151*09537850SAkhilesh Sanikop       "" /*kBlock4x16*/,
152*09537850SAkhilesh Sanikop       "dba421ceeb534756c77167e00ae91a2c",
153*09537850SAkhilesh Sanikop       "72e8ac1d450ef0c6c6b03e93856d5cc2",
154*09537850SAkhilesh Sanikop       "ae573eb368df04e6a0133b4e15471728",
155*09537850SAkhilesh Sanikop       "ceede597b2729357b15e0d08bb9bb760",
156*09537850SAkhilesh Sanikop       "72e8ac1d450ef0c6c6b03e93856d5cc2",
157*09537850SAkhilesh Sanikop       "ae573eb368df04e6a0133b4e15471728",
158*09537850SAkhilesh Sanikop       "ceede597b2729357b15e0d08bb9bb760",
159*09537850SAkhilesh Sanikop       "c4976af803d7ad3f92ef26f25b9f3754",
160*09537850SAkhilesh Sanikop       "ceede597b2729357b15e0d08bb9bb760",
161*09537850SAkhilesh Sanikop       "c4976af803d7ad3f92ef26f25b9f3754",
162*09537850SAkhilesh Sanikop       "1d957d49f71bb7f304705a11a597f0cb",
163*09537850SAkhilesh Sanikop       "9522d5713fb951b79f42d78fbff914cf",
164*09537850SAkhilesh Sanikop       "9522d5713fb951b79f42d78fbff914cf",
165*09537850SAkhilesh Sanikop       "422c046013f79a9f46e2c855967570ba",
166*09537850SAkhilesh Sanikop 
167*09537850SAkhilesh Sanikop       // mask_is_inverse = true.
168*09537850SAkhilesh Sanikop       "a585cca9bc459d10e081bc0eb847b6e3",
169*09537850SAkhilesh Sanikop       "2fa4ec5f74fad2831d216c51c2cdad5a",
170*09537850SAkhilesh Sanikop       "d6c9ac69a9eb3059f5bb6e42b486ebcd",
171*09537850SAkhilesh Sanikop       "" /*kBlock4x16*/,
172*09537850SAkhilesh Sanikop       "2fa4ec5f74fad2831d216c51c2cdad5a",
173*09537850SAkhilesh Sanikop       "d6c9ac69a9eb3059f5bb6e42b486ebcd",
174*09537850SAkhilesh Sanikop       "2ddd8c8a1841501964011030e2557e20",
175*09537850SAkhilesh Sanikop       "97ef2575023dda008711015cf08d7590",
176*09537850SAkhilesh Sanikop       "d6c9ac69a9eb3059f5bb6e42b486ebcd",
177*09537850SAkhilesh Sanikop       "2ddd8c8a1841501964011030e2557e20",
178*09537850SAkhilesh Sanikop       "97ef2575023dda008711015cf08d7590",
179*09537850SAkhilesh Sanikop       "d69aff1e0d43395ce305c9be0dfb4c89",
180*09537850SAkhilesh Sanikop       "97ef2575023dda008711015cf08d7590",
181*09537850SAkhilesh Sanikop       "d69aff1e0d43395ce305c9be0dfb4c89",
182*09537850SAkhilesh Sanikop       "48786f640191dcbee5b3321672778519",
183*09537850SAkhilesh Sanikop       "6ad4718230353440b01f2bb78348157e",
184*09537850SAkhilesh Sanikop       "6ad4718230353440b01f2bb78348157e",
185*09537850SAkhilesh Sanikop       "ad49bd7af0ea17c84f434c7dfd0a911d",
186*09537850SAkhilesh Sanikop   };
187*09537850SAkhilesh Sanikop   return kDigest[id];
188*09537850SAkhilesh Sanikop }
189*09537850SAkhilesh Sanikop #endif  // LIBGAV1_MAX_BITDEPTH == 12
190*09537850SAkhilesh Sanikop 
191*09537850SAkhilesh Sanikop struct WeightMaskTestParam {
WeightMaskTestParamlibgav1::dsp::__anonb6bc346f0111::WeightMaskTestParam192*09537850SAkhilesh Sanikop   WeightMaskTestParam(int width, int height, bool mask_is_inverse)
193*09537850SAkhilesh Sanikop       : width(width), height(height), mask_is_inverse(mask_is_inverse) {}
194*09537850SAkhilesh Sanikop   int width;
195*09537850SAkhilesh Sanikop   int height;
196*09537850SAkhilesh Sanikop   bool mask_is_inverse;
197*09537850SAkhilesh Sanikop };
198*09537850SAkhilesh Sanikop 
operator <<(std::ostream & os,const WeightMaskTestParam & param)199*09537850SAkhilesh Sanikop std::ostream& operator<<(std::ostream& os, const WeightMaskTestParam& param) {
200*09537850SAkhilesh Sanikop   return os << param.width << "x" << param.height
201*09537850SAkhilesh Sanikop             << ", mask_is_inverse: " << param.mask_is_inverse;
202*09537850SAkhilesh Sanikop }
203*09537850SAkhilesh Sanikop 
204*09537850SAkhilesh Sanikop template <int bitdepth>
205*09537850SAkhilesh Sanikop class WeightMaskTest : public testing::TestWithParam<WeightMaskTestParam>,
206*09537850SAkhilesh Sanikop                        public test_utils::MaxAlignedAllocable {
207*09537850SAkhilesh Sanikop  public:
208*09537850SAkhilesh Sanikop   static_assert(bitdepth >= kBitdepth8 && bitdepth <= LIBGAV1_MAX_BITDEPTH, "");
209*09537850SAkhilesh Sanikop   WeightMaskTest() = default;
210*09537850SAkhilesh Sanikop   ~WeightMaskTest() override = default;
211*09537850SAkhilesh Sanikop 
SetUp()212*09537850SAkhilesh Sanikop   void SetUp() override {
213*09537850SAkhilesh Sanikop     test_utils::ResetDspTable(bitdepth);
214*09537850SAkhilesh Sanikop     WeightMaskInit_C();
215*09537850SAkhilesh Sanikop     const dsp::Dsp* const dsp = dsp::GetDspTable(bitdepth);
216*09537850SAkhilesh Sanikop     ASSERT_NE(dsp, nullptr);
217*09537850SAkhilesh Sanikop     const int width_index = FloorLog2(width_) - 3;
218*09537850SAkhilesh Sanikop     const int height_index = FloorLog2(height_) - 3;
219*09537850SAkhilesh Sanikop     const testing::TestInfo* const test_info =
220*09537850SAkhilesh Sanikop         testing::UnitTest::GetInstance()->current_test_info();
221*09537850SAkhilesh Sanikop     const char* const test_case = test_info->test_suite_name();
222*09537850SAkhilesh Sanikop     if (absl::StartsWith(test_case, "C/")) {
223*09537850SAkhilesh Sanikop     } else if (absl::StartsWith(test_case, "NEON/")) {
224*09537850SAkhilesh Sanikop       WeightMaskInit_NEON();
225*09537850SAkhilesh Sanikop     } else if (absl::StartsWith(test_case, "SSE41/")) {
226*09537850SAkhilesh Sanikop       if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
227*09537850SAkhilesh Sanikop       WeightMaskInit_SSE4_1();
228*09537850SAkhilesh Sanikop     }
229*09537850SAkhilesh Sanikop     func_ = dsp->weight_mask[width_index][height_index][mask_is_inverse_];
230*09537850SAkhilesh Sanikop   }
231*09537850SAkhilesh Sanikop 
232*09537850SAkhilesh Sanikop  protected:
233*09537850SAkhilesh Sanikop   void SetInputData(bool use_fixed_values, int value_1, int value_2);
234*09537850SAkhilesh Sanikop   void Test(int num_runs, bool use_fixed_values, int value_1, int value_2);
235*09537850SAkhilesh Sanikop 
236*09537850SAkhilesh Sanikop  private:
237*09537850SAkhilesh Sanikop   const int width_ = GetParam().width;
238*09537850SAkhilesh Sanikop   const int height_ = GetParam().height;
239*09537850SAkhilesh Sanikop   const bool mask_is_inverse_ = GetParam().mask_is_inverse;
240*09537850SAkhilesh Sanikop   using PredType =
241*09537850SAkhilesh Sanikop       typename std::conditional<bitdepth == 8, int16_t, uint16_t>::type;
242*09537850SAkhilesh Sanikop   alignas(
243*09537850SAkhilesh Sanikop       kMaxAlignment) PredType block_1_[kMaxPredictionSize * kMaxPredictionSize];
244*09537850SAkhilesh Sanikop   alignas(
245*09537850SAkhilesh Sanikop       kMaxAlignment) PredType block_2_[kMaxPredictionSize * kMaxPredictionSize];
246*09537850SAkhilesh Sanikop   uint8_t mask_[kMaxPredictionSize * kMaxPredictionSize] = {};
247*09537850SAkhilesh Sanikop   dsp::WeightMaskFunc func_;
248*09537850SAkhilesh Sanikop };
249*09537850SAkhilesh Sanikop 
250*09537850SAkhilesh Sanikop template <int bitdepth>
SetInputData(const bool use_fixed_values,const int value_1,const int value_2)251*09537850SAkhilesh Sanikop void WeightMaskTest<bitdepth>::SetInputData(const bool use_fixed_values,
252*09537850SAkhilesh Sanikop                                             const int value_1,
253*09537850SAkhilesh Sanikop                                             const int value_2) {
254*09537850SAkhilesh Sanikop   if (use_fixed_values) {
255*09537850SAkhilesh Sanikop     std::fill(block_1_, block_1_ + kMaxPredictionSize * kMaxPredictionSize,
256*09537850SAkhilesh Sanikop               value_1);
257*09537850SAkhilesh Sanikop     std::fill(block_2_, block_2_ + kMaxPredictionSize * kMaxPredictionSize,
258*09537850SAkhilesh Sanikop               value_2);
259*09537850SAkhilesh Sanikop   } else {
260*09537850SAkhilesh Sanikop     constexpr int bitdepth_index = (bitdepth - 8) >> 1;
261*09537850SAkhilesh Sanikop     libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
262*09537850SAkhilesh Sanikop     for (int y = 0; y < height_; ++y) {
263*09537850SAkhilesh Sanikop       for (int x = 0; x < width_; ++x) {
264*09537850SAkhilesh Sanikop         const int min_val = kCompoundPredictionRange[bitdepth_index][0];
265*09537850SAkhilesh Sanikop         const int max_val = kCompoundPredictionRange[bitdepth_index][1];
266*09537850SAkhilesh Sanikop         block_1_[y * width_ + x] =
267*09537850SAkhilesh Sanikop             static_cast<PredType>(rnd(max_val - min_val) + min_val);
268*09537850SAkhilesh Sanikop         block_2_[y * width_ + x] =
269*09537850SAkhilesh Sanikop             static_cast<PredType>(rnd(max_val - min_val) + min_val);
270*09537850SAkhilesh Sanikop       }
271*09537850SAkhilesh Sanikop     }
272*09537850SAkhilesh Sanikop   }
273*09537850SAkhilesh Sanikop }
274*09537850SAkhilesh Sanikop 
DimensionsToBlockSize(int width,int height)275*09537850SAkhilesh Sanikop BlockSize DimensionsToBlockSize(int width, int height) {
276*09537850SAkhilesh Sanikop   if (width == 4) {
277*09537850SAkhilesh Sanikop     if (height == 4) return kBlock4x4;
278*09537850SAkhilesh Sanikop     if (height == 8) return kBlock4x8;
279*09537850SAkhilesh Sanikop     if (height == 16) return kBlock4x16;
280*09537850SAkhilesh Sanikop     return kBlockInvalid;
281*09537850SAkhilesh Sanikop   }
282*09537850SAkhilesh Sanikop   if (width == 8) {
283*09537850SAkhilesh Sanikop     if (height == 4) return kBlock8x4;
284*09537850SAkhilesh Sanikop     if (height == 8) return kBlock8x8;
285*09537850SAkhilesh Sanikop     if (height == 16) return kBlock8x16;
286*09537850SAkhilesh Sanikop     if (height == 32) return kBlock8x32;
287*09537850SAkhilesh Sanikop     return kBlockInvalid;
288*09537850SAkhilesh Sanikop   }
289*09537850SAkhilesh Sanikop   if (width == 16) {
290*09537850SAkhilesh Sanikop     if (height == 4) return kBlock16x4;
291*09537850SAkhilesh Sanikop     if (height == 8) return kBlock16x8;
292*09537850SAkhilesh Sanikop     if (height == 16) return kBlock16x16;
293*09537850SAkhilesh Sanikop     if (height == 32) return kBlock16x32;
294*09537850SAkhilesh Sanikop     if (height == 64) return kBlock16x64;
295*09537850SAkhilesh Sanikop     return kBlockInvalid;
296*09537850SAkhilesh Sanikop   }
297*09537850SAkhilesh Sanikop   if (width == 32) {
298*09537850SAkhilesh Sanikop     if (height == 8) return kBlock32x8;
299*09537850SAkhilesh Sanikop     if (height == 16) return kBlock32x16;
300*09537850SAkhilesh Sanikop     if (height == 32) return kBlock32x32;
301*09537850SAkhilesh Sanikop     if (height == 64) return kBlock32x64;
302*09537850SAkhilesh Sanikop     return kBlockInvalid;
303*09537850SAkhilesh Sanikop   }
304*09537850SAkhilesh Sanikop   if (width == 64) {
305*09537850SAkhilesh Sanikop     if (height == 16) return kBlock64x16;
306*09537850SAkhilesh Sanikop     if (height == 32) return kBlock64x32;
307*09537850SAkhilesh Sanikop     if (height == 64) return kBlock64x64;
308*09537850SAkhilesh Sanikop     if (height == 128) return kBlock64x128;
309*09537850SAkhilesh Sanikop     return kBlockInvalid;
310*09537850SAkhilesh Sanikop   }
311*09537850SAkhilesh Sanikop   if (width == 128) {
312*09537850SAkhilesh Sanikop     if (height == 64) return kBlock128x64;
313*09537850SAkhilesh Sanikop     if (height == 128) return kBlock128x128;
314*09537850SAkhilesh Sanikop     return kBlockInvalid;
315*09537850SAkhilesh Sanikop   }
316*09537850SAkhilesh Sanikop   return kBlockInvalid;
317*09537850SAkhilesh Sanikop }
318*09537850SAkhilesh Sanikop 
319*09537850SAkhilesh Sanikop template <int bitdepth>
Test(const int num_runs,const bool use_fixed_values,const int value_1,const int value_2)320*09537850SAkhilesh Sanikop void WeightMaskTest<bitdepth>::Test(const int num_runs,
321*09537850SAkhilesh Sanikop                                     const bool use_fixed_values,
322*09537850SAkhilesh Sanikop                                     const int value_1, const int value_2) {
323*09537850SAkhilesh Sanikop   if (func_ == nullptr) return;
324*09537850SAkhilesh Sanikop   SetInputData(use_fixed_values, value_1, value_2);
325*09537850SAkhilesh Sanikop   const absl::Time start = absl::Now();
326*09537850SAkhilesh Sanikop   for (int i = 0; i < num_runs; ++i) {
327*09537850SAkhilesh Sanikop     func_(block_1_, block_2_, mask_, width_);
328*09537850SAkhilesh Sanikop   }
329*09537850SAkhilesh Sanikop   const absl::Duration elapsed_time = absl::Now() - start;
330*09537850SAkhilesh Sanikop   if (use_fixed_values) {
331*09537850SAkhilesh Sanikop     int fixed_value = (value_1 - value_2 == 0) ? 38 : 64;
332*09537850SAkhilesh Sanikop     if (mask_is_inverse_) fixed_value = 64 - fixed_value;
333*09537850SAkhilesh Sanikop     for (int y = 0; y < height_; ++y) {
334*09537850SAkhilesh Sanikop       for (int x = 0; x < width_; ++x) {
335*09537850SAkhilesh Sanikop         ASSERT_EQ(static_cast<int>(mask_[y * width_ + x]), fixed_value)
336*09537850SAkhilesh Sanikop             << "x: " << x << " y: " << y;
337*09537850SAkhilesh Sanikop       }
338*09537850SAkhilesh Sanikop     }
339*09537850SAkhilesh Sanikop   } else {
340*09537850SAkhilesh Sanikop     const int id_offset = mask_is_inverse_ ? kMaxBlockSizes - 4 : 0;
341*09537850SAkhilesh Sanikop     const int id = id_offset +
342*09537850SAkhilesh Sanikop                    static_cast<int>(DimensionsToBlockSize(width_, height_)) - 4;
343*09537850SAkhilesh Sanikop     const char* expected_digest = nullptr;
344*09537850SAkhilesh Sanikop     switch (bitdepth) {
345*09537850SAkhilesh Sanikop       case 8:
346*09537850SAkhilesh Sanikop         expected_digest = GetDigest8bpp(id);
347*09537850SAkhilesh Sanikop         break;
348*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
349*09537850SAkhilesh Sanikop       case 10:
350*09537850SAkhilesh Sanikop         expected_digest = GetDigest10bpp(id);
351*09537850SAkhilesh Sanikop         break;
352*09537850SAkhilesh Sanikop #endif
353*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
354*09537850SAkhilesh Sanikop       case 12:
355*09537850SAkhilesh Sanikop         expected_digest = GetDigest12bpp(id);
356*09537850SAkhilesh Sanikop         break;
357*09537850SAkhilesh Sanikop #endif
358*09537850SAkhilesh Sanikop     }
359*09537850SAkhilesh Sanikop     ASSERT_NE(expected_digest, nullptr);
360*09537850SAkhilesh Sanikop     test_utils::CheckMd5Digest(
361*09537850SAkhilesh Sanikop         absl::StrFormat("BlockSize %dx%d", width_, height_).c_str(),
362*09537850SAkhilesh Sanikop         "WeightMask", expected_digest, mask_, sizeof(mask_), elapsed_time);
363*09537850SAkhilesh Sanikop   }
364*09537850SAkhilesh Sanikop }
365*09537850SAkhilesh Sanikop 
366*09537850SAkhilesh Sanikop const WeightMaskTestParam weight_mask_test_param[] = {
367*09537850SAkhilesh Sanikop     WeightMaskTestParam(8, 8, false),     WeightMaskTestParam(8, 16, false),
368*09537850SAkhilesh Sanikop     WeightMaskTestParam(8, 32, false),    WeightMaskTestParam(16, 8, false),
369*09537850SAkhilesh Sanikop     WeightMaskTestParam(16, 16, false),   WeightMaskTestParam(16, 32, false),
370*09537850SAkhilesh Sanikop     WeightMaskTestParam(16, 64, false),   WeightMaskTestParam(32, 8, false),
371*09537850SAkhilesh Sanikop     WeightMaskTestParam(32, 16, false),   WeightMaskTestParam(32, 32, false),
372*09537850SAkhilesh Sanikop     WeightMaskTestParam(32, 64, false),   WeightMaskTestParam(64, 16, false),
373*09537850SAkhilesh Sanikop     WeightMaskTestParam(64, 32, false),   WeightMaskTestParam(64, 64, false),
374*09537850SAkhilesh Sanikop     WeightMaskTestParam(64, 128, false),  WeightMaskTestParam(128, 64, false),
375*09537850SAkhilesh Sanikop     WeightMaskTestParam(128, 128, false), WeightMaskTestParam(8, 8, true),
376*09537850SAkhilesh Sanikop     WeightMaskTestParam(8, 16, true),     WeightMaskTestParam(8, 32, true),
377*09537850SAkhilesh Sanikop     WeightMaskTestParam(16, 8, true),     WeightMaskTestParam(16, 16, true),
378*09537850SAkhilesh Sanikop     WeightMaskTestParam(16, 32, true),    WeightMaskTestParam(16, 64, true),
379*09537850SAkhilesh Sanikop     WeightMaskTestParam(32, 8, true),     WeightMaskTestParam(32, 16, true),
380*09537850SAkhilesh Sanikop     WeightMaskTestParam(32, 32, true),    WeightMaskTestParam(32, 64, true),
381*09537850SAkhilesh Sanikop     WeightMaskTestParam(64, 16, true),    WeightMaskTestParam(64, 32, true),
382*09537850SAkhilesh Sanikop     WeightMaskTestParam(64, 64, true),    WeightMaskTestParam(64, 128, true),
383*09537850SAkhilesh Sanikop     WeightMaskTestParam(128, 64, true),   WeightMaskTestParam(128, 128, true),
384*09537850SAkhilesh Sanikop };
385*09537850SAkhilesh Sanikop 
386*09537850SAkhilesh Sanikop using WeightMaskTest8bpp = WeightMaskTest<8>;
387*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest8bpp,FixedValues)388*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest8bpp, FixedValues) {
389*09537850SAkhilesh Sanikop   const int min = kCompoundPredictionRange[0][0];
390*09537850SAkhilesh Sanikop   const int max = kCompoundPredictionRange[0][1];
391*09537850SAkhilesh Sanikop   Test(1, true, min, min);
392*09537850SAkhilesh Sanikop   Test(1, true, min, max);
393*09537850SAkhilesh Sanikop   Test(1, true, max, min);
394*09537850SAkhilesh Sanikop   Test(1, true, max, max);
395*09537850SAkhilesh Sanikop }
396*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest8bpp,RandomValues)397*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest8bpp, RandomValues) { Test(1, false, -1, -1); }
398*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest8bpp,DISABLED_Speed)399*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest8bpp, DISABLED_Speed) {
400*09537850SAkhilesh Sanikop   Test(kNumSpeedTests, false, -1, -1);
401*09537850SAkhilesh Sanikop }
402*09537850SAkhilesh Sanikop 
403*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, WeightMaskTest8bpp,
404*09537850SAkhilesh Sanikop                          testing::ValuesIn(weight_mask_test_param));
405*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
406*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, WeightMaskTest8bpp,
407*09537850SAkhilesh Sanikop                          testing::ValuesIn(weight_mask_test_param));
408*09537850SAkhilesh Sanikop #endif
409*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
410*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, WeightMaskTest8bpp,
411*09537850SAkhilesh Sanikop                          testing::ValuesIn(weight_mask_test_param));
412*09537850SAkhilesh Sanikop #endif
413*09537850SAkhilesh Sanikop 
414*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
415*09537850SAkhilesh Sanikop using WeightMaskTest10bpp = WeightMaskTest<10>;
416*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest10bpp,FixedValues)417*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest10bpp, FixedValues) {
418*09537850SAkhilesh Sanikop   const int min = kCompoundPredictionRange[1][0];
419*09537850SAkhilesh Sanikop   const int max = kCompoundPredictionRange[1][1];
420*09537850SAkhilesh Sanikop   Test(1, true, min, min);
421*09537850SAkhilesh Sanikop   Test(1, true, min, max);
422*09537850SAkhilesh Sanikop   Test(1, true, max, min);
423*09537850SAkhilesh Sanikop   Test(1, true, max, max);
424*09537850SAkhilesh Sanikop }
425*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest10bpp,RandomValues)426*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest10bpp, RandomValues) { Test(1, false, -1, -1); }
427*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest10bpp,DISABLED_Speed)428*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest10bpp, DISABLED_Speed) {
429*09537850SAkhilesh Sanikop   Test(kNumSpeedTests, false, -1, -1);
430*09537850SAkhilesh Sanikop }
431*09537850SAkhilesh Sanikop 
432*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, WeightMaskTest10bpp,
433*09537850SAkhilesh Sanikop                          testing::ValuesIn(weight_mask_test_param));
434*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
435*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, WeightMaskTest10bpp,
436*09537850SAkhilesh Sanikop                          testing::ValuesIn(weight_mask_test_param));
437*09537850SAkhilesh Sanikop #endif
438*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
439*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, WeightMaskTest10bpp,
440*09537850SAkhilesh Sanikop                          testing::ValuesIn(weight_mask_test_param));
441*09537850SAkhilesh Sanikop #endif
442*09537850SAkhilesh Sanikop #endif  // LIBGAV1_MAX_BITDEPTH >= 10
443*09537850SAkhilesh Sanikop 
444*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12
445*09537850SAkhilesh Sanikop using WeightMaskTest12bpp = WeightMaskTest<12>;
446*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest12bpp,FixedValues)447*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest12bpp, FixedValues) {
448*09537850SAkhilesh Sanikop   const int min = kCompoundPredictionRange[2][0];
449*09537850SAkhilesh Sanikop   const int max = kCompoundPredictionRange[2][1];
450*09537850SAkhilesh Sanikop   Test(1, true, min, min);
451*09537850SAkhilesh Sanikop   Test(1, true, min, max);
452*09537850SAkhilesh Sanikop   Test(1, true, max, min);
453*09537850SAkhilesh Sanikop   Test(1, true, max, max);
454*09537850SAkhilesh Sanikop }
455*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest12bpp,RandomValues)456*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest12bpp, RandomValues) { Test(1, false, -1, -1); }
457*09537850SAkhilesh Sanikop 
TEST_P(WeightMaskTest12bpp,DISABLED_Speed)458*09537850SAkhilesh Sanikop TEST_P(WeightMaskTest12bpp, DISABLED_Speed) {
459*09537850SAkhilesh Sanikop   Test(kNumSpeedTests, false, -1, -1);
460*09537850SAkhilesh Sanikop }
461*09537850SAkhilesh Sanikop 
462*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, WeightMaskTest12bpp,
463*09537850SAkhilesh Sanikop                          testing::ValuesIn(weight_mask_test_param));
464*09537850SAkhilesh Sanikop #endif  // LIBGAV1_MAX_BITDEPTH == 12
465*09537850SAkhilesh Sanikop 
466*09537850SAkhilesh Sanikop }  // namespace
467*09537850SAkhilesh Sanikop }  // namespace dsp
468*09537850SAkhilesh Sanikop }  // namespace libgav1
469