/*
 *  Copyright (c) 2010 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.
 */


#ifndef __INC_IDCT_H
#define __INC_IDCT_H

#include "vp9/common/blockd.h"

#define prototype_second_order(sym) \
  void sym(short *input, short *output)

#define prototype_idct(sym) \
  void sym(short *input, short *output, int pitch)

#define prototype_idct_scalar_add(sym) \
  void sym(short input, \
           unsigned char *pred, unsigned char *output, \
           int pitch, int stride)

#if ARCH_X86 || ARCH_X86_64
#include "x86/idct_x86.h"
#endif

#ifdef _MSC_VER
/* TODO: remove these after integer implmementations are done */
#define M_PI       3.14159265358979323846
#define round(x) (((x)>0)? floor((x)+0.5): ceil((x)-0.5))
#endif


#if ARCH_ARM
#include "arm/idct_arm.h"
#endif

#if CONFIG_LOSSLESS
#define WHT_UPSCALE_FACTOR 3
#define Y2_WHT_UPSCALE_FACTOR 2
#endif

#ifndef vp9_idct_idct16x16
#define vp9_idct_idct16x16 vp9_short_idct16x16_c
#endif
extern prototype_idct(vp9_idct_idct16x16);

#ifndef vp9_idct_idct8
#define vp9_idct_idct8 vp9_short_idct8x8_c
#endif
extern prototype_idct(vp9_idct_idct8);

#ifndef vp9_idct_idct8_1
#define vp9_idct_idct8_1 vp9_short_idct8x8_1_c
#endif
extern prototype_idct(vp9_idct_idct8_1);

#ifndef vp9_idct_ihaar2
#define vp9_idct_ihaar2 vp9_short_ihaar2x2_c
#endif
extern prototype_idct(vp9_idct_ihaar2);

#ifndef vp9_idct_ihaar2_1
#define vp9_idct_ihaar2_1 vp9_short_ihaar2x2_1_c
#endif
extern prototype_idct(vp9_idct_ihaar2_1);

#ifndef vp9_idct_idct1_scalar_add_8x8
#define vp9_idct_idct1_scalar_add_8x8 vp9_dc_only_idct_add_8x8_c
#endif
extern prototype_idct_scalar_add(vp9_idct_idct1_scalar_add_8x8);



#ifndef vp9_idct_idct1
#define vp9_idct_idct1 vp9_short_idct4x4llm_1_c
#endif
extern prototype_idct(vp9_idct_idct1);

#ifndef vp9_idct_idct16
#define vp9_idct_idct16 vp9_short_idct4x4llm_c
#endif
extern prototype_idct(vp9_idct_idct16);

#ifndef vp9_idct_idct1_scalar_add
#define vp9_idct_idct1_scalar_add vp9_dc_only_idct_add_c
#endif
extern prototype_idct_scalar_add(vp9_idct_idct1_scalar_add);


#ifndef vp9_idct_iwalsh1
#define vp9_idct_iwalsh1 vp9_short_inv_walsh4x4_1_c
#endif
extern prototype_second_order(vp9_idct_iwalsh1);

#ifndef vp9_idct_iwalsh16
#define vp9_idct_iwalsh16 vp9_short_inv_walsh4x4_c
#endif
extern prototype_second_order(vp9_idct_iwalsh16);

#if CONFIG_LOSSLESS
extern prototype_idct(vp9_short_inv_walsh4x4_x8_c);
extern prototype_idct(vp9_short_inv_walsh4x4_1_x8_c);
extern prototype_idct_scalar_add(vp9_dc_only_inv_walsh_add_c);
extern prototype_second_order(vp9_short_inv_walsh4x4_lossless_c);
extern prototype_second_order(vp9_short_inv_walsh4x4_1_lossless_c);
#endif

void vp9_ihtllm_c(const int16_t *input, int16_t *output, int pitch,
                  TX_TYPE tx_type, int tx_dim);

typedef prototype_idct((*vp9_idct_fn_t));
typedef prototype_idct_scalar_add((*vp9_idct_scalar_add_fn_t));
typedef prototype_second_order((*vp9_second_order_fn_t));

typedef struct {
  vp9_idct_fn_t            idct1;
  vp9_idct_fn_t            idct16;
  vp9_idct_scalar_add_fn_t idct1_scalar_add;

  vp9_second_order_fn_t iwalsh1;
  vp9_second_order_fn_t iwalsh16;

  vp9_idct_fn_t            idct8;
  vp9_idct_fn_t            idct8_1;
  vp9_idct_scalar_add_fn_t idct1_scalar_add_8x8;
  vp9_idct_fn_t ihaar2;
  vp9_idct_fn_t ihaar2_1;

  vp9_idct_fn_t            idct16x16;
} vp9_idct_rtcd_vtable_t;

#if CONFIG_RUNTIME_CPU_DETECT
#define IDCT_INVOKE(ctx,fn) (ctx)->fn
#else
#define IDCT_INVOKE(ctx,fn) vp9_idct_##fn
#endif

#endif
