[mtt] Fix lfnst and chroma coeffs and tests

This commit is contained in:
Joose Sainio 2022-12-12 10:05:17 +02:00 committed by Marko Viitanen
parent 992182dafb
commit 09baddef17
3 changed files with 14 additions and 7 deletions

View file

@ -1685,7 +1685,7 @@ void uvg_encode_coding_tree(
exit(1); exit(1);
} }
if (state->encoder_control->cabac_debug_file) { if (state->encoder_control->cabac_debug_file) {
fprintf(state->encoder_control->cabac_debug_file, "E %4d %4d %d %d", x << (tree_type == UVG_CHROMA_T), y << (tree_type == UVG_CHROMA_T), depth, tree_type); fprintf(state->encoder_control->cabac_debug_file, "E %4d %4d %9d %d", x << (tree_type == UVG_CHROMA_T), y << (tree_type == UVG_CHROMA_T), split_tree.split_tree, tree_type);
fwrite(&cabac->ctx, 1, sizeof(cabac->ctx), state->encoder_control->cabac_debug_file); fwrite(&cabac->ctx, 1, sizeof(cabac->ctx), state->encoder_control->cabac_debug_file);
} }

View file

@ -690,8 +690,12 @@ static double cu_rd_cost_tr_split_accurate(
cu_loc_t split_cu_loc[4]; cu_loc_t split_cu_loc[4];
const int split_count= uvg_get_split_locs(cu_loc, split, split_cu_loc,NULL); const int split_count= uvg_get_split_locs(cu_loc, split, split_cu_loc,NULL);
cu_loc_t split_chroma_cu_loc[4];
if (chroma_loc) {
uvg_get_split_locs(chroma_loc, split, split_chroma_cu_loc, NULL);
}
for (int i = 0; i < split_count; ++i) { for (int i = 0; i < split_count; ++i) {
sum += cu_rd_cost_tr_split_accurate(state, pred_cu, lcu, tree_type, isp_cbf, &split_cu_loc[i], &split_cu_loc[i], has_chroma); sum += cu_rd_cost_tr_split_accurate(state, pred_cu, lcu, tree_type, isp_cbf, &split_cu_loc[i], chroma_loc ? &split_chroma_cu_loc[i] : NULL, has_chroma);
} }
return sum + tr_tree_bits * state->lambda; return sum + tr_tree_bits * state->lambda;
} }
@ -751,7 +755,10 @@ static double cu_rd_cost_tr_split_accurate(
} }
// Chroma transform skip enable/disable is non-normative, so we need to count the chroma // Chroma transform skip enable/disable is non-normative, so we need to count the chroma
// tr-skip bits even when we are never using it. // tr-skip bits even when we are never using it.
const bool can_use_tr_skip = state->encoder_control->cfg.trskip_enable && width <= (1 << state->encoder_control->cfg.trskip_max_size) && !is_isp; const bool can_use_tr_skip = state->encoder_control->cfg.trskip_enable
&& width <= (1 << state->encoder_control->cfg.trskip_max_size)
&& height <= (1 << state->encoder_control->cfg.trskip_max_size)
&& !is_isp;
if(cb_flag_y){ if(cb_flag_y){
if (can_use_tr_skip) { if (can_use_tr_skip) {
@ -860,7 +867,7 @@ static double cu_rd_cost_tr_split_accurate(
} }
const bool is_chroma_tree = is_local_sep_tree || tree_type == UVG_CHROMA_T; const bool is_chroma_tree = is_local_sep_tree || tree_type == UVG_CHROMA_T;
if (uvg_is_lfnst_allowed(state, tr_cu, is_local_sep_tree ? UVG_CHROMA_T : tree_type, is_chroma_tree ? COLOR_UV : COLOR_Y, is_chroma_tree ? cu_loc : chroma_loc, lcu)) { if (uvg_is_lfnst_allowed(state, tr_cu, is_local_sep_tree ? UVG_CHROMA_T : tree_type, is_chroma_tree ? COLOR_UV : COLOR_Y, is_chroma_tree ? chroma_loc : cu_loc, lcu)) {
const int lfnst_idx = is_chroma_tree ? tr_cu->cr_lfnst_idx : tr_cu->lfnst_idx; const int lfnst_idx = is_chroma_tree ? tr_cu->cr_lfnst_idx : tr_cu->lfnst_idx;
CABAC_FBITS_UPDATE( CABAC_FBITS_UPDATE(
cabac, cabac,
@ -1413,7 +1420,7 @@ static double search_cu(
split_tree.current_depth < pu_depth_inter.max); split_tree.current_depth < pu_depth_inter.max);
if(state->encoder_control->cabac_debug_file) { if(state->encoder_control->cabac_debug_file) {
fprintf(state->encoder_control->cabac_debug_file, "S %4d %4d %d %d", x, y, split_tree.current_depth, tree_type); fprintf(state->encoder_control->cabac_debug_file, "S %4d %4d %9d %d", x, y, split_tree.split_tree, tree_type);
fwrite(&state->search_cabac.ctx, 1, sizeof(state->search_cabac.ctx), state->encoder_control->cabac_debug_file); fwrite(&state->search_cabac.ctx, 1, sizeof(state->search_cabac.ctx), state->encoder_control->cabac_debug_file);
} }

View file

@ -30,7 +30,7 @@ def main(state_file: Path, ctx_names: list, ctx_count: int = 332, ctx_size: int
with open(state_file, "rb") as file: with open(state_file, "rb") as file:
try: try:
while True: while True:
type_, x, y, depth, tree_type = file.read(15).decode().split() type_, x, y, depth, tree_type = file.read(23).decode().split()
# Reset stored data at the beginning of the frame # Reset stored data at the beginning of the frame
if x == '0' and y == '0' and type_ == "S" and tree_type != "2": if x == '0' and y == '0' and type_ == "S" and tree_type != "2":
if not was_zero_last: if not was_zero_last:
@ -38,7 +38,7 @@ def main(state_file: Path, ctx_names: list, ctx_count: int = 332, ctx_size: int
ctx_store = dict() ctx_store = dict()
e_store = set() e_store = set()
was_zero_last = True was_zero_last = True
else: elif int(x) >= 64 and int(y) >= 64:
was_zero_last = False was_zero_last = False
ctx = file.read(ctx_count * ctx_size) ctx = file.read(ctx_count * ctx_size)