xref: /aosp_15_r20/external/libgav1/src/reconstruction_test.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1*09537850SAkhilesh Sanikop // Copyright 2021 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/reconstruction.h"
16*09537850SAkhilesh Sanikop 
17*09537850SAkhilesh Sanikop #include <cstddef>
18*09537850SAkhilesh Sanikop #include <cstdint>
19*09537850SAkhilesh Sanikop #include <cstring>
20*09537850SAkhilesh Sanikop #include <vector>
21*09537850SAkhilesh Sanikop 
22*09537850SAkhilesh Sanikop #include "absl/strings/match.h"
23*09537850SAkhilesh Sanikop #include "gmock/gmock.h"
24*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
25*09537850SAkhilesh Sanikop #include "src/dsp/constants.h"
26*09537850SAkhilesh Sanikop #include "src/dsp/dsp.h"
27*09537850SAkhilesh Sanikop #include "src/dsp/inverse_transform.h"
28*09537850SAkhilesh Sanikop #include "src/utils/array_2d.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/block_utils.h"
34*09537850SAkhilesh Sanikop #include "tests/utils.h"
35*09537850SAkhilesh Sanikop 
36*09537850SAkhilesh Sanikop namespace libgav1 {
37*09537850SAkhilesh Sanikop namespace {
38*09537850SAkhilesh Sanikop 
39*09537850SAkhilesh Sanikop // Import the scan tables in the anonymous namespace.
40*09537850SAkhilesh Sanikop #include "src/scan_tables.inc"
41*09537850SAkhilesh Sanikop 
42*09537850SAkhilesh Sanikop constexpr int kTestTransformSize = 4;
43*09537850SAkhilesh Sanikop constexpr int8_t kTestBitdepth = 8;
44*09537850SAkhilesh Sanikop 
45*09537850SAkhilesh Sanikop using testing::ElementsAreArray;
46*09537850SAkhilesh Sanikop 
47*09537850SAkhilesh Sanikop // The 'int' parameter is unused but required to allow for instantiations of C,
48*09537850SAkhilesh Sanikop // NEON, etc.
49*09537850SAkhilesh Sanikop class ReconstructionTest : public testing::TestWithParam<int> {
50*09537850SAkhilesh Sanikop  public:
51*09537850SAkhilesh Sanikop   ReconstructionTest() = default;
52*09537850SAkhilesh Sanikop   ReconstructionTest(const ReconstructionTest&) = delete;
53*09537850SAkhilesh Sanikop   ReconstructionTest& operator=(const ReconstructionTest&) = delete;
54*09537850SAkhilesh Sanikop   ~ReconstructionTest() override = default;
55*09537850SAkhilesh Sanikop 
56*09537850SAkhilesh Sanikop  protected:
SetUp()57*09537850SAkhilesh Sanikop   void SetUp() override {
58*09537850SAkhilesh Sanikop     test_utils::ResetDspTable(kTestBitdepth);
59*09537850SAkhilesh Sanikop     dsp::InverseTransformInit_C();
60*09537850SAkhilesh Sanikop     dsp_ = dsp::GetDspTable(kTestBitdepth);
61*09537850SAkhilesh Sanikop     ASSERT_NE(dsp_, nullptr);
62*09537850SAkhilesh Sanikop     const testing::TestInfo* const test_info =
63*09537850SAkhilesh Sanikop         testing::UnitTest::GetInstance()->current_test_info();
64*09537850SAkhilesh Sanikop     if (test_info->value_param() != nullptr) {
65*09537850SAkhilesh Sanikop       const char* const test_case = test_info->test_suite_name();
66*09537850SAkhilesh Sanikop       if (absl::StartsWith(test_case, "C/")) {
67*09537850SAkhilesh Sanikop       } else if (absl::StartsWith(test_case, "SSE41/")) {
68*09537850SAkhilesh Sanikop         if ((GetCpuInfo() & kSSE4_1) == 0) GTEST_SKIP() << "No SSE4.1 support!";
69*09537850SAkhilesh Sanikop         dsp::InverseTransformInit_SSE4_1();
70*09537850SAkhilesh Sanikop       } else if (absl::StartsWith(test_case, "NEON/")) {
71*09537850SAkhilesh Sanikop         dsp::InverseTransformInit_NEON();
72*09537850SAkhilesh Sanikop       } else {
73*09537850SAkhilesh Sanikop         FAIL() << "Unrecognized architecture prefix in test case name: "
74*09537850SAkhilesh Sanikop                << test_case;
75*09537850SAkhilesh Sanikop       }
76*09537850SAkhilesh Sanikop     }
77*09537850SAkhilesh Sanikop     InitBuffers();
78*09537850SAkhilesh Sanikop   }
79*09537850SAkhilesh Sanikop 
InitBuffers(int width=kTestTransformSize,int height=kTestTransformSize)80*09537850SAkhilesh Sanikop   void InitBuffers(int width = kTestTransformSize,
81*09537850SAkhilesh Sanikop                    int height = kTestTransformSize) {
82*09537850SAkhilesh Sanikop     const int size = width * height;
83*09537850SAkhilesh Sanikop     buffer_.clear();
84*09537850SAkhilesh Sanikop     buffer_.resize(size);
85*09537850SAkhilesh Sanikop     residual_buffer_.clear();
86*09537850SAkhilesh Sanikop     residual_buffer_.resize(size);
87*09537850SAkhilesh Sanikop     for (int i = 0; i < size; ++i) {
88*09537850SAkhilesh Sanikop       buffer_[i] = residual_buffer_[i] = i % 256;
89*09537850SAkhilesh Sanikop     }
90*09537850SAkhilesh Sanikop     frame_buffer_.Reset(height, width, buffer_.data());
91*09537850SAkhilesh Sanikop   }
92*09537850SAkhilesh Sanikop 
93*09537850SAkhilesh Sanikop   template <int bitdepth>
94*09537850SAkhilesh Sanikop   void TestWht();
95*09537850SAkhilesh Sanikop 
96*09537850SAkhilesh Sanikop   std::vector<uint8_t> buffer_;
97*09537850SAkhilesh Sanikop   std::vector<int16_t> residual_buffer_;
98*09537850SAkhilesh Sanikop   // |frame_buffer_| is just a 2D array view into the |buffer_|.
99*09537850SAkhilesh Sanikop   Array2DView<uint8_t> frame_buffer_;
100*09537850SAkhilesh Sanikop   const dsp::Dsp* dsp_;
101*09537850SAkhilesh Sanikop };
102*09537850SAkhilesh Sanikop 
103*09537850SAkhilesh Sanikop template <int bitdepth>
TestWht()104*09537850SAkhilesh Sanikop void ReconstructionTest::TestWht() {
105*09537850SAkhilesh Sanikop   static_assert(bitdepth == kBitdepth8 || bitdepth == kBitdepth10, "");
106*09537850SAkhilesh Sanikop   for (const auto transform :
107*09537850SAkhilesh Sanikop        dsp_->inverse_transforms[dsp::kTransform1dWht][dsp::kTransform1dSize4]) {
108*09537850SAkhilesh Sanikop     if (transform == nullptr) {
109*09537850SAkhilesh Sanikop       GTEST_SKIP() << "No function available for dsp::kTransform1dWht";
110*09537850SAkhilesh Sanikop     }
111*09537850SAkhilesh Sanikop   }
112*09537850SAkhilesh Sanikop   constexpr int max = 16 << bitdepth;
113*09537850SAkhilesh Sanikop   constexpr int min = -max;
114*09537850SAkhilesh Sanikop   static constexpr int16_t residual_inputs[][16]{
115*09537850SAkhilesh Sanikop       {64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
116*09537850SAkhilesh Sanikop       {69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
117*09537850SAkhilesh Sanikop       {0, 0, 0, 0, 0, max - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
118*09537850SAkhilesh Sanikop       {0, 0, 0, 0, 0, min - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
119*09537850SAkhilesh Sanikop       // Note these are unrealistic inputs, but serve to test each position in
120*09537850SAkhilesh Sanikop       // the array and match extremes in some commercial test vectors.
121*09537850SAkhilesh Sanikop       {max, max, max, max, max, max, max, max, max, max, max, max, max, max,
122*09537850SAkhilesh Sanikop        max, max},
123*09537850SAkhilesh Sanikop       {min, min, min, min, min, min, min, min, min, min, min, min, min, min,
124*09537850SAkhilesh Sanikop        min, min}};
125*09537850SAkhilesh Sanikop   // Before the Reconstruct() call, the frame buffer is filled with all 127.
126*09537850SAkhilesh Sanikop   // After the Reconstruct() call, the frame buffer is expected to have the
127*09537850SAkhilesh Sanikop   // following values.
128*09537850SAkhilesh Sanikop   static constexpr uint8_t frame_outputs[][16]{
129*09537850SAkhilesh Sanikop       {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
130*09537850SAkhilesh Sanikop        131, 131},
131*09537850SAkhilesh Sanikop       {132, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
132*09537850SAkhilesh Sanikop        131, 131},
133*09537850SAkhilesh Sanikop       {255, 255, 0, 0, 255, 255, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255},
134*09537850SAkhilesh Sanikop       {0, 0, 255, 255, 0, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 0},
135*09537850SAkhilesh Sanikop       {255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
136*09537850SAkhilesh Sanikop        127, 127},
137*09537850SAkhilesh Sanikop       {0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
138*09537850SAkhilesh Sanikop        127},
139*09537850SAkhilesh Sanikop   };
140*09537850SAkhilesh Sanikop 
141*09537850SAkhilesh Sanikop   const TransformSize tx_size = kTransformSize4x4;
142*09537850SAkhilesh Sanikop   const TransformType tx_type = kTransformTypeDctDct;
143*09537850SAkhilesh Sanikop   const int tx_width = kTransformWidth[tx_size];
144*09537850SAkhilesh Sanikop   const int tx_height = kTransformHeight[tx_size];
145*09537850SAkhilesh Sanikop   const uint16_t* const scan = kScan[GetTransformClass(tx_type)][tx_size];
146*09537850SAkhilesh Sanikop 
147*09537850SAkhilesh Sanikop   InitBuffers(tx_width, tx_height);
148*09537850SAkhilesh Sanikop 
149*09537850SAkhilesh Sanikop   const int num_tests = sizeof(residual_inputs) / sizeof(residual_inputs[0]);
150*09537850SAkhilesh Sanikop   for (int i = 0; i < num_tests; ++i) {
151*09537850SAkhilesh Sanikop     int16_t eob;  // Also known as non_zero_coeff_count.
152*09537850SAkhilesh Sanikop     for (eob = 15; eob >= 0; --eob) {
153*09537850SAkhilesh Sanikop       if (residual_inputs[i][scan[eob]] != 0) break;
154*09537850SAkhilesh Sanikop     }
155*09537850SAkhilesh Sanikop     ++eob;
156*09537850SAkhilesh Sanikop     memcpy(residual_buffer_.data(), residual_inputs[i],
157*09537850SAkhilesh Sanikop            sizeof(residual_inputs[i]));
158*09537850SAkhilesh Sanikop     memset(buffer_.data(), 127, sizeof(frame_outputs[i]));
159*09537850SAkhilesh Sanikop     Reconstruct(*dsp_, tx_type, tx_size, /*lossless=*/true,
160*09537850SAkhilesh Sanikop                 residual_buffer_.data(), 0, 0, &frame_buffer_, eob);
161*09537850SAkhilesh Sanikop 
162*09537850SAkhilesh Sanikop     EXPECT_TRUE(test_utils::CompareBlocks(buffer_.data(), frame_outputs[i],
163*09537850SAkhilesh Sanikop                                           tx_width, tx_height, tx_width,
164*09537850SAkhilesh Sanikop                                           tx_width, false, true))
165*09537850SAkhilesh Sanikop         << "Mismatch WHT test case " << i;
166*09537850SAkhilesh Sanikop   }
167*09537850SAkhilesh Sanikop }
168*09537850SAkhilesh Sanikop 
TEST_P(ReconstructionTest,ReconstructionSimple)169*09537850SAkhilesh Sanikop TEST_P(ReconstructionTest, ReconstructionSimple) {
170*09537850SAkhilesh Sanikop   for (const auto transform :
171*09537850SAkhilesh Sanikop        dsp_->inverse_transforms[dsp::kTransform1dIdentity]
172*09537850SAkhilesh Sanikop                                [dsp::kTransform1dSize4]) {
173*09537850SAkhilesh Sanikop     if (transform == nullptr) GTEST_SKIP();
174*09537850SAkhilesh Sanikop   }
175*09537850SAkhilesh Sanikop   Reconstruct(*dsp_, kTransformTypeIdentityIdentity, kTransformSize4x4, false,
176*09537850SAkhilesh Sanikop               residual_buffer_.data(), 0, 0, &frame_buffer_, 16);
177*09537850SAkhilesh Sanikop   // clang-format off
178*09537850SAkhilesh Sanikop   static constexpr uint8_t expected_output_buffer[] = {
179*09537850SAkhilesh Sanikop       0, 1, 2, 3,
180*09537850SAkhilesh Sanikop       5, 6, 7, 8,
181*09537850SAkhilesh Sanikop       9, 10, 11, 12,
182*09537850SAkhilesh Sanikop       14, 15, 16, 17
183*09537850SAkhilesh Sanikop   };
184*09537850SAkhilesh Sanikop   // clang-format on
185*09537850SAkhilesh Sanikop   EXPECT_THAT(buffer_, ElementsAreArray(expected_output_buffer));
186*09537850SAkhilesh Sanikop }
187*09537850SAkhilesh Sanikop 
TEST_P(ReconstructionTest,ReconstructionFlipY)188*09537850SAkhilesh Sanikop TEST_P(ReconstructionTest, ReconstructionFlipY) {
189*09537850SAkhilesh Sanikop   for (const auto transform :
190*09537850SAkhilesh Sanikop        dsp_->inverse_transforms[dsp::kTransform1dIdentity]
191*09537850SAkhilesh Sanikop                                [dsp::kTransform1dSize4]) {
192*09537850SAkhilesh Sanikop     if (transform == nullptr) GTEST_SKIP();
193*09537850SAkhilesh Sanikop   }
194*09537850SAkhilesh Sanikop   Reconstruct(*dsp_, kTransformTypeIdentityFlipadst, kTransformSize4x4, false,
195*09537850SAkhilesh Sanikop               residual_buffer_.data(), 0, 0, &frame_buffer_, 16);
196*09537850SAkhilesh Sanikop   // clang-format off
197*09537850SAkhilesh Sanikop   static constexpr uint8_t expected_buffer[] = {
198*09537850SAkhilesh Sanikop       0, 1, 2, 3,
199*09537850SAkhilesh Sanikop       4, 5, 6, 7,
200*09537850SAkhilesh Sanikop       7, 8, 9, 10,
201*09537850SAkhilesh Sanikop       14, 15, 16, 17
202*09537850SAkhilesh Sanikop   };
203*09537850SAkhilesh Sanikop   // clang-format on
204*09537850SAkhilesh Sanikop   EXPECT_THAT(buffer_, ElementsAreArray(expected_buffer));
205*09537850SAkhilesh Sanikop }
206*09537850SAkhilesh Sanikop 
TEST_P(ReconstructionTest,ReconstructionFlipX)207*09537850SAkhilesh Sanikop TEST_P(ReconstructionTest, ReconstructionFlipX) {
208*09537850SAkhilesh Sanikop   for (const auto transform :
209*09537850SAkhilesh Sanikop        dsp_->inverse_transforms[dsp::kTransform1dIdentity]
210*09537850SAkhilesh Sanikop                                [dsp::kTransform1dSize4]) {
211*09537850SAkhilesh Sanikop     if (transform == nullptr) GTEST_SKIP();
212*09537850SAkhilesh Sanikop   }
213*09537850SAkhilesh Sanikop   Reconstruct(*dsp_, kTransformTypeFlipadstIdentity, kTransformSize4x4, false,
214*09537850SAkhilesh Sanikop               residual_buffer_.data(), 0, 0, &frame_buffer_, 16);
215*09537850SAkhilesh Sanikop   // clang-format off
216*09537850SAkhilesh Sanikop   static constexpr uint8_t expected_buffer[] = {
217*09537850SAkhilesh Sanikop       0, 1, 2, 3,
218*09537850SAkhilesh Sanikop       4, 5, 6, 8,
219*09537850SAkhilesh Sanikop       8, 10, 10, 13,
220*09537850SAkhilesh Sanikop       12, 14, 14, 18
221*09537850SAkhilesh Sanikop   };
222*09537850SAkhilesh Sanikop   // clang-format on
223*09537850SAkhilesh Sanikop   EXPECT_THAT(buffer_, ElementsAreArray(expected_buffer));
224*09537850SAkhilesh Sanikop }
225*09537850SAkhilesh Sanikop 
TEST_P(ReconstructionTest,ReconstructionFlipXAndFlipY)226*09537850SAkhilesh Sanikop TEST_P(ReconstructionTest, ReconstructionFlipXAndFlipY) {
227*09537850SAkhilesh Sanikop   for (const auto transform :
228*09537850SAkhilesh Sanikop        dsp_->inverse_transforms[dsp::kTransform1dIdentity]
229*09537850SAkhilesh Sanikop                                [dsp::kTransform1dSize4]) {
230*09537850SAkhilesh Sanikop     if (transform == nullptr) GTEST_SKIP();
231*09537850SAkhilesh Sanikop   }
232*09537850SAkhilesh Sanikop   Reconstruct(*dsp_, kTransformTypeFlipadstFlipadst, kTransformSize4x4, false,
233*09537850SAkhilesh Sanikop               residual_buffer_.data(), 0, 0, &frame_buffer_, 16);
234*09537850SAkhilesh Sanikop   // clang-format off
235*09537850SAkhilesh Sanikop   static constexpr uint8_t expected_buffer[] = {
236*09537850SAkhilesh Sanikop       0, 1, 2, 3,
237*09537850SAkhilesh Sanikop       4, 5, 6, 8,
238*09537850SAkhilesh Sanikop       8, 8, 10, 9,
239*09537850SAkhilesh Sanikop       12, 14, 14, 19
240*09537850SAkhilesh Sanikop   };
241*09537850SAkhilesh Sanikop   // clang-format on
242*09537850SAkhilesh Sanikop   EXPECT_THAT(buffer_, ElementsAreArray(expected_buffer));
243*09537850SAkhilesh Sanikop }
244*09537850SAkhilesh Sanikop 
TEST_P(ReconstructionTest,ReconstructionNonZeroStart)245*09537850SAkhilesh Sanikop TEST_P(ReconstructionTest, ReconstructionNonZeroStart) {
246*09537850SAkhilesh Sanikop   uint8_t buffer[64] = {};
247*09537850SAkhilesh Sanikop   Array2DView<uint8_t> frame_buffer(8, 8, buffer);
248*09537850SAkhilesh Sanikop   int k = 0;
249*09537850SAkhilesh Sanikop   for (int i = 0; i < kTestTransformSize; ++i) {
250*09537850SAkhilesh Sanikop     for (int j = 0; j < kTestTransformSize; ++j) {
251*09537850SAkhilesh Sanikop       frame_buffer[i + 4][j + 4] = k++;
252*09537850SAkhilesh Sanikop     }
253*09537850SAkhilesh Sanikop   }
254*09537850SAkhilesh Sanikop   for (const auto transform :
255*09537850SAkhilesh Sanikop        dsp_->inverse_transforms[dsp::kTransform1dIdentity]
256*09537850SAkhilesh Sanikop                                [dsp::kTransform1dSize4]) {
257*09537850SAkhilesh Sanikop     if (transform == nullptr) GTEST_SKIP();
258*09537850SAkhilesh Sanikop   }
259*09537850SAkhilesh Sanikop   Reconstruct(*dsp_, kTransformTypeIdentityIdentity, kTransformSize4x4, false,
260*09537850SAkhilesh Sanikop               residual_buffer_.data(), 4, 4, &frame_buffer, 64);
261*09537850SAkhilesh Sanikop   // clang-format off
262*09537850SAkhilesh Sanikop   static constexpr uint8_t expected_buffer[] = {
263*09537850SAkhilesh Sanikop       0, 0, 0, 0, 0, 0, 0, 0,
264*09537850SAkhilesh Sanikop       0, 0, 0, 0, 0, 0, 0, 0,
265*09537850SAkhilesh Sanikop       0, 0, 0, 0, 0, 0, 0, 0,
266*09537850SAkhilesh Sanikop       0, 0, 0, 0, 0, 0, 0, 0,
267*09537850SAkhilesh Sanikop       0, 0, 0, 0, 0, 1, 2, 3,
268*09537850SAkhilesh Sanikop       0, 0, 0, 0, 5, 6, 7, 8,
269*09537850SAkhilesh Sanikop       0, 0, 0, 0, 9, 10, 11, 12,
270*09537850SAkhilesh Sanikop       0, 0, 0, 0, 14, 15, 16, 17
271*09537850SAkhilesh Sanikop   };
272*09537850SAkhilesh Sanikop   // clang-format on
273*09537850SAkhilesh Sanikop   EXPECT_THAT(buffer, ElementsAreArray(expected_buffer));
274*09537850SAkhilesh Sanikop }
275*09537850SAkhilesh Sanikop 
TEST_P(ReconstructionTest,Wht8bit)276*09537850SAkhilesh Sanikop TEST_P(ReconstructionTest, Wht8bit) { TestWht<kBitdepth8>(); }
277*09537850SAkhilesh Sanikop 
278*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10
TEST_P(ReconstructionTest,Wht10bit)279*09537850SAkhilesh Sanikop TEST_P(ReconstructionTest, Wht10bit) { TestWht<kBitdepth10>(); }
280*09537850SAkhilesh Sanikop #endif
281*09537850SAkhilesh Sanikop 
282*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(C, ReconstructionTest, testing::Values(0));
283*09537850SAkhilesh Sanikop 
284*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1
285*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(SSE41, ReconstructionTest, testing::Values(0));
286*09537850SAkhilesh Sanikop #endif
287*09537850SAkhilesh Sanikop 
288*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON
289*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(NEON, ReconstructionTest, testing::Values(0));
290*09537850SAkhilesh Sanikop #endif
291*09537850SAkhilesh Sanikop 
292*09537850SAkhilesh Sanikop }  // namespace
293*09537850SAkhilesh Sanikop }  // namespace libgav1
294