1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 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#include "./vpx_config.h"
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vp8_rtcd.h"
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/clear_system_state.h"
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/register_state_check.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_integer.h"
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*idct_fn_t)(int16_t *input, unsigned char *pred_ptr,
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          int pred_stride, unsigned char *dst_ptr,
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          int dst_stride);
22233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace {
23233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass IDCTTest : public ::testing::TestWithParam<idct_fn_t> {
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void SetUp() {
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UUT = GetParam();
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan    memset(input, 0, sizeof(input));
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Set up guard blocks */
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 256; i++) output[i] = ((i & 0xF) < 4 && (i < 64)) ? 0 : -1;
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TearDown() { libvpx_test::ClearSystemState(); }
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan  idct_fn_t UUT;
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t input[16];
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned char output[256];
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned char predict[256];
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan
42233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(IDCTTest, TestGuardBlocks) {
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i;
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < 256; i++)
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((i & 0xF) < 4 && i < 64)
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(0, output[i]) << i;
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(255, output[i]);
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan
52233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(IDCTTest, TestAllZeros) {
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i;
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan  REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < 256; i++)
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((i & 0xF) < 4 && i < 64)
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(0, output[i]) << "i==" << i;
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(255, output[i]) << "i==" << i;
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan
64233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(IDCTTest, TestAllOnes) {
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i;
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan  input[0] = 4;
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan  REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < 256; i++)
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((i & 0xF) < 4 && i < 64)
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(1, output[i]) << "i==" << i;
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(255, output[i]) << "i==" << i;
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan
77233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(IDCTTest, TestAddOne) {
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i;
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < 256; i++) predict[i] = i;
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan  input[0] = 4;
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan  REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16));
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < 256; i++)
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((i & 0xF) < 4 && i < 64)
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(i + 1, output[i]) << "i==" << i;
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(255, output[i]) << "i==" << i;
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan
91233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(IDCTTest, TestWithData) {
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i;
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < 16; i++) input[i] = i;
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan  REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < 256; i++)
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((i & 0xF) > 3 || i > 63)
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(255, output[i]) << "i==" << i;
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else if (i == 0)
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(11, output[i]) << "i==" << i;
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else if (i == 34)
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(1, output[i]) << "i==" << i;
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else if (i == 2 || i == 17 || i == 32)
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(3, output[i]) << "i==" << i;
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan      EXPECT_EQ(0, output[i]) << "i==" << i;
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan
111233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(C, IDCTTest, ::testing::Values(vp8_short_idct4x4llm_c));
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_MMX
113233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(MMX, IDCTTest,
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        ::testing::Values(vp8_short_idct4x4llm_mmx));
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
117