diff --git a/src/encode_coding_tree.c b/src/encode_coding_tree.c index e90c0789..fa3eaa36 100644 --- a/src/encode_coding_tree.c +++ b/src/encode_coding_tree.c @@ -165,7 +165,8 @@ static bool can_use_lfnst_with_isp(const int width, const int height, const int const int height, const int x, const int y, - enum uvg_tree_type tree_type) + enum uvg_tree_type tree_type, + const color_t color) { if (state->encoder_control->cfg.lfnst && pred_cu->type == CU_INTRA) { const int isp_mode = 0; // ISP_TODO: assign proper ISP mode when ISP is implemented @@ -185,8 +186,8 @@ static bool can_use_lfnst_with_isp(const int width, const int height, const int (cu_width > TR_MAX_WIDTH || cu_height > TR_MAX_WIDTH)) { return false; } - bool luma_flag = (depth == 4 && tree_type == UVG_BOTH_T) || tree_type == UVG_LUMA_T; - bool chroma_flag = (depth == 4 && tree_type == UVG_BOTH_T) || tree_type == UVG_CHROMA_T; + bool luma_flag = (depth == 4 && color == COLOR_Y) || (tree_type != UVG_CHROMA_T && depth != 4); + bool chroma_flag = (depth == 4 && color != COLOR_Y) || tree_type != UVG_LUMA_T; bool non_zero_coeff_non_ts_corner_8x8 = (luma_flag && pred_cu->violates_lfnst_constrained_luma) || (chroma_flag && pred_cu->violates_lfnst_constrained_chroma); bool is_tr_skip = false; @@ -234,10 +235,11 @@ static bool encode_lfnst_idx( const int depth, const int width, const int height, - enum uvg_tree_type tree_type) + enum uvg_tree_type tree_type, + const color_t color) { - if (uvg_is_lfnst_allowed(state, pred_cu, width, height, x, y, tree_type)) { + if (uvg_is_lfnst_allowed(state, pred_cu, width, height, x, y, tree_type, color)) { // Getting separate tree bool from block size is a temporary fix until a proper dual tree check is possible (there is no dual tree structure at time of writing this). // VTM seems to force explicit dual tree structure for small 4x4 blocks bool is_separate_tree = depth == 4 || tree_type != UVG_BOTH_T; @@ -1717,7 +1719,7 @@ void uvg_encode_coding_tree( encode_transform_coeff(state, x, y, depth, 0, 0, 0, 0, coeff, tree_type); } - bool lfnst_written = encode_lfnst_idx(state, cabac, cur_cu, x, y, depth, cu_width, cu_height, tree_type); + bool lfnst_written = encode_lfnst_idx(state, cabac, cur_cu, x, y, depth, cu_width, cu_height, tree_type, COLOR_Y); encode_mts_idx(state, cabac, cur_cu); @@ -1733,8 +1735,8 @@ void uvg_encode_coding_tree( tmp->lfnst_last_scan_pos = false; encode_transform_coeff(state, x, y, depth, 0, 0, 0, 1, coeff, tree_type); // Write LFNST only once for single tree structure - if (!lfnst_written || tree_type == UVG_CHROMA_T) { - encode_lfnst_idx(state, cabac, tmp, x, y, depth, cu_width, cu_height, tree_type); + if (!lfnst_written || tree_type == UVG_CHROMA_T || depth == 4) { + encode_lfnst_idx(state, cabac, tmp, x, y, depth, cu_width, cu_height, tree_type, COLOR_UV); } } } diff --git a/src/encode_coding_tree.h b/src/encode_coding_tree.h index 797ab158..a6b32a4a 100644 --- a/src/encode_coding_tree.h +++ b/src/encode_coding_tree.h @@ -48,7 +48,8 @@ bool uvg_is_lfnst_allowed( const int height, const int x, const int y, - enum uvg_tree_type tree_type); + enum uvg_tree_type tree_type, + const color_t color); void uvg_encode_coding_tree( encoder_state_t * const state, diff --git a/src/search.c b/src/search.c index 7dd91bca..1e0fd631 100644 --- a/src/search.c +++ b/src/search.c @@ -567,7 +567,7 @@ static double cu_rd_cost_tr_split_accurate( } if(depth == 4 || tree_type == UVG_LUMA_T) { - if (uvg_is_lfnst_allowed(state, tr_cu, width, width, x_px, y_px, tree_type)) { + if (uvg_is_lfnst_allowed(state, tr_cu, width, width, x_px, y_px, tree_type, COLOR_Y)) { const int lfnst_idx = tr_cu->lfnst_idx; CABAC_FBITS_UPDATE( cabac, @@ -634,7 +634,7 @@ static double cu_rd_cost_tr_split_accurate( } } - if (uvg_is_lfnst_allowed(state, tr_cu, width, width, x_px, y_px, tree_type)) { + if (uvg_is_lfnst_allowed(state, tr_cu, width, width, x_px, y_px, tree_type, depth == 4 || tree_type == UVG_CHROMA_T ? COLOR_UV : COLOR_Y)) { const int lfnst_idx = (depth != 4 && tree_type != UVG_CHROMA_T) ? tr_cu->lfnst_idx : tr_cu->cr_lfnst_idx; CABAC_FBITS_UPDATE( cabac, diff --git a/src/transform.c b/src/transform.c index 81801f2c..47fd0cd4 100644 --- a/src/transform.c +++ b/src/transform.c @@ -701,7 +701,7 @@ void uvg_chroma_transform_search( transforms[i] == CHROMA_TS); } if((depth == 4 || tree_type == UVG_CHROMA_T) && state->encoder_control->cfg.lfnst && 0) { - if(uvg_is_lfnst_allowed(state, pred_cu, width, height, 0, 0 , UVG_CHROMA_T)) { + if(uvg_is_lfnst_allowed(state, pred_cu, width, height, 0, 0 , UVG_CHROMA_T, COLOR_UV)) { const int lfnst_idx = pred_cu->cr_lfnst_idx; CABAC_FBITS_UPDATE( &state->search_cabac,