xref: /aosp_15_r20/external/libvpx/test/predict_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2013 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 <stdio.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stdlib.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
14*fb1b10abSAndroid Build Coastguard Worker #include <tuple>
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #include "./vp8_rtcd.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/bench.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
27*fb1b10abSAndroid Build Coastguard Worker 
28*fb1b10abSAndroid Build Coastguard Worker namespace {
29*fb1b10abSAndroid Build Coastguard Worker 
30*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
31*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
32*fb1b10abSAndroid Build Coastguard Worker 
33*fb1b10abSAndroid Build Coastguard Worker typedef void (*PredictFunc)(uint8_t *src_ptr, int src_pixels_per_line,
34*fb1b10abSAndroid Build Coastguard Worker                             int xoffset, int yoffset, uint8_t *dst_ptr,
35*fb1b10abSAndroid Build Coastguard Worker                             int dst_pitch);
36*fb1b10abSAndroid Build Coastguard Worker 
37*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<int, int, PredictFunc> PredictParam;
38*fb1b10abSAndroid Build Coastguard Worker 
39*fb1b10abSAndroid Build Coastguard Worker class PredictTestBase : public AbstractBench,
40*fb1b10abSAndroid Build Coastguard Worker                         public ::testing::TestWithParam<PredictParam> {
41*fb1b10abSAndroid Build Coastguard Worker  public:
PredictTestBase()42*fb1b10abSAndroid Build Coastguard Worker   PredictTestBase()
43*fb1b10abSAndroid Build Coastguard Worker       : width_(GET_PARAM(0)), height_(GET_PARAM(1)), predict_(GET_PARAM(2)),
44*fb1b10abSAndroid Build Coastguard Worker         src_(nullptr), padded_dst_(nullptr), dst_(nullptr), dst_c_(nullptr) {}
45*fb1b10abSAndroid Build Coastguard Worker 
SetUp()46*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
47*fb1b10abSAndroid Build Coastguard Worker     src_ = new uint8_t[kSrcSize];
48*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(src_, nullptr);
49*fb1b10abSAndroid Build Coastguard Worker 
50*fb1b10abSAndroid Build Coastguard Worker     // padded_dst_ provides a buffer of kBorderSize around the destination
51*fb1b10abSAndroid Build Coastguard Worker     // memory to facilitate detecting out of bounds writes.
52*fb1b10abSAndroid Build Coastguard Worker     dst_stride_ = kBorderSize + width_ + kBorderSize;
53*fb1b10abSAndroid Build Coastguard Worker     padded_dst_size_ = dst_stride_ * (kBorderSize + height_ + kBorderSize);
54*fb1b10abSAndroid Build Coastguard Worker     padded_dst_ =
55*fb1b10abSAndroid Build Coastguard Worker         reinterpret_cast<uint8_t *>(vpx_memalign(16, padded_dst_size_));
56*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(padded_dst_, nullptr);
57*fb1b10abSAndroid Build Coastguard Worker     dst_ = padded_dst_ + (kBorderSize * dst_stride_) + kBorderSize;
58*fb1b10abSAndroid Build Coastguard Worker 
59*fb1b10abSAndroid Build Coastguard Worker     dst_c_ = new uint8_t[16 * 16];
60*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(dst_c_, nullptr);
61*fb1b10abSAndroid Build Coastguard Worker 
62*fb1b10abSAndroid Build Coastguard Worker     memset(src_, 0, kSrcSize);
63*fb1b10abSAndroid Build Coastguard Worker     memset(padded_dst_, 128, padded_dst_size_);
64*fb1b10abSAndroid Build Coastguard Worker     memset(dst_c_, 0, 16 * 16);
65*fb1b10abSAndroid Build Coastguard Worker   }
66*fb1b10abSAndroid Build Coastguard Worker 
TearDown()67*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override {
68*fb1b10abSAndroid Build Coastguard Worker     delete[] src_;
69*fb1b10abSAndroid Build Coastguard Worker     src_ = nullptr;
70*fb1b10abSAndroid Build Coastguard Worker     vpx_free(padded_dst_);
71*fb1b10abSAndroid Build Coastguard Worker     padded_dst_ = nullptr;
72*fb1b10abSAndroid Build Coastguard Worker     dst_ = nullptr;
73*fb1b10abSAndroid Build Coastguard Worker     delete[] dst_c_;
74*fb1b10abSAndroid Build Coastguard Worker     dst_c_ = nullptr;
75*fb1b10abSAndroid Build Coastguard Worker     libvpx_test::ClearSystemState();
76*fb1b10abSAndroid Build Coastguard Worker   }
77*fb1b10abSAndroid Build Coastguard Worker 
78*fb1b10abSAndroid Build Coastguard Worker  protected:
79*fb1b10abSAndroid Build Coastguard Worker   // Make reference arrays big enough for 16x16 functions. Six-tap filters need
80*fb1b10abSAndroid Build Coastguard Worker   // 5 extra pixels outside of the macroblock.
81*fb1b10abSAndroid Build Coastguard Worker   static const int kSrcStride = 21;
82*fb1b10abSAndroid Build Coastguard Worker   static const int kSrcSize = kSrcStride * kSrcStride;
83*fb1b10abSAndroid Build Coastguard Worker   static const int kBorderSize = 16;
84*fb1b10abSAndroid Build Coastguard Worker 
85*fb1b10abSAndroid Build Coastguard Worker   int width_;
86*fb1b10abSAndroid Build Coastguard Worker   int height_;
87*fb1b10abSAndroid Build Coastguard Worker   PredictFunc predict_;
88*fb1b10abSAndroid Build Coastguard Worker   uint8_t *src_;
89*fb1b10abSAndroid Build Coastguard Worker   uint8_t *padded_dst_;
90*fb1b10abSAndroid Build Coastguard Worker   uint8_t *dst_;
91*fb1b10abSAndroid Build Coastguard Worker   int padded_dst_size_;
92*fb1b10abSAndroid Build Coastguard Worker   uint8_t *dst_c_;
93*fb1b10abSAndroid Build Coastguard Worker   int dst_stride_;
94*fb1b10abSAndroid Build Coastguard Worker 
CompareBuffers(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride) const95*fb1b10abSAndroid Build Coastguard Worker   bool CompareBuffers(const uint8_t *a, int a_stride, const uint8_t *b,
96*fb1b10abSAndroid Build Coastguard Worker                       int b_stride) const {
97*fb1b10abSAndroid Build Coastguard Worker     for (int height = 0; height < height_; ++height) {
98*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(0, memcmp(a + height * a_stride, b + height * b_stride,
99*fb1b10abSAndroid Build Coastguard Worker                           sizeof(*a) * width_))
100*fb1b10abSAndroid Build Coastguard Worker           << "Row " << height << " does not match.";
101*fb1b10abSAndroid Build Coastguard Worker     }
102*fb1b10abSAndroid Build Coastguard Worker 
103*fb1b10abSAndroid Build Coastguard Worker     return !HasFailure();
104*fb1b10abSAndroid Build Coastguard Worker   }
105*fb1b10abSAndroid Build Coastguard Worker 
106*fb1b10abSAndroid Build Coastguard Worker   // Given a block of memory 'a' with size 'a_size', determine if all regions
107*fb1b10abSAndroid Build Coastguard Worker   // excepting block 'b' described by 'b_stride', 'b_height', and 'b_width'
108*fb1b10abSAndroid Build Coastguard Worker   // match pixel value 'c'.
CheckBorder(const uint8_t * a,int a_size,const uint8_t * b,int b_width,int b_height,int b_stride,uint8_t c) const109*fb1b10abSAndroid Build Coastguard Worker   bool CheckBorder(const uint8_t *a, int a_size, const uint8_t *b, int b_width,
110*fb1b10abSAndroid Build Coastguard Worker                    int b_height, int b_stride, uint8_t c) const {
111*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *a_end = a + a_size;
112*fb1b10abSAndroid Build Coastguard Worker     const int b_size = (b_stride * b_height) + b_width;
113*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *b_end = b + b_size;
114*fb1b10abSAndroid Build Coastguard Worker     const int left_border = (b_stride - b_width) / 2;
115*fb1b10abSAndroid Build Coastguard Worker     const int right_border = left_border + ((b_stride - b_width) % 2);
116*fb1b10abSAndroid Build Coastguard Worker 
117*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(b - left_border, a) << "'b' does not start within 'a'";
118*fb1b10abSAndroid Build Coastguard Worker     EXPECT_LE(b_end + right_border, a_end) << "'b' does not end within 'a'";
119*fb1b10abSAndroid Build Coastguard Worker 
120*fb1b10abSAndroid Build Coastguard Worker     // Top border.
121*fb1b10abSAndroid Build Coastguard Worker     for (int pixel = 0; pixel < b - a - left_border; ++pixel) {
122*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(c, a[pixel]) << "Mismatch at " << pixel << " in top border.";
123*fb1b10abSAndroid Build Coastguard Worker     }
124*fb1b10abSAndroid Build Coastguard Worker 
125*fb1b10abSAndroid Build Coastguard Worker     // Left border.
126*fb1b10abSAndroid Build Coastguard Worker     for (int height = 0; height < b_height; ++height) {
127*fb1b10abSAndroid Build Coastguard Worker       for (int width = left_border; width > 0; --width) {
128*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(c, b[height * b_stride - width])
129*fb1b10abSAndroid Build Coastguard Worker             << "Mismatch at row " << height << " column " << left_border - width
130*fb1b10abSAndroid Build Coastguard Worker             << " in left border.";
131*fb1b10abSAndroid Build Coastguard Worker       }
132*fb1b10abSAndroid Build Coastguard Worker     }
133*fb1b10abSAndroid Build Coastguard Worker 
134*fb1b10abSAndroid Build Coastguard Worker     // Right border.
135*fb1b10abSAndroid Build Coastguard Worker     for (int height = 0; height < b_height; ++height) {
136*fb1b10abSAndroid Build Coastguard Worker       for (int width = b_width; width < b_width + right_border; ++width) {
137*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(c, b[height * b_stride + width])
138*fb1b10abSAndroid Build Coastguard Worker             << "Mismatch at row " << height << " column " << width - b_width
139*fb1b10abSAndroid Build Coastguard Worker             << " in right border.";
140*fb1b10abSAndroid Build Coastguard Worker       }
141*fb1b10abSAndroid Build Coastguard Worker     }
142*fb1b10abSAndroid Build Coastguard Worker 
143*fb1b10abSAndroid Build Coastguard Worker     // Bottom border.
144*fb1b10abSAndroid Build Coastguard Worker     for (int pixel = static_cast<int>(b - a + b_size); pixel < a_size;
145*fb1b10abSAndroid Build Coastguard Worker          ++pixel) {
146*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(c, a[pixel]) << "Mismatch at " << pixel << " in bottom border.";
147*fb1b10abSAndroid Build Coastguard Worker     }
148*fb1b10abSAndroid Build Coastguard Worker 
149*fb1b10abSAndroid Build Coastguard Worker     return !HasFailure();
150*fb1b10abSAndroid Build Coastguard Worker   }
151*fb1b10abSAndroid Build Coastguard Worker 
TestWithRandomData(PredictFunc reference)152*fb1b10abSAndroid Build Coastguard Worker   void TestWithRandomData(PredictFunc reference) {
153*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
154*fb1b10abSAndroid Build Coastguard Worker 
155*fb1b10abSAndroid Build Coastguard Worker     // Run tests for almost all possible offsets.
156*fb1b10abSAndroid Build Coastguard Worker     for (int xoffset = 0; xoffset < 8; ++xoffset) {
157*fb1b10abSAndroid Build Coastguard Worker       for (int yoffset = 0; yoffset < 8; ++yoffset) {
158*fb1b10abSAndroid Build Coastguard Worker         if (xoffset == 0 && yoffset == 0) {
159*fb1b10abSAndroid Build Coastguard Worker           // This represents a copy which is not required to be handled by this
160*fb1b10abSAndroid Build Coastguard Worker           // module.
161*fb1b10abSAndroid Build Coastguard Worker           continue;
162*fb1b10abSAndroid Build Coastguard Worker         }
163*fb1b10abSAndroid Build Coastguard Worker 
164*fb1b10abSAndroid Build Coastguard Worker         for (int i = 0; i < kSrcSize; ++i) {
165*fb1b10abSAndroid Build Coastguard Worker           src_[i] = rnd.Rand8();
166*fb1b10abSAndroid Build Coastguard Worker         }
167*fb1b10abSAndroid Build Coastguard Worker         reference(&src_[kSrcStride * 2 + 2], kSrcStride, xoffset, yoffset,
168*fb1b10abSAndroid Build Coastguard Worker                   dst_c_, 16);
169*fb1b10abSAndroid Build Coastguard Worker 
170*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(predict_(&src_[kSrcStride * 2 + 2], kSrcStride,
171*fb1b10abSAndroid Build Coastguard Worker                                           xoffset, yoffset, dst_, dst_stride_));
172*fb1b10abSAndroid Build Coastguard Worker 
173*fb1b10abSAndroid Build Coastguard Worker         ASSERT_TRUE(CompareBuffers(dst_c_, 16, dst_, dst_stride_));
174*fb1b10abSAndroid Build Coastguard Worker         ASSERT_TRUE(CheckBorder(padded_dst_, padded_dst_size_, dst_, width_,
175*fb1b10abSAndroid Build Coastguard Worker                                 height_, dst_stride_, 128));
176*fb1b10abSAndroid Build Coastguard Worker       }
177*fb1b10abSAndroid Build Coastguard Worker     }
178*fb1b10abSAndroid Build Coastguard Worker   }
179*fb1b10abSAndroid Build Coastguard Worker 
TestWithUnalignedDst(PredictFunc reference)180*fb1b10abSAndroid Build Coastguard Worker   void TestWithUnalignedDst(PredictFunc reference) {
181*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
182*fb1b10abSAndroid Build Coastguard Worker 
183*fb1b10abSAndroid Build Coastguard Worker     // Only the 4x4 need to be able to handle unaligned writes.
184*fb1b10abSAndroid Build Coastguard Worker     if (width_ == 4 && height_ == 4) {
185*fb1b10abSAndroid Build Coastguard Worker       for (int xoffset = 0; xoffset < 8; ++xoffset) {
186*fb1b10abSAndroid Build Coastguard Worker         for (int yoffset = 0; yoffset < 8; ++yoffset) {
187*fb1b10abSAndroid Build Coastguard Worker           if (xoffset == 0 && yoffset == 0) {
188*fb1b10abSAndroid Build Coastguard Worker             continue;
189*fb1b10abSAndroid Build Coastguard Worker           }
190*fb1b10abSAndroid Build Coastguard Worker           for (int i = 0; i < kSrcSize; ++i) {
191*fb1b10abSAndroid Build Coastguard Worker             src_[i] = rnd.Rand8();
192*fb1b10abSAndroid Build Coastguard Worker           }
193*fb1b10abSAndroid Build Coastguard Worker           reference(&src_[kSrcStride * 2 + 2], kSrcStride, xoffset, yoffset,
194*fb1b10abSAndroid Build Coastguard Worker                     dst_c_, 16);
195*fb1b10abSAndroid Build Coastguard Worker 
196*fb1b10abSAndroid Build Coastguard Worker           for (int i = 1; i < 4; ++i) {
197*fb1b10abSAndroid Build Coastguard Worker             memset(padded_dst_, 128, padded_dst_size_);
198*fb1b10abSAndroid Build Coastguard Worker 
199*fb1b10abSAndroid Build Coastguard Worker             ASM_REGISTER_STATE_CHECK(predict_(&src_[kSrcStride * 2 + 2],
200*fb1b10abSAndroid Build Coastguard Worker                                               kSrcStride, xoffset, yoffset,
201*fb1b10abSAndroid Build Coastguard Worker                                               dst_ + i, dst_stride_ + i));
202*fb1b10abSAndroid Build Coastguard Worker 
203*fb1b10abSAndroid Build Coastguard Worker             ASSERT_TRUE(CompareBuffers(dst_c_, 16, dst_ + i, dst_stride_ + i));
204*fb1b10abSAndroid Build Coastguard Worker             ASSERT_TRUE(CheckBorder(padded_dst_, padded_dst_size_, dst_ + i,
205*fb1b10abSAndroid Build Coastguard Worker                                     width_, height_, dst_stride_ + i, 128));
206*fb1b10abSAndroid Build Coastguard Worker           }
207*fb1b10abSAndroid Build Coastguard Worker         }
208*fb1b10abSAndroid Build Coastguard Worker       }
209*fb1b10abSAndroid Build Coastguard Worker     }
210*fb1b10abSAndroid Build Coastguard Worker   }
211*fb1b10abSAndroid Build Coastguard Worker 
Run()212*fb1b10abSAndroid Build Coastguard Worker   void Run() override {
213*fb1b10abSAndroid Build Coastguard Worker     for (int xoffset = 0; xoffset < 8; ++xoffset) {
214*fb1b10abSAndroid Build Coastguard Worker       for (int yoffset = 0; yoffset < 8; ++yoffset) {
215*fb1b10abSAndroid Build Coastguard Worker         if (xoffset == 0 && yoffset == 0) {
216*fb1b10abSAndroid Build Coastguard Worker           continue;
217*fb1b10abSAndroid Build Coastguard Worker         }
218*fb1b10abSAndroid Build Coastguard Worker 
219*fb1b10abSAndroid Build Coastguard Worker         predict_(&src_[kSrcStride * 2 + 2], kSrcStride, xoffset, yoffset, dst_,
220*fb1b10abSAndroid Build Coastguard Worker                  dst_stride_);
221*fb1b10abSAndroid Build Coastguard Worker       }
222*fb1b10abSAndroid Build Coastguard Worker     }
223*fb1b10abSAndroid Build Coastguard Worker   }
224*fb1b10abSAndroid Build Coastguard Worker };  // namespace
225*fb1b10abSAndroid Build Coastguard Worker 
226*fb1b10abSAndroid Build Coastguard Worker class SixtapPredictTest : public PredictTestBase {};
227*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(SixtapPredictTest,TestWithRandomData)228*fb1b10abSAndroid Build Coastguard Worker TEST_P(SixtapPredictTest, TestWithRandomData) {
229*fb1b10abSAndroid Build Coastguard Worker   TestWithRandomData(vp8_sixtap_predict16x16_c);
230*fb1b10abSAndroid Build Coastguard Worker }
TEST_P(SixtapPredictTest,TestWithUnalignedDst)231*fb1b10abSAndroid Build Coastguard Worker TEST_P(SixtapPredictTest, TestWithUnalignedDst) {
232*fb1b10abSAndroid Build Coastguard Worker   TestWithUnalignedDst(vp8_sixtap_predict16x16_c);
233*fb1b10abSAndroid Build Coastguard Worker }
234*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(SixtapPredictTest,TestWithPresetData)235*fb1b10abSAndroid Build Coastguard Worker TEST_P(SixtapPredictTest, TestWithPresetData) {
236*fb1b10abSAndroid Build Coastguard Worker   // Test input
237*fb1b10abSAndroid Build Coastguard Worker   static const uint8_t kTestData[kSrcSize] = {
238*fb1b10abSAndroid Build Coastguard Worker     184, 4,   191, 82,  92,  41,  0,   1,   226, 236, 172, 20,  182, 42,  226,
239*fb1b10abSAndroid Build Coastguard Worker     177, 79,  94,  77,  179, 203, 206, 198, 22,  192, 19,  75,  17,  192, 44,
240*fb1b10abSAndroid Build Coastguard Worker     233, 120, 48,  168, 203, 141, 210, 203, 143, 180, 184, 59,  201, 110, 102,
241*fb1b10abSAndroid Build Coastguard Worker     171, 32,  182, 10,  109, 105, 213, 60,  47,  236, 253, 67,  55,  14,  3,
242*fb1b10abSAndroid Build Coastguard Worker     99,  247, 124, 148, 159, 71,  34,  114, 19,  177, 38,  203, 237, 239, 58,
243*fb1b10abSAndroid Build Coastguard Worker     83,  155, 91,  10,  166, 201, 115, 124, 5,   163, 104, 2,   231, 160, 16,
244*fb1b10abSAndroid Build Coastguard Worker     234, 4,   8,   103, 153, 167, 174, 187, 26,  193, 109, 64,  141, 90,  48,
245*fb1b10abSAndroid Build Coastguard Worker     200, 174, 204, 36,  184, 114, 237, 43,  238, 242, 207, 86,  245, 182, 247,
246*fb1b10abSAndroid Build Coastguard Worker     6,   161, 251, 14,  8,   148, 182, 182, 79,  208, 120, 188, 17,  6,   23,
247*fb1b10abSAndroid Build Coastguard Worker     65,  206, 197, 13,  242, 126, 128, 224, 170, 110, 211, 121, 197, 200, 47,
248*fb1b10abSAndroid Build Coastguard Worker     188, 207, 208, 184, 221, 216, 76,  148, 143, 156, 100, 8,   89,  117, 14,
249*fb1b10abSAndroid Build Coastguard Worker     112, 183, 221, 54,  197, 208, 180, 69,  176, 94,  180, 131, 215, 121, 76,
250*fb1b10abSAndroid Build Coastguard Worker     7,   54,  28,  216, 238, 249, 176, 58,  142, 64,  215, 242, 72,  49,  104,
251*fb1b10abSAndroid Build Coastguard Worker     87,  161, 32,  52,  216, 230, 4,   141, 44,  181, 235, 224, 57,  195, 89,
252*fb1b10abSAndroid Build Coastguard Worker     134, 203, 144, 162, 163, 126, 156, 84,  185, 42,  148, 145, 29,  221, 194,
253*fb1b10abSAndroid Build Coastguard Worker     134, 52,  100, 166, 105, 60,  140, 110, 201, 184, 35,  181, 153, 93,  121,
254*fb1b10abSAndroid Build Coastguard Worker     243, 227, 68,  131, 134, 232, 2,   35,  60,  187, 77,  209, 76,  106, 174,
255*fb1b10abSAndroid Build Coastguard Worker     15,  241, 227, 115, 151, 77,  175, 36,  187, 121, 221, 223, 47,  118, 61,
256*fb1b10abSAndroid Build Coastguard Worker     168, 105, 32,  237, 236, 167, 213, 238, 202, 17,  170, 24,  226, 247, 131,
257*fb1b10abSAndroid Build Coastguard Worker     145, 6,   116, 117, 121, 11,  194, 41,  48,  126, 162, 13,  93,  209, 131,
258*fb1b10abSAndroid Build Coastguard Worker     154, 122, 237, 187, 103, 217, 99,  60,  200, 45,  78,  115, 69,  49,  106,
259*fb1b10abSAndroid Build Coastguard Worker     200, 194, 112, 60,  56,  234, 72,  251, 19,  120, 121, 182, 134, 215, 135,
260*fb1b10abSAndroid Build Coastguard Worker     10,  114, 2,   247, 46,  105, 209, 145, 165, 153, 191, 243, 12,  5,   36,
261*fb1b10abSAndroid Build Coastguard Worker     119, 206, 231, 231, 11,  32,  209, 83,  27,  229, 204, 149, 155, 83,  109,
262*fb1b10abSAndroid Build Coastguard Worker     35,  93,  223, 37,  84,  14,  142, 37,  160, 52,  191, 96,  40,  204, 101,
263*fb1b10abSAndroid Build Coastguard Worker     77,  67,  52,  53,  43,  63,  85,  253, 147, 113, 226, 96,  6,   125, 179,
264*fb1b10abSAndroid Build Coastguard Worker     115, 161, 17,  83,  198, 101, 98,  85,  139, 3,   137, 75,  99,  178, 23,
265*fb1b10abSAndroid Build Coastguard Worker     201, 255, 91,  253, 52,  134, 60,  138, 131, 208, 251, 101, 48,  2,   227,
266*fb1b10abSAndroid Build Coastguard Worker     228, 118, 132, 245, 202, 75,  91,  44,  160, 231, 47,  41,  50,  147, 220,
267*fb1b10abSAndroid Build Coastguard Worker     74,  92,  219, 165, 89,  16
268*fb1b10abSAndroid Build Coastguard Worker   };
269*fb1b10abSAndroid Build Coastguard Worker 
270*fb1b10abSAndroid Build Coastguard Worker   // Expected results for xoffset = 2 and yoffset = 2.
271*fb1b10abSAndroid Build Coastguard Worker   static const int kExpectedDstStride = 16;
272*fb1b10abSAndroid Build Coastguard Worker   static const uint8_t kExpectedDst[256] = {
273*fb1b10abSAndroid Build Coastguard Worker     117, 102, 74,  135, 42,  98,  175, 206, 70,  73,  222, 197, 50,  24,  39,
274*fb1b10abSAndroid Build Coastguard Worker     49,  38,  105, 90,  47,  169, 40,  171, 215, 200, 73,  109, 141, 53,  85,
275*fb1b10abSAndroid Build Coastguard Worker     177, 164, 79,  208, 124, 89,  212, 18,  81,  145, 151, 164, 217, 153, 91,
276*fb1b10abSAndroid Build Coastguard Worker     154, 102, 102, 159, 75,  164, 152, 136, 51,  213, 219, 186, 116, 193, 224,
277*fb1b10abSAndroid Build Coastguard Worker     186, 36,  231, 208, 84,  211, 155, 167, 35,  59,  42,  76,  216, 149, 73,
278*fb1b10abSAndroid Build Coastguard Worker     201, 78,  149, 184, 100, 96,  196, 189, 198, 188, 235, 195, 117, 129, 120,
279*fb1b10abSAndroid Build Coastguard Worker     129, 49,  25,  133, 113, 69,  221, 114, 70,  143, 99,  157, 108, 189, 140,
280*fb1b10abSAndroid Build Coastguard Worker     78,  6,   55,  65,  240, 255, 245, 184, 72,  90,  100, 116, 131, 39,  60,
281*fb1b10abSAndroid Build Coastguard Worker     234, 167, 33,  160, 88,  185, 200, 157, 159, 176, 127, 151, 138, 102, 168,
282*fb1b10abSAndroid Build Coastguard Worker     106, 170, 86,  82,  219, 189, 76,  33,  115, 197, 106, 96,  198, 136, 97,
283*fb1b10abSAndroid Build Coastguard Worker     141, 237, 151, 98,  137, 191, 185, 2,   57,  95,  142, 91,  255, 185, 97,
284*fb1b10abSAndroid Build Coastguard Worker     137, 76,  162, 94,  173, 131, 193, 161, 81,  106, 72,  135, 222, 234, 137,
285*fb1b10abSAndroid Build Coastguard Worker     66,  137, 106, 243, 210, 147, 95,  15,  137, 110, 85,  66,  16,  96,  167,
286*fb1b10abSAndroid Build Coastguard Worker     147, 150, 173, 203, 140, 118, 196, 84,  147, 160, 19,  95,  101, 123, 74,
287*fb1b10abSAndroid Build Coastguard Worker     132, 202, 82,  166, 12,  131, 166, 189, 170, 159, 85,  79,  66,  57,  152,
288*fb1b10abSAndroid Build Coastguard Worker     132, 203, 194, 0,   1,   56,  146, 180, 224, 156, 28,  83,  181, 79,  76,
289*fb1b10abSAndroid Build Coastguard Worker     80,  46,  160, 175, 59,  106, 43,  87,  75,  136, 85,  189, 46,  71,  200,
290*fb1b10abSAndroid Build Coastguard Worker     90
291*fb1b10abSAndroid Build Coastguard Worker   };
292*fb1b10abSAndroid Build Coastguard Worker 
293*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(
294*fb1b10abSAndroid Build Coastguard Worker       predict_(const_cast<uint8_t *>(kTestData) + kSrcStride * 2 + 2,
295*fb1b10abSAndroid Build Coastguard Worker                kSrcStride, 2, 2, dst_, dst_stride_));
296*fb1b10abSAndroid Build Coastguard Worker 
297*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(
298*fb1b10abSAndroid Build Coastguard Worker       CompareBuffers(kExpectedDst, kExpectedDstStride, dst_, dst_stride_));
299*fb1b10abSAndroid Build Coastguard Worker }
300*fb1b10abSAndroid Build Coastguard Worker 
301*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
302*fb1b10abSAndroid Build Coastguard Worker     C, SixtapPredictTest,
303*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_sixtap_predict16x16_c),
304*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_sixtap_predict8x8_c),
305*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_sixtap_predict8x4_c),
306*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_sixtap_predict4x4_c)));
307*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
308*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
309*fb1b10abSAndroid Build Coastguard Worker     NEON, SixtapPredictTest,
310*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_sixtap_predict16x16_neon),
311*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_sixtap_predict8x8_neon),
312*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_sixtap_predict8x4_neon),
313*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_sixtap_predict4x4_neon)));
314*fb1b10abSAndroid Build Coastguard Worker #endif
315*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MMX
316*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
317*fb1b10abSAndroid Build Coastguard Worker     MMX, SixtapPredictTest,
318*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(4, 4, &vp8_sixtap_predict4x4_mmx)));
319*fb1b10abSAndroid Build Coastguard Worker #endif
320*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
321*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
322*fb1b10abSAndroid Build Coastguard Worker     SSE2, SixtapPredictTest,
323*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_sixtap_predict16x16_sse2),
324*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_sixtap_predict8x8_sse2),
325*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_sixtap_predict8x4_sse2)));
326*fb1b10abSAndroid Build Coastguard Worker #endif
327*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSSE3
328*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
329*fb1b10abSAndroid Build Coastguard Worker     SSSE3, SixtapPredictTest,
330*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_sixtap_predict16x16_ssse3),
331*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_sixtap_predict8x8_ssse3),
332*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_sixtap_predict8x4_ssse3),
333*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_sixtap_predict4x4_ssse3)));
334*fb1b10abSAndroid Build Coastguard Worker #endif
335*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA
336*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
337*fb1b10abSAndroid Build Coastguard Worker     MSA, SixtapPredictTest,
338*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_sixtap_predict16x16_msa),
339*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_sixtap_predict8x8_msa),
340*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_sixtap_predict8x4_msa),
341*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_sixtap_predict4x4_msa)));
342*fb1b10abSAndroid Build Coastguard Worker #endif
343*fb1b10abSAndroid Build Coastguard Worker 
344*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MMI
345*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
346*fb1b10abSAndroid Build Coastguard Worker     MMI, SixtapPredictTest,
347*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_sixtap_predict16x16_mmi),
348*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_sixtap_predict8x8_mmi),
349*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_sixtap_predict8x4_mmi),
350*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_sixtap_predict4x4_mmi)));
351*fb1b10abSAndroid Build Coastguard Worker #endif
352*fb1b10abSAndroid Build Coastguard Worker 
353*fb1b10abSAndroid Build Coastguard Worker #if HAVE_LSX
354*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
355*fb1b10abSAndroid Build Coastguard Worker     LSX, SixtapPredictTest,
356*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_sixtap_predict16x16_lsx),
357*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_sixtap_predict8x8_lsx),
358*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_sixtap_predict4x4_lsx)));
359*fb1b10abSAndroid Build Coastguard Worker #endif
360*fb1b10abSAndroid Build Coastguard Worker 
361*fb1b10abSAndroid Build Coastguard Worker class BilinearPredictTest : public PredictTestBase {};
362*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(BilinearPredictTest,TestWithRandomData)363*fb1b10abSAndroid Build Coastguard Worker TEST_P(BilinearPredictTest, TestWithRandomData) {
364*fb1b10abSAndroid Build Coastguard Worker   TestWithRandomData(vp8_bilinear_predict16x16_c);
365*fb1b10abSAndroid Build Coastguard Worker }
TEST_P(BilinearPredictTest,TestWithUnalignedDst)366*fb1b10abSAndroid Build Coastguard Worker TEST_P(BilinearPredictTest, TestWithUnalignedDst) {
367*fb1b10abSAndroid Build Coastguard Worker   TestWithUnalignedDst(vp8_bilinear_predict16x16_c);
368*fb1b10abSAndroid Build Coastguard Worker }
TEST_P(BilinearPredictTest,DISABLED_Speed)369*fb1b10abSAndroid Build Coastguard Worker TEST_P(BilinearPredictTest, DISABLED_Speed) {
370*fb1b10abSAndroid Build Coastguard Worker   const int kCountSpeedTestBlock = 5000000 / (width_ * height_);
371*fb1b10abSAndroid Build Coastguard Worker   RunNTimes(kCountSpeedTestBlock);
372*fb1b10abSAndroid Build Coastguard Worker 
373*fb1b10abSAndroid Build Coastguard Worker   char title[16];
374*fb1b10abSAndroid Build Coastguard Worker   snprintf(title, sizeof(title), "%dx%d", width_, height_);
375*fb1b10abSAndroid Build Coastguard Worker   PrintMedian(title);
376*fb1b10abSAndroid Build Coastguard Worker }
377*fb1b10abSAndroid Build Coastguard Worker 
378*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
379*fb1b10abSAndroid Build Coastguard Worker     C, BilinearPredictTest,
380*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_bilinear_predict16x16_c),
381*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_bilinear_predict8x8_c),
382*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_bilinear_predict8x4_c),
383*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_bilinear_predict4x4_c)));
384*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
385*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
386*fb1b10abSAndroid Build Coastguard Worker     NEON, BilinearPredictTest,
387*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_bilinear_predict16x16_neon),
388*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_bilinear_predict8x8_neon),
389*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_bilinear_predict8x4_neon),
390*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_bilinear_predict4x4_neon)));
391*fb1b10abSAndroid Build Coastguard Worker #endif
392*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
393*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
394*fb1b10abSAndroid Build Coastguard Worker     SSE2, BilinearPredictTest,
395*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_bilinear_predict16x16_sse2),
396*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_bilinear_predict8x8_sse2),
397*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_bilinear_predict8x4_sse2),
398*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_bilinear_predict4x4_sse2)));
399*fb1b10abSAndroid Build Coastguard Worker #endif
400*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSSE3
401*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
402*fb1b10abSAndroid Build Coastguard Worker     SSSE3, BilinearPredictTest,
403*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_bilinear_predict16x16_ssse3),
404*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_bilinear_predict8x8_ssse3)));
405*fb1b10abSAndroid Build Coastguard Worker #endif
406*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA
407*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
408*fb1b10abSAndroid Build Coastguard Worker     MSA, BilinearPredictTest,
409*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(16, 16, &vp8_bilinear_predict16x16_msa),
410*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 8, &vp8_bilinear_predict8x8_msa),
411*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(8, 4, &vp8_bilinear_predict8x4_msa),
412*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(4, 4, &vp8_bilinear_predict4x4_msa)));
413*fb1b10abSAndroid Build Coastguard Worker #endif
414*fb1b10abSAndroid Build Coastguard Worker }  // namespace
415