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
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h>
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits.h>
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h>
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vpx_config.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vp8_rtcd.h"
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vp9_rtcd.h"
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h"
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/acm_random.h"
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/clear_system_state.h"
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/register_state_check.h"
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/util.h"
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h"
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan
32233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef unsigned int (*sad_m_by_n_fn_t)(const unsigned char *source_ptr,
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                        int source_stride,
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                        const unsigned char *reference_ptr,
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                        int reference_stride,
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                        unsigned int max_sad);
37233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef std::tr1::tuple<int, int, sad_m_by_n_fn_t> sad_m_by_n_test_param_t;
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan
39233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*sad_n_by_n_by_4_fn_t)(const uint8_t *src_ptr,
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     int src_stride,
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     const unsigned char * const ref_ptr[],
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     int ref_stride,
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     unsigned int *sad_array);
44233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef std::tr1::tuple<int, int, sad_n_by_n_by_4_fn_t>
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sad_n_by_n_by_4_test_param_t;
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing libvpx_test::ACMRandom;
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan
49233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace {
50233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass SADTestBase : public ::testing::Test {
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan  SADTestBase(int width, int height) : width_(width), height_(height) {}
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void SetUpTestCase() {
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan    source_data_ = reinterpret_cast<uint8_t*>(
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan        vpx_memalign(kDataAlignment, kDataBlockSize));
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan    reference_data_ = reinterpret_cast<uint8_t*>(
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan        vpx_memalign(kDataAlignment, kDataBufferSize));
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void TearDownTestCase() {
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_free(source_data_);
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan    source_data_ = NULL;
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_free(reference_data_);
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan    reference_data_ = NULL;
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TearDown() {
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    libvpx_test::ClearSystemState();
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Handle blocks up to 4 blocks 64x64 with stride up to 128
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int kDataAlignment = 16;
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int kDataBlockSize = 64 * 128;
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int kDataBufferSize = 4 * kDataBlockSize;
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void SetUp() {
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    source_stride_ = (width_ + 31) & ~31;
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan    reference_stride_ = width_ * 2;
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rnd_.Reset(ACMRandom::DeterministicSeed());
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual uint8_t* GetReference(int block_idx) {
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return reference_data_ + block_idx * kDataBlockSize;
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sum of Absolute Differences. Given two blocks, calculate the absolute
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // difference between two pixels in the same relative location; accumulate.
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int ReferenceSAD(unsigned int max_sad, int block_idx = 0) {
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int sad = 0;
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const uint8_t* const reference = GetReference(block_idx);
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int h = 0; h < height_; ++h) {
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (int w = 0; w < width_; ++w) {
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sad += abs(source_data_[h * source_stride_ + w]
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan               - reference[h * reference_stride_ + w]);
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (sad > max_sad) {
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan        break;
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return sad;
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void FillConstant(uint8_t *data, int stride, uint8_t fill_constant) {
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int h = 0; h < height_; ++h) {
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (int w = 0; w < width_; ++w) {
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        data[h * stride + w] = fill_constant;
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void FillRandom(uint8_t *data, int stride) {
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int h = 0; h < height_; ++h) {
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (int w = 0; w < width_; ++w) {
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan        data[h * stride + w] = rnd_.Rand8();
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int width_, height_;
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static uint8_t* source_data_;
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int source_stride_;
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static uint8_t* reference_data_;
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int reference_stride_;
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ACMRandom rnd_;
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan
131233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass SADTest : public SADTestBase,
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    public ::testing::WithParamInterface<sad_m_by_n_test_param_t> {
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  SADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int SAD(unsigned int max_sad, int block_idx = 0) {
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int ret;
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const uint8_t* const reference = GetReference(block_idx);
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_,
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            reference, reference_stride_,
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            max_sad));
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ret;
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void CheckSad(unsigned int max_sad) {
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int reference_sad, exp_sad;
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    reference_sad = ReferenceSAD(max_sad);
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    exp_sad = SAD(max_sad);
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (reference_sad <= max_sad) {
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ASSERT_EQ(exp_sad, reference_sad);
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Alternative implementations are not required to check max_sad
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ASSERT_GE(exp_sad, reference_sad);
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
162233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass SADx4Test : public SADTestBase,
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    public ::testing::WithParamInterface<sad_n_by_n_by_4_test_param_t> {
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  SADx4Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void SADs(unsigned int *results) {
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const uint8_t* refs[] = {GetReference(0), GetReference(1),
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan                             GetReference(2), GetReference(3)};
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_,
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      refs, reference_stride_,
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      results));
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void CheckSADs() {
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int reference_sad, exp_sad[4];
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SADs(exp_sad);
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (int block = 0; block < 4; block++) {
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan      reference_sad = ReferenceSAD(UINT_MAX, block);
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(exp_sad[block], reference_sad) << "block " << block;
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan
189233d2500723e5594f3e7c70896ffeeef32b9c950ywanuint8_t* SADTestBase::source_data_ = NULL;
190233d2500723e5594f3e7c70896ffeeef32b9c950ywanuint8_t* SADTestBase::reference_data_ = NULL;
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan
192233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADTest, MaxRef) {
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(source_data_, source_stride_, 0);
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(reference_data_, reference_stride_, 255);
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSad(UINT_MAX);
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan
198233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADx4Test, MaxRef) {
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(source_data_, source_stride_, 0);
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(0), reference_stride_, 255);
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(1), reference_stride_, 255);
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(2), reference_stride_, 255);
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(3), reference_stride_, 255);
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSADs();
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan
207233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADTest, MaxSrc) {
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(source_data_, source_stride_, 255);
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(reference_data_, reference_stride_, 0);
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSad(UINT_MAX);
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan
213233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADx4Test, MaxSrc) {
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(source_data_, source_stride_, 255);
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(0), reference_stride_, 0);
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(1), reference_stride_, 0);
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(2), reference_stride_, 0);
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(GetReference(3), reference_stride_, 0);
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSADs();
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan
222233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADTest, ShortRef) {
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int tmp_stride = reference_stride_;
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ >>= 1;
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(source_data_, source_stride_);
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(reference_data_, reference_stride_);
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSad(UINT_MAX);
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ = tmp_stride;
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan
231233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADx4Test, ShortRef) {
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int tmp_stride = reference_stride_;
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ >>= 1;
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(source_data_, source_stride_);
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(0), reference_stride_);
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(1), reference_stride_);
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(2), reference_stride_);
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(3), reference_stride_);
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSADs();
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ = tmp_stride;
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan
243233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADTest, UnalignedRef) {
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The reference frame, but not the source frame, may be unaligned for
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // certain types of searches.
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int tmp_stride = reference_stride_;
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ -= 1;
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(source_data_, source_stride_);
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(reference_data_, reference_stride_);
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSad(UINT_MAX);
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ = tmp_stride;
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan
254233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADx4Test, UnalignedRef) {
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The reference frame, but not the source frame, may be unaligned for
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // certain types of searches.
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int tmp_stride = reference_stride_;
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ -= 1;
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(source_data_, source_stride_);
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(0), reference_stride_);
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(1), reference_stride_);
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(2), reference_stride_);
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(3), reference_stride_);
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSADs();
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan  reference_stride_ = tmp_stride;
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan
268233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADTest, ShortSrc) {
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int tmp_stride = source_stride_;
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  source_stride_ >>= 1;
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(source_data_, source_stride_);
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(reference_data_, reference_stride_);
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSad(UINT_MAX);
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  source_stride_ = tmp_stride;
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan
277233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADx4Test, ShortSrc) {
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int tmp_stride = source_stride_;
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan  source_stride_ >>= 1;
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(source_data_, source_stride_);
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(0), reference_stride_);
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(1), reference_stride_);
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(2), reference_stride_);
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillRandom(GetReference(3), reference_stride_);
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSADs();
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan  source_stride_ = tmp_stride;
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan
289233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(SADTest, MaxSAD) {
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Verify that, when max_sad is set, the implementation does not return a
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // value lower than the reference.
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(source_data_, source_stride_, 255);
293233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FillConstant(reference_data_, reference_stride_, 0);
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CheckSad(128);
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan
297233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing std::tr1::make_tuple;
298233d2500723e5594f3e7c70896ffeeef32b9c950ywan
299233d2500723e5594f3e7c70896ffeeef32b9c950ywan//------------------------------------------------------------------------------
300233d2500723e5594f3e7c70896ffeeef32b9c950ywan// C functions
301233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
302233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_c = vp8_sad16x16_c;
303233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x16_c = vp8_sad8x16_c;
304233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x8_c = vp8_sad16x8_c;
305233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x8_c = vp8_sad8x8_c;
306233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x4_c = vp8_sad4x4_c;
307233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
309233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_64x64_c_vp9 = vp9_sad64x64_c;
310233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_32x32_c_vp9 = vp9_sad32x32_c;
311233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_c_vp9 = vp9_sad16x16_c;
312233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x16_c_vp9 = vp9_sad8x16_c;
313233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x8_c_vp9 = vp9_sad16x8_c;
314233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x8_c_vp9 = vp9_sad8x8_c;
315233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x4_c_vp9 = vp9_sad8x4_c;
316233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x8_c_vp9 = vp9_sad4x8_c;
317233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x4_c_vp9 = vp9_sad4x4_c;
318233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
319233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_test_param_t c_tests[] = {
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 16, sad_16x16_c),
322233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 16, sad_8x16_c),
323233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 8, sad_16x8_c),
324233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 8, sad_8x8_c),
325233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(4, 4, sad_4x4_c),
326233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
327233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(64, 64, sad_64x64_c_vp9),
329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(32, 32, sad_32x32_c_vp9),
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 16, sad_16x16_c_vp9),
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 16, sad_8x16_c_vp9),
332233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 8, sad_16x8_c_vp9),
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 8, sad_8x8_c_vp9),
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 4, sad_8x4_c_vp9),
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(4, 8, sad_4x8_c_vp9),
336233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(4, 4, sad_4x4_c_vp9),
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
339233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests));
340233d2500723e5594f3e7c70896ffeeef32b9c950ywan
341233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
342233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_64x64x4d_c = vp9_sad64x64x4d_c;
343233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_64x32x4d_c = vp9_sad64x32x4d_c;
344233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_32x64x4d_c = vp9_sad32x64x4d_c;
345233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_32x32x4d_c = vp9_sad32x32x4d_c;
346233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_32x16x4d_c = vp9_sad32x16x4d_c;
347233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x32x4d_c = vp9_sad16x32x4d_c;
348233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x16x4d_c = vp9_sad16x16x4d_c;
349233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x8x4d_c = vp9_sad16x8x4d_c;
350233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x16x4d_c = vp9_sad8x16x4d_c;
351233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x8x4d_c = vp9_sad8x8x4d_c;
352233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x4x4d_c = vp9_sad8x4x4d_c;
353233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_4x8x4d_c = vp9_sad4x8x4d_c;
354233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_4x4x4d_c = vp9_sad4x4x4d_c;
355233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::Values(
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(64, 64, sad_64x64x4d_c),
357233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(64, 32, sad_64x32x4d_c),
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(32, 64, sad_32x64x4d_c),
359233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(32, 32, sad_32x32x4d_c),
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(32, 16, sad_32x16x4d_c),
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 32, sad_16x32x4d_c),
362233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 16, sad_16x16x4d_c),
363233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 8, sad_16x8x4d_c),
364233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 16, sad_8x16x4d_c),
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 8, sad_8x8x4d_c),
366233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 4, sad_8x4x4d_c),
367233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 8, sad_4x8x4d_c),
368233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 4, sad_4x4x4d_c)));
369233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // CONFIG_VP9_ENCODER
370233d2500723e5594f3e7c70896ffeeef32b9c950ywan
371233d2500723e5594f3e7c70896ffeeef32b9c950ywan//------------------------------------------------------------------------------
372233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ARM functions
373233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_MEDIA
374233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
375233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_armv6 = vp8_sad16x16_armv6;
376233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::Values(
377233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 16, sad_16x16_armv6)));
378233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
379233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
380233d2500723e5594f3e7c70896ffeeef32b9c950ywan
381233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_NEON
382233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
383233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_neon = vp8_sad16x16_neon;
384233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x16_neon = vp8_sad8x16_neon;
385233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x8_neon = vp8_sad16x8_neon;
386233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x8_neon = vp8_sad8x8_neon;
387233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x4_neon = vp8_sad4x4_neon;
388233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::Values(
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 16, sad_16x16_neon),
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 16, sad_8x16_neon),
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 8, sad_16x8_neon),
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 8, sad_8x8_neon),
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 4, sad_4x4_neon)));
394233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan//------------------------------------------------------------------------------
398233d2500723e5594f3e7c70896ffeeef32b9c950ywan// x86 functions
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_MMX
400233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
401233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_mmx = vp8_sad16x16_mmx;
402233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x16_mmx = vp8_sad8x16_mmx;
403233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x8_mmx = vp8_sad16x8_mmx;
404233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x8_mmx = vp8_sad8x8_mmx;
405233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x4_mmx = vp8_sad4x4_mmx;
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
407233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
408233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_mmx_vp9 = vp9_sad16x16_mmx;
409233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x16_mmx_vp9 = vp9_sad8x16_mmx;
410233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x8_mmx_vp9 = vp9_sad16x8_mmx;
411233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x8_mmx_vp9 = vp9_sad8x8_mmx;
412233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x4_mmx_vp9 = vp9_sad4x4_mmx;
413233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan
415233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_test_param_t mmx_tests[] = {
416233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 16, sad_16x16_mmx),
418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 16, sad_8x16_mmx),
419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 8, sad_16x8_mmx),
420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 8, sad_8x8_mmx),
421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(4, 4, sad_4x4_mmx),
422233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
423233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 16, sad_16x16_mmx_vp9),
425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 16, sad_8x16_mmx_vp9),
426233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 8, sad_16x8_mmx_vp9),
427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 8, sad_8x8_mmx_vp9),
428233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(4, 4, sad_4x4_mmx_vp9),
429233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
430233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
431233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(MMX, SADTest, ::testing::ValuesIn(mmx_tests));
432233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
434233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSE
435233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
436233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_USE_X86INC
437233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x4_sse_vp9 = vp9_sad4x4_sse;
438233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x8_sse_vp9 = vp9_sad4x8_sse;
439233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(SSE, SADTest, ::testing::Values(
440233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 4, sad_4x4_sse_vp9),
441233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 8, sad_4x8_sse_vp9)));
442233d2500723e5594f3e7c70896ffeeef32b9c950ywan
443233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_4x8x4d_sse = vp9_sad4x8x4d_sse;
444233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_4x4x4d_sse = vp9_sad4x4x4d_sse;
445233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(SSE, SADx4Test, ::testing::Values(
446233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 8, sad_4x8x4d_sse),
447233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 4, sad_4x4x4d_sse)));
448233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // CONFIG_USE_X86INC
449233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // CONFIG_VP9_ENCODER
450233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // HAVE_SSE
451233d2500723e5594f3e7c70896ffeeef32b9c950ywan
452233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSE2
453233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
454233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_wmt = vp8_sad16x16_wmt;
455233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x16_wmt = vp8_sad8x16_wmt;
456233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x8_wmt = vp8_sad16x8_wmt;
457233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x8_wmt = vp8_sad8x8_wmt;
458233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_4x4_wmt = vp8_sad4x4_wmt;
459233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
460233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
461233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_USE_X86INC
462233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_64x64_sse2_vp9 = vp9_sad64x64_sse2;
463233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_64x32_sse2_vp9 = vp9_sad64x32_sse2;
464233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_32x64_sse2_vp9 = vp9_sad32x64_sse2;
465233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_32x32_sse2_vp9 = vp9_sad32x32_sse2;
466233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_32x16_sse2_vp9 = vp9_sad32x16_sse2;
467233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x32_sse2_vp9 = vp9_sad16x32_sse2;
468233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_sse2_vp9 = vp9_sad16x16_sse2;
469233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x8_sse2_vp9 = vp9_sad16x8_sse2;
470233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x16_sse2_vp9 = vp9_sad8x16_sse2;
471233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x8_sse2_vp9 = vp9_sad8x8_sse2;
472233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_8x4_sse2_vp9 = vp9_sad8x4_sse2;
473233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
474233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
475233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_test_param_t sse2_tests[] = {
476233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
477233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 16, sad_16x16_wmt),
478233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 16, sad_8x16_wmt),
479233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 8, sad_16x8_wmt),
480233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 8, sad_8x8_wmt),
481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(4, 4, sad_4x4_wmt),
482233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
483233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
484233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_USE_X86INC
485233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(64, 64, sad_64x64_sse2_vp9),
486233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(64, 32, sad_64x32_sse2_vp9),
487233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(32, 64, sad_32x64_sse2_vp9),
488233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(32, 32, sad_32x32_sse2_vp9),
489233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(32, 16, sad_32x16_sse2_vp9),
490233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 32, sad_16x32_sse2_vp9),
491233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 16, sad_16x16_sse2_vp9),
492233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(16, 8, sad_16x8_sse2_vp9),
493233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 16, sad_8x16_sse2_vp9),
494233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 8, sad_8x8_sse2_vp9),
495233d2500723e5594f3e7c70896ffeeef32b9c950ywan  make_tuple(8, 4, sad_8x4_sse2_vp9),
496233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
497233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
498233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
499233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
500233d2500723e5594f3e7c70896ffeeef32b9c950ywan
501233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9_ENCODER
502233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_USE_X86INC
503233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_64x64x4d_sse2 = vp9_sad64x64x4d_sse2;
504233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_64x32x4d_sse2 = vp9_sad64x32x4d_sse2;
505233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_32x64x4d_sse2 = vp9_sad32x64x4d_sse2;
506233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_32x32x4d_sse2 = vp9_sad32x32x4d_sse2;
507233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_32x16x4d_sse2 = vp9_sad32x16x4d_sse2;
508233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x32x4d_sse2 = vp9_sad16x32x4d_sse2;
509233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x16x4d_sse2 = vp9_sad16x16x4d_sse2;
510233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x8x4d_sse2 = vp9_sad16x8x4d_sse2;
511233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x16x4d_sse2 = vp9_sad8x16x4d_sse2;
512233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x8x4d_sse2 = vp9_sad8x8x4d_sse2;
513233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x4x4d_sse2 = vp9_sad8x4x4d_sse2;
514233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::Values(
515233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(64, 64, sad_64x64x4d_sse2),
516233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(64, 32, sad_64x32x4d_sse2),
517233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(32, 64, sad_32x64x4d_sse2),
518233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(32, 32, sad_32x32x4d_sse2),
519233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(32, 16, sad_32x16x4d_sse2),
520233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 32, sad_16x32x4d_sse2),
521233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 16, sad_16x16x4d_sse2),
522233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 8, sad_16x8x4d_sse2),
523233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 16, sad_8x16x4d_sse2),
524233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 8, sad_8x8x4d_sse2),
525233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 4, sad_8x4x4d_sse2)));
526233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
527233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
528233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
529233d2500723e5594f3e7c70896ffeeef32b9c950ywan
530233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSE3
531233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
532233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x16x4d_sse3 = vp8_sad16x16x4d_sse3;
533233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_16x8x4d_sse3 = vp8_sad16x8x4d_sse3;
534233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x16x4d_sse3 = vp8_sad8x16x4d_sse3;
535233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_8x8x4d_sse3 = vp8_sad8x8x4d_sse3;
536233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_n_by_n_by_4_fn_t sad_4x4x4d_sse3 = vp8_sad4x4x4d_sse3;
537233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(SSE3, SADx4Test, ::testing::Values(
538233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 16, sad_16x16x4d_sse3),
539233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 8, sad_16x8x4d_sse3),
540233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 16, sad_8x16x4d_sse3),
541233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(8, 8, sad_8x8x4d_sse3),
542233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(4, 4, sad_4x4x4d_sse3)));
543233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
544233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
545233d2500723e5594f3e7c70896ffeeef32b9c950ywan
546233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSSE3
547233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_USE_X86INC
548233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8_ENCODER
549233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst sad_m_by_n_fn_t sad_16x16_sse3 = vp8_sad16x16_sse3;
550233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(SSE3, SADTest, ::testing::Values(
551233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        make_tuple(16, 16, sad_16x16_sse3)));
552233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
553233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
554233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
555233d2500723e5594f3e7c70896ffeeef32b9c950ywan
556233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace
557