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