12263fc984bdc858ee931d3e35c87c404de923950Johann/*
22263fc984bdc858ee931d3e35c87c404de923950Johann *  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
32263fc984bdc858ee931d3e35c87c404de923950Johann *
42263fc984bdc858ee931d3e35c87c404de923950Johann *  Use of this source code is governed by a BSD-style license
52263fc984bdc858ee931d3e35c87c404de923950Johann *  that can be found in the LICENSE file in the root of the source
62263fc984bdc858ee931d3e35c87c404de923950Johann *  tree. An additional intellectual property rights grant can be found
72263fc984bdc858ee931d3e35c87c404de923950Johann *  in the file PATENTS.  All contributing project authors may
82263fc984bdc858ee931d3e35c87c404de923950Johann *  be found in the AUTHORS file in the root of the source tree.
92263fc984bdc858ee931d3e35c87c404de923950Johann */
102263fc984bdc858ee931d3e35c87c404de923950Johann
112263fc984bdc858ee931d3e35c87c404de923950Johann#include <math.h>
122263fc984bdc858ee931d3e35c87c404de923950Johann#include <stdlib.h>
132263fc984bdc858ee931d3e35c87c404de923950Johann#include <new>
142263fc984bdc858ee931d3e35c87c404de923950Johann
152263fc984bdc858ee931d3e35c87c404de923950Johann#include "third_party/googletest/src/include/gtest/gtest.h"
162263fc984bdc858ee931d3e35c87c404de923950Johann#include "test/acm_random.h"
172263fc984bdc858ee931d3e35c87c404de923950Johann#include "test/util.h"
182263fc984bdc858ee931d3e35c87c404de923950Johann#include "./vpx_config.h"
192263fc984bdc858ee931d3e35c87c404de923950Johann#include "vpx_ports/msvc.h"
202263fc984bdc858ee931d3e35c87c404de923950Johann
212263fc984bdc858ee931d3e35c87c404de923950Johann#undef CONFIG_COEFFICIENT_RANGE_CHECKING
222263fc984bdc858ee931d3e35c87c404de923950Johann#define CONFIG_COEFFICIENT_RANGE_CHECKING 1
232263fc984bdc858ee931d3e35c87c404de923950Johann#include "vp10/encoder/dct.c"
242263fc984bdc858ee931d3e35c87c404de923950Johann
252263fc984bdc858ee931d3e35c87c404de923950Johannusing libvpx_test::ACMRandom;
262263fc984bdc858ee931d3e35c87c404de923950Johann
272263fc984bdc858ee931d3e35c87c404de923950Johannnamespace {
282263fc984bdc858ee931d3e35c87c404de923950Johannvoid reference_dct_1d(const double *in, double *out, int size) {
292263fc984bdc858ee931d3e35c87c404de923950Johann  const double PI = 3.141592653589793238462643383279502884;
302263fc984bdc858ee931d3e35c87c404de923950Johann  const double kInvSqrt2 = 0.707106781186547524400844362104;
312263fc984bdc858ee931d3e35c87c404de923950Johann  for (int k = 0; k < size; ++k) {
322263fc984bdc858ee931d3e35c87c404de923950Johann    out[k] = 0;
332263fc984bdc858ee931d3e35c87c404de923950Johann    for (int n = 0; n < size; ++n) {
342263fc984bdc858ee931d3e35c87c404de923950Johann      out[k] += in[n] * cos(PI * (2 * n + 1) * k / (2 * size));
352263fc984bdc858ee931d3e35c87c404de923950Johann    }
362263fc984bdc858ee931d3e35c87c404de923950Johann    if (k == 0)
372263fc984bdc858ee931d3e35c87c404de923950Johann      out[k] = out[k] * kInvSqrt2;
382263fc984bdc858ee931d3e35c87c404de923950Johann  }
392263fc984bdc858ee931d3e35c87c404de923950Johann}
402263fc984bdc858ee931d3e35c87c404de923950Johann
412263fc984bdc858ee931d3e35c87c404de923950Johanntypedef void (*FdctFuncRef)(const double *in, double *out, int size);
422263fc984bdc858ee931d3e35c87c404de923950Johanntypedef void (*IdctFuncRef)(const double *in, double *out, int size);
432263fc984bdc858ee931d3e35c87c404de923950Johanntypedef void (*FdctFunc)(const tran_low_t *in, tran_low_t *out);
442263fc984bdc858ee931d3e35c87c404de923950Johanntypedef void (*IdctFunc)(const tran_low_t *in, tran_low_t *out);
452263fc984bdc858ee931d3e35c87c404de923950Johann
462263fc984bdc858ee931d3e35c87c404de923950Johannclass TransTestBase {
472263fc984bdc858ee931d3e35c87c404de923950Johann public:
482263fc984bdc858ee931d3e35c87c404de923950Johann  virtual ~TransTestBase() {}
492263fc984bdc858ee931d3e35c87c404de923950Johann
502263fc984bdc858ee931d3e35c87c404de923950Johann protected:
512263fc984bdc858ee931d3e35c87c404de923950Johann  void RunFwdAccuracyCheck() {
522263fc984bdc858ee931d3e35c87c404de923950Johann    tran_low_t *input  = new tran_low_t[txfm_size_];
532263fc984bdc858ee931d3e35c87c404de923950Johann    tran_low_t *output = new tran_low_t[txfm_size_];
542263fc984bdc858ee931d3e35c87c404de923950Johann    double *ref_input  = new double[txfm_size_];
552263fc984bdc858ee931d3e35c87c404de923950Johann    double *ref_output = new double[txfm_size_];
562263fc984bdc858ee931d3e35c87c404de923950Johann
572263fc984bdc858ee931d3e35c87c404de923950Johann    ACMRandom rnd(ACMRandom::DeterministicSeed());
582263fc984bdc858ee931d3e35c87c404de923950Johann    const int count_test_block = 5000;
592263fc984bdc858ee931d3e35c87c404de923950Johann    for (int ti =  0; ti < count_test_block; ++ti) {
602263fc984bdc858ee931d3e35c87c404de923950Johann      for (int ni = 0; ni < txfm_size_; ++ni) {
612263fc984bdc858ee931d3e35c87c404de923950Johann        input[ni] = rnd.Rand8() - rnd.Rand8();
622263fc984bdc858ee931d3e35c87c404de923950Johann        ref_input[ni] = static_cast<double>(input[ni]);
632263fc984bdc858ee931d3e35c87c404de923950Johann      }
642263fc984bdc858ee931d3e35c87c404de923950Johann
652263fc984bdc858ee931d3e35c87c404de923950Johann      fwd_txfm_(input, output);
662263fc984bdc858ee931d3e35c87c404de923950Johann      fwd_txfm_ref_(ref_input, ref_output, txfm_size_);
672263fc984bdc858ee931d3e35c87c404de923950Johann
682263fc984bdc858ee931d3e35c87c404de923950Johann      for (int ni = 0; ni < txfm_size_; ++ni) {
692263fc984bdc858ee931d3e35c87c404de923950Johann        EXPECT_LE(
702263fc984bdc858ee931d3e35c87c404de923950Johann            abs(output[ni] - static_cast<tran_low_t>(round(ref_output[ni]))),
712263fc984bdc858ee931d3e35c87c404de923950Johann            max_error_);
722263fc984bdc858ee931d3e35c87c404de923950Johann      }
732263fc984bdc858ee931d3e35c87c404de923950Johann    }
742263fc984bdc858ee931d3e35c87c404de923950Johann
752263fc984bdc858ee931d3e35c87c404de923950Johann    delete[] input;
762263fc984bdc858ee931d3e35c87c404de923950Johann    delete[] output;
772263fc984bdc858ee931d3e35c87c404de923950Johann    delete[] ref_input;
782263fc984bdc858ee931d3e35c87c404de923950Johann    delete[] ref_output;
792263fc984bdc858ee931d3e35c87c404de923950Johann  }
802263fc984bdc858ee931d3e35c87c404de923950Johann
812263fc984bdc858ee931d3e35c87c404de923950Johann  double max_error_;
822263fc984bdc858ee931d3e35c87c404de923950Johann  int txfm_size_;
832263fc984bdc858ee931d3e35c87c404de923950Johann  FdctFunc fwd_txfm_;
842263fc984bdc858ee931d3e35c87c404de923950Johann  FdctFuncRef fwd_txfm_ref_;
852263fc984bdc858ee931d3e35c87c404de923950Johann};
862263fc984bdc858ee931d3e35c87c404de923950Johann
872263fc984bdc858ee931d3e35c87c404de923950Johanntypedef std::tr1::tuple<FdctFunc, FdctFuncRef, int, int> FdctParam;
882263fc984bdc858ee931d3e35c87c404de923950Johannclass Vp10FwdTxfm
892263fc984bdc858ee931d3e35c87c404de923950Johann    : public TransTestBase,
902263fc984bdc858ee931d3e35c87c404de923950Johann      public ::testing::TestWithParam<FdctParam> {
912263fc984bdc858ee931d3e35c87c404de923950Johann public:
922263fc984bdc858ee931d3e35c87c404de923950Johann  virtual void SetUp() {
932263fc984bdc858ee931d3e35c87c404de923950Johann    fwd_txfm_ = GET_PARAM(0);
942263fc984bdc858ee931d3e35c87c404de923950Johann    fwd_txfm_ref_ = GET_PARAM(1);
952263fc984bdc858ee931d3e35c87c404de923950Johann    txfm_size_ = GET_PARAM(2);
962263fc984bdc858ee931d3e35c87c404de923950Johann    max_error_ = GET_PARAM(3);
972263fc984bdc858ee931d3e35c87c404de923950Johann  }
982263fc984bdc858ee931d3e35c87c404de923950Johann  virtual void TearDown() {}
992263fc984bdc858ee931d3e35c87c404de923950Johann};
1002263fc984bdc858ee931d3e35c87c404de923950Johann
1012263fc984bdc858ee931d3e35c87c404de923950JohannTEST_P(Vp10FwdTxfm, RunFwdAccuracyCheck) {
1022263fc984bdc858ee931d3e35c87c404de923950Johann  RunFwdAccuracyCheck();
1032263fc984bdc858ee931d3e35c87c404de923950Johann}
1042263fc984bdc858ee931d3e35c87c404de923950Johann
1052263fc984bdc858ee931d3e35c87c404de923950JohannINSTANTIATE_TEST_CASE_P(
1062263fc984bdc858ee931d3e35c87c404de923950Johann    C, Vp10FwdTxfm,
1072263fc984bdc858ee931d3e35c87c404de923950Johann    ::testing::Values(
1082263fc984bdc858ee931d3e35c87c404de923950Johann        FdctParam(&fdct4, &reference_dct_1d, 4, 1),
1092263fc984bdc858ee931d3e35c87c404de923950Johann        FdctParam(&fdct8, &reference_dct_1d, 8, 1),
1102263fc984bdc858ee931d3e35c87c404de923950Johann        FdctParam(&fdct16, &reference_dct_1d, 16, 2)));
1112263fc984bdc858ee931d3e35c87c404de923950Johann}  // namespace
112