diff --git a/src/strategies/avx2/quant-avx2.c b/src/strategies/avx2/quant-avx2.c index 8313b1f0..664933a8 100644 --- a/src/strategies/avx2/quant-avx2.c +++ b/src/strategies/avx2/quant-avx2.c @@ -716,7 +716,7 @@ int uvg_quantize_residual_avx2(encoder_state_t *const state, uvg_itransformskip(state->encoder_control, residual, coeff, width); } else { - uvg_itransform2d(state->encoder_control, residual, coeff, width, color, cur_cu); + uvg_itransform2d(state->encoder_control, residual, coeff, width, height, color, cur_cu); } if (state->tile->frame->lmcs_aps->m_sliceReshapeInfo.enableChromaAdj && color != COLOR_Y) { diff --git a/src/strategies/generic/dct-generic.c b/src/strategies/generic/dct-generic.c index 00562737..edba54f5 100644 --- a/src/strategies/generic/dct-generic.c +++ b/src/strategies/generic/dct-generic.c @@ -2499,8 +2499,8 @@ static void mts_dct_generic( { tr_type_t type_hor; tr_type_t type_ver; - // ISP_TODO: height passed but not used + // ISP_TODO: height uvg_get_tr_type(width, color, tu, &type_hor, &type_ver, mts_idx); if (type_hor == DCT2 && type_ver == DCT2 && !tu->lfnst_idx && !tu->cr_lfnst_idx || width != height) @@ -2514,6 +2514,7 @@ static void mts_dct_generic( int skip_height = (type_ver != DCT2 && height == 32) ? 16 : (height > 32 ? height - 32 : 0); const int log2_width_minus2 = uvg_g_convert_to_bit[width]; const int log2_height_minus2 = uvg_g_convert_to_bit[height]; + if(tu->lfnst_idx || tu->cr_lfnst_idx) { if ((width == 4 && height > 4) || (width > 4 && height == 4)) { @@ -2545,6 +2546,7 @@ static void mts_idct_generic( const color_t color, const cu_info_t* tu, const int8_t width, + const int8_t height, const int16_t* input, int16_t* output, const int8_t mts_idx) @@ -2552,26 +2554,38 @@ static void mts_idct_generic( tr_type_t type_hor; tr_type_t type_ver; + // ISP_TODO: height uvg_get_tr_type(width, color, tu, &type_hor, &type_ver, mts_idx); - if (type_hor == DCT2 && type_ver == DCT2) + if (type_hor == DCT2 && type_ver == DCT2 && !tu->lfnst_idx && !tu->cr_lfnst_idx || width != height) { dct_func *idct_func = uvg_get_idct_func(width, color, tu->type); idct_func(bitdepth, input, output); } else { - const int height = width; - const int skip_width = (type_hor != DCT2 && width == 32) ? 16 : width > 32 ? width - 32 : 0; - const int skip_height = (type_ver != DCT2 && height == 32) ? 16 : height > 32 ? height - 32 : 0; + int skip_width = (type_hor != DCT2 && width == 32) ? 16 : width > 32 ? width - 32 : 0; + int skip_height = (type_ver != DCT2 && height == 32) ? 16 : height > 32 ? height - 32 : 0; const int log2_width_minus2 = uvg_g_convert_to_bit[width]; + const int log2_height_minus2 = uvg_g_convert_to_bit[height]; + + if (tu->lfnst_idx || tu->cr_lfnst_idx) { + if ((width == 4 && height > 4) || (width > 4 && height == 4)) { + skip_width == width - 4; + skip_height == height - 4; + } + else if ((width >= 8 && height >= 8)) { + skip_width = width - 8; + skip_height = height - 8; + } + } partial_tr_func* idct_hor = idct_table[type_hor][log2_width_minus2]; partial_tr_func* idct_ver = idct_table[type_ver][log2_width_minus2]; int16_t tmp[32 * 32]; - const int32_t shift_1st = 7; - const int32_t shift_2nd = 20 - bitdepth; + const int32_t shift_1st = log2_width_minus2 - 7; + const int32_t shift_2nd = log2_height_minus2 + 8; idct_ver(input, tmp, shift_1st, width, skip_width, skip_height); idct_hor(tmp, output, shift_2nd, height, 0, skip_width); diff --git a/src/strategies/generic/quant-generic.c b/src/strategies/generic/quant-generic.c index 03d4daf8..11a63871 100644 --- a/src/strategies/generic/quant-generic.c +++ b/src/strategies/generic/quant-generic.c @@ -349,7 +349,7 @@ int uvg_quant_cbcr_residual_generic( uvg_inv_lfnst(cur_cu, width, width, COLOR_UV, cur_cu->cr_lfnst_idx, coeff, tree_type); } - uvg_itransform2d(state->encoder_control, combined_residual, coeff, width, cur_cu->joint_cb_cr == 1 ? COLOR_V : COLOR_U, cur_cu); + uvg_itransform2d(state->encoder_control, combined_residual, coeff, width, height, cur_cu->joint_cb_cr == 1 ? COLOR_V : COLOR_U, cur_cu); //if (state->tile->frame->lmcs_aps->m_sliceReshapeInfo.enableChromaAdj && color != COLOR_Y) { @@ -537,7 +537,7 @@ int uvg_quantize_residual_generic(encoder_state_t *const state, uvg_itransformskip(state->encoder_control, residual, coeff, width); } else { - uvg_itransform2d(state->encoder_control, residual, coeff, width, color, cur_cu); + uvg_itransform2d(state->encoder_control, residual, coeff, width, height, color, cur_cu); } if (state->tile->frame->lmcs_aps->m_sliceReshapeInfo.enableChromaAdj && color != COLOR_Y) { diff --git a/src/strategies/strategies-dct.c b/src/strategies/strategies-dct.c index 07f0fcb4..e7cc37e9 100644 --- a/src/strategies/strategies-dct.c +++ b/src/strategies/strategies-dct.c @@ -66,6 +66,7 @@ void(*uvg_mts_idct)(int8_t bitdepth, color_t color, const cu_info_t *tu, int8_t width, + int8_t height, const int16_t *input, int16_t *output, const int8_t mts_idx); diff --git a/src/strategies/strategies-dct.h b/src/strategies/strategies-dct.h index 50cc3b5a..59e05084 100644 --- a/src/strategies/strategies-dct.h +++ b/src/strategies/strategies-dct.h @@ -77,6 +77,7 @@ typedef void (mts_idct_func)( color_t color, const cu_info_t* tu, int8_t width, + int8_t height, const int16_t* input, int16_t* output, const int8_t mts_idx); diff --git a/src/transform.c b/src/transform.c index 0f73eeeb..53d27de7 100644 --- a/src/transform.c +++ b/src/transform.c @@ -266,17 +266,19 @@ void uvg_transform2d(const encoder_control_t * const encoder, void uvg_itransform2d(const encoder_control_t * const encoder, int16_t *block, int16_t *coeff, - int8_t block_size, + int8_t block_width, + int8_t block_height, color_t color, const cu_info_t *tu) { if (encoder->cfg.mts) { - uvg_mts_idct(encoder->bitdepth, color, tu, block_size, coeff, block, encoder->cfg.mts); + uvg_mts_idct(encoder->bitdepth, color, tu, block_width, block_height, coeff, block, encoder->cfg.mts); } else { - dct_func *idct_func = uvg_get_idct_func(block_size, color, tu->type); + // ISP_TODO: block height + dct_func *idct_func = uvg_get_idct_func(block_width, color, tu->type); idct_func(encoder->bitdepth, coeff, block); } } @@ -590,7 +592,7 @@ void uvg_chroma_transform_search( if (pred_cu->cr_lfnst_idx) { uvg_inv_lfnst(pred_cu, width, height, COLOR_U, pred_cu->cr_lfnst_idx, &u_coeff[i * trans_offset], tree_type); } - uvg_itransform2d(state->encoder_control, u_recon_resi, &u_coeff[i * trans_offset], width, + uvg_itransform2d(state->encoder_control, u_recon_resi, &u_coeff[i * trans_offset], width, height, transforms[i] != JCCR_1 ? COLOR_U : COLOR_V, pred_cu); } else { @@ -617,7 +619,7 @@ void uvg_chroma_transform_search( if (pred_cu->cr_lfnst_idx) { uvg_inv_lfnst(pred_cu, width, height, COLOR_V, pred_cu->cr_lfnst_idx, &v_coeff[i * trans_offset], tree_type); } - uvg_itransform2d(state->encoder_control, v_recon_resi, &v_coeff[i * trans_offset], width, + uvg_itransform2d(state->encoder_control, v_recon_resi, &v_coeff[i * trans_offset], width, height, transforms[i] != JCCR_1 ? COLOR_U : COLOR_V, pred_cu); } else { diff --git a/src/transform.h b/src/transform.h index a7b6e221..0da34a12 100644 --- a/src/transform.h +++ b/src/transform.h @@ -61,7 +61,8 @@ void uvg_transform2d(const encoder_control_t * const encoder, void uvg_itransform2d(const encoder_control_t * const encoder, int16_t *block, int16_t *coeff, - int8_t block_size, + int8_t block_width, + int8_t block_height, color_t color, const cu_info_t *tu); diff --git a/tests/mts_tests.c b/tests/mts_tests.c index 2a132c77..e12de73e 100644 --- a/tests/mts_tests.c +++ b/tests/mts_tests.c @@ -134,7 +134,7 @@ static void setup_tests() tu.tr_idx = MTS_DST7_DST7 + trafo; tu.lfnst_idx = 0; tu.cr_lfnst_idx = 0; - idct_generic(UVG_BIT_DEPTH, COLOR_Y, &tu, 1 << (LCU_MIN_LOG_W + block), dct_bufs[trafo * NUM_SIZES + block], idct_result[trafo][block], UVG_MTS_BOTH); + idct_generic(UVG_BIT_DEPTH, COLOR_Y, &tu, 1 << (LCU_MIN_LOG_W + block), 1 << (LCU_MIN_LOG_W + block), dct_bufs[trafo * NUM_SIZES + block], idct_result[trafo][block], UVG_MTS_BOTH); } }