de6dfa6bb0
Enable ADST/DCT of dimension 16x16 for I16X16 modes. This change provides benefits mostly for hd sequences. Set up the framework for selectable transform dimension. Also allowing quantization parameter threshold to control the use of hybrid transform (This is currently disabled by setting threshold always above the quantization parameter. Adaptive thresholding can be built upon this, which will further improve the coding performance.) The coding performance gains (with respect to the codec that has all other configuration settings turned on) are derf: 0.013 yt: 0.086 hd: 0.198 std-hd: 0.501 Change-Id: Ibb4263a61fc74e0b3c345f54d73e8c73552bf926
223 lines
8.2 KiB
C
223 lines
8.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 DEQUANTIZE_H
|
|
#define DEQUANTIZE_H
|
|
#include "vp8/common/blockd.h"
|
|
|
|
#define prototype_dequant_block(sym) \
|
|
void sym(BLOCKD *x)
|
|
|
|
#define prototype_dequant_idct_add(sym) \
|
|
void sym(short *input, short *dq, \
|
|
unsigned char *pred, unsigned char *output, \
|
|
int pitch, int stride)
|
|
|
|
#define prototype_dequant_dc_idct_add(sym) \
|
|
void sym(short *input, short *dq, \
|
|
unsigned char *pred, unsigned char *output, \
|
|
int pitch, int stride, \
|
|
int dc)
|
|
|
|
#define prototype_dequant_dc_idct_add_y_block(sym) \
|
|
void sym(short *q, short *dq, \
|
|
unsigned char *pre, unsigned char *dst, \
|
|
int stride, char *eobs, short *dc)
|
|
|
|
#define prototype_dequant_idct_add_y_block(sym) \
|
|
void sym(short *q, short *dq, \
|
|
unsigned char *pre, unsigned char *dst, \
|
|
int stride, char *eobs)
|
|
|
|
#define prototype_dequant_idct_add_uv_block(sym) \
|
|
void sym(short *q, short *dq, \
|
|
unsigned char *pre, unsigned char *dst_u, \
|
|
unsigned char *dst_v, int stride, char *eobs)
|
|
|
|
#define prototype_dequant_dc_idct_add_y_block_8x8(sym) \
|
|
void sym(short *q, short *dq, \
|
|
unsigned char *pre, unsigned char *dst, \
|
|
int stride, char *eobs, short *dc, MACROBLOCKD *xd)
|
|
|
|
#define prototype_dequant_idct_add_y_block_8x8(sym) \
|
|
void sym(short *q, short *dq, \
|
|
unsigned char *pre, unsigned char *dst, \
|
|
int stride, char *eobs, MACROBLOCKD *xd)
|
|
|
|
#define prototype_dequant_idct_add_uv_block_8x8(sym) \
|
|
void sym(short *q, short *dq, \
|
|
unsigned char *pre, unsigned char *dst_u, \
|
|
unsigned char *dst_v, int stride, char *eobs, \
|
|
MACROBLOCKD *xd)
|
|
|
|
#if ARCH_X86 || ARCH_X86_64
|
|
#include "x86/dequantize_x86.h"
|
|
#endif
|
|
|
|
#if ARCH_ARM
|
|
#include "arm/dequantize_arm.h"
|
|
#endif
|
|
|
|
#ifndef vp8_dequant_block
|
|
#define vp8_dequant_block vp8_dequantize_b_c
|
|
#endif
|
|
extern prototype_dequant_block(vp8_dequant_block);
|
|
|
|
#ifndef vp8_dequant_idct_add
|
|
#define vp8_dequant_idct_add vp8_dequant_idct_add_c
|
|
#endif
|
|
extern prototype_dequant_idct_add(vp8_dequant_idct_add);
|
|
|
|
#if CONFIG_HYBRIDTRANSFORM
|
|
// declare dequantization and inverse transform module of hybrid transform decoder
|
|
#ifndef vp8_ht_dequant_idct_add
|
|
#define vp8_ht_dequant_idct_add vp8_ht_dequant_idct_add_c
|
|
#endif
|
|
extern void vp8_ht_dequant_idct_add(TX_TYPE tx_type, short *input, short *dq,
|
|
unsigned char *pred, unsigned char *dest,
|
|
int pitch, int stride);
|
|
|
|
#endif
|
|
|
|
#ifndef vp8_dequant_dc_idct_add
|
|
#define vp8_dequant_dc_idct_add vp8_dequant_dc_idct_add_c
|
|
#endif
|
|
extern prototype_dequant_dc_idct_add(vp8_dequant_dc_idct_add);
|
|
|
|
#ifndef vp8_dequant_dc_idct_add_y_block
|
|
#define vp8_dequant_dc_idct_add_y_block vp8_dequant_dc_idct_add_y_block_c
|
|
#endif
|
|
extern prototype_dequant_dc_idct_add_y_block(vp8_dequant_dc_idct_add_y_block);
|
|
|
|
#ifndef vp8_dequant_idct_add_y_block
|
|
#define vp8_dequant_idct_add_y_block vp8_dequant_idct_add_y_block_c
|
|
#endif
|
|
extern prototype_dequant_idct_add_y_block(vp8_dequant_idct_add_y_block);
|
|
|
|
#ifndef vp8_dequant_idct_add_uv_block
|
|
#define vp8_dequant_idct_add_uv_block vp8_dequant_idct_add_uv_block_c
|
|
#endif
|
|
extern prototype_dequant_idct_add_uv_block(vp8_dequant_idct_add_uv_block);
|
|
|
|
#if CONFIG_LOSSLESS
|
|
extern prototype_dequant_idct_add(vp8_dequant_idct_add_lossless_c);
|
|
extern prototype_dequant_dc_idct_add(vp8_dequant_dc_idct_add_lossless_c);
|
|
extern prototype_dequant_dc_idct_add_y_block(vp8_dequant_dc_idct_add_y_block_lossless_c);
|
|
extern prototype_dequant_idct_add_y_block(vp8_dequant_idct_add_y_block_lossless_c);
|
|
extern prototype_dequant_idct_add_uv_block(vp8_dequant_idct_add_uv_block_lossless_c);
|
|
#endif
|
|
|
|
#ifndef vp8_dequant_block_2x2
|
|
#define vp8_dequant_block_2x2 vp8_dequantize_b_2x2_c
|
|
#endif
|
|
extern prototype_dequant_block(vp8_dequant_block_2x2);
|
|
|
|
#ifndef vp8_dequant_idct_add_8x8
|
|
#define vp8_dequant_idct_add_8x8 vp8_dequant_idct_add_8x8_c
|
|
#endif
|
|
extern prototype_dequant_idct_add(vp8_dequant_idct_add_8x8);
|
|
|
|
#ifndef vp8_dequant_dc_idct_add_8x8
|
|
#define vp8_dequant_dc_idct_add_8x8 vp8_dequant_dc_idct_add_8x8_c
|
|
#endif
|
|
extern prototype_dequant_dc_idct_add(vp8_dequant_dc_idct_add_8x8);
|
|
|
|
#ifndef vp8_dequant_dc_idct_add_y_block_8x8
|
|
#define vp8_dequant_dc_idct_add_y_block_8x8 vp8_dequant_dc_idct_add_y_block_8x8_c
|
|
#endif
|
|
extern prototype_dequant_dc_idct_add_y_block_8x8(vp8_dequant_dc_idct_add_y_block_8x8);
|
|
|
|
#ifndef vp8_dequant_idct_add_y_block_8x8
|
|
#define vp8_dequant_idct_add_y_block_8x8 vp8_dequant_idct_add_y_block_8x8_c
|
|
#endif
|
|
extern prototype_dequant_idct_add_y_block_8x8(vp8_dequant_idct_add_y_block_8x8);
|
|
|
|
#ifndef vp8_dequant_idct_add_uv_block_8x8
|
|
#define vp8_dequant_idct_add_uv_block_8x8 vp8_dequant_idct_add_uv_block_8x8_c
|
|
#endif
|
|
extern prototype_dequant_idct_add_uv_block_8x8(vp8_dequant_idct_add_uv_block_8x8);
|
|
|
|
#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16
|
|
#ifndef vp8_dequant_idct_add_16x16
|
|
#define vp8_dequant_idct_add_16x16 vp8_dequant_idct_add_16x16_c
|
|
#endif
|
|
extern prototype_dequant_idct_add(vp8_dequant_idct_add_16x16);
|
|
#endif
|
|
|
|
|
|
typedef prototype_dequant_block((*vp8_dequant_block_fn_t));
|
|
|
|
typedef prototype_dequant_idct_add((*vp8_dequant_idct_add_fn_t));
|
|
|
|
typedef prototype_dequant_dc_idct_add((*vp8_dequant_dc_idct_add_fn_t));
|
|
|
|
typedef prototype_dequant_dc_idct_add_y_block((*vp8_dequant_dc_idct_add_y_block_fn_t));
|
|
|
|
typedef prototype_dequant_idct_add_y_block((*vp8_dequant_idct_add_y_block_fn_t));
|
|
|
|
typedef prototype_dequant_idct_add_uv_block((*vp8_dequant_idct_add_uv_block_fn_t));
|
|
|
|
typedef prototype_dequant_dc_idct_add_y_block_8x8((*vp8_dequant_dc_idct_add_y_block_fn_t_8x8));
|
|
|
|
typedef prototype_dequant_idct_add_y_block_8x8((*vp8_dequant_idct_add_y_block_fn_t_8x8));
|
|
|
|
typedef prototype_dequant_idct_add_uv_block_8x8((*vp8_dequant_idct_add_uv_block_fn_t_8x8));
|
|
|
|
typedef struct {
|
|
vp8_dequant_block_fn_t block;
|
|
vp8_dequant_idct_add_fn_t idct_add;
|
|
vp8_dequant_dc_idct_add_fn_t dc_idct_add;
|
|
vp8_dequant_dc_idct_add_y_block_fn_t dc_idct_add_y_block;
|
|
vp8_dequant_idct_add_y_block_fn_t idct_add_y_block;
|
|
vp8_dequant_idct_add_uv_block_fn_t idct_add_uv_block;
|
|
vp8_dequant_block_fn_t block_2x2;
|
|
vp8_dequant_idct_add_fn_t idct_add_8x8;
|
|
vp8_dequant_dc_idct_add_fn_t dc_idct_add_8x8;
|
|
vp8_dequant_dc_idct_add_y_block_fn_t_8x8 dc_idct_add_y_block_8x8;
|
|
vp8_dequant_idct_add_y_block_fn_t_8x8 idct_add_y_block_8x8;
|
|
vp8_dequant_idct_add_uv_block_fn_t_8x8 idct_add_uv_block_8x8;
|
|
#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16
|
|
vp8_dequant_idct_add_fn_t idct_add_16x16;
|
|
#endif
|
|
} vp8_dequant_rtcd_vtable_t;
|
|
|
|
#if CONFIG_RUNTIME_CPU_DETECT
|
|
#define DEQUANT_INVOKE(ctx,fn) (ctx)->fn
|
|
#else
|
|
#define DEQUANT_INVOKE(ctx,fn) vp8_dequant_##fn
|
|
#endif
|
|
|
|
#if CONFIG_HYBRIDTRANSFORM8X8
|
|
void vp8_ht_dequant_idct_add_8x8_c(TX_TYPE tx_type, short *input, short *dq,
|
|
unsigned char *pred, unsigned char *dest,
|
|
int pitch, int stride);
|
|
#endif
|
|
|
|
#if CONFIG_HYBRIDTRANSFORM16X16
|
|
void vp8_ht_dequant_idct_add_16x16_c(TX_TYPE tx_type, short *input, short *dq,
|
|
unsigned char *pred, unsigned char *dest,
|
|
int pitch, int stride);
|
|
#endif
|
|
|
|
#if CONFIG_SUPERBLOCKS
|
|
void vp8_dequant_dc_idct_add_y_block_8x8_inplace_c(short *q, short *dq,
|
|
unsigned char *dst,
|
|
int stride, char *eobs,
|
|
short *dc, MACROBLOCKD *xd);
|
|
void vp8_dequant_idct_add_uv_block_8x8_inplace_c(short *q, short *dq,
|
|
unsigned char *dstu,
|
|
unsigned char *dstv,
|
|
int stride, char *eobs,
|
|
MACROBLOCKD *xd);
|
|
#endif
|
|
|
|
#endif
|