Add facade to inverse txfm
Add inv_txfm and highbd_inv_txfm as facades of inverse transform such that the code flow in encodemb.c can be simpler Change-Id: Iea45fd22dd8b173f8eb3919ca6502636f7bcfcf7
This commit is contained in:
@@ -1244,3 +1244,66 @@ void vp10_highbd_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
|
void inv_txfm_add(const tran_low_t *input, uint8_t *dest, int stride,
|
||||||
|
INV_TXFM_PARAM *inv_txfm_param) {
|
||||||
|
const TX_TYPE tx_type = inv_txfm_param->tx_type;
|
||||||
|
const TX_SIZE tx_size = inv_txfm_param->tx_size;
|
||||||
|
const int eob = inv_txfm_param->eob;
|
||||||
|
const int lossless = inv_txfm_param->lossless;
|
||||||
|
|
||||||
|
switch (tx_size) {
|
||||||
|
case TX_32X32:
|
||||||
|
vp10_inv_txfm_add_32x32(input, dest, stride, eob, tx_type);
|
||||||
|
break;
|
||||||
|
case TX_16X16:
|
||||||
|
vp10_inv_txfm_add_16x16(input, dest, stride, eob, tx_type);
|
||||||
|
break;
|
||||||
|
case TX_8X8:
|
||||||
|
vp10_inv_txfm_add_8x8(input, dest, stride, eob, tx_type);
|
||||||
|
break;
|
||||||
|
case TX_4X4:
|
||||||
|
// this is like vp10_short_idct4x4 but has a special case around eob<=1
|
||||||
|
// which is significant (not just an optimization) for the lossless
|
||||||
|
// case.
|
||||||
|
vp10_inv_txfm_add_4x4(input, dest, stride, eob, tx_type,
|
||||||
|
lossless);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0 && "Invalid transform size");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
void highbd_inv_txfm_add(const tran_low_t *input, uint8_t *dest, int stride,
|
||||||
|
INV_TXFM_PARAM *inv_txfm_param) {
|
||||||
|
const TX_TYPE tx_type = inv_txfm_param->tx_type;
|
||||||
|
const TX_SIZE tx_size = inv_txfm_param->tx_size;
|
||||||
|
const int eob = inv_txfm_param->eob;
|
||||||
|
const int bd = inv_txfm_param->bd;
|
||||||
|
const int lossless = inv_txfm_param->lossless;
|
||||||
|
|
||||||
|
switch (tx_size) {
|
||||||
|
case TX_32X32:
|
||||||
|
vp10_highbd_inv_txfm_add_32x32(input, dest, stride, eob, bd, tx_type);
|
||||||
|
break;
|
||||||
|
case TX_16X16:
|
||||||
|
vp10_highbd_inv_txfm_add_16x16(input, dest, stride, eob, bd, tx_type);
|
||||||
|
break;
|
||||||
|
case TX_8X8:
|
||||||
|
vp10_highbd_inv_txfm_add_8x8(input, dest, stride, eob, bd, tx_type);
|
||||||
|
break;
|
||||||
|
case TX_4X4:
|
||||||
|
// this is like vp10_short_idct4x4 but has a special case around eob<=1
|
||||||
|
// which is significant (not just an optimization) for the lossless
|
||||||
|
// case.
|
||||||
|
vp10_highbd_inv_txfm_add_4x4(input, dest, stride, eob, bd, tx_type,
|
||||||
|
lossless);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0 && "Invalid transform size");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|||||||
@@ -24,6 +24,16 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct INV_TXFM_PARAM {
|
||||||
|
TX_TYPE tx_type;
|
||||||
|
TX_SIZE tx_size;
|
||||||
|
int eob;
|
||||||
|
int lossless;
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
int bd;
|
||||||
|
#endif
|
||||||
|
} INV_TXFM_PARAM;
|
||||||
|
|
||||||
typedef void (*transform_1d)(const tran_low_t*, tran_low_t*);
|
typedef void (*transform_1d)(const tran_low_t*, tran_low_t*);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -51,7 +61,8 @@ void vp10_inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest,
|
|||||||
int stride, int eob, TX_TYPE tx_type);
|
int stride, int eob, TX_TYPE tx_type);
|
||||||
void vp10_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
|
void vp10_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
|
||||||
int stride, int eob, TX_TYPE tx_type);
|
int stride, int eob, TX_TYPE tx_type);
|
||||||
|
void inv_txfm_add(const tran_low_t *input, uint8_t *dest, int stride,
|
||||||
|
INV_TXFM_PARAM *inv_txfm_param);
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
void vp10_highbd_iwht4x4_add(const tran_low_t *input, uint8_t *dest, int stride,
|
void vp10_highbd_iwht4x4_add(const tran_low_t *input, uint8_t *dest, int stride,
|
||||||
int eob, int bd);
|
int eob, int bd);
|
||||||
@@ -74,6 +85,8 @@ void vp10_highbd_inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest,
|
|||||||
void vp10_highbd_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
|
void vp10_highbd_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
|
||||||
int stride, int eob, int bd,
|
int stride, int eob, int bd,
|
||||||
TX_TYPE tx_type);
|
TX_TYPE tx_type);
|
||||||
|
void highbd_inv_txfm_add(const tran_low_t *input, uint8_t *dest, int stride,
|
||||||
|
INV_TXFM_PARAM *inv_txfm_param);
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -588,7 +588,7 @@ static void encode_block(int plane, int block, int blk_row, int blk_col,
|
|||||||
tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block);
|
tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block);
|
||||||
uint8_t *dst;
|
uint8_t *dst;
|
||||||
ENTROPY_CONTEXT *a, *l;
|
ENTROPY_CONTEXT *a, *l;
|
||||||
TX_TYPE tx_type = get_tx_type(pd->plane_type, xd, block, tx_size);
|
INV_TXFM_PARAM inv_txfm_param;
|
||||||
#if CONFIG_VAR_TX
|
#if CONFIG_VAR_TX
|
||||||
int i;
|
int i;
|
||||||
const int bwl = b_width_log2_lookup[plane_bsize];
|
const int bwl = b_width_log2_lookup[plane_bsize];
|
||||||
@@ -697,62 +697,21 @@ static void encode_block(int plane, int block, int blk_row, int blk_col,
|
|||||||
|
|
||||||
if (p->eobs[block] == 0)
|
if (p->eobs[block] == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// inverse transform parameters
|
||||||
|
inv_txfm_param.tx_type = get_tx_type(pd->plane_type, xd, block, tx_size);
|
||||||
|
inv_txfm_param.tx_size = tx_size;
|
||||||
|
inv_txfm_param.eob = p->eobs[block];
|
||||||
|
inv_txfm_param.lossless = xd->lossless[xd->mi[0]->mbmi.segment_id];
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
|
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
|
||||||
switch (tx_size) {
|
inv_txfm_param.bd = xd->bd;
|
||||||
case TX_32X32:
|
highbd_inv_txfm_add(dqcoeff, dst, pd->dst.stride, &inv_txfm_param);
|
||||||
vp10_highbd_inv_txfm_add_32x32(dqcoeff, dst, pd->dst.stride,
|
|
||||||
p->eobs[block], xd->bd, tx_type);
|
|
||||||
break;
|
|
||||||
case TX_16X16:
|
|
||||||
vp10_highbd_inv_txfm_add_16x16(dqcoeff, dst, pd->dst.stride,
|
|
||||||
p->eobs[block], xd->bd, tx_type);
|
|
||||||
break;
|
|
||||||
case TX_8X8:
|
|
||||||
vp10_highbd_inv_txfm_add_8x8(dqcoeff, dst, pd->dst.stride,
|
|
||||||
p->eobs[block], xd->bd, tx_type);
|
|
||||||
break;
|
|
||||||
case TX_4X4:
|
|
||||||
// this is like vp10_short_idct4x4 but has a special case around eob<=1
|
|
||||||
// which is significant (not just an optimization) for the lossless
|
|
||||||
// case.
|
|
||||||
vp10_highbd_inv_txfm_add_4x4(dqcoeff, dst, pd->dst.stride,
|
|
||||||
p->eobs[block], xd->bd, tx_type,
|
|
||||||
xd->lossless[xd->mi[0]->mbmi.segment_id]);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0 && "Invalid transform size");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
inv_txfm_add(dqcoeff, dst, pd->dst.stride, &inv_txfm_param);
|
||||||
switch (tx_size) {
|
|
||||||
case TX_32X32:
|
|
||||||
vp10_inv_txfm_add_32x32(dqcoeff, dst, pd->dst.stride, p->eobs[block],
|
|
||||||
tx_type);
|
|
||||||
break;
|
|
||||||
case TX_16X16:
|
|
||||||
vp10_inv_txfm_add_16x16(dqcoeff, dst, pd->dst.stride, p->eobs[block],
|
|
||||||
tx_type);
|
|
||||||
break;
|
|
||||||
case TX_8X8:
|
|
||||||
vp10_inv_txfm_add_8x8(dqcoeff, dst, pd->dst.stride, p->eobs[block],
|
|
||||||
tx_type);
|
|
||||||
break;
|
|
||||||
case TX_4X4:
|
|
||||||
// this is like vp10_short_idct4x4 but has a special case around eob<=1
|
|
||||||
// which is significant (not just an optimization) for the lossless
|
|
||||||
// case.
|
|
||||||
vp10_inv_txfm_add_4x4(dqcoeff, dst, pd->dst.stride, p->eobs[block],
|
|
||||||
tx_type, xd->lossless[xd->mi[0]->mbmi.segment_id]);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0 && "Invalid transform size");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_VAR_TX
|
#if CONFIG_VAR_TX
|
||||||
@@ -932,6 +891,9 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
int tx1d_size = get_tx1d_size(tx_size);
|
int tx1d_size = get_tx1d_size(tx_size);
|
||||||
|
|
||||||
FWD_TXFM_PARAM fwd_txfm_param;
|
FWD_TXFM_PARAM fwd_txfm_param;
|
||||||
|
INV_TXFM_PARAM inv_txfm_param;
|
||||||
|
|
||||||
|
// foward transform parameters
|
||||||
fwd_txfm_param.tx_type = tx_type;
|
fwd_txfm_param.tx_type = tx_type;
|
||||||
fwd_txfm_param.tx_size = tx_size;
|
fwd_txfm_param.tx_size = tx_size;
|
||||||
fwd_txfm_param.fwd_txfm_opt = FWD_TXFM_OPT_NORMAL;
|
fwd_txfm_param.fwd_txfm_opt = FWD_TXFM_OPT_NORMAL;
|
||||||
@@ -946,6 +908,7 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
vp10_predict_intra_block(xd, bwl, bhl, tx_size, mode, dst, dst_stride,
|
vp10_predict_intra_block(xd, bwl, bhl, tx_size, mode, dst, dst_stride,
|
||||||
dst, dst_stride, blk_col, blk_row, plane);
|
dst, dst_stride, blk_col, blk_row, plane);
|
||||||
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
|
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
|
||||||
vpx_highbd_subtract_block(tx1d_size, tx1d_size, src_diff, diff_stride,
|
vpx_highbd_subtract_block(tx1d_size, tx1d_size, src_diff, diff_stride,
|
||||||
@@ -960,9 +923,6 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
qcoeff, dqcoeff, pd->dequant, eob,
|
qcoeff, dqcoeff, pd->dequant, eob,
|
||||||
scan_order->scan, scan_order->iscan);
|
scan_order->scan, scan_order->iscan);
|
||||||
}
|
}
|
||||||
if (*eob)
|
|
||||||
vp10_highbd_inv_txfm_add_32x32(dqcoeff, dst, dst_stride, *eob, xd->bd,
|
|
||||||
tx_type);
|
|
||||||
break;
|
break;
|
||||||
case TX_16X16:
|
case TX_16X16:
|
||||||
if (!x->skip_recode) {
|
if (!x->skip_recode) {
|
||||||
@@ -971,9 +931,6 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
pd->dequant, eob,
|
pd->dequant, eob,
|
||||||
scan_order->scan, scan_order->iscan);
|
scan_order->scan, scan_order->iscan);
|
||||||
}
|
}
|
||||||
if (*eob)
|
|
||||||
vp10_highbd_inv_txfm_add_16x16(dqcoeff, dst, dst_stride, *eob, xd->bd,
|
|
||||||
tx_type);
|
|
||||||
break;
|
break;
|
||||||
case TX_8X8:
|
case TX_8X8:
|
||||||
if (!x->skip_recode) {
|
if (!x->skip_recode) {
|
||||||
@@ -982,9 +939,6 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
pd->dequant, eob,
|
pd->dequant, eob,
|
||||||
scan_order->scan, scan_order->iscan);
|
scan_order->scan, scan_order->iscan);
|
||||||
}
|
}
|
||||||
if (*eob)
|
|
||||||
vp10_highbd_inv_txfm_add_8x8(dqcoeff, dst, dst_stride, *eob, xd->bd,
|
|
||||||
tx_type);
|
|
||||||
break;
|
break;
|
||||||
case TX_4X4:
|
case TX_4X4:
|
||||||
if (!x->skip_recode) {
|
if (!x->skip_recode) {
|
||||||
@@ -993,20 +947,22 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
pd->dequant, eob,
|
pd->dequant, eob,
|
||||||
scan_order->scan, scan_order->iscan);
|
scan_order->scan, scan_order->iscan);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*eob)
|
|
||||||
// this is like vp10_short_idct4x4 but has a special case around
|
|
||||||
// eob<=1 which is significant (not just an optimization) for the
|
|
||||||
// lossless case.
|
|
||||||
vp10_highbd_inv_txfm_add_4x4(dqcoeff, dst, dst_stride, *eob, xd->bd,
|
|
||||||
tx_type, xd->lossless[mbmi->segment_id]);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (*eob)
|
if (*eob) {
|
||||||
|
// inverse transform parameters
|
||||||
|
inv_txfm_param.tx_type = tx_type;
|
||||||
|
inv_txfm_param.tx_size = tx_size;
|
||||||
|
inv_txfm_param.eob = *eob;
|
||||||
|
inv_txfm_param.lossless = xd->lossless[mbmi->segment_id];
|
||||||
|
inv_txfm_param.bd = xd->bd;
|
||||||
|
|
||||||
|
highbd_inv_txfm_add(dqcoeff, dst, dst_stride, &inv_txfm_param);
|
||||||
*(args->skip) = 0;
|
*(args->skip) = 0;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
@@ -1023,8 +979,6 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
pd->dequant, eob, scan_order->scan,
|
pd->dequant, eob, scan_order->scan,
|
||||||
scan_order->iscan);
|
scan_order->iscan);
|
||||||
}
|
}
|
||||||
if (*eob)
|
|
||||||
vp10_inv_txfm_add_32x32(dqcoeff, dst, dst_stride, *eob, tx_type);
|
|
||||||
break;
|
break;
|
||||||
case TX_16X16:
|
case TX_16X16:
|
||||||
if (!x->skip_recode) {
|
if (!x->skip_recode) {
|
||||||
@@ -1033,8 +987,6 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
pd->dequant, eob, scan_order->scan,
|
pd->dequant, eob, scan_order->scan,
|
||||||
scan_order->iscan);
|
scan_order->iscan);
|
||||||
}
|
}
|
||||||
if (*eob)
|
|
||||||
vp10_inv_txfm_add_16x16(dqcoeff, dst, dst_stride, *eob, tx_type);
|
|
||||||
break;
|
break;
|
||||||
case TX_8X8:
|
case TX_8X8:
|
||||||
if (!x->skip_recode) {
|
if (!x->skip_recode) {
|
||||||
@@ -1043,8 +995,6 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
pd->dequant, eob, scan_order->scan,
|
pd->dequant, eob, scan_order->scan,
|
||||||
scan_order->iscan);
|
scan_order->iscan);
|
||||||
}
|
}
|
||||||
if (*eob)
|
|
||||||
vp10_inv_txfm_add_8x8(dqcoeff, dst, dst_stride, *eob, tx_type);
|
|
||||||
break;
|
break;
|
||||||
case TX_4X4:
|
case TX_4X4:
|
||||||
if (!x->skip_recode) {
|
if (!x->skip_recode) {
|
||||||
@@ -1053,21 +1003,21 @@ void vp10_encode_block_intra(int plane, int block, int blk_row, int blk_col,
|
|||||||
pd->dequant, eob, scan_order->scan,
|
pd->dequant, eob, scan_order->scan,
|
||||||
scan_order->iscan);
|
scan_order->iscan);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*eob) {
|
|
||||||
// this is like vp10_short_idct4x4 but has a special case around eob<=1
|
|
||||||
// which is significant (not just an optimization) for the lossless
|
|
||||||
// case.
|
|
||||||
vp10_inv_txfm_add_4x4(dqcoeff, dst, dst_stride, *eob, tx_type,
|
|
||||||
xd->lossless[xd->mi[0]->mbmi.segment_id]);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*eob)
|
if (*eob) {
|
||||||
|
// inverse transform parameters
|
||||||
|
inv_txfm_param.tx_type = tx_type;
|
||||||
|
inv_txfm_param.tx_size = tx_size;
|
||||||
|
inv_txfm_param.eob = *eob;
|
||||||
|
inv_txfm_param.lossless = xd->lossless[mbmi->segment_id];
|
||||||
|
|
||||||
|
inv_txfm_add(dqcoeff, dst, dst_stride, &inv_txfm_param);
|
||||||
*(args->skip) = 0;
|
*(args->skip) = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp10_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
|
void vp10_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
|
||||||
|
|||||||
Reference in New Issue
Block a user