vpx/vp9/common/idct.h
Yunqing Wang e60478d46d Optimize 8x8 dequant and idct
Similar to 16x16 dequant and idct, based on the value of eobs, the
8x8 dequant and idct calculation was simplified to improve decorder
performance.

Combined vp9_dequant_idct_add_8x8 and vp9_dequant_dc_idct_add_8x8
to eliminate duplicate code.

Change-Id: Ia58e50ab27f7012b7379c495837c9c0b5ba9cf7f
2012-11-12 17:41:53 -08:00

157 lines
4.1 KiB
C

/*
* 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_idct10_16x16
#define vp9_idct_idct10_16x16 vp9_short_idct10_16x16_c
#endif
extern prototype_idct(vp9_idct_idct10_16x16);
#ifndef vp9_idct_idct8
#define vp9_idct_idct8 vp9_short_idct8x8_c
#endif
extern prototype_idct(vp9_idct_idct8);
#ifndef vp9_idct_idct10_8
#define vp9_idct_idct10_8 vp9_short_idct10_8x8_c
#endif
extern prototype_idct(vp9_idct_idct10_8);
#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 idct10_8;
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_fn_t idct10_16x16;
} 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