1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h>
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <new>
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h"
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/clear_system_state.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/register_state_check.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_integer.h"
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vpx_config.h"
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h"
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include "./vp8_rtcd.h"
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include "vp8/common/variance.h"
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include "./vp9_rtcd.h"
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include "vp9/encoder/vp9_variance.h"
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/acm_random.h"
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan
31233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace {
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan
33233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::tr1::get;
34233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::tr1::make_tuple;
35233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::tr1::tuple;
36233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing libvpx_test::ACMRandom;
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan
38233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned int variance_ref(const uint8_t *ref, const uint8_t *src,
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                 int l2w, int l2h, unsigned int *sse_ptr) {
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int se = 0;
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int sse = 0;
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int w = 1 << l2w, h = 1 << l2h;
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (int y = 0; y < h; y++) {
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int x = 0; x < w; x++) {
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int diff = ref[w * y + x] - src[w * y + x];
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan      se += diff;
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan      sse += diff * diff;
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *sse_ptr = sse;
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return sse - (((int64_t) se * se) >> (l2w + l2h));
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan
54233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned int subpel_variance_ref(const uint8_t *ref, const uint8_t *src,
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                        int l2w, int l2h, int xoff, int yoff,
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                        unsigned int *sse_ptr) {
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int se = 0;
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int sse = 0;
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int w = 1 << l2w, h = 1 << l2h;
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (int y = 0; y < h; y++) {
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int x = 0; x < w; x++) {
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // bilinear interpolation at a 16th pel step
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int a1 = ref[(w + 1) * (y + 0) + x + 0];
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int a2 = ref[(w + 1) * (y + 0) + x + 1];
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int b1 = ref[(w + 1) * (y + 1) + x + 0];
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int b2 = ref[(w + 1) * (y + 1) + x + 1];
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int r = a + (((b - a) * yoff + 8) >> 4);
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int diff = r - src[w * y + x];
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan      se += diff;
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan      sse += diff * diff;
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *sse_ptr = sse;
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return sse - (((int64_t) se * se) >> (l2w + l2h));
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan
79233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename VarianceFunctionType>
80233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass VarianceTest
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ::testing::TestWithParam<tuple<int, int, VarianceFunctionType> > {
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void SetUp() {
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const tuple<int, int, VarianceFunctionType>& params = this->GetParam();
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan    log2width_  = get<0>(params);
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    width_ = 1 << log2width_;
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    log2height_ = get<1>(params);
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan    height_ = 1 << log2height_;
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan    variance_ = get<2>(params);
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rnd(ACMRandom::DeterministicSeed());
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    block_size_ = width_ * height_;
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan    src_ = new uint8_t[block_size_];
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ref_ = new uint8_t[block_size_];
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_TRUE(src_ != NULL);
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_TRUE(ref_ != NULL);
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TearDown() {
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    delete[] src_;
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    delete[] ref_;
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    libvpx_test::ClearSystemState();
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void ZeroTest();
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void RefTest();
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void OneQuarterTest();
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ACMRandom rnd;
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint8_t* src_;
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint8_t* ref_;
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int width_, log2width_;
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int height_, log2height_;
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int block_size_;
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan  VarianceFunctionType variance_;
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
119233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename VarianceFunctionType>
120233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid VarianceTest<VarianceFunctionType>::ZeroTest() {
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (int i = 0; i <= 255; ++i) {
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    memset(src_, i, block_size_);
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int j = 0; j <= 255; ++j) {
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan      memset(ref_, j, block_size_);
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan      unsigned int sse;
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan      unsigned int var;
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan      REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse));
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j;
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan
133233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename VarianceFunctionType>
134233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid VarianceTest<VarianceFunctionType>::RefTest() {
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (int i = 0; i < 10; ++i) {
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int j = 0; j < block_size_; j++) {
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan      src_[j] = rnd.Rand8();
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ref_[j] = rnd.Rand8();
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int sse1, sse2;
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int var1;
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    REGISTER_STATE_CHECK(var1 = variance_(src_, width_, ref_, width_, &sse1));
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned int var2 = variance_ref(src_, ref_, log2width_,
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                           log2height_, &sse2);
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPECT_EQ(sse1, sse2);
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPECT_EQ(var1, var2);
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan
150233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename VarianceFunctionType>
151233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid VarianceTest<VarianceFunctionType>::OneQuarterTest() {
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan  memset(src_, 255, block_size_);
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int half = block_size_ / 2;
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  memset(ref_, 255, half);
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan  memset(ref_ + half, 0, half);
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int sse;
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int var;
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan  REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse));
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const unsigned int expected = block_size_ * 255 * 255 / 4;
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_EQ(expected, var);
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan
165233d2500723e5594f3e7c70896ffeeef32b9c950ywanunsigned int subpel_avg_variance_ref(const uint8_t *ref,
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     const uint8_t *src,
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     const uint8_t *second_pred,
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     int l2w, int l2h,
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     int xoff, int yoff,
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     unsigned int *sse_ptr) {
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int se = 0;
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int sse = 0;
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int w = 1 << l2w, h = 1 << l2h;
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (int y = 0; y < h; y++) {
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int x = 0; x < w; x++) {
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // bilinear interpolation at a 16th pel step
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int a1 = ref[(w + 1) * (y + 0) + x + 0];
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int a2 = ref[(w + 1) * (y + 0) + x + 1];
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int b1 = ref[(w + 1) * (y + 1) + x + 0];
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int b2 = ref[(w + 1) * (y + 1) + x + 1];
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int r = a + (((b - a) * yoff + 8) >> 4);
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int diff = ((r + second_pred[w * y + x] + 1) >> 1) - src[w * y + x];
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan      se += diff;
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan      sse += diff * diff;
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *sse_ptr = sse;
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return sse - (((int64_t) se * se) >> (l2w + l2h));
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan
193233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename SubpelVarianceFunctionType>
194233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass SubpelVarianceTest
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ::testing::TestWithParam<tuple<int, int,
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            SubpelVarianceFunctionType> > {
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void SetUp() {
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const tuple<int, int, SubpelVarianceFunctionType>& params =
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan        this->GetParam();
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan    log2width_  = get<0>(params);
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    width_ = 1 << log2width_;
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan    log2height_ = get<1>(params);
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    height_ = 1 << log2height_;
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subpel_variance_ = get<2>(params);
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rnd(ACMRandom::DeterministicSeed());
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    block_size_ = width_ * height_;
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan    src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sec_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ref_ = new uint8_t[block_size_ + width_ + height_ + 1];
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_TRUE(src_ != NULL);
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_TRUE(sec_ != NULL);
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_TRUE(ref_ != NULL);
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TearDown() {
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_free(src_);
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    delete[] ref_;
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_free(sec_);
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    libvpx_test::ClearSystemState();
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void RefTest();
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ACMRandom rnd;
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint8_t *src_;
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint8_t *ref_;
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint8_t *sec_;
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int width_, log2width_;
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int height_, log2height_;
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int block_size_;
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  SubpelVarianceFunctionType subpel_variance_;
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan
237233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename SubpelVarianceFunctionType>
238233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() {
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (int x = 0; x < 16; ++x) {
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int y = 0; y < 16; ++y) {
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (int j = 0; j < block_size_; j++) {
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan        src_[j] = rnd.Rand8();
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ref_[j] = rnd.Rand8();
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan      unsigned int sse1, sse2;
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan      unsigned int var1;
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan      REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y,
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   src_, width_, &sse1));
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const unsigned int var2 = subpel_variance_ref(ref_, src_, log2width_,
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                    log2height_, x, y, &sse2);
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan
259233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<>
260233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid SubpelVarianceTest<vp9_subp_avg_variance_fn_t>::RefTest() {
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (int x = 0; x < 16; ++x) {
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int y = 0; y < 16; ++y) {
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (int j = 0; j < block_size_; j++) {
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan        src_[j] = rnd.Rand8();
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sec_[j] = rnd.Rand8();
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ref_[j] = rnd.Rand8();
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan      unsigned int sse1, sse2;
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan      unsigned int var1;
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan      REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y,
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   src_, width_, &sse1, sec_));
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const unsigned int var2 = subpel_avg_variance_ref(ref_, src_, sec_,
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                        log2width_, log2height_,
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                        x, y, &sse2);
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // CONFIG_VP9_ENCODER
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan// -----------------------------------------------------------------------------
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan// VP8 test cases.
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
288233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace vp8 {
289233d2500723e5594f3e7c70896ffeeef32b9c950ywan
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
291233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef VarianceTest<vp8_variance_fn_t> VP8VarianceTest;
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan
293233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP8VarianceTest, Zero) { ZeroTest(); }
294233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP8VarianceTest, Ref) { RefTest(); }
295233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP8VarianceTest, OneQuarter) { OneQuarterTest(); }
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan
297233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance4x4_c = vp8_variance4x4_c;
298233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x8_c = vp8_variance8x8_c;
299233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x16_c = vp8_variance8x16_c;
300233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x8_c = vp8_variance16x8_c;
301233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x16_c = vp8_variance16x16_c;
302233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
303233d2500723e5594f3e7c70896ffeeef32b9c950ywan    C, VP8VarianceTest,
304233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, variance4x4_c),
305233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, variance8x8_c),
306233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, variance8x16_c),
307233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, variance16x8_c),
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, variance16x16_c)));
309233d2500723e5594f3e7c70896ffeeef32b9c950ywan
310233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_NEON
311233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x8_neon = vp8_variance8x8_neon;
312233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x16_neon = vp8_variance8x16_neon;
313233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x8_neon = vp8_variance16x8_neon;
314233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x16_neon = vp8_variance16x16_neon;
315233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
316233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NEON, VP8VarianceTest,
317233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(3, 3, variance8x8_neon),
318233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, variance8x16_neon),
319233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, variance16x8_neon),
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, variance16x16_neon)));
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
322233d2500723e5594f3e7c70896ffeeef32b9c950ywan
323233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_MMX
324233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance4x4_mmx = vp8_variance4x4_mmx;
325233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x8_mmx = vp8_variance8x8_mmx;
326233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x16_mmx = vp8_variance8x16_mmx;
327233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x8_mmx = vp8_variance16x8_mmx;
328233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x16_mmx = vp8_variance16x16_mmx;
329233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MMX, VP8VarianceTest,
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, variance4x4_mmx),
332233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, variance8x8_mmx),
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, variance8x16_mmx),
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, variance16x8_mmx),
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, variance16x16_mmx)));
336233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSE2
339233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance4x4_wmt = vp8_variance4x4_wmt;
340233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x8_wmt = vp8_variance8x8_wmt;
341233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance8x16_wmt = vp8_variance8x16_wmt;
342233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x8_wmt = vp8_variance16x8_wmt;
343233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp8_variance_fn_t variance16x16_wmt = vp8_variance16x16_wmt;
344233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SSE2, VP8VarianceTest,
346233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, variance4x4_wmt),
347233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, variance8x8_wmt),
348233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, variance8x16_wmt),
349233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, variance16x8_wmt),
350233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, variance16x16_wmt)));
351233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
352233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // CONFIG_VP8_ENCODER
353233d2500723e5594f3e7c70896ffeeef32b9c950ywan
354233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace vp8
355233d2500723e5594f3e7c70896ffeeef32b9c950ywan
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan// -----------------------------------------------------------------------------
357233d2500723e5594f3e7c70896ffeeef32b9c950ywan// VP9 test cases.
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan
359233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace vp9 {
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
362233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef VarianceTest<vp9_variance_fn_t> VP9VarianceTest;
363233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef SubpelVarianceTest<vp9_subpixvariance_fn_t> VP9SubpelVarianceTest;
364233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef SubpelVarianceTest<vp9_subp_avg_variance_fn_t> VP9SubpelAvgVarianceTest;
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan
366233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP9VarianceTest, Zero) { ZeroTest(); }
367233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP9VarianceTest, Ref) { RefTest(); }
368233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP9SubpelVarianceTest, Ref) { RefTest(); }
369233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP9SubpelAvgVarianceTest, Ref) { RefTest(); }
370233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP9VarianceTest, OneQuarter) { OneQuarterTest(); }
371233d2500723e5594f3e7c70896ffeeef32b9c950ywan
372233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance4x4_c = vp9_variance4x4_c;
373233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance4x8_c = vp9_variance4x8_c;
374233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x4_c = vp9_variance8x4_c;
375233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x8_c = vp9_variance8x8_c;
376233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x16_c = vp9_variance8x16_c;
377233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x8_c = vp9_variance16x8_c;
378233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x16_c = vp9_variance16x16_c;
379233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x32_c = vp9_variance16x32_c;
380233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance32x16_c = vp9_variance32x16_c;
381233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance32x32_c = vp9_variance32x32_c;
382233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance32x64_c = vp9_variance32x64_c;
383233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance64x32_c = vp9_variance64x32_c;
384233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance64x64_c = vp9_variance64x64_c;
385233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
386233d2500723e5594f3e7c70896ffeeef32b9c950ywan    C, VP9VarianceTest,
387233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, variance4x4_c),
388233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, variance4x8_c),
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, variance8x4_c),
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, variance8x8_c),
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, variance8x16_c),
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, variance16x8_c),
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, variance16x16_c),
394233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, variance16x32_c),
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, variance32x16_c),
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, variance32x32_c),
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, variance32x64_c),
398233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, variance64x32_c),
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, variance64x64_c)));
400233d2500723e5594f3e7c70896ffeeef32b9c950ywan
401233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance4x4_c =
402233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance4x4_c;
403233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance4x8_c =
404233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance4x8_c;
405233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x4_c =
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x4_c;
407233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x8_c =
408233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x8_c;
409233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x16_c =
410233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x16_c;
411233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x8_c =
412233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x8_c;
413233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x16_c =
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x16_c;
415233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x32_c =
416233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x32_c;
417233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x16_c =
418233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x16_c;
419233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x32_c =
420233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x32_c;
421233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x64_c =
422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x64_c;
423233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance64x32_c =
424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance64x32_c;
425233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance64x64_c =
426233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance64x64_c;
427233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
428233d2500723e5594f3e7c70896ffeeef32b9c950ywan    C, VP9SubpelVarianceTest,
429233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, subpel_variance4x4_c),
430233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, subpel_variance4x8_c),
431233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, subpel_variance8x4_c),
432233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, subpel_variance8x8_c),
433233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, subpel_variance8x16_c),
434233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, subpel_variance16x8_c),
435233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, subpel_variance16x16_c),
436233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, subpel_variance16x32_c),
437233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, subpel_variance32x16_c),
438233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, subpel_variance32x32_c),
439233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, subpel_variance32x64_c),
440233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, subpel_variance64x32_c),
441233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, subpel_variance64x64_c)));
442233d2500723e5594f3e7c70896ffeeef32b9c950ywan
443233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_c =
444233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance4x4_c;
445233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_c =
446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance4x8_c;
447233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_c =
448233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x4_c;
449233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_c =
450233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x8_c;
451233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_c =
452233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x16_c;
453233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_c =
454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x8_c;
455233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_c =
456233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x16_c;
457233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_c =
458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x32_c;
459233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_c =
460233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x16_c;
461233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_c =
462233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x32_c;
463233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_c =
464233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x64_c;
465233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_c =
466233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance64x32_c;
467233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_c =
468233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance64x64_c;
469233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
470233d2500723e5594f3e7c70896ffeeef32b9c950ywan    C, VP9SubpelAvgVarianceTest,
471233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_c),
472233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, subpel_avg_variance4x8_c),
473233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, subpel_avg_variance8x4_c),
474233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, subpel_avg_variance8x8_c),
475233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, subpel_avg_variance8x16_c),
476233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, subpel_avg_variance16x8_c),
477233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, subpel_avg_variance16x16_c),
478233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, subpel_avg_variance16x32_c),
479233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, subpel_avg_variance32x16_c),
480233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, subpel_avg_variance32x32_c),
481233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, subpel_avg_variance32x64_c),
482233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, subpel_avg_variance64x32_c),
483233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, subpel_avg_variance64x64_c)));
484233d2500723e5594f3e7c70896ffeeef32b9c950ywan
485233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_MMX
486233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance4x4_mmx = vp9_variance4x4_mmx;
487233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x8_mmx = vp9_variance8x8_mmx;
488233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x16_mmx = vp9_variance8x16_mmx;
489233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x8_mmx = vp9_variance16x8_mmx;
490233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x16_mmx = vp9_variance16x16_mmx;
491233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
492233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MMX, VP9VarianceTest,
493233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, variance4x4_mmx),
494233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, variance8x8_mmx),
495233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, variance8x16_mmx),
496233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, variance16x8_mmx),
497233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, variance16x16_mmx)));
498233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
499233d2500723e5594f3e7c70896ffeeef32b9c950ywan
500233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSE2
501233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_USE_X86INC
502233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance4x4_sse2 = vp9_variance4x4_sse2;
503233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance4x8_sse2 = vp9_variance4x8_sse2;
504233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x4_sse2 = vp9_variance8x4_sse2;
505233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x8_sse2 = vp9_variance8x8_sse2;
506233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance8x16_sse2 = vp9_variance8x16_sse2;
507233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x8_sse2 = vp9_variance16x8_sse2;
508233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x16_sse2 = vp9_variance16x16_sse2;
509233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance16x32_sse2 = vp9_variance16x32_sse2;
510233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance32x16_sse2 = vp9_variance32x16_sse2;
511233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance32x32_sse2 = vp9_variance32x32_sse2;
512233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance32x64_sse2 = vp9_variance32x64_sse2;
513233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance64x32_sse2 = vp9_variance64x32_sse2;
514233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_variance_fn_t variance64x64_sse2 = vp9_variance64x64_sse2;
515233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
516233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SSE2, VP9VarianceTest,
517233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, variance4x4_sse2),
518233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, variance4x8_sse2),
519233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, variance8x4_sse2),
520233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, variance8x8_sse2),
521233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, variance8x16_sse2),
522233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, variance16x8_sse2),
523233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, variance16x16_sse2),
524233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, variance16x32_sse2),
525233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, variance32x16_sse2),
526233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, variance32x32_sse2),
527233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, variance32x64_sse2),
528233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, variance64x32_sse2),
529233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, variance64x64_sse2)));
530233d2500723e5594f3e7c70896ffeeef32b9c950ywan
531233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance4x4_sse =
532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance4x4_sse;
533233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance4x8_sse =
534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance4x8_sse;
535233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x4_sse2 =
536233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x4_sse2;
537233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x8_sse2 =
538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x8_sse2;
539233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x16_sse2 =
540233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x16_sse2;
541233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x8_sse2 =
542233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x8_sse2;
543233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x16_sse2 =
544233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x16_sse2;
545233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x32_sse2 =
546233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x32_sse2;
547233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x16_sse2 =
548233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x16_sse2;
549233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x32_sse2 =
550233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x32_sse2;
551233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x64_sse2 =
552233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x64_sse2;
553233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance64x32_sse2 =
554233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance64x32_sse2;
555233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance64x64_sse2 =
556233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance64x64_sse2;
557233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
558233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SSE2, VP9SubpelVarianceTest,
559233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, subpel_variance4x4_sse),
560233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, subpel_variance4x8_sse),
561233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, subpel_variance8x4_sse2),
562233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, subpel_variance8x8_sse2),
563233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, subpel_variance8x16_sse2),
564233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, subpel_variance16x8_sse2),
565233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, subpel_variance16x16_sse2),
566233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, subpel_variance16x32_sse2),
567233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, subpel_variance32x16_sse2),
568233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, subpel_variance32x32_sse2),
569233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, subpel_variance32x64_sse2),
570233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, subpel_variance64x32_sse2),
571233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, subpel_variance64x64_sse2)));
572233d2500723e5594f3e7c70896ffeeef32b9c950ywan
573233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_sse =
574233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance4x4_sse;
575233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_sse =
576233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance4x8_sse;
577233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_sse2 =
578233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x4_sse2;
579233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_sse2 =
580233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x8_sse2;
581233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_sse2 =
582233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x16_sse2;
583233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_sse2 =
584233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x8_sse2;
585233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_sse2 =
586233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x16_sse2;
587233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_sse2 =
588233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x32_sse2;
589233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_sse2 =
590233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x16_sse2;
591233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_sse2 =
592233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x32_sse2;
593233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_sse2 =
594233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x64_sse2;
595233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_sse2 =
596233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance64x32_sse2;
597233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_sse2 =
598233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance64x64_sse2;
599233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
600233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SSE2, VP9SubpelAvgVarianceTest,
601233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_sse),
602233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, subpel_avg_variance4x8_sse),
603233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, subpel_avg_variance8x4_sse2),
604233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, subpel_avg_variance8x8_sse2),
605233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, subpel_avg_variance8x16_sse2),
606233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, subpel_avg_variance16x8_sse2),
607233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, subpel_avg_variance16x16_sse2),
608233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, subpel_avg_variance16x32_sse2),
609233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, subpel_avg_variance32x16_sse2),
610233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, subpel_avg_variance32x32_sse2),
611233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, subpel_avg_variance32x64_sse2),
612233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, subpel_avg_variance64x32_sse2),
613233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, subpel_avg_variance64x64_sse2)));
614233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
615233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
616233d2500723e5594f3e7c70896ffeeef32b9c950ywan
617233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSSE3
618233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_USE_X86INC
619233d2500723e5594f3e7c70896ffeeef32b9c950ywan
620233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance4x4_ssse3 =
621233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance4x4_ssse3;
622233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance4x8_ssse3 =
623233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance4x8_ssse3;
624233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x4_ssse3 =
625233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x4_ssse3;
626233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x8_ssse3 =
627233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x8_ssse3;
628233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance8x16_ssse3 =
629233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance8x16_ssse3;
630233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x8_ssse3 =
631233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x8_ssse3;
632233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x16_ssse3 =
633233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x16_ssse3;
634233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance16x32_ssse3 =
635233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance16x32_ssse3;
636233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x16_ssse3 =
637233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x16_ssse3;
638233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x32_ssse3 =
639233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x32_ssse3;
640233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance32x64_ssse3 =
641233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance32x64_ssse3;
642233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance64x32_ssse3 =
643233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance64x32_ssse3;
644233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subpixvariance_fn_t subpel_variance64x64_ssse3 =
645233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_variance64x64_ssse3;
646233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
647233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SSSE3, VP9SubpelVarianceTest,
648233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, subpel_variance4x4_ssse3),
649233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, subpel_variance4x8_ssse3),
650233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, subpel_variance8x4_ssse3),
651233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, subpel_variance8x8_ssse3),
652233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, subpel_variance8x16_ssse3),
653233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, subpel_variance16x8_ssse3),
654233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, subpel_variance16x16_ssse3),
655233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, subpel_variance16x32_ssse3),
656233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, subpel_variance32x16_ssse3),
657233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, subpel_variance32x32_ssse3),
658233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, subpel_variance32x64_ssse3),
659233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, subpel_variance64x32_ssse3),
660233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, subpel_variance64x64_ssse3)));
661233d2500723e5594f3e7c70896ffeeef32b9c950ywan
662233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_ssse3 =
663233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance4x4_ssse3;
664233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_ssse3 =
665233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance4x8_ssse3;
666233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_ssse3 =
667233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x4_ssse3;
668233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_ssse3 =
669233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x8_ssse3;
670233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_ssse3 =
671233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance8x16_ssse3;
672233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_ssse3 =
673233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x8_ssse3;
674233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_ssse3 =
675233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x16_ssse3;
676233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_ssse3 =
677233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance16x32_ssse3;
678233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_ssse3 =
679233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x16_ssse3;
680233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_ssse3 =
681233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x32_ssse3;
682233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_ssse3 =
683233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance32x64_ssse3;
684233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_ssse3 =
685233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance64x32_ssse3;
686233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_ssse3 =
687233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp9_sub_pixel_avg_variance64x64_ssse3;
688233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(
689233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SSSE3, VP9SubpelAvgVarianceTest,
690233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_ssse3),
691233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(2, 3, subpel_avg_variance4x8_ssse3),
692233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 2, subpel_avg_variance8x4_ssse3),
693233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 3, subpel_avg_variance8x8_ssse3),
694233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(3, 4, subpel_avg_variance8x16_ssse3),
695233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 3, subpel_avg_variance16x8_ssse3),
696233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 4, subpel_avg_variance16x16_ssse3),
697233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(4, 5, subpel_avg_variance16x32_ssse3),
698233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 4, subpel_avg_variance32x16_ssse3),
699233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 5, subpel_avg_variance32x32_ssse3),
700233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(5, 6, subpel_avg_variance32x64_ssse3),
701233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 5, subpel_avg_variance64x32_ssse3),
702233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      make_tuple(6, 6, subpel_avg_variance64x64_ssse3)));
703233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
704233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
705233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // CONFIG_VP9_ENCODER
706233d2500723e5594f3e7c70896ffeeef32b9c950ywan
707233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace vp9
708233d2500723e5594f3e7c70896ffeeef32b9c950ywan
709233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace
710