[intra] Fix chroma cbf counting for 4x4

This commit is contained in:
Joose Sainio 2022-05-11 15:18:59 +03:00
parent 2feb3daaaf
commit 8c939c1405
3 changed files with 18 additions and 11 deletions

View file

@ -718,6 +718,7 @@ static void encode_transform_coeff(encoder_state_t * const state,
if ((cur_cu->type == CU_INTRA || tr_depth > 0 || cb_flag_u || cb_flag_v) && !only_chroma) { if ((cur_cu->type == CU_INTRA || tr_depth > 0 || cb_flag_u || cb_flag_v) && !only_chroma) {
cabac->cur_ctx = &(cabac->ctx.qt_cbf_model_luma[0]); cabac->cur_ctx = &(cabac->ctx.qt_cbf_model_luma[0]);
CABAC_BIN(cabac, cb_flag_y, "cbf_luma"); CABAC_BIN(cabac, cb_flag_y, "cbf_luma");
// printf("%hu %hu %d %d\n", cabac->ctx.qt_cbf_model_luma[0].state[0], cabac->ctx.qt_cbf_model_luma[0].state[1], x, y);
} }
if (cb_flag_y | cb_flag_u | cb_flag_v) { if (cb_flag_y | cb_flag_u | cb_flag_v) {
@ -888,8 +889,11 @@ int uvg_encode_inter_prediction_unit(encoder_state_t * const state,
return non_zero_mvd; return non_zero_mvd;
} }
static void encode_chroma_intra_cu(cabac_data_t* const cabac, const cu_info_t* const cur_cu, const int cclm_enabled, double static void encode_chroma_intra_cu(
* bits_out) { cabac_data_t* const cabac,
const cu_info_t* const cur_cu,
const int cclm_enabled,
double* bits_out) {
unsigned pred_mode = 0; unsigned pred_mode = 0;
unsigned chroma_pred_modes[8] = {0, 50, 18, 1, 67, 81, 82, 83}; unsigned chroma_pred_modes[8] = {0, 50, 18, 1, 67, 81, 82, 83};
int8_t chroma_intra_dir = cur_cu->intra.mode_chroma; int8_t chroma_intra_dir = cur_cu->intra.mode_chroma;
@ -900,10 +904,9 @@ static void encode_chroma_intra_cu(cabac_data_t* const cabac, const cu_info_t* c
} }
} }
double bits = 0;
bool derived_mode = chroma_intra_dir == luma_intra_dir; bool derived_mode = chroma_intra_dir == luma_intra_dir;
bool cclm_mode = chroma_intra_dir > 67; bool cclm_mode = chroma_intra_dir > 67;
double bits = 0;
if (cclm_enabled) { if (cclm_enabled) {
CABAC_FBITS_UPDATE(cabac, &cabac->ctx.cclm_flag, cclm_mode, bits, "cclm_flag"); CABAC_FBITS_UPDATE(cabac, &cabac->ctx.cclm_flag, cclm_mode, bits, "cclm_flag");
@ -971,6 +974,7 @@ static void encode_chroma_intra_cu(cabac_data_t* const cabac, const cu_info_t* c
if (cabac->only_count && bits_out) *bits_out += 2 + bits; if (cabac->only_count && bits_out) *bits_out += 2 + bits;
//} //}
} }
else if (cabac->only_count && bits_out)*bits_out += bits;
} }
void uvg_encode_intra_luma_coding_unit(const encoder_state_t * const state, void uvg_encode_intra_luma_coding_unit(const encoder_state_t * const state,

View file

@ -401,7 +401,7 @@ double uvg_cu_rd_cost_chroma(const encoder_state_t *const state,
} }
// See luma for why the second condition // See luma for why the second condition
if (depth < MAX_PU_DEPTH && !skip_residual_coding) { if (!skip_residual_coding) {
const int tr_depth = depth - pred_cu->depth; const int tr_depth = depth - pred_cu->depth;
cabac_data_t* cabac = (cabac_data_t*)&state->search_cabac; cabac_data_t* cabac = (cabac_data_t*)&state->search_cabac;
cabac_ctx_t *ctx = &(cabac->ctx.qt_cbf_model_cb[0]); cabac_ctx_t *ctx = &(cabac->ctx.qt_cbf_model_cb[0]);
@ -503,7 +503,7 @@ static double cu_rd_cost_tr_split_accurate(const encoder_state_t* const state,
} }
if(state->encoder_control->chroma_format != UVG_CSP_400 && !skip_residual_coding) { if(state->encoder_control->chroma_format != UVG_CSP_400 && !skip_residual_coding && (depth != 4 || (x_px % 8 && y_px % 8))) {
if(tr_cu->depth == depth || cbf_is_set(pred_cu->cbf, depth - 1, COLOR_U)) { if(tr_cu->depth == depth || cbf_is_set(pred_cu->cbf, depth - 1, COLOR_U)) {
CABAC_FBITS_UPDATE(cabac, &(cabac->ctx.qt_cbf_model_cb[0]), cb_flag_u, tr_tree_bits, "cbf_cb"); CABAC_FBITS_UPDATE(cabac, &(cabac->ctx.qt_cbf_model_cb[0]), cb_flag_u, tr_tree_bits, "cbf_cb");
} }
@ -532,7 +532,7 @@ static double cu_rd_cost_tr_split_accurate(const encoder_state_t* const state,
cb_flag_v) cb_flag_v)
&& !skip_residual_coding) && !skip_residual_coding)
{ {
cabac_ctx_t* ctx = &(cabac->ctx.qt_cbf_model_luma[!is_tr_split]); cabac_ctx_t* ctx = &(cabac->ctx.qt_cbf_model_luma[0]);
CABAC_FBITS_UPDATE(cabac, ctx, cb_flag_y, tr_tree_bits, "cbf_y_search"); CABAC_FBITS_UPDATE(cabac, ctx, cb_flag_y, tr_tree_bits, "cbf_y_search");
} }
@ -1170,9 +1170,9 @@ static double search_cu(encoder_state_t * const state, int x, int y, int depth,
// the split costs at least as much as not splitting. // the split costs at least as much as not splitting.
if (cur_cu->type == CU_NOTSET || cbf || state->encoder_control->cfg.cu_split_termination == UVG_CU_SPLIT_TERMINATION_OFF) { if (cur_cu->type == CU_NOTSET || cbf || state->encoder_control->cfg.cu_split_termination == UVG_CU_SPLIT_TERMINATION_OFF) {
if (split_cost < cost) split_cost += search_cu(state, x, y, depth + 1, work_tree); if (split_cost < cost) split_cost += search_cu(state, x, y, depth + 1, work_tree);
if (split_cost < cost) split_cost += search_cu(state, x + half_cu, y, depth + 1, work_tree); if (split_cost < cost || 1) split_cost += search_cu(state, x + half_cu, y, depth + 1, work_tree);
if (split_cost < cost) split_cost += search_cu(state, x, y + half_cu, depth + 1, work_tree); if (split_cost < cost || 1) split_cost += search_cu(state, x, y + half_cu, depth + 1, work_tree);
if (split_cost < cost) split_cost += search_cu(state, x + half_cu, y + half_cu, depth + 1, work_tree); if (split_cost < cost || 1) split_cost += search_cu(state, x + half_cu, y + half_cu, depth + 1, work_tree);
} else { } else {
split_cost = INT_MAX; split_cost = INT_MAX;
} }

View file

@ -1192,7 +1192,7 @@ static void get_rough_cost_for_2n_modes(
if(multi_ref_idx) { if(multi_ref_idx) {
bits[i] = mrl + not_mip; bits[i] = mrl + not_mip;
bits[i] += CTX_ENTROPY_FBITS(&(state->search_cabac.ctx.multi_ref_line[1]), multi_ref_idx != 1); bits[i] += CTX_ENTROPY_FBITS(&(state->search_cabac.ctx.multi_ref_line[1]), multi_ref_idx != 1);
bits[i] += MIN((mode + i + 1) % 6, 4); bits[i] += MIN(((mode + i) % 5) + 1, 4);
} }
else if(search_data[mode + i].pred_cu.intra.mip_flag) { else if(search_data[mode + i].pred_cu.intra.mip_flag) {
bits[i] = mip + 1; bits[i] = mip + 1;
@ -1250,6 +1250,9 @@ static int8_t search_intra_rdo(
const int tr_depth = CLIP(1, MAX_PU_DEPTH, depth + state->encoder_control->cfg.tr_depth_intra); const int tr_depth = CLIP(1, MAX_PU_DEPTH, depth + state->encoder_control->cfg.tr_depth_intra);
for (int mode = 0; mode < modes_to_check; mode++) { for (int mode = 0; mode < modes_to_check; mode++) {
if(mode == 0) {
printf("%hu %hu %d %d\n", state->search_cabac.ctx.qt_cbf_model_luma[0].state[0], state->search_cabac.ctx.qt_cbf_model_luma[0].state[1], x_px, y_px);
}
double rdo_bitcost = uvg_luma_mode_bits(state, &search_data[mode].pred_cu, x_px, y_px, depth, lcu); double rdo_bitcost = uvg_luma_mode_bits(state, &search_data[mode].pred_cu, x_px, y_px, depth, lcu);
search_data[mode].pred_cu.tr_idx = MTS_TR_NUM; search_data[mode].pred_cu.tr_idx = MTS_TR_NUM;
search_data[mode].bits = rdo_bitcost; search_data[mode].bits = rdo_bitcost;