idct_test.cc revision 1b362b15af34006e6a11974088a46d42b903418e
11b362b15af34006e6a11974088a46d42b903418eJohann/*
21b362b15af34006e6a11974088a46d42b903418eJohann *  Copyright (c) 2010 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
121b362b15af34006e6a11974088a46d42b903418eJohannextern "C" {
131b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h"
141b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_rtcd.h"
151b362b15af34006e6a11974088a46d42b903418eJohann}
161b362b15af34006e6a11974088a46d42b903418eJohann#include "third_party/googletest/src/include/gtest/gtest.h"
171b362b15af34006e6a11974088a46d42b903418eJohann
181b362b15af34006e6a11974088a46d42b903418eJohanntypedef void (*idct_fn_t)(short *input, unsigned char *pred_ptr,
191b362b15af34006e6a11974088a46d42b903418eJohann                          int pred_stride, unsigned char *dst_ptr,
201b362b15af34006e6a11974088a46d42b903418eJohann                          int dst_stride);
211b362b15af34006e6a11974088a46d42b903418eJohannnamespace {
221b362b15af34006e6a11974088a46d42b903418eJohannclass IDCTTest : public ::testing::TestWithParam<idct_fn_t>
231b362b15af34006e6a11974088a46d42b903418eJohann{
241b362b15af34006e6a11974088a46d42b903418eJohann  protected:
251b362b15af34006e6a11974088a46d42b903418eJohann    virtual void SetUp()
261b362b15af34006e6a11974088a46d42b903418eJohann    {
271b362b15af34006e6a11974088a46d42b903418eJohann        int i;
281b362b15af34006e6a11974088a46d42b903418eJohann
291b362b15af34006e6a11974088a46d42b903418eJohann        UUT = GetParam();
301b362b15af34006e6a11974088a46d42b903418eJohann        memset(input, 0, sizeof(input));
311b362b15af34006e6a11974088a46d42b903418eJohann        /* Set up guard blocks */
321b362b15af34006e6a11974088a46d42b903418eJohann        for(i=0; i<256; i++)
331b362b15af34006e6a11974088a46d42b903418eJohann            output[i] = ((i&0xF)<4&&(i<64))?0:-1;
341b362b15af34006e6a11974088a46d42b903418eJohann    }
351b362b15af34006e6a11974088a46d42b903418eJohann
361b362b15af34006e6a11974088a46d42b903418eJohann    idct_fn_t UUT;
371b362b15af34006e6a11974088a46d42b903418eJohann    short input[16];
381b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char output[256];
391b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char predict[256];
401b362b15af34006e6a11974088a46d42b903418eJohann};
411b362b15af34006e6a11974088a46d42b903418eJohann
421b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(IDCTTest, TestGuardBlocks)
431b362b15af34006e6a11974088a46d42b903418eJohann{
441b362b15af34006e6a11974088a46d42b903418eJohann    int i;
451b362b15af34006e6a11974088a46d42b903418eJohann
461b362b15af34006e6a11974088a46d42b903418eJohann    for(i=0; i<256; i++)
471b362b15af34006e6a11974088a46d42b903418eJohann        if((i&0xF) < 4 && i<64)
481b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(0, output[i]) << i;
491b362b15af34006e6a11974088a46d42b903418eJohann        else
501b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(255, output[i]);
511b362b15af34006e6a11974088a46d42b903418eJohann}
521b362b15af34006e6a11974088a46d42b903418eJohann
531b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(IDCTTest, TestAllZeros)
541b362b15af34006e6a11974088a46d42b903418eJohann{
551b362b15af34006e6a11974088a46d42b903418eJohann    int i;
561b362b15af34006e6a11974088a46d42b903418eJohann
571b362b15af34006e6a11974088a46d42b903418eJohann    UUT(input, output, 16, output, 16);
581b362b15af34006e6a11974088a46d42b903418eJohann
591b362b15af34006e6a11974088a46d42b903418eJohann    for(i=0; i<256; i++)
601b362b15af34006e6a11974088a46d42b903418eJohann        if((i&0xF) < 4 && i<64)
611b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(0, output[i]) << "i==" << i;
621b362b15af34006e6a11974088a46d42b903418eJohann        else
631b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(255, output[i]) << "i==" << i;
641b362b15af34006e6a11974088a46d42b903418eJohann}
651b362b15af34006e6a11974088a46d42b903418eJohann
661b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(IDCTTest, TestAllOnes)
671b362b15af34006e6a11974088a46d42b903418eJohann{
681b362b15af34006e6a11974088a46d42b903418eJohann    int i;
691b362b15af34006e6a11974088a46d42b903418eJohann
701b362b15af34006e6a11974088a46d42b903418eJohann    input[0] = 4;
711b362b15af34006e6a11974088a46d42b903418eJohann    UUT(input, output, 16, output, 16);
721b362b15af34006e6a11974088a46d42b903418eJohann
731b362b15af34006e6a11974088a46d42b903418eJohann    for(i=0; i<256; i++)
741b362b15af34006e6a11974088a46d42b903418eJohann        if((i&0xF) < 4 && i<64)
751b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(1, output[i]) << "i==" << i;
761b362b15af34006e6a11974088a46d42b903418eJohann        else
771b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(255, output[i]) << "i==" << i;
781b362b15af34006e6a11974088a46d42b903418eJohann}
791b362b15af34006e6a11974088a46d42b903418eJohann
801b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(IDCTTest, TestAddOne)
811b362b15af34006e6a11974088a46d42b903418eJohann{
821b362b15af34006e6a11974088a46d42b903418eJohann    int i;
831b362b15af34006e6a11974088a46d42b903418eJohann
841b362b15af34006e6a11974088a46d42b903418eJohann    for(i=0; i<256; i++)
851b362b15af34006e6a11974088a46d42b903418eJohann        predict[i] = i;
861b362b15af34006e6a11974088a46d42b903418eJohann
871b362b15af34006e6a11974088a46d42b903418eJohann    input[0] = 4;
881b362b15af34006e6a11974088a46d42b903418eJohann    UUT(input, predict, 16, output, 16);
891b362b15af34006e6a11974088a46d42b903418eJohann
901b362b15af34006e6a11974088a46d42b903418eJohann    for(i=0; i<256; i++)
911b362b15af34006e6a11974088a46d42b903418eJohann        if((i&0xF) < 4 && i<64)
921b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(i+1, output[i]) << "i==" << i;
931b362b15af34006e6a11974088a46d42b903418eJohann        else
941b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(255, output[i]) << "i==" << i;
951b362b15af34006e6a11974088a46d42b903418eJohann}
961b362b15af34006e6a11974088a46d42b903418eJohann
971b362b15af34006e6a11974088a46d42b903418eJohannTEST_P(IDCTTest, TestWithData)
981b362b15af34006e6a11974088a46d42b903418eJohann{
991b362b15af34006e6a11974088a46d42b903418eJohann    int i;
1001b362b15af34006e6a11974088a46d42b903418eJohann
1011b362b15af34006e6a11974088a46d42b903418eJohann    for(i=0; i<16; i++)
1021b362b15af34006e6a11974088a46d42b903418eJohann        input[i] = i;
1031b362b15af34006e6a11974088a46d42b903418eJohann
1041b362b15af34006e6a11974088a46d42b903418eJohann    UUT(input, output, 16, output, 16);
1051b362b15af34006e6a11974088a46d42b903418eJohann
1061b362b15af34006e6a11974088a46d42b903418eJohann    for(i=0; i<256; i++)
1071b362b15af34006e6a11974088a46d42b903418eJohann        if((i&0xF) > 3 || i>63)
1081b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(255, output[i]) << "i==" << i;
1091b362b15af34006e6a11974088a46d42b903418eJohann        else if(i == 0)
1101b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(11, output[i]) << "i==" << i;
1111b362b15af34006e6a11974088a46d42b903418eJohann        else if(i == 34)
1121b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(1, output[i]) << "i==" << i;
1131b362b15af34006e6a11974088a46d42b903418eJohann        else if(i == 2 || i == 17 || i == 32)
1141b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(3, output[i]) << "i==" << i;
1151b362b15af34006e6a11974088a46d42b903418eJohann        else
1161b362b15af34006e6a11974088a46d42b903418eJohann            EXPECT_EQ(0, output[i]) << "i==" << i;
1171b362b15af34006e6a11974088a46d42b903418eJohann}
1181b362b15af34006e6a11974088a46d42b903418eJohann
1191b362b15af34006e6a11974088a46d42b903418eJohannINSTANTIATE_TEST_CASE_P(C, IDCTTest,
1201b362b15af34006e6a11974088a46d42b903418eJohann                        ::testing::Values(vp8_short_idct4x4llm_c));
1211b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_MMX
1221b362b15af34006e6a11974088a46d42b903418eJohannINSTANTIATE_TEST_CASE_P(MMX, IDCTTest,
1231b362b15af34006e6a11974088a46d42b903418eJohann                        ::testing::Values(vp8_short_idct4x4llm_mmx));
1241b362b15af34006e6a11974088a46d42b903418eJohann#endif
1251b362b15af34006e6a11974088a46d42b903418eJohann}
126