Fix bitrot in LBD Daala inverse TX Cleanup/optimizations of the low-bitdepth inverse TX path for AV1 TX broke Daala TX in several places; this patch cleans up the cleanup. Tested against the New Daala TX code that unified LBD/HBD, restores bit-identical TX behavior. monty-daalaTX-invzerotest-LBD-s1-2@2017-11-10T08:46:01.822Z -> monty-daalaTX-invzerotest-test-s1@2017-11-09T05:09:05.483Z PSNR | PSNR Cb | PSNR Cr | PSNR HVS | SSIM | MS SSIM | CIEDE 2000 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 Change-Id: I58e4de4c71ec5251138ff7816f77777db6f869a3
diff --git a/av1/common/idct.c b/av1/common/idct.c index c3bde4c..51c35cd 100644 --- a/av1/common/idct.c +++ b/av1/common/idct.c
@@ -56,7 +56,7 @@ } } -#if CONFIG_TX64X64 +#if CONFIG_TX64X64 && !CONFIG_DAALA_TX64 static void iidtx64_c(const tran_low_t *input, tran_low_t *output) { for (int i = 0; i < 64; ++i) { output[i] = (tran_low_t)dct_const_round_shift(input[i] * 4 * Sqrt2); @@ -78,7 +78,7 @@ // Note overall scaling factor is 4 times orthogonal } -#if CONFIG_TX64X64 +#if CONFIG_TX64X64 && !CONFIG_DAALA_TX64 static void idct64_col_c(const tran_low_t *input, tran_low_t *output) { int32_t in[64], out[64]; @@ -111,6 +111,8 @@ #endif // CONFIG_TX64X64 // Inverse identity transform and add. +#if !(CONFIG_DAALA_TX4 && CONFIG_DAALA_TX8 && CONFIG_DAALA_TX16 && \ + CONFIG_DAALA_TX32 && (!CONFIG_TX64X64 || CONFIG_DAALA_TX64)) static void inv_idtx_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bsx, int bsy, TX_TYPE tx_type) { const int pels = bsx * bsy; @@ -124,6 +126,7 @@ } } } +#endif #define FLIPUD_PTR(dest, stride, size) \ do { \ @@ -1813,13 +1816,12 @@ av1_iwht4x4_add(input, dest, stride, txfm_param); return; } - - switch (tx_type) { -#if !CONFIG_DAALA_TX4 - case DCT_DCT: av1_idct4x4_add(input, dest, stride, txfm_param); break; +#if CONFIG_DAALA_TX4 + (void)tx_type; + av1_iht4x4_16_add_c(input, dest, stride, txfm_param); #else - case DCT_DCT: -#endif + switch (tx_type) { + case DCT_DCT: av1_idct4x4_add(input, dest, stride, txfm_param); break; case ADST_DCT: case DCT_ADST: case ADST_ADST: av1_iht4x4_16_add(input, dest, stride, txfm_param); break; @@ -1842,6 +1844,7 @@ case IDTX: inv_idtx_add_c(input, dest, stride, 4, 4, tx_type); break; default: assert(0); break; } +#endif } static void inv_txfm_add_4x8(const tran_low_t *input, uint8_t *dest, int stride, @@ -1943,13 +1946,12 @@ static void inv_txfm_add_8x8(const tran_low_t *input, uint8_t *dest, int stride, const TxfmParam *txfm_param) { +#if CONFIG_DAALA_TX8 + av1_iht8x8_64_add_c(input, dest, stride, txfm_param); +#else const TX_TYPE tx_type = txfm_param->tx_type; switch (tx_type) { -#if !CONFIG_DAALA_TX8 case DCT_DCT: idct8x8_add(input, dest, stride, txfm_param); break; -#else - case DCT_DCT: -#endif case ADST_DCT: case DCT_ADST: case ADST_ADST: av1_iht8x8_64_add(input, dest, stride, txfm_param); break; @@ -1972,17 +1974,17 @@ case IDTX: inv_idtx_add_c(input, dest, stride, 8, 8, tx_type); break; default: assert(0); break; } +#endif } static void inv_txfm_add_16x16(const tran_low_t *input, uint8_t *dest, int stride, const TxfmParam *txfm_param) { +#if CONFIG_DAALA_TX16 + av1_iht16x16_256_add_c(input, dest, stride, txfm_param); +#else const TX_TYPE tx_type = txfm_param->tx_type; switch (tx_type) { -#if !CONFIG_DAALA_TX16 case DCT_DCT: idct16x16_add(input, dest, stride, txfm_param); break; -#else - case DCT_DCT: -#endif case ADST_DCT: case DCT_ADST: case ADST_ADST: @@ -2007,19 +2009,17 @@ #endif // CONFIG_MRC_TX default: assert(0); break; } +#endif } static void inv_txfm_add_32x32(const tran_low_t *input, uint8_t *dest, int stride, const TxfmParam *txfm_param) { +#if CONFIG_DAALA_TX32 + av1_iht32x32_1024_add_c(input, dest, stride, txfm_param); +#else const TX_TYPE tx_type = txfm_param->tx_type; switch (tx_type) { -#if !CONFIG_DAALA_TX32 case DCT_DCT: idct32x32_add(input, dest, stride, txfm_param); break; -#else - case DCT_DCT: - av1_iht32x32_1024_add_c(input, dest, stride, txfm_param); - break; -#endif case ADST_DCT: case DCT_ADST: case ADST_ADST: @@ -2042,19 +2042,19 @@ #endif // CONFIG_MRC_TX default: assert(0); break; } +#endif } #if CONFIG_TX64X64 static void inv_txfm_add_64x64(const tran_low_t *input, uint8_t *dest, int stride, const TxfmParam *txfm_param) { +#if CONFIG_DAALA_TX64 + av1_iht64x64_4096_add_c(input, dest, stride, txfm_param); +#else const TX_TYPE tx_type = txfm_param->tx_type; assert(tx_type == DCT_DCT); switch (tx_type) { -#if !CONFIG_DAALA_TX64 case DCT_DCT: idct64x64_add(input, dest, stride, txfm_param); break; -#else - case DCT_DCT: -#endif case ADST_DCT: case DCT_ADST: case ADST_ADST: @@ -2077,6 +2077,7 @@ #endif // CONFIG_MRC_TX default: assert(0); break; } +#endif } #endif // CONFIG_TX64X64
diff --git a/av1/encoder/dct.c b/av1/encoder/dct.c index 43d059a..ff9e0fb 100644 --- a/av1/encoder/dct.c +++ b/av1/encoder/dct.c
@@ -2401,7 +2401,7 @@ } } -#if CONFIG_TX64X64 +#if CONFIG_TX64X64 && !(CONFIG_DAALA_TX64 && CONFIG_DAALA_TX32) static void fidtx64(const tran_low_t *input, tran_low_t *output) { int i; for (i = 0; i < 64; ++i)