diff options
Diffstat (limited to 'third_party/aom/av1/common/av1_inv_txfm2d.c')
-rw-r--r-- | third_party/aom/av1/common/av1_inv_txfm2d.c | 165 |
1 files changed, 69 insertions, 96 deletions
diff --git a/third_party/aom/av1/common/av1_inv_txfm2d.c b/third_party/aom/av1/common/av1_inv_txfm2d.c index d56c7d11f..e07f994c6 100644 --- a/third_party/aom/av1/common/av1_inv_txfm2d.c +++ b/third_party/aom/av1/common/av1_inv_txfm2d.c @@ -13,7 +13,7 @@ #include "av1/common/enums.h" #include "av1/common/av1_txfm.h" #include "av1/common/av1_inv_txfm1d.h" -#include "av1/common/av1_inv_txfm2d_cfg.h" +#include "av1/common/av1_inv_txfm1d_cfg.h" static INLINE TxfmFunc inv_txfm_type_to_func(TXFM_TYPE txfm_type) { switch (txfm_type) { @@ -25,132 +25,100 @@ static INLINE TxfmFunc inv_txfm_type_to_func(TXFM_TYPE txfm_type) { case TXFM_TYPE_ADST8: return av1_iadst8_new; case TXFM_TYPE_ADST16: return av1_iadst16_new; case TXFM_TYPE_ADST32: return av1_iadst32_new; +#if CONFIG_EXT_TX + case TXFM_TYPE_IDENTITY4: return av1_iidentity4_c; + case TXFM_TYPE_IDENTITY8: return av1_iidentity8_c; + case TXFM_TYPE_IDENTITY16: return av1_iidentity16_c; + case TXFM_TYPE_IDENTITY32: return av1_iidentity32_c; +#endif // CONFIG_EXT_TX default: assert(0); return NULL; } } -const TXFM_2D_CFG *inv_txfm_cfg_ls[TX_TYPES][TX_SIZES] = { - // DCT_DCT - { -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_dct_dct_4, &inv_txfm_2d_cfg_dct_dct_8, - &inv_txfm_2d_cfg_dct_dct_16, &inv_txfm_2d_cfg_dct_dct_32 }, - // ADST_DCT +static const TXFM_1D_CFG *inv_txfm_col_cfg_ls[TX_TYPES_1D][TX_SIZES] = { + // DCT { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_adst_dct_4, &inv_txfm_2d_cfg_adst_dct_8, - &inv_txfm_2d_cfg_adst_dct_16, &inv_txfm_2d_cfg_adst_dct_32 }, - // DCT_ADST + &inv_txfm_1d_col_cfg_dct_4, &inv_txfm_1d_col_cfg_dct_8, + &inv_txfm_1d_col_cfg_dct_16, &inv_txfm_1d_col_cfg_dct_32 }, + // ADST { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_dct_adst_4, &inv_txfm_2d_cfg_dct_adst_8, - &inv_txfm_2d_cfg_dct_adst_16, &inv_txfm_2d_cfg_dct_adst_32 }, - // ADST_ADST + &inv_txfm_1d_col_cfg_adst_4, &inv_txfm_1d_col_cfg_adst_8, + &inv_txfm_1d_col_cfg_adst_16, &inv_txfm_1d_col_cfg_adst_32 }, +#if CONFIG_EXT_TX + // FLIPADST { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, -#if CONFIG_EXT_TX - // FLIPADST_DCT + &inv_txfm_1d_col_cfg_adst_4, &inv_txfm_1d_col_cfg_adst_8, + &inv_txfm_1d_col_cfg_adst_16, &inv_txfm_1d_col_cfg_adst_32 }, + // IDENTITY { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_adst_dct_4, &inv_txfm_2d_cfg_adst_dct_8, - &inv_txfm_2d_cfg_adst_dct_16, &inv_txfm_2d_cfg_adst_dct_32 }, - // DCT_FLIPADST + &inv_txfm_1d_cfg_identity_4, &inv_txfm_1d_cfg_identity_8, + &inv_txfm_1d_cfg_identity_16, &inv_txfm_1d_cfg_identity_32 }, +#endif // CONFIG_EXT_TX +}; + +static const TXFM_1D_CFG *inv_txfm_row_cfg_ls[TX_TYPES_1D][TX_SIZES] = { + // DCT { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_dct_adst_4, &inv_txfm_2d_cfg_dct_adst_8, - &inv_txfm_2d_cfg_dct_adst_16, &inv_txfm_2d_cfg_dct_adst_32 }, - // FLIPADST_FLIPADST + &inv_txfm_1d_row_cfg_dct_4, &inv_txfm_1d_row_cfg_dct_8, + &inv_txfm_1d_row_cfg_dct_16, &inv_txfm_1d_row_cfg_dct_32 }, + // ADST { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, - // ADST_FLIPADST + &inv_txfm_1d_row_cfg_adst_4, &inv_txfm_1d_row_cfg_adst_8, + &inv_txfm_1d_row_cfg_adst_16, &inv_txfm_1d_row_cfg_adst_32 }, +#if CONFIG_EXT_TX + // FLIPADST { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, - // FLIPADST_ADST + &inv_txfm_1d_row_cfg_adst_4, &inv_txfm_1d_row_cfg_adst_8, + &inv_txfm_1d_row_cfg_adst_16, &inv_txfm_1d_row_cfg_adst_32 }, + // IDENTITY { -#if CONFIG_CB4X4 +#if CONFIG_CHROMA_2X2 NULL, #endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, - { // IDTX -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, - { // V_DCT -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_dct_adst_4, &inv_txfm_2d_cfg_dct_adst_8, - &inv_txfm_2d_cfg_dct_adst_16, &inv_txfm_2d_cfg_dct_adst_32 }, - { // H_DCT -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_adst_dct_4, &inv_txfm_2d_cfg_adst_dct_8, - &inv_txfm_2d_cfg_adst_dct_16, &inv_txfm_2d_cfg_adst_dct_32 }, - { // V_ADST -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, - { // H_ADST -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, - { // V_FLIP_ADST -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, - { // H_FLIP_ADST -#if CONFIG_CB4X4 - NULL, -#endif - &inv_txfm_2d_cfg_adst_adst_4, &inv_txfm_2d_cfg_adst_adst_8, - &inv_txfm_2d_cfg_adst_adst_16, &inv_txfm_2d_cfg_adst_adst_32 }, + &inv_txfm_1d_cfg_identity_4, &inv_txfm_1d_cfg_identity_8, + &inv_txfm_1d_cfg_identity_16, &inv_txfm_1d_cfg_identity_32 }, #endif // CONFIG_EXT_TX }; TXFM_2D_FLIP_CFG av1_get_inv_txfm_cfg(int tx_type, int tx_size) { TXFM_2D_FLIP_CFG cfg; set_flip_cfg(tx_type, &cfg); - cfg.cfg = inv_txfm_cfg_ls[tx_type][tx_size]; + int tx_type_col = vtx_tab[tx_type]; + int tx_type_row = htx_tab[tx_type]; + // TODO(sarahparker) this is currently only implemented for + // square transforms + cfg.col_cfg = inv_txfm_col_cfg_ls[tx_type_col][tx_size]; + cfg.row_cfg = inv_txfm_row_cfg_ls[tx_type_row][tx_size]; return cfg; } TXFM_2D_FLIP_CFG av1_get_inv_txfm_64x64_cfg(int tx_type) { - TXFM_2D_FLIP_CFG cfg = { 0, 0, NULL }; + TXFM_2D_FLIP_CFG cfg = { 0, 0, NULL, NULL }; switch (tx_type) { case DCT_DCT: - cfg.cfg = &inv_txfm_2d_cfg_dct_dct_64; + cfg.col_cfg = &inv_txfm_1d_col_cfg_dct_64; + cfg.row_cfg = &inv_txfm_1d_row_cfg_dct_64; set_flip_cfg(tx_type, &cfg); break; default: assert(0); @@ -161,14 +129,15 @@ TXFM_2D_FLIP_CFG av1_get_inv_txfm_64x64_cfg(int tx_type) { static INLINE void inv_txfm2d_add_c(const int32_t *input, int16_t *output, int stride, TXFM_2D_FLIP_CFG *cfg, int32_t *txfm_buf) { - const int txfm_size = cfg->cfg->txfm_size; - const int8_t *shift = cfg->cfg->shift; - const int8_t *stage_range_col = cfg->cfg->stage_range_col; - const int8_t *stage_range_row = cfg->cfg->stage_range_row; - const int8_t *cos_bit_col = cfg->cfg->cos_bit_col; - const int8_t *cos_bit_row = cfg->cfg->cos_bit_row; - const TxfmFunc txfm_func_col = inv_txfm_type_to_func(cfg->cfg->txfm_type_col); - const TxfmFunc txfm_func_row = inv_txfm_type_to_func(cfg->cfg->txfm_type_row); + // TODO(sarahparker) must correct for rectangular transforms in follow up + const int txfm_size = cfg->row_cfg->txfm_size; + const int8_t *shift = cfg->row_cfg->shift; + const int8_t *stage_range_col = cfg->col_cfg->stage_range; + const int8_t *stage_range_row = cfg->row_cfg->stage_range; + const int8_t *cos_bit_col = cfg->col_cfg->cos_bit; + const int8_t *cos_bit_row = cfg->row_cfg->cos_bit; + const TxfmFunc txfm_func_col = inv_txfm_type_to_func(cfg->col_cfg->txfm_type); + const TxfmFunc txfm_func_row = inv_txfm_type_to_func(cfg->row_cfg->txfm_type); // txfm_buf's length is txfm_size * txfm_size + 2 * txfm_size // it is used for intermediate data buffering @@ -216,7 +185,11 @@ static INLINE void inv_txfm2d_add_facade(const int32_t *input, uint16_t *output, // int16_t* TXFM_2D_FLIP_CFG cfg = av1_get_inv_txfm_cfg(tx_type, tx_size); inv_txfm2d_add_c(input, (int16_t *)output, stride, &cfg, txfm_buf); - clamp_block((int16_t *)output, cfg.cfg->txfm_size, stride, 0, (1 << bd) - 1); + // TODO(sarahparker) just using the cfg_row->txfm_size for now because + // we are assumint this is only used for square transforms. This will + // be adjusted in a follow up + clamp_block((int16_t *)output, cfg.row_cfg->txfm_size, stride, 0, + (1 << bd) - 1); } void av1_inv_txfm2d_add_4x4_c(const int32_t *input, uint16_t *output, |