1ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/*
2ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *
4ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  Use of this source code is governed by a BSD-style license
5ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  that can be found in the LICENSE file in the root of the source
6ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  tree. An additional intellectual property rights grant can be found
7ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  in the file PATENTS.  All contributing project authors may
8ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
10ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
11ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
12ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include <string.h>
13ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include <limits.h>
14ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include <stdio.h>
15ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
16ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "./vpx_config.h"
17923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP8_ENCODER
186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "./vp8_rtcd.h"
19923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#endif
20923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP9_ENCODER
21923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "./vp9_rtcd.h"
22923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#endif
23ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vpx_mem/vpx_mem.h"
24ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
25ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "test/acm_random.h"
267c1508f4449fe8184aa045737c20ba37e603dd03fgalligan@chromium.org#include "test/clear_system_state.h"
27d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#include "test/register_state_check.h"
28ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "test/util.h"
29ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h"
30ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
31ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
3288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_VP8_ENCODER
33ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef unsigned int (*SadMxNFunc)(const unsigned char *source_ptr,
34ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                                   int source_stride,
35ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                                   const unsigned char *reference_ptr,
36ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                                   int reference_stride,
37ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                                   unsigned int max_sad);
38ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef std::tr1::tuple<int, int, SadMxNFunc> SadMxNParam;
3988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
4088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_VP9_ENCODER
41ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef unsigned int (*SadMxNVp9Func)(const unsigned char *source_ptr,
42ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                                      int source_stride,
43ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                                      const unsigned char *reference_ptr,
44ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                                      int reference_stride);
45ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef std::tr1::tuple<int, int, SadMxNVp9Func> SadMxNVp9Param;
4688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
47ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
48ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef void (*SadMxNx4Func)(const uint8_t *src_ptr,
49ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             int src_stride,
50ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             const unsigned char *const ref_ptr[],
51ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             int ref_stride,
52ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             unsigned int *sad_array);
53ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef std::tr1::tuple<int, int, SadMxNx4Func> SadMxNx4Param;
54923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
55ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgusing libvpx_test::ACMRandom;
56ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
57ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgnamespace {
58923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgclass SADTestBase : public ::testing::Test {
59ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org public:
60923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  SADTestBase(int width, int height) : width_(width), height_(height) {}
61923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
62ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  static void SetUpTestCase() {
63ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    source_data_ = reinterpret_cast<uint8_t*>(
64923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        vpx_memalign(kDataAlignment, kDataBlockSize));
65ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    reference_data_ = reinterpret_cast<uint8_t*>(
66ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vpx_memalign(kDataAlignment, kDataBufferSize));
67ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
68ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
69ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  static void TearDownTestCase() {
70ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(source_data_);
71ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    source_data_ = NULL;
72ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vpx_free(reference_data_);
73ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    reference_data_ = NULL;
74ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
75ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
767c1508f4449fe8184aa045737c20ba37e603dd03fgalligan@chromium.org  virtual void TearDown() {
777c1508f4449fe8184aa045737c20ba37e603dd03fgalligan@chromium.org    libvpx_test::ClearSystemState();
787c1508f4449fe8184aa045737c20ba37e603dd03fgalligan@chromium.org  }
797c1508f4449fe8184aa045737c20ba37e603dd03fgalligan@chromium.org
80ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org protected:
81923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // Handle blocks up to 4 blocks 64x64 with stride up to 128
82ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  static const int kDataAlignment = 16;
83923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  static const int kDataBlockSize = 64 * 128;
84923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  static const int kDataBufferSize = 4 * kDataBlockSize;
85ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
86ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void SetUp() {
87923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    source_stride_ = (width_ + 31) & ~31;
88ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    reference_stride_ = width_ * 2;
89ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    rnd_.Reset(ACMRandom::DeterministicSeed());
90ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
91ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
92923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  virtual uint8_t* GetReference(int block_idx) {
93923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    return reference_data_ + block_idx * kDataBlockSize;
94ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
95ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
96ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Sum of Absolute Differences. Given two blocks, calculate the absolute
97ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // difference between two pixels in the same relative location; accumulate.
9888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  unsigned int ReferenceSAD(unsigned int max_sad, int block_idx) {
99ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int sad = 0;
100923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    const uint8_t* const reference = GetReference(block_idx);
101ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
102ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    for (int h = 0; h < height_; ++h) {
103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      for (int w = 0; w < width_; ++w) {
104ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        sad += abs(source_data_[h * source_stride_ + w]
105923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org               - reference[h * reference_stride_ + w]);
106ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      }
107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      if (sad > max_sad) {
108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        break;
109ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      }
110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    return sad;
112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
114ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  void FillConstant(uint8_t *data, int stride, uint8_t fill_constant) {
115ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    for (int h = 0; h < height_; ++h) {
116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      for (int w = 0; w < width_; ++w) {
117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        data[h * stride + w] = fill_constant;
118ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      }
119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
120ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
121ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
122ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  void FillRandom(uint8_t *data, int stride) {
123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    for (int h = 0; h < height_; ++h) {
124ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      for (int w = 0; w < width_; ++w) {
125ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        data[h * stride + w] = rnd_.Rand8();
126ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      }
127ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
128ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
129ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
130923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  int width_, height_;
131923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  static uint8_t* source_data_;
132923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  int source_stride_;
133923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  static uint8_t* reference_data_;
134923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  int reference_stride_;
135923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
136923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  ACMRandom rnd_;
137923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org};
138923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
13988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgclass SADx4Test
14088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : public SADTestBase,
141ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      public ::testing::WithParamInterface<SadMxNx4Param> {
14288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org public:
14388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  SADx4Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
14488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
14588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org protected:
14688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  void SADs(unsigned int *results) {
14788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const uint8_t* refs[] = {GetReference(0), GetReference(1),
14888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                             GetReference(2), GetReference(3)};
14988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
15095aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com    ASM_REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_,
15195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                          refs, reference_stride_,
15295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                          results));
15388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
15488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
15588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  void CheckSADs() {
15688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    unsigned int reference_sad, exp_sad[4];
15788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
15888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    SADs(exp_sad);
15988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    for (int block = 0; block < 4; ++block) {
16088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      reference_sad = ReferenceSAD(UINT_MAX, block);
16188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
16288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      EXPECT_EQ(reference_sad, exp_sad[block]) << "block " << block;
16388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    }
16488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
16588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
16688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
16788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_VP8_ENCODER
16888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgclass SADTest
16988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : public SADTestBase,
170ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      public ::testing::WithParamInterface<SadMxNParam> {
171923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org public:
172923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  SADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
173923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
174923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org protected:
17588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  unsigned int SAD(unsigned int max_sad, int block_idx) {
176923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    unsigned int ret;
177923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    const uint8_t* const reference = GetReference(block_idx);
178923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
17995aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com    ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_,
18095aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                                reference, reference_stride_,
18195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                                max_sad));
182923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    return ret;
183923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
184923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
18588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  void CheckSAD(unsigned int max_sad) {
18688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const unsigned int reference_sad = ReferenceSAD(max_sad, 0);
18788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const unsigned int exp_sad = SAD(max_sad, 0);
188ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (reference_sad <= max_sad) {
190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      ASSERT_EQ(exp_sad, reference_sad);
191ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    } else {
192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      // Alternative implementations are not required to check max_sad
193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      ASSERT_GE(exp_sad, reference_sad);
194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
196923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org};
19788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
19988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_VP9_ENCODER
20088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgclass SADVP9Test
20188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : public SADTestBase,
202ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      public ::testing::WithParamInterface<SadMxNVp9Param> {
203923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org public:
20488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  SADVP9Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
206923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org protected:
20788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  unsigned int SAD(int block_idx) {
20888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    unsigned int ret;
20988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const uint8_t* const reference = GetReference(block_idx);
210923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
21195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com    ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_,
21295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                                reference, reference_stride_));
21388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    return ret;
214923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
215923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
21688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  void CheckSAD() {
21788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const unsigned int reference_sad = ReferenceSAD(UINT_MAX, 0);
21888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const unsigned int exp_sad = SAD(0);
219923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
22088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ASSERT_EQ(reference_sad, exp_sad);
221923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org};
22388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP9_ENCODER
224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
225923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orguint8_t* SADTestBase::source_data_ = NULL;
226923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orguint8_t* SADTestBase::reference_data_ = NULL;
227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
22888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_VP8_ENCODER
229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgTEST_P(SADTest, MaxRef) {
230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  FillConstant(source_data_, source_stride_, 0);
231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  FillConstant(reference_data_, reference_stride_, 255);
23288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD(UINT_MAX);
23388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
23488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
23588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADTest, MaxSrc) {
23688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(source_data_, source_stride_, 255);
23788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(reference_data_, reference_stride_, 0);
23888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD(UINT_MAX);
23988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
24088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
24188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADTest, ShortRef) {
24288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  int tmp_stride = reference_stride_;
24388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ >>= 1;
24488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(source_data_, source_stride_);
24588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(reference_data_, reference_stride_);
24688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD(UINT_MAX);
24788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ = tmp_stride;
24888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
24988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
25088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADTest, UnalignedRef) {
25188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  // The reference frame, but not the source frame, may be unaligned for
25288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  // certain types of searches.
25388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int tmp_stride = reference_stride_;
25488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ -= 1;
25588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(source_data_, source_stride_);
25688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(reference_data_, reference_stride_);
25788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD(UINT_MAX);
25888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ = tmp_stride;
25988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
26088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
26188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADTest, ShortSrc) {
26288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int tmp_stride = source_stride_;
26388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  source_stride_ >>= 1;
26488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(source_data_, source_stride_);
26588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(reference_data_, reference_stride_);
26688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD(UINT_MAX);
26788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  source_stride_ = tmp_stride;
26888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
26988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
27088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADTest, MaxSAD) {
27188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  // Verify that, when max_sad is set, the implementation does not return a
27288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  // value lower than the reference.
27388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(source_data_, source_stride_, 255);
27488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(reference_data_, reference_stride_, 0);
27588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD(128);
27688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
27788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
27888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
27988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_VP9_ENCODER
28088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADVP9Test, MaxRef) {
28188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(source_data_, source_stride_, 0);
28288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(reference_data_, reference_stride_, 255);
28388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD();
28488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
28588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
28688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADVP9Test, MaxSrc) {
28788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(source_data_, source_stride_, 255);
28888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillConstant(reference_data_, reference_stride_, 0);
28988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD();
29088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
29188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
29288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADVP9Test, ShortRef) {
29388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int tmp_stride = reference_stride_;
29488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ >>= 1;
29588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(source_data_, source_stride_);
29688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(reference_data_, reference_stride_);
29788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD();
29888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ = tmp_stride;
299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
30188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADVP9Test, UnalignedRef) {
30288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  // The reference frame, but not the source frame, may be unaligned for
30388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  // certain types of searches.
30488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int tmp_stride = reference_stride_;
30588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ -= 1;
30688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(source_data_, source_stride_);
30788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(reference_data_, reference_stride_);
30888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD();
30988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  reference_stride_ = tmp_stride;
31088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
31188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
31288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(SADVP9Test, ShortSrc) {
31388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int tmp_stride = source_stride_;
31488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  source_stride_ >>= 1;
31588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(source_data_, source_stride_);
31688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  FillRandom(reference_data_, reference_stride_);
31788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  CheckSAD();
31888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  source_stride_ = tmp_stride;
31988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
32088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP9_ENCODER
32188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
322923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(SADx4Test, MaxRef) {
323923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(source_data_, source_stride_, 0);
324923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(0), reference_stride_, 255);
325923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(1), reference_stride_, 255);
326923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(2), reference_stride_, 255);
327923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(3), reference_stride_, 255);
328923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckSADs();
329923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
330923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
331923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(SADx4Test, MaxSrc) {
332923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(source_data_, source_stride_, 255);
333923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(0), reference_stride_, 0);
334923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(1), reference_stride_, 0);
335923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(2), reference_stride_, 0);
336923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillConstant(GetReference(3), reference_stride_, 0);
337923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckSADs();
338923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
339923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
340923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(SADx4Test, ShortRef) {
341923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  int tmp_stride = reference_stride_;
342923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  reference_stride_ >>= 1;
343923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(source_data_, source_stride_);
344923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(0), reference_stride_);
345923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(1), reference_stride_);
346923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(2), reference_stride_);
347923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(3), reference_stride_);
348923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckSADs();
349923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  reference_stride_ = tmp_stride;
350923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
351923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
352923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(SADx4Test, UnalignedRef) {
353923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // The reference frame, but not the source frame, may be unaligned for
354923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // certain types of searches.
355923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  int tmp_stride = reference_stride_;
356923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  reference_stride_ -= 1;
357923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(source_data_, source_stride_);
358923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(0), reference_stride_);
359923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(1), reference_stride_);
360923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(2), reference_stride_);
361923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(3), reference_stride_);
362923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckSADs();
363923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  reference_stride_ = tmp_stride;
364923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
365923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
366923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(SADx4Test, ShortSrc) {
367923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  int tmp_stride = source_stride_;
368923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  source_stride_ >>= 1;
369923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(source_data_, source_stride_);
370923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(0), reference_stride_);
371923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(1), reference_stride_);
372923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(2), reference_stride_);
373923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  FillRandom(GetReference(3), reference_stride_);
374923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckSADs();
375923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  source_stride_ = tmp_stride;
376923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
377923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
378ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgusing std::tr1::make_tuple;
379ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
380411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org//------------------------------------------------------------------------------
381411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org// C functions
382923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP8_ENCODER
383ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x16_c = vp8_sad16x16_c;
384ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x16_c = vp8_sad8x16_c;
385ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x8_c = vp8_sad16x8_c;
386ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x8_c = vp8_sad8x8_c;
387ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_4x4_c = vp8_sad4x4_c;
388ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNParam c_tests[] = {
38910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 16, sad_16x16_c),
39010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 16, sad_8x16_c),
39110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 8, sad_16x8_c),
39210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 8, sad_8x8_c),
39310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(4, 4, sad_4x4_c),
39488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
39588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests));
39688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
39788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
398923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP9_ENCODER
399ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_64x64_c_vp9 = vp9_sad64x64_c;
400ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_32x32_c_vp9 = vp9_sad32x32_c;
401ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_16x16_c_vp9 = vp9_sad16x16_c;
402ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_8x16_c_vp9 = vp9_sad8x16_c;
403ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_16x8_c_vp9 = vp9_sad16x8_c;
404ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_8x8_c_vp9 = vp9_sad8x8_c;
405ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_8x4_c_vp9 = vp9_sad8x4_c;
406ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_4x8_c_vp9 = vp9_sad4x8_c;
407ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_4x4_c_vp9 = vp9_sad4x4_c;
408ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Param c_vp9_tests[] = {
40910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(64, 64, sad_64x64_c_vp9),
41010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(32, 32, sad_32x32_c_vp9),
41110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 16, sad_16x16_c_vp9),
41210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 16, sad_8x16_c_vp9),
41310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 8, sad_16x8_c_vp9),
41410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 8, sad_8x8_c_vp9),
4155dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org  make_tuple(8, 4, sad_8x4_c_vp9),
4165dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org  make_tuple(4, 8, sad_4x8_c_vp9),
41710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(4, 4, sad_4x4_c_vp9),
41810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org};
41988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(C, SADVP9Test, ::testing::ValuesIn(c_vp9_tests));
420923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
421ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_64x64x4d_c = vp9_sad64x64x4d_c;
422ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_64x32x4d_c = vp9_sad64x32x4d_c;
423ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_32x64x4d_c = vp9_sad32x64x4d_c;
424ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_32x32x4d_c = vp9_sad32x32x4d_c;
425ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_32x16x4d_c = vp9_sad32x16x4d_c;
426ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x32x4d_c = vp9_sad16x32x4d_c;
427ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x16x4d_c = vp9_sad16x16x4d_c;
428ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x8x4d_c = vp9_sad16x8x4d_c;
429ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x16x4d_c = vp9_sad8x16x4d_c;
430ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x8x4d_c = vp9_sad8x8x4d_c;
431ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x4x4d_c = vp9_sad8x4x4d_c;
432ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_4x8x4d_c = vp9_sad4x8x4d_c;
433ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_4x4x4d_c = vp9_sad4x4x4d_c;
434923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::Values(
435923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(64, 64, sad_64x64x4d_c),
436f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(64, 32, sad_64x32x4d_c),
437f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(32, 64, sad_32x64x4d_c),
438923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(32, 32, sad_32x32x4d_c),
439f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(32, 16, sad_32x16x4d_c),
440f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(16, 32, sad_16x32x4d_c),
441923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(16, 16, sad_16x16x4d_c),
442f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(16, 8, sad_16x8x4d_c),
443f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(8, 16, sad_8x16x4d_c),
444923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(8, 8, sad_8x8x4d_c),
445f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(8, 4, sad_8x4x4d_c),
446f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(4, 8, sad_4x8x4d_c),
447923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(4, 4, sad_4x4x4d_c)));
448411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#endif  // CONFIG_VP9_ENCODER
449ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
450411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org//------------------------------------------------------------------------------
451411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org// ARM functions
452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if HAVE_MEDIA
453411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#if CONFIG_VP8_ENCODER
454ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x16_armv6 = vp8_sad16x16_armv6;
455ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgINSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::Values(
456ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        make_tuple(16, 16, sad_16x16_armv6)));
45788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
45888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAVE_MEDIA
459411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org
460ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if HAVE_NEON
461411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#if CONFIG_VP8_ENCODER
462ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x16_neon = vp8_sad16x16_neon;
463ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x16_neon = vp8_sad8x16_neon;
464ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x8_neon = vp8_sad16x8_neon;
465ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x8_neon = vp8_sad8x8_neon;
466ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_4x4_neon = vp8_sad4x4_neon;
467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgINSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::Values(
468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        make_tuple(16, 16, sad_16x16_neon),
469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        make_tuple(8, 16, sad_8x16_neon),
470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        make_tuple(16, 8, sad_16x8_neon),
471ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        make_tuple(8, 8, sad_8x8_neon),
472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        make_tuple(4, 4, sad_4x4_neon)));
47388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
474ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#if CONFIG_VP9_ENCODER
475ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_64x64_neon_vp9 = vp9_sad64x64_neon;
476ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_32x32_neon_vp9 = vp9_sad32x32_neon;
477ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_16x16_neon_vp9 = vp9_sad16x16_neon;
47841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgconst SadMxNVp9Func sad_8x8_neon_vp9 = vp9_sad8x8_neon;
479ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Param neon_vp9_tests[] = {
480ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  make_tuple(64, 64, sad_64x64_neon_vp9),
481ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  make_tuple(32, 32, sad_32x32_neon_vp9),
482ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  make_tuple(16, 16, sad_16x16_neon_vp9),
48341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  make_tuple(8, 8, sad_8x8_neon_vp9),
484ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org};
485ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(NEON, SADVP9Test, ::testing::ValuesIn(neon_vp9_tests));
486ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#endif  // CONFIG_VP9_ENCODER
48788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAVE_NEON
488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
489411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org//------------------------------------------------------------------------------
490411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org// x86 functions
491ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if HAVE_MMX
492923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP8_ENCODER
493ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x16_mmx = vp8_sad16x16_mmx;
494ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x16_mmx = vp8_sad8x16_mmx;
495ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x8_mmx = vp8_sad16x8_mmx;
496ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x8_mmx = vp8_sad8x8_mmx;
497ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_4x4_mmx = vp8_sad4x4_mmx;
498ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNParam mmx_tests[] = {
49910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 16, sad_16x16_mmx),
50010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 16, sad_8x16_mmx),
50110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 8, sad_16x8_mmx),
50210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 8, sad_8x8_mmx),
50310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(4, 4, sad_4x4_mmx),
50488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
50588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(MMX, SADTest, ::testing::ValuesIn(mmx_tests));
50688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
50788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
50888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAVE_MMX
509923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
510923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if HAVE_SSE
511923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP9_ENCODER
51253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#if CONFIG_USE_X86INC
513ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_4x4_sse_vp9 = vp9_sad4x4_sse;
514ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_4x8_sse_vp9 = vp9_sad4x8_sse;
51588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(SSE, SADVP9Test, ::testing::Values(
5165dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org                        make_tuple(4, 4, sad_4x4_sse_vp9),
5175dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org                        make_tuple(4, 8, sad_4x8_sse_vp9)));
518923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
519ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_4x8x4d_sse = vp9_sad4x8x4d_sse;
520ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_4x4x4d_sse = vp9_sad4x4x4d_sse;
521923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSE, SADx4Test, ::testing::Values(
522f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(4, 8, sad_4x8x4d_sse),
523923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(4, 4, sad_4x4x4d_sse)));
524411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#endif  // CONFIG_USE_X86INC
525411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#endif  // CONFIG_VP9_ENCODER
526411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#endif  // HAVE_SSE
527923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
528ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if HAVE_SSE2
529923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP8_ENCODER
530ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x16_wmt = vp8_sad16x16_wmt;
531ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x16_wmt = vp8_sad8x16_wmt;
532ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x8_wmt = vp8_sad16x8_wmt;
533ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_8x8_wmt = vp8_sad8x8_wmt;
534ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_4x4_wmt = vp8_sad4x4_wmt;
535ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNParam sse2_tests[] = {
53610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 16, sad_16x16_wmt),
53710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 16, sad_8x16_wmt),
53810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 8, sad_16x8_wmt),
53910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 8, sad_8x8_wmt),
54010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(4, 4, sad_4x4_wmt),
54188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org};
54288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
54388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
54488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
545923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP9_ENCODER
54653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#if CONFIG_USE_X86INC
547ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_64x64_sse2_vp9 = vp9_sad64x64_sse2;
548ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_64x32_sse2_vp9 = vp9_sad64x32_sse2;
549ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_32x64_sse2_vp9 = vp9_sad32x64_sse2;
550ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_32x32_sse2_vp9 = vp9_sad32x32_sse2;
551ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_32x16_sse2_vp9 = vp9_sad32x16_sse2;
552ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_16x32_sse2_vp9 = vp9_sad16x32_sse2;
553ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_16x16_sse2_vp9 = vp9_sad16x16_sse2;
554ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_16x8_sse2_vp9 = vp9_sad16x8_sse2;
555ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_8x16_sse2_vp9 = vp9_sad8x16_sse2;
556ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_8x8_sse2_vp9 = vp9_sad8x8_sse2;
557ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Func sad_8x4_sse2_vp9 = vp9_sad8x4_sse2;
558ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNVp9Param sse2_vp9_tests[] = {
55910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(64, 64, sad_64x64_sse2_vp9),
56047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org  make_tuple(64, 32, sad_64x32_sse2_vp9),
56147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org  make_tuple(32, 64, sad_32x64_sse2_vp9),
56210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(32, 32, sad_32x32_sse2_vp9),
56347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org  make_tuple(32, 16, sad_32x16_sse2_vp9),
56447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org  make_tuple(16, 32, sad_16x32_sse2_vp9),
56510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 16, sad_16x16_sse2_vp9),
56610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(16, 8, sad_16x8_sse2_vp9),
56747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org  make_tuple(8, 16, sad_8x16_sse2_vp9),
56810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  make_tuple(8, 8, sad_8x8_sse2_vp9),
5695dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org  make_tuple(8, 4, sad_8x4_sse2_vp9),
57010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org};
57188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2, SADVP9Test, ::testing::ValuesIn(sse2_vp9_tests));
572923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
573ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_64x64x4d_sse2 = vp9_sad64x64x4d_sse2;
574ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_64x32x4d_sse2 = vp9_sad64x32x4d_sse2;
575ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_32x64x4d_sse2 = vp9_sad32x64x4d_sse2;
576ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_32x32x4d_sse2 = vp9_sad32x32x4d_sse2;
577ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_32x16x4d_sse2 = vp9_sad32x16x4d_sse2;
578ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x32x4d_sse2 = vp9_sad16x32x4d_sse2;
579ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x16x4d_sse2 = vp9_sad16x16x4d_sse2;
580ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x8x4d_sse2 = vp9_sad16x8x4d_sse2;
581ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x16x4d_sse2 = vp9_sad8x16x4d_sse2;
582ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x8x4d_sse2 = vp9_sad8x8x4d_sse2;
583ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x4x4d_sse2 = vp9_sad8x4x4d_sse2;
584923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::Values(
585923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(64, 64, sad_64x64x4d_sse2),
586f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(64, 32, sad_64x32x4d_sse2),
587f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(32, 64, sad_32x64x4d_sse2),
588923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(32, 32, sad_32x32x4d_sse2),
589f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(32, 16, sad_32x16x4d_sse2),
590f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(16, 32, sad_16x32x4d_sse2),
591923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(16, 16, sad_16x16x4d_sse2),
592923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(16, 8, sad_16x8x4d_sse2),
593923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(8, 16, sad_8x16x4d_sse2),
594f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(8, 8, sad_8x8x4d_sse2),
595f7b25aef0ed571110c9f656f29ead07b02d33d89fgalligan@chromium.org                        make_tuple(8, 4, sad_8x4x4d_sse2)));
59688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_USE_X86INC
59788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP9_ENCODER
59888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAVE_SSE2
599923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
600923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if HAVE_SSE3
601923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if CONFIG_VP8_ENCODER
602ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x16x4d_sse3 = vp8_sad16x16x4d_sse3;
603ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_16x8x4d_sse3 = vp8_sad16x8x4d_sse3;
604ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x16x4d_sse3 = vp8_sad8x16x4d_sse3;
605ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_8x8x4d_sse3 = vp8_sad8x8x4d_sse3;
606ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_4x4x4d_sse3 = vp8_sad4x4x4d_sse3;
607923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSE3, SADx4Test, ::testing::Values(
608923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(16, 16, sad_16x16x4d_sse3),
609923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(16, 8, sad_16x8x4d_sse3),
610923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(8, 16, sad_8x16x4d_sse3),
611923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(8, 8, sad_8x8x4d_sse3),
612923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        make_tuple(4, 4, sad_4x4x4d_sse3)));
61388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
61488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAVE_SSE3
615923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
616ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if HAVE_SSSE3
61753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#if CONFIG_USE_X86INC
618411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#if CONFIG_VP8_ENCODER
619ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNFunc sad_16x16_sse3 = vp8_sad16x16_sse3;
620ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgINSTANTIATE_TEST_CASE_P(SSE3, SADTest, ::testing::Values(
621ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        make_tuple(16, 16, sad_16x16_sse3)));
62288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP8_ENCODER
62388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_USE_X86INC
62488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAVE_SSSE3
62588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
62688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if HAVE_AVX2
62788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_VP9_ENCODER
628ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_64x64x4d_avx2 = vp9_sad64x64x4d_avx2;
629ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgconst SadMxNx4Func sad_32x32x4d_avx2 = vp9_sad32x32x4d_avx2;
63041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(AVX2, SADx4Test, ::testing::Values(
63188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        make_tuple(32, 32, sad_32x32x4d_avx2),
63288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        make_tuple(64, 64, sad_64x64x4d_avx2)));
63388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // CONFIG_VP9_ENCODER
63488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAVE_AVX2
635ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
636ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}  // namespace
637