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