/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

#ifndef AV1_TXFM_TEST_H_
#define AV1_TXFM_TEST_H_

#include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
#define _USE_MATH_DEFINES
#endif
#include <math.h>

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

#include "test/acm_random.h"
#include "av1/common/enums.h"
#include "av1/common/av1_txfm.h"
#include "./av1_rtcd.h"

namespace libaom_test {
typedef enum {
  TYPE_DCT = 0,
  TYPE_ADST,
  TYPE_IDCT,
  TYPE_IADST,
  TYPE_LAST
} TYPE_TXFM;

int get_txfm1d_size(TX_SIZE tx_size);

void get_txfm1d_type(TX_TYPE txfm2d_type, TYPE_TXFM *type0, TYPE_TXFM *type1);

void reference_dct_1d(const double *in, double *out, int size);
void reference_idct_1d(const double *in, double *out, int size);

void reference_adst_1d(const double *in, double *out, int size);

void reference_hybrid_1d(double *in, double *out, int size, int type);

void reference_hybrid_2d(double *in, double *out, int size, int type0,
                         int type1);
template <typename Type1, typename Type2>
static double compute_avg_abs_error(const Type1 *a, const Type2 *b,
                                    const int size) {
  double error = 0;
  for (int i = 0; i < size; i++) {
    error += fabs(static_cast<double>(a[i]) - static_cast<double>(b[i]));
  }
  error = error / size;
  return error;
}

template <typename Type>
void fliplr(Type *dest, int stride, int length);

template <typename Type>
void flipud(Type *dest, int stride, int length);

template <typename Type>
void fliplrud(Type *dest, int stride, int length);

typedef void (*TxfmFunc)(const int32_t *in, int32_t *out, const int8_t *cos_bit,
                         const int8_t *range_bit);

typedef void (*Fwd_Txfm2d_Func)(const int16_t *, int32_t *, int, TX_TYPE, int);
typedef void (*Inv_Txfm2d_Func)(const int32_t *, uint16_t *, int, TX_TYPE, int);

static const int bd = 10;
static const int input_base = (1 << bd);

#if CONFIG_HIGHBITDEPTH
#if CONFIG_AV1_ENCODER

static const Fwd_Txfm2d_Func fwd_txfm_func_ls[TX_SIZES_ALL] = {
#if CONFIG_CHROMA_2X2
  NULL,
#endif
  av1_fwd_txfm2d_4x4_c,
  av1_fwd_txfm2d_8x8_c,
  av1_fwd_txfm2d_16x16_c,
  av1_fwd_txfm2d_32x32_c,
#if CONFIG_TX64X64
  av1_fwd_txfm2d_64x64_c,
#endif  // CONFIG_TX64X64
  av1_fwd_txfm2d_4x8_c,
  av1_fwd_txfm2d_8x4_c,
  av1_fwd_txfm2d_8x16_c,
  av1_fwd_txfm2d_16x8_c,
  av1_fwd_txfm2d_16x32_c,
  av1_fwd_txfm2d_32x16_c,
#if CONFIG_TX64X64
  av1_fwd_txfm2d_32x64_c,
  av1_fwd_txfm2d_64x32_c,
#endif  // CONFIG_TX64X64
  NULL,
  NULL,
  NULL,
  NULL,
};
#endif

static const Inv_Txfm2d_Func inv_txfm_func_ls[TX_SIZES_ALL] = {
#if CONFIG_CHROMA_2X2
  NULL,
#endif
  av1_inv_txfm2d_add_4x4_c,
  av1_inv_txfm2d_add_8x8_c,
  av1_inv_txfm2d_add_16x16_c,
  av1_inv_txfm2d_add_32x32_c,
#if CONFIG_TX64X64
  av1_inv_txfm2d_add_64x64_c,
#endif  // CONFIG_TX64X64
  av1_inv_txfm2d_add_4x8_c,
  av1_inv_txfm2d_add_8x4_c,
  av1_inv_txfm2d_add_8x16_c,
  av1_inv_txfm2d_add_16x8_c,
  av1_inv_txfm2d_add_16x32_c,
  av1_inv_txfm2d_add_32x16_c,
#if CONFIG_TX64X64
  av1_inv_txfm2d_add_32x64_c,
  av1_inv_txfm2d_add_64x32_c,
#endif  // CONFIG_TX64X64
  NULL,
  NULL,
  NULL,
  NULL,
};
#endif  // CONFIG_HIGHBITDEPTH

#define BD_NUM 3

extern int bd_arr[];
extern int8_t low_range_arr[];
extern int8_t high_range_arr[];

void txfm_stage_range_check(const int8_t *stage_range, int stage_num,
                            const int8_t *cos_bit, int low_range,
                            int high_range);
}  // namespace libaom_test
#endif  // AV1_TXFM_TEST_H_
