[cabac] Fix trskip writing

This commit is contained in:
Joose Sainio 2022-05-18 09:34:31 +03:00
parent c11e30fdb4
commit 03246c031e
3 changed files with 11 additions and 13 deletions

View file

@ -345,8 +345,7 @@ void uvg_encode_ts_residual(encoder_state_t* const state,
{
//===== encode sign's =====
int sign = curr_coeff < 0;
CABAC_BIN(cabac, sign, "coeff_sign_flag");
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_sig[
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_res_sign[
uvg_sign_ctx_id_abs_ts(coeff, pos_x, pos_y, width, 0)
], sign, bits, "coeff_sign_flag");
maxCtxBins--;
@ -360,15 +359,15 @@ void uvg_encode_ts_residual(encoder_state_t* const state,
remAbsLevel = modAbsCoeff - 1;
unsigned gt1 = !!remAbsLevel;
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_sig[
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_gt1[
uvg_lrg1_ctx_id_abs_ts(coeff, pos_x, pos_y, width, 0)
], remAbsLevel & 1, bits, "abs_level_gtx_flag");
], gt1, bits, "abs_level_gtx_flag");
maxCtxBins--;
if (gt1)
{
remAbsLevel -= 1;
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_par, gt1, bits, "par_level_flag");
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_par, remAbsLevel & 1, bits, "par_level_flag");
maxCtxBins--;
}
}
@ -393,11 +392,7 @@ void uvg_encode_ts_residual(encoder_state_t* const state,
if (absLevel >= cutoffVal)
{
unsigned gt2 = (absLevel >= (cutoffVal + 2));
cabac->cur_ctx = &cabac->ctx.transform_skip_gt2[cutoffVal >> 1];
CABAC_BIN(cabac, gt2, "abs_level_gtx_flag");
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_sig[
kvz_lrg1_ctx_id_abs_ts(coeff, pos_x, pos_y, width, 0)
], gt2, bits, "abs_level_gtx_flag");
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_gt2[cutoffVal >> 1], gt2, bits, "abs_level_gtx_flag");
maxCtxBins--;
}
cutoffVal += 2;
@ -1394,6 +1389,11 @@ bool uvg_write_split_flag(const encoder_state_t * const state, cabac_data_t* cab
split_model += 3 * (split_num >> 1);
cabac->cur_ctx = &(cabac->ctx.split_flag_model[split_model]);
if(cabac->only_count && !split_flag) {
//printf("%hu %hu %d %d %d\n", state->search_cabac.ctx.split_flag_model[split_model].state[0], state->search_cabac.ctx.split_flag_model[split_model].state[1],
// split_model, x, y);
}
CABAC_FBITS_UPDATE(cabac, &(cabac->ctx.split_flag_model[split_model]), split_flag, bits, "split_flag");
}

View file

@ -338,7 +338,7 @@ double uvg_cu_rd_cost_luma(const encoder_state_t *const state,
}
if (is_set && state->encoder_control->cfg.trskip_enable && width <= (1 << state->encoder_control->cfg.trskip_max_size)) {
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_model_luma, tr_cu->tr_idx == MTS_SKIP, tr_tree_bits, "transform_skip_flag");
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.transform_skip_model_luma, pred_cu->tr_idx == MTS_SKIP, tr_tree_bits, "transform_skip_flag");
}
// SSD between reconstruction and original

View file

@ -556,8 +556,6 @@ int uvg_quantize_residual_trskip(
state, cur_cu, width, color, scan_order,
1, in_stride, width,
ref_in, pred_in, skip.rec, skip.coeff, false, lmcs_chroma_adj);
skip.cost = uvg_pixels_calc_ssd(ref_in, skip.rec, in_stride, width, width);
skip.cost += uvg_get_coeff_cost(state, skip.coeff, NULL, width, 0, scan_order, 1) * state->frame->lambda;
/* if (noskip.cost <= skip.cost) {
*trskip_out = 0;