1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <stdlib.h>
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <new>
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "third_party/googletest/src/include/gtest/gtest.h"
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/clear_system_state.h"
1691037db265ecdd914a26e056cf69207b4f50924ehkuang#include "test/register_state_check.h"
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vpx_integer.h"
191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "./vpx_config.h"
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangextern "C" {
2191037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vpx_mem/vpx_mem.h"
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# include "vp8/common/variance.h"
241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang# include "./vp8_rtcd.h"
25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# include "vp9/encoder/vp9_variance.h"
281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang# include "./vp9_rtcd.h"
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
3191037db265ecdd914a26e056cf69207b4f50924ehkuang#include "test/acm_random.h"
32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangnamespace {
34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangusing ::std::tr1::get;
36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangusing ::std::tr1::make_tuple;
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangusing ::std::tr1::tuple;
3891037db265ecdd914a26e056cf69207b4f50924ehkuangusing libvpx_test::ACMRandom;
3991037db265ecdd914a26e056cf69207b4f50924ehkuang
4091037db265ecdd914a26e056cf69207b4f50924ehkuangstatic unsigned int variance_ref(const uint8_t *ref, const uint8_t *src,
4191037db265ecdd914a26e056cf69207b4f50924ehkuang                                 int l2w, int l2h, unsigned int *sse_ptr) {
4291037db265ecdd914a26e056cf69207b4f50924ehkuang  int se = 0;
4391037db265ecdd914a26e056cf69207b4f50924ehkuang  unsigned int sse = 0;
4491037db265ecdd914a26e056cf69207b4f50924ehkuang  const int w = 1 << l2w, h = 1 << l2h;
4591037db265ecdd914a26e056cf69207b4f50924ehkuang  for (int y = 0; y < h; y++) {
4691037db265ecdd914a26e056cf69207b4f50924ehkuang    for (int x = 0; x < w; x++) {
4791037db265ecdd914a26e056cf69207b4f50924ehkuang      int diff = ref[w * y + x] - src[w * y + x];
4891037db265ecdd914a26e056cf69207b4f50924ehkuang      se += diff;
4991037db265ecdd914a26e056cf69207b4f50924ehkuang      sse += diff * diff;
5091037db265ecdd914a26e056cf69207b4f50924ehkuang    }
5191037db265ecdd914a26e056cf69207b4f50924ehkuang  }
5291037db265ecdd914a26e056cf69207b4f50924ehkuang  *sse_ptr = sse;
5391037db265ecdd914a26e056cf69207b4f50924ehkuang  return sse - (((int64_t) se * se) >> (l2w + l2h));
5491037db265ecdd914a26e056cf69207b4f50924ehkuang}
5591037db265ecdd914a26e056cf69207b4f50924ehkuang
5691037db265ecdd914a26e056cf69207b4f50924ehkuangstatic unsigned int subpel_variance_ref(const uint8_t *ref, const uint8_t *src,
5791037db265ecdd914a26e056cf69207b4f50924ehkuang                                        int l2w, int l2h, int xoff, int yoff,
5891037db265ecdd914a26e056cf69207b4f50924ehkuang                                        unsigned int *sse_ptr) {
5991037db265ecdd914a26e056cf69207b4f50924ehkuang  int se = 0;
6091037db265ecdd914a26e056cf69207b4f50924ehkuang  unsigned int sse = 0;
6191037db265ecdd914a26e056cf69207b4f50924ehkuang  const int w = 1 << l2w, h = 1 << l2h;
6291037db265ecdd914a26e056cf69207b4f50924ehkuang  for (int y = 0; y < h; y++) {
6391037db265ecdd914a26e056cf69207b4f50924ehkuang    for (int x = 0; x < w; x++) {
6491037db265ecdd914a26e056cf69207b4f50924ehkuang      // bilinear interpolation at a 16th pel step
6591037db265ecdd914a26e056cf69207b4f50924ehkuang      const int a1 = ref[(w + 1) * (y + 0) + x + 0];
6691037db265ecdd914a26e056cf69207b4f50924ehkuang      const int a2 = ref[(w + 1) * (y + 0) + x + 1];
6791037db265ecdd914a26e056cf69207b4f50924ehkuang      const int b1 = ref[(w + 1) * (y + 1) + x + 0];
6891037db265ecdd914a26e056cf69207b4f50924ehkuang      const int b2 = ref[(w + 1) * (y + 1) + x + 1];
6991037db265ecdd914a26e056cf69207b4f50924ehkuang      const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
7091037db265ecdd914a26e056cf69207b4f50924ehkuang      const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
7191037db265ecdd914a26e056cf69207b4f50924ehkuang      const int r = a + (((b - a) * yoff + 8) >> 4);
7291037db265ecdd914a26e056cf69207b4f50924ehkuang      int diff = r - src[w * y + x];
7391037db265ecdd914a26e056cf69207b4f50924ehkuang      se += diff;
7491037db265ecdd914a26e056cf69207b4f50924ehkuang      sse += diff * diff;
7591037db265ecdd914a26e056cf69207b4f50924ehkuang    }
7691037db265ecdd914a26e056cf69207b4f50924ehkuang  }
7791037db265ecdd914a26e056cf69207b4f50924ehkuang  *sse_ptr = sse;
7891037db265ecdd914a26e056cf69207b4f50924ehkuang  return sse - (((int64_t) se * se) >> (l2w + l2h));
7991037db265ecdd914a26e056cf69207b4f50924ehkuang}
8091037db265ecdd914a26e056cf69207b4f50924ehkuang
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtemplate<typename VarianceFunctionType>
821184aebb761cbeac9124c37189a80a1a58f04b6bhkuangclass VarianceTest
831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    : public ::testing::TestWithParam<tuple<int, int, VarianceFunctionType> > {
84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual void SetUp() {
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    const tuple<int, int, VarianceFunctionType>& params = this->GetParam();
8791037db265ecdd914a26e056cf69207b4f50924ehkuang    log2width_  = get<0>(params);
8891037db265ecdd914a26e056cf69207b4f50924ehkuang    width_ = 1 << log2width_;
8991037db265ecdd914a26e056cf69207b4f50924ehkuang    log2height_ = get<1>(params);
9091037db265ecdd914a26e056cf69207b4f50924ehkuang    height_ = 1 << log2height_;
91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    variance_ = get<2>(params);
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
9391037db265ecdd914a26e056cf69207b4f50924ehkuang    rnd(ACMRandom::DeterministicSeed());
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    block_size_ = width_ * height_;
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    src_ = new uint8_t[block_size_];
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ref_ = new uint8_t[block_size_];
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ASSERT_TRUE(src_ != NULL);
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ASSERT_TRUE(ref_ != NULL);
99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual void TearDown() {
102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    delete[] src_;
103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    delete[] ref_;
104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    libvpx_test::ClearSystemState();
105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected:
108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void ZeroTest();
10991037db265ecdd914a26e056cf69207b4f50924ehkuang  void RefTest();
110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void OneQuarterTest();
111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11291037db265ecdd914a26e056cf69207b4f50924ehkuang  ACMRandom rnd;
113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint8_t* src_;
114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  uint8_t* ref_;
11591037db265ecdd914a26e056cf69207b4f50924ehkuang  int width_, log2width_;
11691037db265ecdd914a26e056cf69207b4f50924ehkuang  int height_, log2height_;
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int block_size_;
118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VarianceFunctionType variance_;
119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtemplate<typename VarianceFunctionType>
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid VarianceTest<VarianceFunctionType>::ZeroTest() {
123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (int i = 0; i <= 255; ++i) {
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    memset(src_, i, block_size_);
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (int j = 0; j <= 255; ++j) {
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      memset(ref_, j, block_size_);
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      unsigned int sse;
12891037db265ecdd914a26e056cf69207b4f50924ehkuang      unsigned int var;
12991037db265ecdd914a26e056cf69207b4f50924ehkuang      REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse));
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j;
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtemplate<typename VarianceFunctionType>
13691037db265ecdd914a26e056cf69207b4f50924ehkuangvoid VarianceTest<VarianceFunctionType>::RefTest() {
13791037db265ecdd914a26e056cf69207b4f50924ehkuang  for (int i = 0; i < 10; ++i) {
13891037db265ecdd914a26e056cf69207b4f50924ehkuang    for (int j = 0; j < block_size_; j++) {
13991037db265ecdd914a26e056cf69207b4f50924ehkuang      src_[j] = rnd.Rand8();
14091037db265ecdd914a26e056cf69207b4f50924ehkuang      ref_[j] = rnd.Rand8();
14191037db265ecdd914a26e056cf69207b4f50924ehkuang    }
14291037db265ecdd914a26e056cf69207b4f50924ehkuang    unsigned int sse1, sse2;
14391037db265ecdd914a26e056cf69207b4f50924ehkuang    unsigned int var1;
14491037db265ecdd914a26e056cf69207b4f50924ehkuang    REGISTER_STATE_CHECK(var1 = variance_(src_, width_, ref_, width_, &sse1));
14591037db265ecdd914a26e056cf69207b4f50924ehkuang    const unsigned int var2 = variance_ref(src_, ref_, log2width_,
14691037db265ecdd914a26e056cf69207b4f50924ehkuang                                           log2height_, &sse2);
14791037db265ecdd914a26e056cf69207b4f50924ehkuang    EXPECT_EQ(sse1, sse2);
14891037db265ecdd914a26e056cf69207b4f50924ehkuang    EXPECT_EQ(var1, var2);
14991037db265ecdd914a26e056cf69207b4f50924ehkuang  }
15091037db265ecdd914a26e056cf69207b4f50924ehkuang}
15191037db265ecdd914a26e056cf69207b4f50924ehkuang
15291037db265ecdd914a26e056cf69207b4f50924ehkuangtemplate<typename VarianceFunctionType>
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid VarianceTest<VarianceFunctionType>::OneQuarterTest() {
154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  memset(src_, 255, block_size_);
155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int half = block_size_ / 2;
156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  memset(ref_, 255, half);
157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  memset(ref_ + half, 0, half);
158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int sse;
15991037db265ecdd914a26e056cf69207b4f50924ehkuang  unsigned int var;
16091037db265ecdd914a26e056cf69207b4f50924ehkuang  REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse));
161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const unsigned int expected = block_size_ * 255 * 255 / 4;
162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  EXPECT_EQ(expected, var);
163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if CONFIG_VP9_ENCODER
1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangunsigned int subpel_avg_variance_ref(const uint8_t *ref,
1685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const uint8_t *src,
1695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const uint8_t *second_pred,
1705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     int l2w, int l2h,
1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     int xoff, int yoff,
1725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     unsigned int *sse_ptr) {
1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int se = 0;
1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unsigned int sse = 0;
1755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int w = 1 << l2w, h = 1 << l2h;
1765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int y = 0; y < h; y++) {
1775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int x = 0; x < w; x++) {
1785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // bilinear interpolation at a 16th pel step
1795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int a1 = ref[(w + 1) * (y + 0) + x + 0];
1805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int a2 = ref[(w + 1) * (y + 0) + x + 1];
1815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int b1 = ref[(w + 1) * (y + 1) + x + 0];
1825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int b2 = ref[(w + 1) * (y + 1) + x + 1];
1835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
1845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
1855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int r = a + (((b - a) * yoff + 8) >> 4);
1865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      int diff = ((r + second_pred[w * y + x] + 1) >> 1) - src[w * y + x];
1875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      se += diff;
1885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      sse += diff * diff;
1895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
1915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *sse_ptr = sse;
1925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return sse - (((int64_t) se * se) >> (l2w + l2h));
1935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
1945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19591037db265ecdd914a26e056cf69207b4f50924ehkuangtemplate<typename SubpelVarianceFunctionType>
1961184aebb761cbeac9124c37189a80a1a58f04b6bhkuangclass SubpelVarianceTest
1971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    : public ::testing::TestWithParam<tuple<int, int,
1981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                                            SubpelVarianceFunctionType> > {
19991037db265ecdd914a26e056cf69207b4f50924ehkuang public:
20091037db265ecdd914a26e056cf69207b4f50924ehkuang  virtual void SetUp() {
20191037db265ecdd914a26e056cf69207b4f50924ehkuang    const tuple<int, int, SubpelVarianceFunctionType>& params =
20291037db265ecdd914a26e056cf69207b4f50924ehkuang        this->GetParam();
20391037db265ecdd914a26e056cf69207b4f50924ehkuang    log2width_  = get<0>(params);
20491037db265ecdd914a26e056cf69207b4f50924ehkuang    width_ = 1 << log2width_;
20591037db265ecdd914a26e056cf69207b4f50924ehkuang    log2height_ = get<1>(params);
20691037db265ecdd914a26e056cf69207b4f50924ehkuang    height_ = 1 << log2height_;
20791037db265ecdd914a26e056cf69207b4f50924ehkuang    subpel_variance_ = get<2>(params);
20891037db265ecdd914a26e056cf69207b4f50924ehkuang
20991037db265ecdd914a26e056cf69207b4f50924ehkuang    rnd(ACMRandom::DeterministicSeed());
21091037db265ecdd914a26e056cf69207b4f50924ehkuang    block_size_ = width_ * height_;
21191037db265ecdd914a26e056cf69207b4f50924ehkuang    src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
21291037db265ecdd914a26e056cf69207b4f50924ehkuang    sec_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
21391037db265ecdd914a26e056cf69207b4f50924ehkuang    ref_ = new uint8_t[block_size_ + width_ + height_ + 1];
21491037db265ecdd914a26e056cf69207b4f50924ehkuang    ASSERT_TRUE(src_ != NULL);
21591037db265ecdd914a26e056cf69207b4f50924ehkuang    ASSERT_TRUE(sec_ != NULL);
21691037db265ecdd914a26e056cf69207b4f50924ehkuang    ASSERT_TRUE(ref_ != NULL);
21791037db265ecdd914a26e056cf69207b4f50924ehkuang  }
21891037db265ecdd914a26e056cf69207b4f50924ehkuang
21991037db265ecdd914a26e056cf69207b4f50924ehkuang  virtual void TearDown() {
22091037db265ecdd914a26e056cf69207b4f50924ehkuang    vpx_free(src_);
22191037db265ecdd914a26e056cf69207b4f50924ehkuang    delete[] ref_;
22291037db265ecdd914a26e056cf69207b4f50924ehkuang    vpx_free(sec_);
22391037db265ecdd914a26e056cf69207b4f50924ehkuang    libvpx_test::ClearSystemState();
22491037db265ecdd914a26e056cf69207b4f50924ehkuang  }
22591037db265ecdd914a26e056cf69207b4f50924ehkuang
22691037db265ecdd914a26e056cf69207b4f50924ehkuang protected:
22791037db265ecdd914a26e056cf69207b4f50924ehkuang  void RefTest();
22891037db265ecdd914a26e056cf69207b4f50924ehkuang
22991037db265ecdd914a26e056cf69207b4f50924ehkuang  ACMRandom rnd;
23091037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t *src_;
23191037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t *ref_;
23291037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t *sec_;
23391037db265ecdd914a26e056cf69207b4f50924ehkuang  int width_, log2width_;
23491037db265ecdd914a26e056cf69207b4f50924ehkuang  int height_, log2height_;
23591037db265ecdd914a26e056cf69207b4f50924ehkuang  int block_size_;
23691037db265ecdd914a26e056cf69207b4f50924ehkuang  SubpelVarianceFunctionType subpel_variance_;
23791037db265ecdd914a26e056cf69207b4f50924ehkuang};
23891037db265ecdd914a26e056cf69207b4f50924ehkuang
23991037db265ecdd914a26e056cf69207b4f50924ehkuangtemplate<typename SubpelVarianceFunctionType>
24091037db265ecdd914a26e056cf69207b4f50924ehkuangvoid SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() {
24191037db265ecdd914a26e056cf69207b4f50924ehkuang  for (int x = 0; x < 16; ++x) {
24291037db265ecdd914a26e056cf69207b4f50924ehkuang    for (int y = 0; y < 16; ++y) {
24391037db265ecdd914a26e056cf69207b4f50924ehkuang      for (int j = 0; j < block_size_; j++) {
24491037db265ecdd914a26e056cf69207b4f50924ehkuang        src_[j] = rnd.Rand8();
24591037db265ecdd914a26e056cf69207b4f50924ehkuang      }
24691037db265ecdd914a26e056cf69207b4f50924ehkuang      for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
24791037db265ecdd914a26e056cf69207b4f50924ehkuang        ref_[j] = rnd.Rand8();
24891037db265ecdd914a26e056cf69207b4f50924ehkuang      }
24991037db265ecdd914a26e056cf69207b4f50924ehkuang      unsigned int sse1, sse2;
25091037db265ecdd914a26e056cf69207b4f50924ehkuang      unsigned int var1;
25191037db265ecdd914a26e056cf69207b4f50924ehkuang      REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y,
25291037db265ecdd914a26e056cf69207b4f50924ehkuang                                                   src_, width_, &sse1));
25391037db265ecdd914a26e056cf69207b4f50924ehkuang      const unsigned int var2 = subpel_variance_ref(ref_, src_, log2width_,
25491037db265ecdd914a26e056cf69207b4f50924ehkuang                                                    log2height_, x, y, &sse2);
25591037db265ecdd914a26e056cf69207b4f50924ehkuang      EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
25691037db265ecdd914a26e056cf69207b4f50924ehkuang      EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
25791037db265ecdd914a26e056cf69207b4f50924ehkuang    }
25891037db265ecdd914a26e056cf69207b4f50924ehkuang  }
25991037db265ecdd914a26e056cf69207b4f50924ehkuang}
26091037db265ecdd914a26e056cf69207b4f50924ehkuang
26191037db265ecdd914a26e056cf69207b4f50924ehkuangtemplate<>
26291037db265ecdd914a26e056cf69207b4f50924ehkuangvoid SubpelVarianceTest<vp9_subp_avg_variance_fn_t>::RefTest() {
26391037db265ecdd914a26e056cf69207b4f50924ehkuang  for (int x = 0; x < 16; ++x) {
26491037db265ecdd914a26e056cf69207b4f50924ehkuang    for (int y = 0; y < 16; ++y) {
26591037db265ecdd914a26e056cf69207b4f50924ehkuang      for (int j = 0; j < block_size_; j++) {
26691037db265ecdd914a26e056cf69207b4f50924ehkuang        src_[j] = rnd.Rand8();
26791037db265ecdd914a26e056cf69207b4f50924ehkuang        sec_[j] = rnd.Rand8();
26891037db265ecdd914a26e056cf69207b4f50924ehkuang      }
26991037db265ecdd914a26e056cf69207b4f50924ehkuang      for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
27091037db265ecdd914a26e056cf69207b4f50924ehkuang        ref_[j] = rnd.Rand8();
27191037db265ecdd914a26e056cf69207b4f50924ehkuang      }
27291037db265ecdd914a26e056cf69207b4f50924ehkuang      unsigned int sse1, sse2;
27391037db265ecdd914a26e056cf69207b4f50924ehkuang      unsigned int var1;
27491037db265ecdd914a26e056cf69207b4f50924ehkuang      REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y,
27591037db265ecdd914a26e056cf69207b4f50924ehkuang                                                   src_, width_, &sse1, sec_));
27691037db265ecdd914a26e056cf69207b4f50924ehkuang      const unsigned int var2 = subpel_avg_variance_ref(ref_, src_, sec_,
27791037db265ecdd914a26e056cf69207b4f50924ehkuang                                                        log2width_, log2height_,
27891037db265ecdd914a26e056cf69207b4f50924ehkuang                                                        x, y, &sse2);
27991037db265ecdd914a26e056cf69207b4f50924ehkuang      EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
28091037db265ecdd914a26e056cf69207b4f50924ehkuang      EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
28191037db265ecdd914a26e056cf69207b4f50924ehkuang    }
28291037db265ecdd914a26e056cf69207b4f50924ehkuang  }
28391037db265ecdd914a26e056cf69207b4f50924ehkuang}
28491037db265ecdd914a26e056cf69207b4f50924ehkuang
2855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // CONFIG_VP9_ENCODER
2865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// -----------------------------------------------------------------------------
288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// VP8 test cases.
289ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangnamespace vp8 {
291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef VarianceTest<vp8_variance_fn_t> VP8VarianceTest;
294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(VP8VarianceTest, Zero) { ZeroTest(); }
29691037db265ecdd914a26e056cf69207b4f50924ehkuangTEST_P(VP8VarianceTest, Ref) { RefTest(); }
297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(VP8VarianceTest, OneQuarter) { OneQuarterTest(); }
298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance4x4_c = vp8_variance4x4_c;
300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance8x8_c = vp8_variance8x8_c;
301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance8x16_c = vp8_variance8x16_c;
302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance16x8_c = vp8_variance16x8_c;
303ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance16x16_c = vp8_variance16x16_c;
304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(
305ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    C, VP8VarianceTest,
30691037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, variance4x4_c),
30791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, variance8x8_c),
30891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, variance8x16_c),
30991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, variance16x8_c),
31091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, variance16x16_c)));
311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if HAVE_MMX
313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance4x4_mmx = vp8_variance4x4_mmx;
314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance8x8_mmx = vp8_variance8x8_mmx;
315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance8x16_mmx = vp8_variance8x16_mmx;
316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance16x8_mmx = vp8_variance16x8_mmx;
317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance16x16_mmx = vp8_variance16x16_mmx;
318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(
319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    MMX, VP8VarianceTest,
32091037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, variance4x4_mmx),
32191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, variance8x8_mmx),
32291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, variance8x16_mmx),
32391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, variance16x8_mmx),
32491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, variance16x16_mmx)));
325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if HAVE_SSE2
328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance4x4_wmt = vp8_variance4x4_wmt;
329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance8x8_wmt = vp8_variance8x8_wmt;
330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance8x16_wmt = vp8_variance8x16_wmt;
331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance16x8_wmt = vp8_variance16x8_wmt;
332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp8_variance_fn_t variance16x16_wmt = vp8_variance16x16_wmt;
333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(
334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    SSE2, VP8VarianceTest,
33591037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, variance4x4_wmt),
33691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, variance8x8_wmt),
33791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, variance8x16_wmt),
33891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, variance16x8_wmt),
33991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, variance16x16_wmt)));
340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // CONFIG_VP8_ENCODER
342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}  // namespace vp8
344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// -----------------------------------------------------------------------------
346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// VP9 test cases.
347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangnamespace vp9 {
349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
350ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef VarianceTest<vp9_variance_fn_t> VP9VarianceTest;
35291037db265ecdd914a26e056cf69207b4f50924ehkuangtypedef SubpelVarianceTest<vp9_subpixvariance_fn_t> VP9SubpelVarianceTest;
35391037db265ecdd914a26e056cf69207b4f50924ehkuangtypedef SubpelVarianceTest<vp9_subp_avg_variance_fn_t> VP9SubpelAvgVarianceTest;
354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
355ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(VP9VarianceTest, Zero) { ZeroTest(); }
35691037db265ecdd914a26e056cf69207b4f50924ehkuangTEST_P(VP9VarianceTest, Ref) { RefTest(); }
35791037db265ecdd914a26e056cf69207b4f50924ehkuangTEST_P(VP9SubpelVarianceTest, Ref) { RefTest(); }
35891037db265ecdd914a26e056cf69207b4f50924ehkuangTEST_P(VP9SubpelAvgVarianceTest, Ref) { RefTest(); }
359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(VP9VarianceTest, OneQuarter) { OneQuarterTest(); }
360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
361ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance4x4_c = vp9_variance4x4_c;
36291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance4x8_c = vp9_variance4x8_c;
36391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance8x4_c = vp9_variance8x4_c;
364ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance8x8_c = vp9_variance8x8_c;
365ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance8x16_c = vp9_variance8x16_c;
366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance16x8_c = vp9_variance16x8_c;
367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance16x16_c = vp9_variance16x16_c;
36891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance16x32_c = vp9_variance16x32_c;
36991037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance32x16_c = vp9_variance32x16_c;
37091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance32x32_c = vp9_variance32x32_c;
37191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance32x64_c = vp9_variance32x64_c;
37291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance64x32_c = vp9_variance64x32_c;
37391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance64x64_c = vp9_variance64x64_c;
374ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(
375ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    C, VP9VarianceTest,
37691037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, variance4x4_c),
37791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, variance4x8_c),
37891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, variance8x4_c),
37991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, variance8x8_c),
38091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, variance8x16_c),
38191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, variance16x8_c),
38291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, variance16x16_c),
38391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, variance16x32_c),
38491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, variance32x16_c),
38591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, variance32x32_c),
38691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, variance32x64_c),
38791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, variance64x32_c),
38891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, variance64x64_c)));
38991037db265ecdd914a26e056cf69207b4f50924ehkuang
39091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance4x4_c =
39191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance4x4_c;
39291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance4x8_c =
39391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance4x8_c;
39491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x4_c =
39591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x4_c;
39691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x8_c =
39791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x8_c;
39891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x16_c =
39991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x16_c;
40091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x8_c =
40191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x8_c;
40291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x16_c =
40391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x16_c;
40491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x32_c =
40591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x32_c;
40691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x16_c =
40791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x16_c;
40891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x32_c =
40991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x32_c;
41091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x64_c =
41191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x64_c;
41291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance64x32_c =
41391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance64x32_c;
41491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance64x64_c =
41591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance64x64_c;
41691037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(
41791037db265ecdd914a26e056cf69207b4f50924ehkuang    C, VP9SubpelVarianceTest,
41891037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, subpel_variance4x4_c),
41991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, subpel_variance4x8_c),
42091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, subpel_variance8x4_c),
42191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, subpel_variance8x8_c),
42291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, subpel_variance8x16_c),
42391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, subpel_variance16x8_c),
42491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, subpel_variance16x16_c),
42591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, subpel_variance16x32_c),
42691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, subpel_variance32x16_c),
42791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, subpel_variance32x32_c),
42891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, subpel_variance32x64_c),
42991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, subpel_variance64x32_c),
43091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, subpel_variance64x64_c)));
43191037db265ecdd914a26e056cf69207b4f50924ehkuang
43291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_c =
43391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance4x4_c;
43491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_c =
43591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance4x8_c;
43691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_c =
43791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x4_c;
43891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_c =
43991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x8_c;
44091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_c =
44191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x16_c;
44291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_c =
44391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x8_c;
44491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_c =
44591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x16_c;
44691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_c =
44791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x32_c;
44891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_c =
44991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x16_c;
45091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_c =
45191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x32_c;
45291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_c =
45391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x64_c;
45491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_c =
45591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance64x32_c;
45691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_c =
45791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance64x64_c;
45891037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(
45991037db265ecdd914a26e056cf69207b4f50924ehkuang    C, VP9SubpelAvgVarianceTest,
46091037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_c),
46191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, subpel_avg_variance4x8_c),
46291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, subpel_avg_variance8x4_c),
46391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, subpel_avg_variance8x8_c),
46491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, subpel_avg_variance8x16_c),
46591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, subpel_avg_variance16x8_c),
46691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, subpel_avg_variance16x16_c),
46791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, subpel_avg_variance16x32_c),
46891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, subpel_avg_variance32x16_c),
46991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, subpel_avg_variance32x32_c),
47091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, subpel_avg_variance32x64_c),
47191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, subpel_avg_variance64x32_c),
47291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, subpel_avg_variance64x64_c)));
473ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
474ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if HAVE_MMX
475ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance4x4_mmx = vp9_variance4x4_mmx;
476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance8x8_mmx = vp9_variance8x8_mmx;
477ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance8x16_mmx = vp9_variance8x16_mmx;
478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance16x8_mmx = vp9_variance16x8_mmx;
479ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst vp9_variance_fn_t variance16x16_mmx = vp9_variance16x16_mmx;
480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(
481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    MMX, VP9VarianceTest,
48291037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, variance4x4_mmx),
48391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, variance8x8_mmx),
48491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, variance8x16_mmx),
48591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, variance16x8_mmx),
48691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, variance16x16_mmx)));
487ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
489ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if HAVE_SSE2
4901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_USE_X86INC
49191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance4x4_sse2 = vp9_variance4x4_sse2;
49291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance4x8_sse2 = vp9_variance4x8_sse2;
49391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance8x4_sse2 = vp9_variance8x4_sse2;
49491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance8x8_sse2 = vp9_variance8x8_sse2;
49591037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance8x16_sse2 = vp9_variance8x16_sse2;
49691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance16x8_sse2 = vp9_variance16x8_sse2;
49791037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance16x16_sse2 = vp9_variance16x16_sse2;
49891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance16x32_sse2 = vp9_variance16x32_sse2;
49991037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance32x16_sse2 = vp9_variance32x16_sse2;
50091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance32x32_sse2 = vp9_variance32x32_sse2;
50191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance32x64_sse2 = vp9_variance32x64_sse2;
50291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance64x32_sse2 = vp9_variance64x32_sse2;
50391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_variance_fn_t variance64x64_sse2 = vp9_variance64x64_sse2;
504ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(
505ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    SSE2, VP9VarianceTest,
50691037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, variance4x4_sse2),
50791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, variance4x8_sse2),
50891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, variance8x4_sse2),
50991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, variance8x8_sse2),
51091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, variance8x16_sse2),
51191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, variance16x8_sse2),
51291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, variance16x16_sse2),
51391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, variance16x32_sse2),
51491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, variance32x16_sse2),
51591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, variance32x32_sse2),
51691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, variance32x64_sse2),
51791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, variance64x32_sse2),
51891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, variance64x64_sse2)));
51991037db265ecdd914a26e056cf69207b4f50924ehkuang
52091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance4x4_sse =
52191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance4x4_sse;
52291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance4x8_sse =
52391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance4x8_sse;
52491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x4_sse2 =
52591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x4_sse2;
52691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x8_sse2 =
52791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x8_sse2;
52891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x16_sse2 =
52991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x16_sse2;
53091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x8_sse2 =
53191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x8_sse2;
53291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x16_sse2 =
53391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x16_sse2;
53491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x32_sse2 =
53591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x32_sse2;
53691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x16_sse2 =
53791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x16_sse2;
53891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x32_sse2 =
53991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x32_sse2;
54091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x64_sse2 =
54191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x64_sse2;
54291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance64x32_sse2 =
54391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance64x32_sse2;
54491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance64x64_sse2 =
54591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance64x64_sse2;
54691037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(
54791037db265ecdd914a26e056cf69207b4f50924ehkuang    SSE2, VP9SubpelVarianceTest,
54891037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, subpel_variance4x4_sse),
54991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, subpel_variance4x8_sse),
55091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, subpel_variance8x4_sse2),
55191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, subpel_variance8x8_sse2),
55291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, subpel_variance8x16_sse2),
55391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, subpel_variance16x8_sse2),
55491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, subpel_variance16x16_sse2),
55591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, subpel_variance16x32_sse2),
55691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, subpel_variance32x16_sse2),
55791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, subpel_variance32x32_sse2),
55891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, subpel_variance32x64_sse2),
55991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, subpel_variance64x32_sse2),
56091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, subpel_variance64x64_sse2)));
56191037db265ecdd914a26e056cf69207b4f50924ehkuang
56291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_sse =
56391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance4x4_sse;
56491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_sse =
56591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance4x8_sse;
56691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_sse2 =
56791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x4_sse2;
56891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_sse2 =
56991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x8_sse2;
57091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_sse2 =
57191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x16_sse2;
57291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_sse2 =
57391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x8_sse2;
57491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_sse2 =
57591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x16_sse2;
57691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_sse2 =
57791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x32_sse2;
57891037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_sse2 =
57991037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x16_sse2;
58091037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_sse2 =
58191037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x32_sse2;
58291037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_sse2 =
58391037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x64_sse2;
58491037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_sse2 =
58591037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance64x32_sse2;
58691037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_sse2 =
58791037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance64x64_sse2;
58891037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(
58991037db265ecdd914a26e056cf69207b4f50924ehkuang    SSE2, VP9SubpelAvgVarianceTest,
59091037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_sse),
59191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, subpel_avg_variance4x8_sse),
59291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, subpel_avg_variance8x4_sse2),
59391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, subpel_avg_variance8x8_sse2),
59491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, subpel_avg_variance8x16_sse2),
59591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, subpel_avg_variance16x8_sse2),
59691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, subpel_avg_variance16x16_sse2),
59791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, subpel_avg_variance16x32_sse2),
59891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, subpel_avg_variance32x16_sse2),
59991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, subpel_avg_variance32x32_sse2),
60091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, subpel_avg_variance32x64_sse2),
60191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, subpel_avg_variance64x32_sse2),
60291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, subpel_avg_variance64x64_sse2)));
60391037db265ecdd914a26e056cf69207b4f50924ehkuang#endif
6041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif
60591037db265ecdd914a26e056cf69207b4f50924ehkuang
60691037db265ecdd914a26e056cf69207b4f50924ehkuang#if HAVE_SSSE3
6071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_USE_X86INC
6081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
60991037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance4x4_ssse3 =
61091037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance4x4_ssse3;
61191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance4x8_ssse3 =
61291037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance4x8_ssse3;
61391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x4_ssse3 =
61491037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x4_ssse3;
61591037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x8_ssse3 =
61691037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x8_ssse3;
61791037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance8x16_ssse3 =
61891037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance8x16_ssse3;
61991037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x8_ssse3 =
62091037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x8_ssse3;
62191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x16_ssse3 =
62291037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x16_ssse3;
62391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance16x32_ssse3 =
62491037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance16x32_ssse3;
62591037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x16_ssse3 =
62691037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x16_ssse3;
62791037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x32_ssse3 =
62891037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x32_ssse3;
62991037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance32x64_ssse3 =
63091037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance32x64_ssse3;
63191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance64x32_ssse3 =
63291037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance64x32_ssse3;
63391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subpixvariance_fn_t subpel_variance64x64_ssse3 =
63491037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_variance64x64_ssse3;
63591037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(
63691037db265ecdd914a26e056cf69207b4f50924ehkuang    SSSE3, VP9SubpelVarianceTest,
63791037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, subpel_variance4x4_ssse3),
63891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, subpel_variance4x8_ssse3),
63991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, subpel_variance8x4_ssse3),
64091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, subpel_variance8x8_ssse3),
64191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, subpel_variance8x16_ssse3),
64291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, subpel_variance16x8_ssse3),
64391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, subpel_variance16x16_ssse3),
64491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, subpel_variance16x32_ssse3),
64591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, subpel_variance32x16_ssse3),
64691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, subpel_variance32x32_ssse3),
64791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, subpel_variance32x64_ssse3),
64891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, subpel_variance64x32_ssse3),
64991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, subpel_variance64x64_ssse3)));
65091037db265ecdd914a26e056cf69207b4f50924ehkuang
65191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_ssse3 =
65291037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance4x4_ssse3;
65391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_ssse3 =
65491037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance4x8_ssse3;
65591037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_ssse3 =
65691037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x4_ssse3;
65791037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_ssse3 =
65891037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x8_ssse3;
65991037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_ssse3 =
66091037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance8x16_ssse3;
66191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_ssse3 =
66291037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x8_ssse3;
66391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_ssse3 =
66491037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x16_ssse3;
66591037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_ssse3 =
66691037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance16x32_ssse3;
66791037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_ssse3 =
66891037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x16_ssse3;
66991037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_ssse3 =
67091037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x32_ssse3;
67191037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_ssse3 =
67291037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance32x64_ssse3;
67391037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_ssse3 =
67491037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance64x32_ssse3;
67591037db265ecdd914a26e056cf69207b4f50924ehkuangconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_ssse3 =
67691037db265ecdd914a26e056cf69207b4f50924ehkuang    vp9_sub_pixel_avg_variance64x64_ssse3;
67791037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(
67891037db265ecdd914a26e056cf69207b4f50924ehkuang    SSSE3, VP9SubpelAvgVarianceTest,
67991037db265ecdd914a26e056cf69207b4f50924ehkuang    ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_ssse3),
68091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(2, 3, subpel_avg_variance4x8_ssse3),
68191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 2, subpel_avg_variance8x4_ssse3),
68291037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 3, subpel_avg_variance8x8_ssse3),
68391037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(3, 4, subpel_avg_variance8x16_ssse3),
68491037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 3, subpel_avg_variance16x8_ssse3),
68591037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 4, subpel_avg_variance16x16_ssse3),
68691037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(4, 5, subpel_avg_variance16x32_ssse3),
68791037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 4, subpel_avg_variance32x16_ssse3),
68891037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 5, subpel_avg_variance32x32_ssse3),
68991037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(5, 6, subpel_avg_variance32x64_ssse3),
69091037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 5, subpel_avg_variance64x32_ssse3),
69191037db265ecdd914a26e056cf69207b4f50924ehkuang                      make_tuple(6, 6, subpel_avg_variance64x64_ssse3)));
692ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
6931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#endif
694ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // CONFIG_VP9_ENCODER
695ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
696ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}  // namespace vp9
697ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
698ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}  // namespace
699