Commit f1d090e2 authored by Hui Su's avatar Hui Su Committed by Gerrit Code Review

Merge "Refactoring on transform types"

parents 697a8e6f d76e5b36
...@@ -178,30 +178,73 @@ void vp10_idct32x32_add(const tran_low_t *input, uint8_t *dest, int stride, ...@@ -178,30 +178,73 @@ void vp10_idct32x32_add(const tran_low_t *input, uint8_t *dest, int stride,
vpx_idct32x32_1024_add(input, dest, stride); vpx_idct32x32_1024_add(input, dest, stride);
} }
// iht void vp10_inv_txfm_add_4x4(const tran_low_t *input, uint8_t *dest,
void vp10_iht4x4_add(TX_TYPE tx_type, const tran_low_t *input, uint8_t *dest, int stride, int eob, TX_TYPE tx_type,
int stride, int eob) { void (*itxm_add_4x4)(const tran_low_t *input,
if (tx_type == DCT_DCT) uint8_t *dest, int stride, int eob)) {
vp10_idct4x4_add(input, dest, stride, eob); switch (tx_type) {
else case DCT_DCT:
vp10_iht4x4_16_add(input, dest, stride, tx_type); itxm_add_4x4(input, dest, stride, eob);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_iht4x4_16_add(input, dest, stride, tx_type);
break;
default:
assert(0);
break;
}
} }
void vp10_iht8x8_add(TX_TYPE tx_type, const tran_low_t *input, uint8_t *dest, void vp10_inv_txfm_add_8x8(const tran_low_t *input, uint8_t *dest,
int stride, int eob) { int stride, int eob, TX_TYPE tx_type) {
if (tx_type == DCT_DCT) { switch (tx_type) {
vp10_idct8x8_add(input, dest, stride, eob); case DCT_DCT:
} else { vp10_idct8x8_add(input, dest, stride, eob);
vp10_iht8x8_64_add(input, dest, stride, tx_type); break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_iht8x8_64_add(input, dest, stride, tx_type);
break;
default:
assert(0);
break;
} }
} }
void vp10_iht16x16_add(TX_TYPE tx_type, const tran_low_t *input, uint8_t *dest, void vp10_inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest,
int stride, int eob) { int stride, int eob, TX_TYPE tx_type) {
if (tx_type == DCT_DCT) { switch (tx_type) {
vp10_idct16x16_add(input, dest, stride, eob); case DCT_DCT:
} else { vp10_idct16x16_add(input, dest, stride, eob);
vp10_iht16x16_256_add(input, dest, stride, tx_type); break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_iht16x16_256_add(input, dest, stride, tx_type);
break;
default:
assert(0);
break;
}
}
void vp10_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
int stride, int eob, TX_TYPE tx_type) {
switch (tx_type) {
case DCT_DCT:
vp10_idct32x32_add(input, dest, stride, eob);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
assert(0);
break;
default:
assert(0);
break;
} }
} }
...@@ -373,30 +416,77 @@ void vp10_highbd_idct32x32_add(const tran_low_t *input, uint8_t *dest, ...@@ -373,30 +416,77 @@ void vp10_highbd_idct32x32_add(const tran_low_t *input, uint8_t *dest,
} }
} }
// iht void vp10_highbd_inv_txfm_add_4x4(const tran_low_t *input, uint8_t *dest,
void vp10_highbd_iht4x4_add(TX_TYPE tx_type, const tran_low_t *input, int stride, int eob, int bd, TX_TYPE tx_type,
uint8_t *dest, int stride, int eob, int bd) { void (*highbd_itxm_add_4x4)
if (tx_type == DCT_DCT) (const tran_low_t *input, uint8_t *dest,
vp10_highbd_idct4x4_add(input, dest, stride, eob, bd); int stride, int eob, int bd)) {
else switch (tx_type) {
vp10_highbd_iht4x4_16_add(input, dest, stride, tx_type, bd); case DCT_DCT:
highbd_itxm_add_4x4(input, dest, stride, eob, bd);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_highbd_iht4x4_16_add(input, dest, stride, tx_type, bd);
break;
default:
assert(0);
break;
}
} }
void vp10_highbd_iht8x8_add(TX_TYPE tx_type, const tran_low_t *input, void vp10_highbd_inv_txfm_add_8x8(const tran_low_t *input, uint8_t *dest,
uint8_t *dest, int stride, int eob, int bd) { int stride, int eob, int bd,
if (tx_type == DCT_DCT) { TX_TYPE tx_type) {
vp10_highbd_idct8x8_add(input, dest, stride, eob, bd); switch (tx_type) {
} else { case DCT_DCT:
vp10_highbd_iht8x8_64_add(input, dest, stride, tx_type, bd); vp10_highbd_idct8x8_add(input, dest, stride, eob, bd);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_highbd_iht8x8_64_add(input, dest, stride, tx_type, bd);
break;
default:
assert(0);
break;
} }
} }
void vp10_highbd_iht16x16_add(TX_TYPE tx_type, const tran_low_t *input, void vp10_highbd_inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest,
uint8_t *dest, int stride, int eob, int bd) { int stride, int eob, int bd,
if (tx_type == DCT_DCT) { TX_TYPE tx_type) {
vp10_highbd_idct16x16_add(input, dest, stride, eob, bd); switch (tx_type) {
} else { case DCT_DCT:
vp10_highbd_iht16x16_256_add(input, dest, stride, tx_type, bd); vp10_highbd_idct16x16_add(input, dest, stride, eob, bd);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_highbd_iht16x16_256_add(input, dest, stride, tx_type, bd);
break;
default:
assert(0);
break;
}
}
void vp10_highbd_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
int stride, int eob, int bd,
TX_TYPE tx_type) {
switch (tx_type) {
case DCT_DCT:
vp10_highbd_idct32x32_add(input, dest, stride, eob, bd);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
assert(0);
break;
default:
assert(0);
break;
} }
} }
#endif // CONFIG_VP9_HIGHBITDEPTH #endif // CONFIG_VP9_HIGHBITDEPTH
...@@ -42,19 +42,17 @@ void vp10_iwht4x4_add(const tran_low_t *input, uint8_t *dest, int stride, ...@@ -42,19 +42,17 @@ void vp10_iwht4x4_add(const tran_low_t *input, uint8_t *dest, int stride,
int eob); int eob);
void vp10_idct4x4_add(const tran_low_t *input, uint8_t *dest, int stride, void vp10_idct4x4_add(const tran_low_t *input, uint8_t *dest, int stride,
int eob); int eob);
void vp10_idct8x8_add(const tran_low_t *input, uint8_t *dest, int stride,
int eob);
void vp10_idct16x16_add(const tran_low_t *input, uint8_t *dest, int stride,
int eob);
void vp10_idct32x32_add(const tran_low_t *input, uint8_t *dest, int stride,
int eob);
void vp10_iht4x4_add(TX_TYPE tx_type, const tran_low_t *input, uint8_t *dest, void vp10_inv_txfm_add_4x4(const tran_low_t *input, uint8_t *dest,
int stride, int eob); int stride, int eob, TX_TYPE tx_type,
void vp10_iht8x8_add(TX_TYPE tx_type, const tran_low_t *input, uint8_t *dest, void (*itxm_add_4x4)(const tran_low_t *input,
int stride, int eob); uint8_t *dest, int stride, int eob));
void vp10_iht16x16_add(TX_TYPE tx_type, const tran_low_t *input, uint8_t *dest, void vp10_inv_txfm_add_8x8(const tran_low_t *input, uint8_t *dest,
int stride, int eob); int stride, int eob, TX_TYPE tx_type);
void vp10_inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest,
int stride, int eob, TX_TYPE tx_type);
void vp10_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
int stride, int eob, TX_TYPE tx_type);
#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,
...@@ -67,12 +65,19 @@ void vp10_highbd_idct16x16_add(const tran_low_t *input, uint8_t *dest, ...@@ -67,12 +65,19 @@ void vp10_highbd_idct16x16_add(const tran_low_t *input, uint8_t *dest,
int stride, int eob, int bd); int stride, int eob, int bd);
void vp10_highbd_idct32x32_add(const tran_low_t *input, uint8_t *dest, void vp10_highbd_idct32x32_add(const tran_low_t *input, uint8_t *dest,
int stride, int eob, int bd); int stride, int eob, int bd);
void vp10_highbd_iht4x4_add(TX_TYPE tx_type, const tran_low_t *input, void vp10_highbd_inv_txfm_add_4x4(const tran_low_t *input, uint8_t *dest,
uint8_t *dest, int stride, int eob, int bd); int stride, int eob, int bd, TX_TYPE tx_type,
void vp10_highbd_iht8x8_add(TX_TYPE tx_type, const tran_low_t *input, void (*highbd_itxm_add_4x4)
uint8_t *dest, int stride, int eob, int bd); (const tran_low_t *input, uint8_t *dest,
void vp10_highbd_iht16x16_add(TX_TYPE tx_type, const tran_low_t *input, int stride, int eob, int bd));
uint8_t *dest, int stride, int eob, int bd); void vp10_highbd_inv_txfm_add_8x8(const tran_low_t *input, uint8_t *dest,
int stride, int eob, int bd, TX_TYPE tx_type);
void vp10_highbd_inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest,
int stride, int eob, int bd,
TX_TYPE tx_type);
void vp10_highbd_inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest,
int stride, int eob, int bd,
TX_TYPE tx_type);
#endif // CONFIG_VP9_HIGHBITDEPTH #endif // CONFIG_VP9_HIGHBITDEPTH
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
......
...@@ -186,76 +186,59 @@ static void read_mv_probs(nmv_context *ctx, int allow_hp, vpx_reader *r) { ...@@ -186,76 +186,59 @@ static void read_mv_probs(nmv_context *ctx, int allow_hp, vpx_reader *r) {
static void inverse_transform_block_inter(MACROBLOCKD* xd, int plane, static void inverse_transform_block_inter(MACROBLOCKD* xd, int plane,
const TX_SIZE tx_size, const TX_SIZE tx_size,
uint8_t *dst, int stride, uint8_t *dst, int stride,
int eob) { int eob, int block) {
struct macroblockd_plane *const pd = &xd->plane[plane]; struct macroblockd_plane *const pd = &xd->plane[plane];
TX_TYPE tx_type = get_tx_type(pd->plane_type, xd, block);
if (eob > 0) { if (eob > 0) {
tran_low_t *const dqcoeff = pd->dqcoeff; tran_low_t *const dqcoeff = pd->dqcoeff;
#if CONFIG_VP9_HIGHBITDEPTH #if CONFIG_VP9_HIGHBITDEPTH
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
if (xd->lossless) { switch (tx_size) {
vp10_highbd_iwht4x4_add(dqcoeff, dst, stride, eob, xd->bd); case TX_4X4:
} else { vp10_highbd_inv_txfm_add_4x4(dqcoeff, dst, stride, eob, xd->bd,
switch (tx_size) { tx_type, xd->lossless ?
case TX_4X4: vp10_highbd_iwht4x4_add :
vp10_highbd_idct4x4_add(dqcoeff, dst, stride, eob, xd->bd); vp10_highbd_idct4x4_add);
break; break;
case TX_8X8: case TX_8X8:
vp10_highbd_idct8x8_add(dqcoeff, dst, stride, eob, xd->bd); vp10_highbd_inv_txfm_add_8x8(dqcoeff, dst, stride, eob, xd->bd,
break; tx_type);
case TX_16X16: break;
vp10_highbd_idct16x16_add(dqcoeff, dst, stride, eob, xd->bd); case TX_16X16:
break; vp10_highbd_inv_txfm_add_16x16(dqcoeff, dst, stride, eob, xd->bd,
case TX_32X32: tx_type);
vp10_highbd_idct32x32_add(dqcoeff, dst, stride, eob, xd->bd); break;
break; case TX_32X32:
default: vp10_highbd_inv_txfm_add_32x32(dqcoeff, dst, stride, eob, xd->bd,
assert(0 && "Invalid transform size"); tx_type);
} break;
} default:
} else { assert(0 && "Invalid transform size");
if (xd->lossless) { return;
vp10_iwht4x4_add(dqcoeff, dst, stride, eob);
} else {
switch (tx_size) {
case TX_4X4:
vp10_idct4x4_add(dqcoeff, dst, stride, eob);
break;
case TX_8X8:
vp10_idct8x8_add(dqcoeff, dst, stride, eob);
break;
case TX_16X16:
vp10_idct16x16_add(dqcoeff, dst, stride, eob);
break;
case TX_32X32:
vp10_idct32x32_add(dqcoeff, dst, stride, eob);
break;
default:
assert(0 && "Invalid transform size");
return;
}
} }
}
#else
if (xd->lossless) {
vp10_iwht4x4_add(dqcoeff, dst, stride, eob);
} else { } else {
#else // CONFIG_VP9_HIGHBITDEPTH
switch (tx_size) { switch (tx_size) {
case TX_4X4: case TX_4X4:
vp10_idct4x4_add(dqcoeff, dst, stride, eob); vp10_inv_txfm_add_4x4(dqcoeff, dst, stride, eob, tx_type,
xd->lossless ? vp10_iwht4x4_add :
vp10_idct4x4_add);
break; break;
case TX_8X8: case TX_8X8:
vp10_idct8x8_add(dqcoeff, dst, stride, eob); vp10_inv_txfm_add_8x8(dqcoeff, dst, stride, eob, tx_type);
break; break;
case TX_16X16: case TX_16X16:
vp10_idct16x16_add(dqcoeff, dst, stride, eob); vp10_inv_txfm_add_16x16(dqcoeff, dst, stride, eob, tx_type);
break; break;
case TX_32X32: case TX_32X32:
vp10_idct32x32_add(dqcoeff, dst, stride, eob); vp10_inv_txfm_add_32x32(dqcoeff, dst, stride, eob, tx_type);
break; break;
default: default:
assert(0 && "Invalid transform size"); assert(0 && "Invalid transform size");
return; return;
} }
#endif // CONFIG_VP9_HIGHBITDEPTH
#if CONFIG_VP9_HIGHBITDEPTH
} }
#endif // CONFIG_VP9_HIGHBITDEPTH #endif // CONFIG_VP9_HIGHBITDEPTH
...@@ -282,70 +265,52 @@ static void inverse_transform_block_intra(MACROBLOCKD* xd, int plane, ...@@ -282,70 +265,52 @@ static void inverse_transform_block_intra(MACROBLOCKD* xd, int plane,
tran_low_t *const dqcoeff = pd->dqcoeff; tran_low_t *const dqcoeff = pd->dqcoeff;
#if CONFIG_VP9_HIGHBITDEPTH #if CONFIG_VP9_HIGHBITDEPTH
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
if (xd->lossless) { switch (tx_size) {
vp10_highbd_iwht4x4_add(dqcoeff, dst, stride, eob, xd->bd); case TX_4X4:
} else { vp10_highbd_inv_txfm_add_4x4(dqcoeff, dst, stride, eob, xd->bd,
switch (tx_size) { tx_type, xd->lossless ?
case TX_4X4: vp10_highbd_iwht4x4_add :
vp10_highbd_iht4x4_add(tx_type, dqcoeff, dst, stride, eob, xd->bd); vp10_highbd_idct4x4_add);
break; break;
case TX_8X8: case TX_8X8:
vp10_highbd_iht8x8_add(tx_type, dqcoeff, dst, stride, eob, xd->bd); vp10_highbd_inv_txfm_add_8x8(dqcoeff, dst, stride, eob, xd->bd,
break; tx_type);
case TX_16X16: break;
vp10_highbd_iht16x16_add(tx_type, dqcoeff, dst, stride, eob, xd->bd); case TX_16X16:
break; vp10_highbd_inv_txfm_add_16x16(dqcoeff, dst, stride, eob, xd->bd,
case TX_32X32: tx_type);
vp10_highbd_idct32x32_add(dqcoeff, dst, stride, eob, xd->bd); break;
break; case TX_32X32:
default: vp10_highbd_inv_txfm_add_32x32(dqcoeff, dst, stride, eob, xd->bd,
assert(0 && "Invalid transform size"); tx_type);
} break;
} default:
} else { assert(0 && "Invalid transform size");
if (xd->lossless) { return;
vp10_iwht4x4_add(dqcoeff, dst, stride, eob);
} else {
switch (tx_size) {
case TX_4X4:
vp10_iht4x4_add(tx_type, dqcoeff, dst, stride, eob);
break;
case TX_8X8:
vp10_iht8x8_add(tx_type, dqcoeff, dst, stride, eob);
break;
case TX_16X16:
vp10_iht16x16_add(tx_type, dqcoeff, dst, stride, eob);
break;
case TX_32X32:
vp10_idct32x32_add(dqcoeff, dst, stride, eob);
break;
default:
assert(0 && "Invalid transform size");
return;
}
} }
}
#else
if (xd->lossless) {
vp10_iwht4x4_add(dqcoeff, dst, stride, eob);
} else { } else {
#else // CONFIG_VP9_HIGHBITDEPTH
switch (tx_size) { switch (tx_size) {
case TX_4X4: case TX_4X4:
vp10_iht4x4_add(tx_type, dqcoeff, dst, stride, eob); vp10_inv_txfm_add_4x4(dqcoeff, dst, stride, eob, tx_type,
xd->lossless ? vp10_iwht4x4_add :
vp10_idct4x4_add);
break; break;
case TX_8X8: case TX_8X8:
vp10_iht8x8_add(tx_type, dqcoeff, dst, stride, eob); vp10_inv_txfm_add_8x8(dqcoeff, dst, stride, eob, tx_type);
break; break;
case TX_16X16: case TX_16X16:
vp10_iht16x16_add(tx_type, dqcoeff, dst, stride, eob); vp10_inv_txfm_add_16x16(dqcoeff, dst, stride, eob, tx_type);
break; break;
case TX_32X32: case TX_32X32:
vp10_idct32x32_add(dqcoeff, dst, stride, eob); vp10_inv_txfm_add_32x32(dqcoeff, dst, stride, eob, tx_type);
break; break;
default: default:
assert(0 && "Invalid transform size"); assert(0 && "Invalid transform size");
return; return;
} }
#endif // CONFIG_VP9_HIGHBITDEPTH
#if CONFIG_VP9_HIGHBITDEPTH
} }
#endif // CONFIG_VP9_HIGHBITDEPTH #endif // CONFIG_VP9_HIGHBITDEPTH
...@@ -406,7 +371,7 @@ static int reconstruct_inter_block(MACROBLOCKD *const xd, vpx_reader *r, ...@@ -406,7 +371,7 @@ static int reconstruct_inter_block(MACROBLOCKD *const xd, vpx_reader *r,
inverse_transform_block_inter(xd, plane, tx_size, inverse_transform_block_inter(xd, plane, tx_size,
&pd->dst.buf[4 * row * pd->dst.stride + 4 * col], &pd->dst.buf[4 * row * pd->dst.stride + 4 * col],
pd->dst.stride, eob); pd->dst.stride, eob, block_idx);
return eob; return eob;
} }
......
...@@ -496,6 +496,146 @@ void vp10_xform_quant_dc(MACROBLOCK *x, int plane, int block, ...@@ -496,6 +496,146 @@ void vp10_xform_quant_dc(MACROBLOCK *x, int plane, int block,
} }
} }
void vp10_fwd_txfm_4x4(const int16_t *src_diff,
tran_low_t *coeff, int diff_stride, TX_TYPE tx_type,
void (*fwd_txm4x4)(const int16_t *input,
tran_low_t *output, int stride)) {
switch (tx_type) {
case DCT_DCT:
fwd_txm4x4(src_diff, coeff, diff_stride);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_fht4x4(src_diff, coeff, diff_stride, tx_type);
break;
default:
assert(0);
break;
}
}
static void fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff,
int diff_stride, TX_TYPE tx_type) {
switch (tx_type) {
case DCT_DCT:
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_fht8x8(src_diff, coeff, diff_stride, tx_type);
break;
default:
assert(0);
break;
}
}
static void fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff,
int diff_stride, TX_TYPE tx_type) {
switch (tx_type) {
case DCT_DCT:
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_fht16x16(src_diff, coeff, diff_stride, tx_type);
break;
default:
assert(0);
break;
}
}
static void fwd_txfm_32x32(int rd_transform, const int16_t *src_diff,
tran_low_t *coeff, int diff_stride,
TX_TYPE tx_type) {
switch (tx_type) {
case DCT_DCT:
fdct32x32(rd_transform, src_diff, coeff, diff_stride);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
assert(0);
break;
default:
assert(0);
break;
}
}
#if CONFIG_VP9_HIGHBITDEPTH
void vp10_highbd_fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff,
int diff_stride, TX_TYPE tx_type,
void (*highbd_fwd_txm4x4)(const int16_t *input,
tran_low_t *output, int stride)) {
switch (tx_type) {
case DCT_DCT:
highbd_fwd_txm4x4(src_diff, coeff, diff_stride);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_highbd_fht4x4(src_diff, coeff, diff_stride, tx_type);
break;
default:
assert(0);
break;
}
}
static void highbd_fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff,
int diff_stride, TX_TYPE tx_type) {
switch (tx_type) {
case DCT_DCT:
vpx_highbd_fdct8x8(src_diff, coeff, diff_stride);
break;
case ADST_DCT:
case DCT_ADST:
case ADST_ADST:
vp10_highbd_fht8x8(src_diff, coeff, diff_stride, tx_type);
break;
default:
assert(0);
break;
}
}
static void highbd_fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff,
int diff_stride, TX_TYPE tx_type) {
switch (tx_type) {
case DCT_DCT:
vpx_highbd_fdct16x16(src_diff, coeff