summaryrefslogtreecommitdiff
path: root/test/variance_test.cc
blob: 83f1139949dfb981fc7e25b17e414a7de429e8c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#include <stdlib.h>
#include <new>

#include "third_party/googletest/src/include/gtest/gtest.h"

#include "vpx_config.h"
extern "C" {
#include "vp9/encoder/vp9_variance.h"
#include "vpx/vpx_integer.h"
#include "vp9_rtcd.h"
}

namespace {

using ::std::tr1::get;
using ::std::tr1::make_tuple;
using ::std::tr1::tuple;

class VP9VarianceTest :
    public ::testing::TestWithParam<tuple<int, int, vp9_variance_fn_t> > {
 public:
  virtual void SetUp() {
    const tuple<int, int, vp9_variance_fn_t>& params = GetParam();
    width_  = get<0>(params);
    height_ = get<1>(params);
    variance_ = get<2>(params);

    block_size_ = width_ * height_;
    src_ = new uint8_t[block_size_];
    ref_ = new uint8_t[block_size_];
    ASSERT_TRUE(src_ != NULL);
    ASSERT_TRUE(ref_ != NULL);
  }

  virtual void TearDown() {
    delete[] src_;
    delete[] ref_;
  }

 protected:
  uint8_t* src_;
  uint8_t* ref_;
  int width_;
  int height_;
  int block_size_;
  vp9_variance_fn_t variance_;
};

TEST_P(VP9VarianceTest, Zero) {
  for (int i = 0; i <= 255; ++i) {
    memset(src_, i, block_size_);
    for (int j = 0; j <= 255; ++j) {
      memset(ref_, j, block_size_);
      unsigned int sse;
      const unsigned int var = variance_(src_, width_, ref_, width_, &sse);
      EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j;
    }
  }
}

TEST_P(VP9VarianceTest, OneQuarter) {
  memset(src_, 255, block_size_);
  const int half = block_size_ / 2;
  memset(ref_, 255, half);
  memset(ref_ + half, 0, half);
  unsigned int sse;
  const unsigned int var = variance_(src_, width_, ref_, width_, &sse);
  const unsigned int expected = block_size_ * 255 * 255 / 4;
  EXPECT_EQ(expected, var);
}

const vp9_variance_fn_t variance4x4_c = vp9_variance4x4_c;
const vp9_variance_fn_t variance8x8_c = vp9_variance8x8_c;
const vp9_variance_fn_t variance8x16_c = vp9_variance8x16_c;
const vp9_variance_fn_t variance16x8_c = vp9_variance16x8_c;
const vp9_variance_fn_t variance16x16_c = vp9_variance16x16_c;
INSTANTIATE_TEST_CASE_P(
    C, VP9VarianceTest,
    ::testing::Values(make_tuple(4, 4, variance4x4_c),
                      make_tuple(8, 8, variance8x8_c),
                      make_tuple(8, 16, variance8x16_c),
                      make_tuple(16, 8, variance16x8_c),
                      make_tuple(16, 16, variance16x16_c)));

#if HAVE_MMX
const vp9_variance_fn_t variance4x4_mmx = vp9_variance4x4_mmx;
const vp9_variance_fn_t variance8x8_mmx = vp9_variance8x8_mmx;
const vp9_variance_fn_t variance8x16_mmx = vp9_variance8x16_mmx;
const vp9_variance_fn_t variance16x8_mmx = vp9_variance16x8_mmx;
const vp9_variance_fn_t variance16x16_mmx = vp9_variance16x16_mmx;
INSTANTIATE_TEST_CASE_P(
    MMX, VP9VarianceTest,
    ::testing::Values(make_tuple(4, 4, variance4x4_mmx),
                      make_tuple(8, 8, variance8x8_mmx),
                      make_tuple(8, 16, variance8x16_mmx),
                      make_tuple(16, 8, variance16x8_mmx),
                      make_tuple(16, 16, variance16x16_mmx)));
#endif

#if HAVE_SSE2
const vp9_variance_fn_t variance4x4_wmt = vp9_variance4x4_wmt;
const vp9_variance_fn_t variance8x8_wmt = vp9_variance8x8_wmt;
const vp9_variance_fn_t variance8x16_wmt = vp9_variance8x16_wmt;
const vp9_variance_fn_t variance16x8_wmt = vp9_variance16x8_wmt;
const vp9_variance_fn_t variance16x16_wmt = vp9_variance16x16_wmt;
INSTANTIATE_TEST_CASE_P(
    SSE2, VP9VarianceTest,
    ::testing::Values(make_tuple(4, 4, variance4x4_wmt),
                      make_tuple(8, 8, variance8x8_wmt),
                      make_tuple(8, 16, variance8x16_wmt),
                      make_tuple(16, 8, variance16x8_wmt),
                      make_tuple(16, 16, variance16x16_wmt)));
#endif
}  // namespace