vpx/vp8/encoder/dct.h
Jingning Han 9824230fe3 Adds hybrid transform
Adds ADST/DCT hybrid transform coding for Intra4x4 mode.
The ADST is applied to directions in which the boundary
pixels are used for prediction, while DCT applied to
directions without corresponding boundary prediction.

Adds enum TX_TYPE in b_mode_infor to indicate the transform
type used.

Make coding style consistent with google style.
Fixed the commented issues.

Experimental results in terms of bit-rate reduction:
derf:   0.731%
yt:     0.982%
std-hd: 0.459%
hd:     0.725%

Will be looking at 8x8 transforms next.

Change-Id: I46dbd7b80dbb3e8856e9c34fbc58cb3764a12fcf
2012-07-19 13:02:57 -07:00

90 lines
2.2 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_DCT_H
#define __INC_DCT_H
#define prototype_fdct(sym) void (sym)(short *input, short *output, int pitch)
#if ARCH_X86 || ARCH_X86_64
#include "x86/dct_x86.h"
#endif
#if ARCH_ARM
#include "arm/dct_arm.h"
#endif
#if CONFIG_HYBRIDTRANSFORM
void vp8_fht4x4_c(short *input, short *output, int pitch, TX_TYPE tx_type);
void vp8_fht8x4_c(short *input, short *output, int pitch, TX_TYPE tx_type);
#endif
#ifndef vp8_fdct_short8x8
#define vp8_fdct_short8x8 vp8_short_fdct8x8_c
#endif
extern prototype_fdct(vp8_fdct_short8x8);
#ifndef vp8_fhaar_short2x2
#define vp8_fhaar_short2x2 vp8_short_fhaar2x2_c
#endif
extern prototype_fdct(vp8_fhaar_short2x2);
#ifndef vp8_fdct_short4x4
#define vp8_fdct_short4x4 vp8_short_fdct4x4_c
#endif
extern prototype_fdct(vp8_fdct_short4x4);
#ifndef vp8_fdct_short8x4
#define vp8_fdct_short8x4 vp8_short_fdct8x4_c
#endif
extern prototype_fdct(vp8_fdct_short8x4);
// There is no fast4x4 (for now)
#ifndef vp8_fdct_fast4x4
#define vp8_fdct_fast4x4 vp8_short_fdct4x4_c
#endif
#ifndef vp8_fdct_fast8x4
#define vp8_fdct_fast8x4 vp8_short_fdct8x4_c
#endif
#ifndef vp8_fdct_walsh_short4x4
#define vp8_fdct_walsh_short4x4 vp8_short_walsh4x4_c
#endif
extern prototype_fdct(vp8_fdct_walsh_short4x4);
#if CONFIG_LOSSLESS
extern prototype_fdct(vp8_short_walsh4x4_x8_c);
extern prototype_fdct(vp8_short_walsh8x4_x8_c);
extern prototype_fdct(vp8_short_walsh4x4_lossless_c);
#endif
typedef prototype_fdct(*vp8_fdct_fn_t);
typedef struct {
vp8_fdct_fn_t short8x8;
vp8_fdct_fn_t haar_short2x2;
vp8_fdct_fn_t short4x4;
vp8_fdct_fn_t short8x4;
vp8_fdct_fn_t fast4x4;
vp8_fdct_fn_t fast8x4;
vp8_fdct_fn_t walsh_short4x4;
} vp8_fdct_rtcd_vtable_t;
#if CONFIG_RUNTIME_CPU_DETECT
#define FDCT_INVOKE(ctx,fn) (ctx)->fn
#else
#define FDCT_INVOKE(ctx,fn) vp8_fdct_##fn
#endif
#endif