diff options
Diffstat (limited to 'third_party/aom/av1/encoder/hybrid_fwd_txfm.c')
-rw-r--r-- | third_party/aom/av1/encoder/hybrid_fwd_txfm.c | 609 |
1 files changed, 148 insertions, 461 deletions
diff --git a/third_party/aom/av1/encoder/hybrid_fwd_txfm.c b/third_party/aom/av1/encoder/hybrid_fwd_txfm.c index 6ddeb2b77..0922557d0 100644 --- a/third_party/aom/av1/encoder/hybrid_fwd_txfm.c +++ b/third_party/aom/av1/encoder/hybrid_fwd_txfm.c @@ -9,228 +9,73 @@ * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ -#include "./av1_rtcd.h" -#include "./aom_config.h" -#include "./aom_dsp_rtcd.h" +#include "config/aom_config.h" +#include "config/av1_rtcd.h" +#include "config/aom_dsp_rtcd.h" #include "av1/common/idct.h" #include "av1/encoder/hybrid_fwd_txfm.h" -#if CONFIG_CHROMA_2X2 -static void fwd_txfm_2x2(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { - tran_high_t a1 = src_diff[0]; - tran_high_t b1 = src_diff[1]; - tran_high_t c1 = src_diff[diff_stride]; - tran_high_t d1 = src_diff[1 + diff_stride]; - - tran_high_t a2 = a1 + c1; - tran_high_t b2 = b1 + d1; - tran_high_t c2 = a1 - c1; - tran_high_t d2 = b1 - d1; - - a1 = a2 + b2; - b1 = a2 - b2; - c1 = c2 + d2; - d1 = c2 - d2; - - coeff[0] = (tran_low_t)(4 * a1); - coeff[1] = (tran_low_t)(4 * b1); - coeff[2] = (tran_low_t)(4 * c1); - coeff[3] = (tran_low_t)(4 * d1); - - (void)txfm_param; -} -#endif - -static void fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { - if (txfm_param->lossless) { - assert(txfm_param->tx_type == DCT_DCT); - av1_fwht4x4(src_diff, coeff, diff_stride); - return; +/* 4-point reversible, orthonormal Walsh-Hadamard in 3.5 adds, 0.5 shifts per + pixel. */ +void av1_fwht4x4_c(const int16_t *input, tran_low_t *output, int stride) { + int i; + tran_high_t a1, b1, c1, d1, e1; + const int16_t *ip_pass0 = input; + const tran_low_t *ip = NULL; + tran_low_t *op = output; + + for (i = 0; i < 4; i++) { + a1 = ip_pass0[0 * stride]; + b1 = ip_pass0[1 * stride]; + c1 = ip_pass0[2 * stride]; + d1 = ip_pass0[3 * stride]; + + a1 += b1; + d1 = d1 - c1; + e1 = (a1 - d1) >> 1; + b1 = e1 - b1; + c1 = e1 - c1; + a1 -= c1; + d1 += b1; + op[0] = (tran_low_t)a1; + op[4] = (tran_low_t)c1; + op[8] = (tran_low_t)d1; + op[12] = (tran_low_t)b1; + + ip_pass0++; + op++; } - -#if CONFIG_LGT || CONFIG_DAALA_DCT4 - // only C version has LGTs - av1_fht4x4_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht4x4(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_4x8(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht4x8_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht4x8(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_8x4(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht8x4_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht8x4(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_8x16(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht8x16_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht8x16(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_16x8(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht16x8_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht16x8(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_16x32(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { - av1_fht16x32(src_diff, coeff, diff_stride, txfm_param); -} - -static void fwd_txfm_32x16(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { - av1_fht32x16(src_diff, coeff, diff_stride, txfm_param); -} - -static void fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT || CONFIG_DAALA_DCT8 - av1_fht8x8_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht8x8(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_DAALA_DCT16 - av1_fht16x16_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht16x16(src_diff, coeff, diff_stride, txfm_param); -#endif // CONFIG_DAALA_DCT16 -} - -static void fwd_txfm_32x32(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_MRC_TX - // MRC_DCT currently only has a C implementation - if (txfm_param->tx_type == MRC_DCT) { - av1_fht32x32_c(src_diff, coeff, diff_stride, txfm_param); - return; + ip = output; + op = output; + + for (i = 0; i < 4; i++) { + a1 = ip[0]; + b1 = ip[1]; + c1 = ip[2]; + d1 = ip[3]; + + a1 += b1; + d1 -= c1; + e1 = (a1 - d1) >> 1; + b1 = e1 - b1; + c1 = e1 - c1; + a1 -= c1; + d1 += b1; + op[0] = (tran_low_t)(a1 * UNIT_QUANT_FACTOR); + op[1] = (tran_low_t)(c1 * UNIT_QUANT_FACTOR); + op[2] = (tran_low_t)(d1 * UNIT_QUANT_FACTOR); + op[3] = (tran_low_t)(b1 * UNIT_QUANT_FACTOR); + + ip += 4; + op += 4; } -#endif // CONFIG_MRC_TX - av1_fht32x32(src_diff, coeff, diff_stride, txfm_param); -} - -#if CONFIG_TX64X64 -static void fwd_txfm_64x64(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_EXT_TX - if (txfm_param->tx_type == IDTX) - av1_fwd_idtx_c(src_diff, coeff, diff_stride, 64, 64, txfm_param->tx_type); - else -#endif - av1_fht64x64(src_diff, coeff, diff_stride, txfm_param); -} - -static void fwd_txfm_32x64(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_EXT_TX - if (txfm_param->tx_type == IDTX) - av1_fwd_idtx_c(src_diff, coeff, diff_stride, 32, 64, txfm_param->tx_type); - else -#endif - av1_fht32x64(src_diff, coeff, diff_stride, txfm_param); -} - -static void fwd_txfm_64x32(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_EXT_TX - if (txfm_param->tx_type == IDTX) - av1_fwd_idtx_c(src_diff, coeff, diff_stride, 64, 32, txfm_param->tx_type); - else -#endif - av1_fht64x32(src_diff, coeff, diff_stride, txfm_param); -} -#endif // CONFIG_TX64X64 - -#if CONFIG_RECT_TX_EXT && (CONFIG_EXT_TX || CONFIG_VAR_TX) -static void fwd_txfm_16x4(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht16x4_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht16x4(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_4x16(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht4x16_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht4x16(src_diff, coeff, diff_stride, txfm_param); -#endif -} - -static void fwd_txfm_32x8(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht32x8_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht32x8(src_diff, coeff, diff_stride, txfm_param); -#endif } -static void fwd_txfm_8x32(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { -#if CONFIG_LGT - av1_fht8x32_c(src_diff, coeff, diff_stride, txfm_param); -#else - av1_fht8x32(src_diff, coeff, diff_stride, txfm_param); -#endif -} -#endif - -#if CONFIG_CHROMA_2X2 -static void highbd_fwd_txfm_2x2(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param) { - tran_high_t a1 = src_diff[0]; - tran_high_t b1 = src_diff[1]; - tran_high_t c1 = src_diff[diff_stride]; - tran_high_t d1 = src_diff[1 + diff_stride]; - - tran_high_t a2 = a1 + c1; - tran_high_t b2 = b1 + d1; - tran_high_t c2 = a1 - c1; - tran_high_t d2 = b1 - d1; - - a1 = a2 + b2; - b1 = a2 - b2; - c1 = c2 + d2; - d1 = c2 - d2; - - coeff[0] = (tran_low_t)(4 * a1); - coeff[1] = (tran_low_t)(4 * b1); - coeff[2] = (tran_low_t)(4 * c1); - coeff[3] = (tran_low_t)(4 * d1); - - (void)txfm_param; +void av1_highbd_fwht4x4_c(const int16_t *input, tran_low_t *output, + int stride) { + av1_fwht4x4_c(input, output, stride); } -#endif static void highbd_fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { @@ -243,22 +88,6 @@ static void highbd_fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff, return; } switch (tx_type) { - case DCT_DCT: - case ADST_DCT: - case DCT_ADST: - case ADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_4x4(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; -#if CONFIG_EXT_TX - case FLIPADST_DCT: - case DCT_FLIPADST: - case FLIPADST_FLIPADST: - case ADST_FLIPADST: - case FLIPADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_4x4(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; // use the c version for anything including identity for now case V_DCT: case H_DCT: @@ -267,11 +96,11 @@ static void highbd_fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff, case V_FLIPADST: case H_FLIPADST: case IDTX: - // fallthrough intended av1_fwd_txfm2d_4x4_c(src_diff, dst_coeff, diff_stride, tx_type, bd); break; -#endif // CONFIG_EXT_TX - default: assert(0); + default: + av1_fwd_txfm2d_4x4(src_diff, dst_coeff, diff_stride, tx_type, bd); + break; } } @@ -317,28 +146,40 @@ static void highbd_fwd_txfm_32x16(const int16_t *src_diff, tran_low_t *coeff, txfm_param->bd); } +static void highbd_fwd_txfm_16x4(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + int32_t *dst_coeff = (int32_t *)coeff; + av1_fwd_txfm2d_16x4_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, + txfm_param->bd); +} + +static void highbd_fwd_txfm_4x16(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + int32_t *dst_coeff = (int32_t *)coeff; + av1_fwd_txfm2d_4x16_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, + txfm_param->bd); +} + +static void highbd_fwd_txfm_32x8(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + int32_t *dst_coeff = (int32_t *)coeff; + av1_fwd_txfm2d_32x8_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, + txfm_param->bd); +} + +static void highbd_fwd_txfm_8x32(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + int32_t *dst_coeff = (int32_t *)coeff; + av1_fwd_txfm2d_8x32_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, + txfm_param->bd); +} + static void highbd_fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { int32_t *dst_coeff = (int32_t *)coeff; const TX_TYPE tx_type = txfm_param->tx_type; const int bd = txfm_param->bd; switch (tx_type) { - case DCT_DCT: - case ADST_DCT: - case DCT_ADST: - case ADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_8x8(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; -#if CONFIG_EXT_TX - case FLIPADST_DCT: - case DCT_FLIPADST: - case FLIPADST_FLIPADST: - case ADST_FLIPADST: - case FLIPADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_8x8(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; // use the c version for anything including identity for now case V_DCT: case H_DCT: @@ -347,11 +188,11 @@ static void highbd_fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff, case V_FLIPADST: case H_FLIPADST: case IDTX: - // fallthrough intended av1_fwd_txfm2d_8x8_c(src_diff, dst_coeff, diff_stride, tx_type, bd); break; -#endif // CONFIG_EXT_TX - default: assert(0); + default: + av1_fwd_txfm2d_8x8(src_diff, dst_coeff, diff_stride, tx_type, bd); + break; } } @@ -361,22 +202,6 @@ static void highbd_fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff, const TX_TYPE tx_type = txfm_param->tx_type; const int bd = txfm_param->bd; switch (tx_type) { - case DCT_DCT: - case ADST_DCT: - case DCT_ADST: - case ADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_16x16(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; -#if CONFIG_EXT_TX - case FLIPADST_DCT: - case DCT_FLIPADST: - case FLIPADST_FLIPADST: - case ADST_FLIPADST: - case FLIPADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_16x16(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; // use the c version for anything including identity for now case V_DCT: case H_DCT: @@ -385,11 +210,11 @@ static void highbd_fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff, case V_FLIPADST: case H_FLIPADST: case IDTX: - // fallthrough intended av1_fwd_txfm2d_16x16_c(src_diff, dst_coeff, diff_stride, tx_type, bd); break; -#endif // CONFIG_EXT_TX - default: assert(0); + default: + av1_fwd_txfm2d_16x16(src_diff, dst_coeff, diff_stride, tx_type, bd); + break; } } @@ -399,22 +224,6 @@ static void highbd_fwd_txfm_32x32(const int16_t *src_diff, tran_low_t *coeff, const TX_TYPE tx_type = txfm_param->tx_type; const int bd = txfm_param->bd; switch (tx_type) { - case DCT_DCT: - case ADST_DCT: - case DCT_ADST: - case ADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_32x32(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; -#if CONFIG_EXT_TX - case FLIPADST_DCT: - case DCT_FLIPADST: - case FLIPADST_FLIPADST: - case ADST_FLIPADST: - case FLIPADST_ADST: - // fallthrough intended - av1_fwd_txfm2d_32x32(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; // use the c version for anything including identity for now case V_DCT: case H_DCT: @@ -423,206 +232,72 @@ static void highbd_fwd_txfm_32x32(const int16_t *src_diff, tran_low_t *coeff, case V_FLIPADST: case H_FLIPADST: case IDTX: - // fallthrough intended av1_fwd_txfm2d_32x32_c(src_diff, dst_coeff, diff_stride, tx_type, bd); break; -#endif // CONFIG_EXT_TX - default: assert(0); + default: + av1_fwd_txfm2d_32x32(src_diff, dst_coeff, diff_stride, tx_type, bd); + break; } } -#if CONFIG_TX64X64 static void highbd_fwd_txfm_32x64(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { + assert(txfm_param->tx_type == DCT_DCT); int32_t *dst_coeff = (int32_t *)coeff; - const TX_TYPE tx_type = txfm_param->tx_type; const int bd = txfm_param->bd; - switch (tx_type) { - case DCT_DCT: - av1_fwd_txfm2d_32x64_c(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; -#if CONFIG_EXT_TX - case ADST_DCT: - case DCT_ADST: - case ADST_ADST: - case FLIPADST_DCT: - case DCT_FLIPADST: - case FLIPADST_FLIPADST: - case ADST_FLIPADST: - case FLIPADST_ADST: - case V_DCT: - case H_DCT: - case V_ADST: - case H_ADST: - case V_FLIPADST: - case H_FLIPADST: - // TODO(sarahparker) - // I've deleted the 64x64 implementations that existed in lieu - // of adst, flipadst and identity for simplicity but will bring back - // in a later change. This shouldn't impact performance since - // DCT_DCT is the only extended type currently allowed for 64x64, - // as dictated by get_ext_tx_set_type in blockd.h. - av1_fwd_txfm2d_32x64_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); - break; - case IDTX: - av1_fwd_idtx_c(src_diff, dst_coeff, diff_stride, 32, 64, tx_type); - break; -#endif // CONFIG_EXT_TX - default: assert(0); break; - } + av1_fwd_txfm2d_32x64_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); } static void highbd_fwd_txfm_64x32(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { + assert(txfm_param->tx_type == DCT_DCT); int32_t *dst_coeff = (int32_t *)coeff; - const TX_TYPE tx_type = txfm_param->tx_type; const int bd = txfm_param->bd; - switch (tx_type) { - case DCT_DCT: - av1_fwd_txfm2d_64x32_c(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; -#if CONFIG_EXT_TX - case ADST_DCT: - case DCT_ADST: - case ADST_ADST: - case FLIPADST_DCT: - case DCT_FLIPADST: - case FLIPADST_FLIPADST: - case ADST_FLIPADST: - case FLIPADST_ADST: - case V_DCT: - case H_DCT: - case V_ADST: - case H_ADST: - case V_FLIPADST: - case H_FLIPADST: - // TODO(sarahparker) - // I've deleted the 64x64 implementations that existed in lieu - // of adst, flipadst and identity for simplicity but will bring back - // in a later change. This shouldn't impact performance since - // DCT_DCT is the only extended type currently allowed for 64x64, - // as dictated by get_ext_tx_set_type in blockd.h. - av1_fwd_txfm2d_64x32_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); - break; - case IDTX: - av1_fwd_idtx_c(src_diff, dst_coeff, diff_stride, 64, 32, tx_type); - break; -#endif // CONFIG_EXT_TX - default: assert(0); break; - } + av1_fwd_txfm2d_64x32_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); +} + +static void highbd_fwd_txfm_16x64(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + assert(txfm_param->tx_type == DCT_DCT); + int32_t *dst_coeff = (int32_t *)coeff; + const int bd = txfm_param->bd; + av1_fwd_txfm2d_16x64_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); +} + +static void highbd_fwd_txfm_64x16(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + assert(txfm_param->tx_type == DCT_DCT); + int32_t *dst_coeff = (int32_t *)coeff; + const int bd = txfm_param->bd; + av1_fwd_txfm2d_64x16_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); } + static void highbd_fwd_txfm_64x64(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { + assert(txfm_param->tx_type == DCT_DCT); int32_t *dst_coeff = (int32_t *)coeff; - const TX_TYPE tx_type = txfm_param->tx_type; const int bd = txfm_param->bd; - switch (tx_type) { - case DCT_DCT: - av1_fwd_txfm2d_64x64(src_diff, dst_coeff, diff_stride, tx_type, bd); - break; -#if CONFIG_EXT_TX - case ADST_DCT: - case DCT_ADST: - case ADST_ADST: - case FLIPADST_DCT: - case DCT_FLIPADST: - case FLIPADST_FLIPADST: - case ADST_FLIPADST: - case FLIPADST_ADST: - case V_DCT: - case H_DCT: - case V_ADST: - case H_ADST: - case V_FLIPADST: - case H_FLIPADST: - // TODO(sarahparker) - // I've deleted the 64x64 implementations that existed in lieu - // of adst, flipadst and identity for simplicity but will bring back - // in a later change. This shouldn't impact performance since - // DCT_DCT is the only extended type currently allowed for 64x64, - // as dictated by get_ext_tx_set_type in blockd.h. - av1_fwd_txfm2d_64x64_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); - break; - case IDTX: - av1_fwd_idtx_c(src_diff, dst_coeff, diff_stride, 64, 64, tx_type); - break; -#endif // CONFIG_EXT_TX - default: assert(0); break; - } + av1_fwd_txfm2d_64x64(src_diff, dst_coeff, diff_stride, DCT_DCT, bd); } -#endif // CONFIG_TX64X64 void av1_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { - const TX_SIZE tx_size = txfm_param->tx_size; -#if CONFIG_LGT_FROM_PRED - if (txfm_param->use_lgt) { - // if use_lgt is 1, it will override tx_type - assert(is_lgt_allowed(txfm_param->mode, tx_size)); - flgt2d_from_pred_c(src_diff, coeff, diff_stride, txfm_param); - return; - } -#endif // CONFIG_LGT_FROM_PRED - switch (tx_size) { -#if CONFIG_TX64X64 - case TX_64X64: - fwd_txfm_64x64(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_32X64: - fwd_txfm_32x64(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_64X32: - fwd_txfm_64x32(src_diff, coeff, diff_stride, txfm_param); - break; -#endif // CONFIG_TX64X64 - case TX_32X32: - fwd_txfm_32x32(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X16: - fwd_txfm_16x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_8X8: fwd_txfm_8x8(src_diff, coeff, diff_stride, txfm_param); break; - case TX_4X8: fwd_txfm_4x8(src_diff, coeff, diff_stride, txfm_param); break; - case TX_8X4: fwd_txfm_8x4(src_diff, coeff, diff_stride, txfm_param); break; - case TX_8X16: - fwd_txfm_8x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X8: - fwd_txfm_16x8(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X32: - fwd_txfm_16x32(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_32X16: - fwd_txfm_32x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_4X4: fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param); break; -#if CONFIG_CHROMA_2X2 - case TX_2X2: fwd_txfm_2x2(src_diff, coeff, diff_stride, txfm_param); break; -#endif -#if CONFIG_RECT_TX_EXT && (CONFIG_EXT_TX || CONFIG_VAR_TX) - case TX_4X16: - fwd_txfm_4x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X4: - fwd_txfm_16x4(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_8X32: - fwd_txfm_8x32(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_32X8: - fwd_txfm_32x8(src_diff, coeff, diff_stride, txfm_param); - break; -#endif - default: assert(0); break; - } + if (txfm_param->bd == 8) + av1_lowbd_fwd_txfm(src_diff, coeff, diff_stride, txfm_param); + else + av1_highbd_fwd_txfm(src_diff, coeff, diff_stride, txfm_param); +} + +void av1_lowbd_fwd_txfm_c(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + av1_highbd_fwd_txfm(src_diff, coeff, diff_stride, txfm_param); } void av1_highbd_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { + assert(av1_ext_tx_used[txfm_param->tx_set_type][txfm_param->tx_type]); const TX_SIZE tx_size = txfm_param->tx_size; switch (tx_size) { -#if CONFIG_TX64X64 case TX_64X64: highbd_fwd_txfm_64x64(src_diff, coeff, diff_stride, txfm_param); break; @@ -632,7 +307,12 @@ void av1_highbd_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff, case TX_64X32: highbd_fwd_txfm_64x32(src_diff, coeff, diff_stride, txfm_param); break; -#endif // CONFIG_TX64X64 + case TX_16X64: + highbd_fwd_txfm_16x64(src_diff, coeff, diff_stride, txfm_param); + break; + case TX_64X16: + highbd_fwd_txfm_64x16(src_diff, coeff, diff_stride, txfm_param); + break; case TX_32X32: highbd_fwd_txfm_32x32(src_diff, coeff, diff_stride, txfm_param); break; @@ -663,11 +343,18 @@ void av1_highbd_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff, case TX_4X4: highbd_fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param); break; -#if CONFIG_CHROMA_2X2 - case TX_2X2: - highbd_fwd_txfm_2x2(src_diff, coeff, diff_stride, txfm_param); + case TX_4X16: + highbd_fwd_txfm_4x16(src_diff, coeff, diff_stride, txfm_param); + break; + case TX_16X4: + highbd_fwd_txfm_16x4(src_diff, coeff, diff_stride, txfm_param); + break; + case TX_8X32: + highbd_fwd_txfm_8x32(src_diff, coeff, diff_stride, txfm_param); + break; + case TX_32X8: + highbd_fwd_txfm_32x8(src_diff, coeff, diff_stride, txfm_param); break; -#endif default: assert(0); break; } } |