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