11b362b15af34006e6a11974088a46d42b903418eJohann/*
21b362b15af34006e6a11974088a46d42b903418eJohann *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann *
41b362b15af34006e6a11974088a46d42b903418eJohann *  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann *  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann *  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann *  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann *  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann */
101b362b15af34006e6a11974088a46d42b903418eJohann
111b362b15af34006e6a11974088a46d42b903418eJohann
121b362b15af34006e6a11974088a46d42b903418eJohann#include <string.h>
131b362b15af34006e6a11974088a46d42b903418eJohann#include <limits.h>
141b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h>
151b362b15af34006e6a11974088a46d42b903418eJohann
161b362b15af34006e6a11974088a46d42b903418eJohann#include "./vpx_config.h"
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vp8_rtcd.h"
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vp9_rtcd.h"
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
231b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h"
241b362b15af34006e6a11974088a46d42b903418eJohann
251b362b15af34006e6a11974088a46d42b903418eJohann#include "test/acm_random.h"
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/clear_system_state.h"
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/register_state_check.h"
281b362b15af34006e6a11974088a46d42b903418eJohann#include "test/util.h"
291b362b15af34006e6a11974088a46d42b903418eJohann#include "third_party/googletest/src/include/gtest/gtest.h"
301b362b15af34006e6a11974088a46d42b903418eJohann
311b362b15af34006e6a11974088a46d42b903418eJohann
321b362b15af34006e6a11974088a46d42b903418eJohanntypedef unsigned int (*sad_m_by_n_fn_t)(const unsigned char *source_ptr,
331b362b15af34006e6a11974088a46d42b903418eJohann                                        int source_stride,
341b362b15af34006e6a11974088a46d42b903418eJohann                                        const unsigned char *reference_ptr,
351b362b15af34006e6a11974088a46d42b903418eJohann                                        int reference_stride,
361b362b15af34006e6a11974088a46d42b903418eJohann                                        unsigned int max_sad);
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef std::tr1::tuple<int, int, sad_m_by_n_fn_t> sad_m_by_n_test_param_t;
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef void (*sad_n_by_n_by_4_fn_t)(const uint8_t *src_ptr,
40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                     int src_stride,
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                     const unsigned char * const ref_ptr[],
42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                     int ref_stride,
43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                     unsigned int *sad_array);
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef std::tr1::tuple<int, int, sad_n_by_n_by_4_fn_t>
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        sad_n_by_n_by_4_test_param_t;
461b362b15af34006e6a11974088a46d42b903418eJohann
471b362b15af34006e6a11974088a46d42b903418eJohannusing libvpx_test::ACMRandom;
481b362b15af34006e6a11974088a46d42b903418eJohann
491b362b15af34006e6a11974088a46d42b903418eJohannnamespace {
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass SADTestBase : public ::testing::Test {
511b362b15af34006e6a11974088a46d42b903418eJohann public:
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  SADTestBase(int width, int height) : width_(width), height_(height) {}
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
541b362b15af34006e6a11974088a46d42b903418eJohann  static void SetUpTestCase() {
551b362b15af34006e6a11974088a46d42b903418eJohann    source_data_ = reinterpret_cast<uint8_t*>(
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        vpx_memalign(kDataAlignment, kDataBlockSize));
571b362b15af34006e6a11974088a46d42b903418eJohann    reference_data_ = reinterpret_cast<uint8_t*>(
581b362b15af34006e6a11974088a46d42b903418eJohann        vpx_memalign(kDataAlignment, kDataBufferSize));
591b362b15af34006e6a11974088a46d42b903418eJohann  }
601b362b15af34006e6a11974088a46d42b903418eJohann
611b362b15af34006e6a11974088a46d42b903418eJohann  static void TearDownTestCase() {
621b362b15af34006e6a11974088a46d42b903418eJohann    vpx_free(source_data_);
631b362b15af34006e6a11974088a46d42b903418eJohann    source_data_ = NULL;
641b362b15af34006e6a11974088a46d42b903418eJohann    vpx_free(reference_data_);
651b362b15af34006e6a11974088a46d42b903418eJohann    reference_data_ = NULL;
661b362b15af34006e6a11974088a46d42b903418eJohann  }
671b362b15af34006e6a11974088a46d42b903418eJohann
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual void TearDown() {
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    libvpx_test::ClearSystemState();
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
721b362b15af34006e6a11974088a46d42b903418eJohann protected:
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Handle blocks up to 4 blocks 64x64 with stride up to 128
741b362b15af34006e6a11974088a46d42b903418eJohann  static const int kDataAlignment = 16;
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  static const int kDataBlockSize = 64 * 128;
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  static const int kDataBufferSize = 4 * kDataBlockSize;
771b362b15af34006e6a11974088a46d42b903418eJohann
781b362b15af34006e6a11974088a46d42b903418eJohann  virtual void SetUp() {
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    source_stride_ = (width_ + 31) & ~31;
801b362b15af34006e6a11974088a46d42b903418eJohann    reference_stride_ = width_ * 2;
811b362b15af34006e6a11974088a46d42b903418eJohann    rnd_.Reset(ACMRandom::DeterministicSeed());
821b362b15af34006e6a11974088a46d42b903418eJohann  }
831b362b15af34006e6a11974088a46d42b903418eJohann
84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual uint8_t* GetReference(int block_idx) {
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return reference_data_ + block_idx * kDataBlockSize;
861b362b15af34006e6a11974088a46d42b903418eJohann  }
871b362b15af34006e6a11974088a46d42b903418eJohann
881b362b15af34006e6a11974088a46d42b903418eJohann  // Sum of Absolute Differences. Given two blocks, calculate the absolute
891b362b15af34006e6a11974088a46d42b903418eJohann  // difference between two pixels in the same relative location; accumulate.
90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int ReferenceSAD(unsigned int max_sad, int block_idx = 0) {
911b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int sad = 0;
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    const uint8_t* const reference = GetReference(block_idx);
931b362b15af34006e6a11974088a46d42b903418eJohann
941b362b15af34006e6a11974088a46d42b903418eJohann    for (int h = 0; h < height_; ++h) {
951b362b15af34006e6a11974088a46d42b903418eJohann      for (int w = 0; w < width_; ++w) {
961b362b15af34006e6a11974088a46d42b903418eJohann        sad += abs(source_data_[h * source_stride_ + w]
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               - reference[h * reference_stride_ + w]);
981b362b15af34006e6a11974088a46d42b903418eJohann      }
991b362b15af34006e6a11974088a46d42b903418eJohann      if (sad > max_sad) {
1001b362b15af34006e6a11974088a46d42b903418eJohann        break;
1011b362b15af34006e6a11974088a46d42b903418eJohann      }
1021b362b15af34006e6a11974088a46d42b903418eJohann    }
1031b362b15af34006e6a11974088a46d42b903418eJohann    return sad;
1041b362b15af34006e6a11974088a46d42b903418eJohann  }
1051b362b15af34006e6a11974088a46d42b903418eJohann
1061b362b15af34006e6a11974088a46d42b903418eJohann  void FillConstant(uint8_t *data, int stride, uint8_t fill_constant) {
1071b362b15af34006e6a11974088a46d42b903418eJohann    for (int h = 0; h < height_; ++h) {
1081b362b15af34006e6a11974088a46d42b903418eJohann      for (int w = 0; w < width_; ++w) {
1091b362b15af34006e6a11974088a46d42b903418eJohann        data[h * stride + w] = fill_constant;
1101b362b15af34006e6a11974088a46d42b903418eJohann      }
1111b362b15af34006e6a11974088a46d42b903418eJohann    }
1121b362b15af34006e6a11974088a46d42b903418eJohann  }
1131b362b15af34006e6a11974088a46d42b903418eJohann
1141b362b15af34006e6a11974088a46d42b903418eJohann  void FillRandom(uint8_t *data, int stride) {
1151b362b15af34006e6a11974088a46d42b903418eJohann    for (int h = 0; h < height_; ++h) {
1161b362b15af34006e6a11974088a46d42b903418eJohann      for (int w = 0; w < width_; ++w) {
1171b362b15af34006e6a11974088a46d42b903418eJohann        data[h * stride + w] = rnd_.Rand8();
1181b362b15af34006e6a11974088a46d42b903418eJohann      }
1191b362b15af34006e6a11974088a46d42b903418eJohann    }
1201b362b15af34006e6a11974088a46d42b903418eJohann  }
1211b362b15af34006e6a11974088a46d42b903418eJohann
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int width_, height_;
123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  static uint8_t* source_data_;
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int source_stride_;
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  static uint8_t* reference_data_;
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int reference_stride_;
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  ACMRandom rnd_;
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass SADTest : public SADTestBase,
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    public ::testing::WithParamInterface<sad_m_by_n_test_param_t> {
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  SADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected:
137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int SAD(unsigned int max_sad, int block_idx = 0) {
138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned int ret;
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    const uint8_t* const reference = GetReference(block_idx);
140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_,
142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                            reference, reference_stride_,
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                            max_sad));
144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return ret;
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1471b362b15af34006e6a11974088a46d42b903418eJohann  void CheckSad(unsigned int max_sad) {
1481b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int reference_sad, exp_sad;
1491b362b15af34006e6a11974088a46d42b903418eJohann
1501b362b15af34006e6a11974088a46d42b903418eJohann    reference_sad = ReferenceSAD(max_sad);
1511b362b15af34006e6a11974088a46d42b903418eJohann    exp_sad = SAD(max_sad);
1521b362b15af34006e6a11974088a46d42b903418eJohann
1531b362b15af34006e6a11974088a46d42b903418eJohann    if (reference_sad <= max_sad) {
1541b362b15af34006e6a11974088a46d42b903418eJohann      ASSERT_EQ(exp_sad, reference_sad);
1551b362b15af34006e6a11974088a46d42b903418eJohann    } else {
1561b362b15af34006e6a11974088a46d42b903418eJohann      // Alternative implementations are not required to check max_sad
1571b362b15af34006e6a11974088a46d42b903418eJohann      ASSERT_GE(exp_sad, reference_sad);
1581b362b15af34006e6a11974088a46d42b903418eJohann    }
1591b362b15af34006e6a11974088a46d42b903418eJohann  }
160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
1611b362b15af34006e6a11974088a46d42b903418eJohann
162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass SADx4Test : public SADTestBase,
163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    public ::testing::WithParamInterface<sad_n_by_n_by_4_test_param_t> {
164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  SADx4Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
1661b362b15af34006e6a11974088a46d42b903418eJohann
167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected:
168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void SADs(unsigned int *results) {
169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    const uint8_t* refs[] = {GetReference(0), GetReference(1),
170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             GetReference(2), GetReference(3)};
171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_,
173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                      refs, reference_stride_,
174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                      results));
175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void CheckSADs() {
178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned int reference_sad, exp_sad[4];
179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    SADs(exp_sad);
181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (int block = 0; block < 4; block++) {
182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      reference_sad = ReferenceSAD(UINT_MAX, block);
183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      EXPECT_EQ(exp_sad[block], reference_sad) << "block " << block;
185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
1871b362b15af34006e6a11974088a46d42b903418eJohann};
1881b362b15af34006e6a11974088a46d42b903418eJohann
189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuanguint8_t* SADTestBase::source_data_ = NULL;
190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuanguint8_t* SADTestBase::reference_data_ = NULL;
1911b362b15af34006e6a11974088a46d42b903418eJohann
1921b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(SADTest, MaxRef) {
1931b362b15af34006e6a11974088a46d42b903418eJohann  FillConstant(source_data_, source_stride_, 0);
1941b362b15af34006e6a11974088a46d42b903418eJohann  FillConstant(reference_data_, reference_stride_, 255);
1951b362b15af34006e6a11974088a46d42b903418eJohann  CheckSad(UINT_MAX);
1961b362b15af34006e6a11974088a46d42b903418eJohann}
1971b362b15af34006e6a11974088a46d42b903418eJohann
198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(SADx4Test, MaxRef) {
199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(source_data_, source_stride_, 0);
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(0), reference_stride_, 255);
201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(1), reference_stride_, 255);
202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(2), reference_stride_, 255);
203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(3), reference_stride_, 255);
204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  CheckSADs();
205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2071b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(SADTest, MaxSrc) {
2081b362b15af34006e6a11974088a46d42b903418eJohann  FillConstant(source_data_, source_stride_, 255);
2091b362b15af34006e6a11974088a46d42b903418eJohann  FillConstant(reference_data_, reference_stride_, 0);
2101b362b15af34006e6a11974088a46d42b903418eJohann  CheckSad(UINT_MAX);
2111b362b15af34006e6a11974088a46d42b903418eJohann}
2121b362b15af34006e6a11974088a46d42b903418eJohann
213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(SADx4Test, MaxSrc) {
214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(source_data_, source_stride_, 255);
215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(0), reference_stride_, 0);
216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(1), reference_stride_, 0);
217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(2), reference_stride_, 0);
218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillConstant(GetReference(3), reference_stride_, 0);
219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  CheckSADs();
220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2221b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(SADTest, ShortRef) {
2231b362b15af34006e6a11974088a46d42b903418eJohann  int tmp_stride = reference_stride_;
2241b362b15af34006e6a11974088a46d42b903418eJohann  reference_stride_ >>= 1;
2251b362b15af34006e6a11974088a46d42b903418eJohann  FillRandom(source_data_, source_stride_);
2261b362b15af34006e6a11974088a46d42b903418eJohann  FillRandom(reference_data_, reference_stride_);
2271b362b15af34006e6a11974088a46d42b903418eJohann  CheckSad(UINT_MAX);
2281b362b15af34006e6a11974088a46d42b903418eJohann  reference_stride_ = tmp_stride;
2291b362b15af34006e6a11974088a46d42b903418eJohann}
2301b362b15af34006e6a11974088a46d42b903418eJohann
231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(SADx4Test, ShortRef) {
232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int tmp_stride = reference_stride_;
233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  reference_stride_ >>= 1;
234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(source_data_, source_stride_);
235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(0), reference_stride_);
236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(1), reference_stride_);
237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(2), reference_stride_);
238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(3), reference_stride_);
239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  CheckSADs();
240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  reference_stride_ = tmp_stride;
241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2431b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(SADTest, UnalignedRef) {
2441b362b15af34006e6a11974088a46d42b903418eJohann  // The reference frame, but not the source frame, may be unaligned for
2451b362b15af34006e6a11974088a46d42b903418eJohann  // certain types of searches.
2461b362b15af34006e6a11974088a46d42b903418eJohann  int tmp_stride = reference_stride_;
2471b362b15af34006e6a11974088a46d42b903418eJohann  reference_stride_ -= 1;
2481b362b15af34006e6a11974088a46d42b903418eJohann  FillRandom(source_data_, source_stride_);
2491b362b15af34006e6a11974088a46d42b903418eJohann  FillRandom(reference_data_, reference_stride_);
2501b362b15af34006e6a11974088a46d42b903418eJohann  CheckSad(UINT_MAX);
2511b362b15af34006e6a11974088a46d42b903418eJohann  reference_stride_ = tmp_stride;
2521b362b15af34006e6a11974088a46d42b903418eJohann}
2531b362b15af34006e6a11974088a46d42b903418eJohann
254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(SADx4Test, UnalignedRef) {
255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // The reference frame, but not the source frame, may be unaligned for
256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // certain types of searches.
257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int tmp_stride = reference_stride_;
258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  reference_stride_ -= 1;
259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(source_data_, source_stride_);
260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(0), reference_stride_);
261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(1), reference_stride_);
262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(2), reference_stride_);
263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(3), reference_stride_);
264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  CheckSADs();
265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  reference_stride_ = tmp_stride;
266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2681b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(SADTest, ShortSrc) {
2691b362b15af34006e6a11974088a46d42b903418eJohann  int tmp_stride = source_stride_;
2701b362b15af34006e6a11974088a46d42b903418eJohann  source_stride_ >>= 1;
2711b362b15af34006e6a11974088a46d42b903418eJohann  FillRandom(source_data_, source_stride_);
2721b362b15af34006e6a11974088a46d42b903418eJohann  FillRandom(reference_data_, reference_stride_);
2731b362b15af34006e6a11974088a46d42b903418eJohann  CheckSad(UINT_MAX);
2741b362b15af34006e6a11974088a46d42b903418eJohann  source_stride_ = tmp_stride;
2751b362b15af34006e6a11974088a46d42b903418eJohann}
2761b362b15af34006e6a11974088a46d42b903418eJohann
277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(SADx4Test, ShortSrc) {
278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int tmp_stride = source_stride_;
279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  source_stride_ >>= 1;
280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(source_data_, source_stride_);
281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(0), reference_stride_);
282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(1), reference_stride_);
283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(2), reference_stride_);
284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  FillRandom(GetReference(3), reference_stride_);
285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  CheckSADs();
286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  source_stride_ = tmp_stride;
287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2891b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(SADTest, MaxSAD) {
2901b362b15af34006e6a11974088a46d42b903418eJohann  // Verify that, when max_sad is set, the implementation does not return a
2911b362b15af34006e6a11974088a46d42b903418eJohann  // value lower than the reference.
2921b362b15af34006e6a11974088a46d42b903418eJohann  FillConstant(source_data_, source_stride_, 255);
2931b362b15af34006e6a11974088a46d42b903418eJohann  FillConstant(reference_data_, reference_stride_, 0);
2941b362b15af34006e6a11974088a46d42b903418eJohann  CheckSad(128);
2951b362b15af34006e6a11974088a46d42b903418eJohann}
2961b362b15af34006e6a11974088a46d42b903418eJohann
2971b362b15af34006e6a11974088a46d42b903418eJohannusing std::tr1::make_tuple;
2981b362b15af34006e6a11974088a46d42b903418eJohann
299b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian//------------------------------------------------------------------------------
300b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// C functions
301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
3021b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x16_c = vp8_sad16x16_c;
3031b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x16_c = vp8_sad8x16_c;
3041b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x8_c = vp8_sad16x8_c;
3051b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x8_c = vp8_sad8x8_c;
3061b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_4x4_c = vp8_sad4x4_c;
307ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
308ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_64x64_c_vp9 = vp9_sad64x64_c;
310ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_32x32_c_vp9 = vp9_sad32x32_c;
311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_16x16_c_vp9 = vp9_sad16x16_c;
312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_8x16_c_vp9 = vp9_sad8x16_c;
313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_16x8_c_vp9 = vp9_sad16x8_c;
314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_8x8_c_vp9 = vp9_sad8x8_c;
315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_8x4_c_vp9 = vp9_sad8x4_c;
316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_4x8_c_vp9 = vp9_sad4x8_c;
317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_4x4_c_vp9 = vp9_sad4x4_c;
318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_test_param_t c_tests[] = {
320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
321ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 16, sad_16x16_c),
322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 16, sad_8x16_c),
323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 8, sad_16x8_c),
324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 8, sad_8x8_c),
325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(4, 4, sad_4x4_c),
326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(64, 64, sad_64x64_c_vp9),
329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(32, 32, sad_32x32_c_vp9),
330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 16, sad_16x16_c_vp9),
331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 16, sad_8x16_c_vp9),
332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 8, sad_16x8_c_vp9),
333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 8, sad_8x8_c_vp9),
334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 4, sad_8x4_c_vp9),
335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(4, 8, sad_4x8_c_vp9),
336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(4, 4, sad_4x4_c_vp9),
337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests));
340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_64x64x4d_c = vp9_sad64x64x4d_c;
343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_64x32x4d_c = vp9_sad64x32x4d_c;
344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_32x64x4d_c = vp9_sad32x64x4d_c;
345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_32x32x4d_c = vp9_sad32x32x4d_c;
346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_32x16x4d_c = vp9_sad32x16x4d_c;
347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x32x4d_c = vp9_sad16x32x4d_c;
348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x16x4d_c = vp9_sad16x16x4d_c;
349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x8x4d_c = vp9_sad16x8x4d_c;
350ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x16x4d_c = vp9_sad8x16x4d_c;
351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x8x4d_c = vp9_sad8x8x4d_c;
352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x4x4d_c = vp9_sad8x4x4d_c;
353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_4x8x4d_c = vp9_sad4x8x4d_c;
354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_4x4x4d_c = vp9_sad4x4x4d_c;
355ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::Values(
356ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(64, 64, sad_64x64x4d_c),
357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(64, 32, sad_64x32x4d_c),
358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(32, 64, sad_32x64x4d_c),
359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(32, 32, sad_32x32x4d_c),
360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(32, 16, sad_32x16x4d_c),
361ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 32, sad_16x32x4d_c),
362ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 16, sad_16x16x4d_c),
363ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 8, sad_16x8x4d_c),
364ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 16, sad_8x16x4d_c),
365ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 8, sad_8x8x4d_c),
366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 4, sad_8x4x4d_c),
367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(4, 8, sad_4x8x4d_c),
368ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(4, 4, sad_4x4x4d_c)));
369b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // CONFIG_VP9_ENCODER
3701b362b15af34006e6a11974088a46d42b903418eJohann
371b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian//------------------------------------------------------------------------------
372b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// ARM functions
3731b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_MEDIA
374b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_VP8_ENCODER
3751b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x16_armv6 = vp8_sad16x16_armv6;
3761b362b15af34006e6a11974088a46d42b903418eJohannINSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::Values(
3771b362b15af34006e6a11974088a46d42b903418eJohann                        make_tuple(16, 16, sad_16x16_armv6)));
3781b362b15af34006e6a11974088a46d42b903418eJohann#endif
379b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
380b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
3811b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_NEON
382b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_VP8_ENCODER
3831b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x16_neon = vp8_sad16x16_neon;
3841b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x16_neon = vp8_sad8x16_neon;
3851b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x8_neon = vp8_sad16x8_neon;
3861b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x8_neon = vp8_sad8x8_neon;
3871b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_4x4_neon = vp8_sad4x4_neon;
3881b362b15af34006e6a11974088a46d42b903418eJohannINSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::Values(
3891b362b15af34006e6a11974088a46d42b903418eJohann                        make_tuple(16, 16, sad_16x16_neon),
3901b362b15af34006e6a11974088a46d42b903418eJohann                        make_tuple(8, 16, sad_8x16_neon),
3911b362b15af34006e6a11974088a46d42b903418eJohann                        make_tuple(16, 8, sad_16x8_neon),
3921b362b15af34006e6a11974088a46d42b903418eJohann                        make_tuple(8, 8, sad_8x8_neon),
3931b362b15af34006e6a11974088a46d42b903418eJohann                        make_tuple(4, 4, sad_4x4_neon)));
3941b362b15af34006e6a11974088a46d42b903418eJohann#endif
395b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
3961b362b15af34006e6a11974088a46d42b903418eJohann
397b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian//------------------------------------------------------------------------------
398b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// x86 functions
3991b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_MMX
400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
4011b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x16_mmx = vp8_sad16x16_mmx;
4021b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x16_mmx = vp8_sad8x16_mmx;
4031b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x8_mmx = vp8_sad16x8_mmx;
4041b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x8_mmx = vp8_sad8x8_mmx;
4051b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_4x4_mmx = vp8_sad4x4_mmx;
4061b362b15af34006e6a11974088a46d42b903418eJohann#endif
407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_16x16_mmx_vp9 = vp9_sad16x16_mmx;
409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_8x16_mmx_vp9 = vp9_sad8x16_mmx;
410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_16x8_mmx_vp9 = vp9_sad16x8_mmx;
411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_8x8_mmx_vp9 = vp9_sad8x8_mmx;
412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_4x4_mmx_vp9 = vp9_sad4x4_mmx;
413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
415ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_test_param_t mmx_tests[] = {
416ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 16, sad_16x16_mmx),
418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 16, sad_8x16_mmx),
419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 8, sad_16x8_mmx),
420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 8, sad_8x8_mmx),
421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(4, 4, sad_4x4_mmx),
422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
424ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 16, sad_16x16_mmx_vp9),
425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 16, sad_8x16_mmx_vp9),
426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 8, sad_16x8_mmx_vp9),
427ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 8, sad_8x8_mmx_vp9),
428ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(4, 4, sad_4x4_mmx_vp9),
429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
431ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(MMX, SADTest, ::testing::ValuesIn(mmx_tests));
432ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
433ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
434ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if HAVE_SSE
435ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
4363df0563f1b24dac6c0bd122fc922a48211269061hkuang#if CONFIG_USE_X86INC
437ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_4x4_sse_vp9 = vp9_sad4x4_sse;
438ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_4x8_sse_vp9 = vp9_sad4x8_sse;
439ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(SSE, SADTest, ::testing::Values(
440ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(4, 4, sad_4x4_sse_vp9),
441ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(4, 8, sad_4x8_sse_vp9)));
442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
443ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_4x8x4d_sse = vp9_sad4x8x4d_sse;
444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_4x4x4d_sse = vp9_sad4x4x4d_sse;
445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(SSE, SADx4Test, ::testing::Values(
446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(4, 8, sad_4x8x4d_sse),
447ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(4, 4, sad_4x4x4d_sse)));
448b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // CONFIG_USE_X86INC
449b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // CONFIG_VP9_ENCODER
450b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // HAVE_SSE
451ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4521b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_SSE2
453ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
4541b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x16_wmt = vp8_sad16x16_wmt;
4551b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x16_wmt = vp8_sad8x16_wmt;
4561b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x8_wmt = vp8_sad16x8_wmt;
4571b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_8x8_wmt = vp8_sad8x8_wmt;
4581b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_4x4_wmt = vp8_sad4x4_wmt;
4591b362b15af34006e6a11974088a46d42b903418eJohann#endif
460ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
4613df0563f1b24dac6c0bd122fc922a48211269061hkuang#if CONFIG_USE_X86INC
462ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_64x64_sse2_vp9 = vp9_sad64x64_sse2;
46391037db265ecdd914a26e056cf69207b4f50924ehkuangconst sad_m_by_n_fn_t sad_64x32_sse2_vp9 = vp9_sad64x32_sse2;
46491037db265ecdd914a26e056cf69207b4f50924ehkuangconst sad_m_by_n_fn_t sad_32x64_sse2_vp9 = vp9_sad32x64_sse2;
465ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_32x32_sse2_vp9 = vp9_sad32x32_sse2;
46691037db265ecdd914a26e056cf69207b4f50924ehkuangconst sad_m_by_n_fn_t sad_32x16_sse2_vp9 = vp9_sad32x16_sse2;
46791037db265ecdd914a26e056cf69207b4f50924ehkuangconst sad_m_by_n_fn_t sad_16x32_sse2_vp9 = vp9_sad16x32_sse2;
468ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_16x16_sse2_vp9 = vp9_sad16x16_sse2;
469ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_16x8_sse2_vp9 = vp9_sad16x8_sse2;
47091037db265ecdd914a26e056cf69207b4f50924ehkuangconst sad_m_by_n_fn_t sad_8x16_sse2_vp9 = vp9_sad8x16_sse2;
471ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_8x8_sse2_vp9 = vp9_sad8x8_sse2;
472ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_fn_t sad_8x4_sse2_vp9 = vp9_sad8x4_sse2;
473ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
4743df0563f1b24dac6c0bd122fc922a48211269061hkuang#endif
475ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_m_by_n_test_param_t sse2_tests[] = {
476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
477ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 16, sad_16x16_wmt),
478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 16, sad_8x16_wmt),
479ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 8, sad_16x8_wmt),
480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 8, sad_8x8_wmt),
481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(4, 4, sad_4x4_wmt),
482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
4843df0563f1b24dac6c0bd122fc922a48211269061hkuang#if CONFIG_USE_X86INC
485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(64, 64, sad_64x64_sse2_vp9),
48691037db265ecdd914a26e056cf69207b4f50924ehkuang  make_tuple(64, 32, sad_64x32_sse2_vp9),
48791037db265ecdd914a26e056cf69207b4f50924ehkuang  make_tuple(32, 64, sad_32x64_sse2_vp9),
488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(32, 32, sad_32x32_sse2_vp9),
48991037db265ecdd914a26e056cf69207b4f50924ehkuang  make_tuple(32, 16, sad_32x16_sse2_vp9),
49091037db265ecdd914a26e056cf69207b4f50924ehkuang  make_tuple(16, 32, sad_16x32_sse2_vp9),
491ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 16, sad_16x16_sse2_vp9),
492ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(16, 8, sad_16x8_sse2_vp9),
49391037db265ecdd914a26e056cf69207b4f50924ehkuang  make_tuple(8, 16, sad_8x16_sse2_vp9),
494ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 8, sad_8x8_sse2_vp9),
495ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  make_tuple(8, 4, sad_8x4_sse2_vp9),
496ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
4973df0563f1b24dac6c0bd122fc922a48211269061hkuang#endif
498ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
499ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
500ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
501ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
5023df0563f1b24dac6c0bd122fc922a48211269061hkuang#if CONFIG_USE_X86INC
503ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_64x64x4d_sse2 = vp9_sad64x64x4d_sse2;
504ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_64x32x4d_sse2 = vp9_sad64x32x4d_sse2;
505ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_32x64x4d_sse2 = vp9_sad32x64x4d_sse2;
506ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_32x32x4d_sse2 = vp9_sad32x32x4d_sse2;
507ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_32x16x4d_sse2 = vp9_sad32x16x4d_sse2;
508ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x32x4d_sse2 = vp9_sad16x32x4d_sse2;
509ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x16x4d_sse2 = vp9_sad16x16x4d_sse2;
510ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x8x4d_sse2 = vp9_sad16x8x4d_sse2;
511ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x16x4d_sse2 = vp9_sad8x16x4d_sse2;
512ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x8x4d_sse2 = vp9_sad8x8x4d_sse2;
513ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x4x4d_sse2 = vp9_sad8x4x4d_sse2;
514ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::Values(
515ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(64, 64, sad_64x64x4d_sse2),
516ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(64, 32, sad_64x32x4d_sse2),
517ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(32, 64, sad_32x64x4d_sse2),
518ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(32, 32, sad_32x32x4d_sse2),
519ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(32, 16, sad_32x16x4d_sse2),
520ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 32, sad_16x32x4d_sse2),
521ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 16, sad_16x16x4d_sse2),
522ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 8, sad_16x8x4d_sse2),
523ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 16, sad_8x16x4d_sse2),
524ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 8, sad_8x8x4d_sse2),
525ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 4, sad_8x4x4d_sse2)));
526ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
527ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
5283df0563f1b24dac6c0bd122fc922a48211269061hkuang#endif
529ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
530ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if HAVE_SSE3
531ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
532ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x16x4d_sse3 = vp8_sad16x16x4d_sse3;
533ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_16x8x4d_sse3 = vp8_sad16x8x4d_sse3;
534ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x16x4d_sse3 = vp8_sad8x16x4d_sse3;
535ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_8x8x4d_sse3 = vp8_sad8x8x4d_sse3;
536ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst sad_n_by_n_by_4_fn_t sad_4x4x4d_sse3 = vp8_sad4x4x4d_sse3;
537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangINSTANTIATE_TEST_CASE_P(SSE3, SADx4Test, ::testing::Values(
538ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 16, sad_16x16x4d_sse3),
539ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(16, 8, sad_16x8x4d_sse3),
540ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 16, sad_8x16x4d_sse3),
541ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(8, 8, sad_8x8x4d_sse3),
542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        make_tuple(4, 4, sad_4x4x4d_sse3)));
543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
544ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
545ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5461b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_SSSE3
5473df0563f1b24dac6c0bd122fc922a48211269061hkuang#if CONFIG_USE_X86INC
548b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_VP8_ENCODER
5491b362b15af34006e6a11974088a46d42b903418eJohannconst sad_m_by_n_fn_t sad_16x16_sse3 = vp8_sad16x16_sse3;
5501b362b15af34006e6a11974088a46d42b903418eJohannINSTANTIATE_TEST_CASE_P(SSE3, SADTest, ::testing::Values(
5511b362b15af34006e6a11974088a46d42b903418eJohann                        make_tuple(16, 16, sad_16x16_sse3)));
5521b362b15af34006e6a11974088a46d42b903418eJohann#endif
5533df0563f1b24dac6c0bd122fc922a48211269061hkuang#endif
554b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
5551b362b15af34006e6a11974088a46d42b903418eJohann
5561b362b15af34006e6a11974088a46d42b903418eJohann}  // namespace
557