xref: /aosp_15_r20/external/libvpx/test/idct_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "./vp8_rtcd.h"
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "test/buffer.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
20*fb1b10abSAndroid Build Coastguard Worker 
21*fb1b10abSAndroid Build Coastguard Worker typedef void (*IdctFunc)(int16_t *input, unsigned char *pred_ptr,
22*fb1b10abSAndroid Build Coastguard Worker                          int pred_stride, unsigned char *dst_ptr,
23*fb1b10abSAndroid Build Coastguard Worker                          int dst_stride);
24*fb1b10abSAndroid Build Coastguard Worker namespace {
25*fb1b10abSAndroid Build Coastguard Worker 
26*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::Buffer;
27*fb1b10abSAndroid Build Coastguard Worker 
28*fb1b10abSAndroid Build Coastguard Worker class IDCTTest : public ::testing::TestWithParam<IdctFunc> {
29*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()30*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
31*fb1b10abSAndroid Build Coastguard Worker     UUT = GetParam();
32*fb1b10abSAndroid Build Coastguard Worker 
33*fb1b10abSAndroid Build Coastguard Worker     input = new Buffer<int16_t>(4, 4, 0);
34*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(input, nullptr);
35*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(input->Init());
36*fb1b10abSAndroid Build Coastguard Worker     predict = new Buffer<uint8_t>(4, 4, 3);
37*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(predict, nullptr);
38*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(predict->Init());
39*fb1b10abSAndroid Build Coastguard Worker     output = new Buffer<uint8_t>(4, 4, 3);
40*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(output, nullptr);
41*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(output->Init());
42*fb1b10abSAndroid Build Coastguard Worker   }
43*fb1b10abSAndroid Build Coastguard Worker 
TearDown()44*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override {
45*fb1b10abSAndroid Build Coastguard Worker     delete input;
46*fb1b10abSAndroid Build Coastguard Worker     delete predict;
47*fb1b10abSAndroid Build Coastguard Worker     delete output;
48*fb1b10abSAndroid Build Coastguard Worker     libvpx_test::ClearSystemState();
49*fb1b10abSAndroid Build Coastguard Worker   }
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker   IdctFunc UUT;
52*fb1b10abSAndroid Build Coastguard Worker   Buffer<int16_t> *input;
53*fb1b10abSAndroid Build Coastguard Worker   Buffer<uint8_t> *predict;
54*fb1b10abSAndroid Build Coastguard Worker   Buffer<uint8_t> *output;
55*fb1b10abSAndroid Build Coastguard Worker };
56*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(IDCTTest,TestAllZeros)57*fb1b10abSAndroid Build Coastguard Worker TEST_P(IDCTTest, TestAllZeros) {
58*fb1b10abSAndroid Build Coastguard Worker   // When the input is '0' the output will be '0'.
59*fb1b10abSAndroid Build Coastguard Worker   input->Set(0);
60*fb1b10abSAndroid Build Coastguard Worker   predict->Set(0);
61*fb1b10abSAndroid Build Coastguard Worker   output->Set(0);
62*fb1b10abSAndroid Build Coastguard Worker 
63*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(),
64*fb1b10abSAndroid Build Coastguard Worker                                predict->stride(), output->TopLeftPixel(),
65*fb1b10abSAndroid Build Coastguard Worker                                output->stride()));
66*fb1b10abSAndroid Build Coastguard Worker 
67*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(input->CheckValues(0));
68*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(input->CheckPadding());
69*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(output->CheckValues(0));
70*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(output->CheckPadding());
71*fb1b10abSAndroid Build Coastguard Worker }
72*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(IDCTTest,TestAllOnes)73*fb1b10abSAndroid Build Coastguard Worker TEST_P(IDCTTest, TestAllOnes) {
74*fb1b10abSAndroid Build Coastguard Worker   input->Set(0);
75*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NE(input->TopLeftPixel(), nullptr);
76*fb1b10abSAndroid Build Coastguard Worker   // When the first element is '4' it will fill the output buffer with '1'.
77*fb1b10abSAndroid Build Coastguard Worker   input->TopLeftPixel()[0] = 4;
78*fb1b10abSAndroid Build Coastguard Worker   predict->Set(0);
79*fb1b10abSAndroid Build Coastguard Worker   output->Set(0);
80*fb1b10abSAndroid Build Coastguard Worker 
81*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(),
82*fb1b10abSAndroid Build Coastguard Worker                                predict->stride(), output->TopLeftPixel(),
83*fb1b10abSAndroid Build Coastguard Worker                                output->stride()));
84*fb1b10abSAndroid Build Coastguard Worker 
85*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(output->CheckValues(1));
86*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(output->CheckPadding());
87*fb1b10abSAndroid Build Coastguard Worker }
88*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(IDCTTest,TestAddOne)89*fb1b10abSAndroid Build Coastguard Worker TEST_P(IDCTTest, TestAddOne) {
90*fb1b10abSAndroid Build Coastguard Worker   // Set the transform output to '1' and make sure it gets added to the
91*fb1b10abSAndroid Build Coastguard Worker   // prediction buffer.
92*fb1b10abSAndroid Build Coastguard Worker   input->Set(0);
93*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NE(input->TopLeftPixel(), nullptr);
94*fb1b10abSAndroid Build Coastguard Worker   input->TopLeftPixel()[0] = 4;
95*fb1b10abSAndroid Build Coastguard Worker   output->Set(0);
96*fb1b10abSAndroid Build Coastguard Worker 
97*fb1b10abSAndroid Build Coastguard Worker   uint8_t *pred = predict->TopLeftPixel();
98*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < 4; ++y) {
99*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < 4; ++x) {
100*fb1b10abSAndroid Build Coastguard Worker       pred[y * predict->stride() + x] = y * 4 + x;
101*fb1b10abSAndroid Build Coastguard Worker     }
102*fb1b10abSAndroid Build Coastguard Worker   }
103*fb1b10abSAndroid Build Coastguard Worker 
104*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(),
105*fb1b10abSAndroid Build Coastguard Worker                                predict->stride(), output->TopLeftPixel(),
106*fb1b10abSAndroid Build Coastguard Worker                                output->stride()));
107*fb1b10abSAndroid Build Coastguard Worker 
108*fb1b10abSAndroid Build Coastguard Worker   uint8_t const *out = output->TopLeftPixel();
109*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < 4; ++y) {
110*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < 4; ++x) {
111*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(1 + y * 4 + x, out[y * output->stride() + x]);
112*fb1b10abSAndroid Build Coastguard Worker     }
113*fb1b10abSAndroid Build Coastguard Worker   }
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker   if (HasFailure()) {
116*fb1b10abSAndroid Build Coastguard Worker     output->DumpBuffer();
117*fb1b10abSAndroid Build Coastguard Worker   }
118*fb1b10abSAndroid Build Coastguard Worker 
119*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(output->CheckPadding());
120*fb1b10abSAndroid Build Coastguard Worker }
121*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(IDCTTest,TestWithData)122*fb1b10abSAndroid Build Coastguard Worker TEST_P(IDCTTest, TestWithData) {
123*fb1b10abSAndroid Build Coastguard Worker   // Test a single known input.
124*fb1b10abSAndroid Build Coastguard Worker   predict->Set(0);
125*fb1b10abSAndroid Build Coastguard Worker 
126*fb1b10abSAndroid Build Coastguard Worker   int16_t *in = input->TopLeftPixel();
127*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < 4; ++y) {
128*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < 4; ++x) {
129*fb1b10abSAndroid Build Coastguard Worker       in[y * input->stride() + x] = y * 4 + x;
130*fb1b10abSAndroid Build Coastguard Worker     }
131*fb1b10abSAndroid Build Coastguard Worker   }
132*fb1b10abSAndroid Build Coastguard Worker 
133*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(),
134*fb1b10abSAndroid Build Coastguard Worker                                predict->stride(), output->TopLeftPixel(),
135*fb1b10abSAndroid Build Coastguard Worker                                output->stride()));
136*fb1b10abSAndroid Build Coastguard Worker 
137*fb1b10abSAndroid Build Coastguard Worker   uint8_t *out = output->TopLeftPixel();
138*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < 4; ++y) {
139*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < 4; ++x) {
140*fb1b10abSAndroid Build Coastguard Worker       switch (y * 4 + x) {
141*fb1b10abSAndroid Build Coastguard Worker         case 0: EXPECT_EQ(11, out[y * output->stride() + x]); break;
142*fb1b10abSAndroid Build Coastguard Worker         case 2:
143*fb1b10abSAndroid Build Coastguard Worker         case 5:
144*fb1b10abSAndroid Build Coastguard Worker         case 8: EXPECT_EQ(3, out[y * output->stride() + x]); break;
145*fb1b10abSAndroid Build Coastguard Worker         case 10: EXPECT_EQ(1, out[y * output->stride() + x]); break;
146*fb1b10abSAndroid Build Coastguard Worker         default: EXPECT_EQ(0, out[y * output->stride() + x]);
147*fb1b10abSAndroid Build Coastguard Worker       }
148*fb1b10abSAndroid Build Coastguard Worker     }
149*fb1b10abSAndroid Build Coastguard Worker   }
150*fb1b10abSAndroid Build Coastguard Worker 
151*fb1b10abSAndroid Build Coastguard Worker   if (HasFailure()) {
152*fb1b10abSAndroid Build Coastguard Worker     output->DumpBuffer();
153*fb1b10abSAndroid Build Coastguard Worker   }
154*fb1b10abSAndroid Build Coastguard Worker 
155*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(output->CheckPadding());
156*fb1b10abSAndroid Build Coastguard Worker }
157*fb1b10abSAndroid Build Coastguard Worker 
158*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(C, IDCTTest,
159*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(vp8_short_idct4x4llm_c));
160*fb1b10abSAndroid Build Coastguard Worker 
161*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
162*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, IDCTTest,
163*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(vp8_short_idct4x4llm_neon));
164*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON
165*fb1b10abSAndroid Build Coastguard Worker 
166*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MMX
167*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MMX, IDCTTest,
168*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(vp8_short_idct4x4llm_mmx));
169*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MMX
170*fb1b10abSAndroid Build Coastguard Worker 
171*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA
172*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MSA, IDCTTest,
173*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(vp8_short_idct4x4llm_msa));
174*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MSA
175*fb1b10abSAndroid Build Coastguard Worker 
176*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MMI
177*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MMI, IDCTTest,
178*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(vp8_short_idct4x4llm_mmi));
179*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MMI
180*fb1b10abSAndroid Build Coastguard Worker }  // namespace
181