[mtt] Add function for easily getting all split cu_locs

This commit is contained in:
Joose Sainio 2022-09-19 08:44:49 +03:00 committed by Marko Viitanen
parent cfc6aebe3c
commit 58c6af8c87
3 changed files with 46 additions and 9 deletions

View file

@ -315,3 +315,42 @@ void uvg_cu_loc_ctor(cu_loc_t* loc, int x, int y, int width, int height)
loc->chroma_width = MAX(width >> 1, 4);
loc->chroma_height = MAX(height >> 1, 4);
}
void uvg_get_split_locs(const cu_loc_t* const origin, enum split_type split, cu_loc_t out[4])
{
const int half_width = origin->width >> 1;
const int half_height = origin->height >> 1;
const int quarter_width = origin->width >> 2;
const int quarter_height = origin->height >> 2;
switch (split) {
case NO_SPLIT:
assert(0 && "trying to get split from no split");
break;
case QT_SPLIT:
uvg_cu_loc_ctor(&out[0], origin->x, origin->y, half_width, half_height);
uvg_cu_loc_ctor(&out[1], origin->x + half_width, origin->y, half_width, half_height);
uvg_cu_loc_ctor(&out[2], origin->x, origin->y + half_height, half_width, half_height);
uvg_cu_loc_ctor(&out[3], origin->x + half_width, origin->y + half_height, half_width, half_height);
break;
case BT_HOR_SPLIT:
uvg_cu_loc_ctor(&out[0], origin->x, origin->y, origin->width, half_height);
uvg_cu_loc_ctor(&out[1], origin->x, origin->y + half_height, origin->width, half_height);
break;
case BT_VER_SPLIT:
uvg_cu_loc_ctor(&out[0], origin->x, origin->y, half_width, origin->height);
uvg_cu_loc_ctor(&out[1], origin->x + half_width, origin->y, half_width, origin->height);
break;
case TT_HOR_SPLIT:
uvg_cu_loc_ctor(&out[0], origin->x, origin->y, origin->width, quarter_height);
uvg_cu_loc_ctor(&out[1], origin->x, origin->y + quarter_height, origin->width, half_height);
uvg_cu_loc_ctor(&out[2], origin->x, origin->y + quarter_height + half_height, origin->width, quarter_height);
break;
case TT_VER_SPLIT:
uvg_cu_loc_ctor(&out[0], origin->x, origin->y, quarter_width, origin->height);
uvg_cu_loc_ctor(&out[1], origin->x + quarter_width, origin->y, half_width, origin->height);
uvg_cu_loc_ctor(&out[2], origin->x + quarter_width + half_width, origin->y, quarter_width, origin->height);
break;
}
}

View file

@ -185,6 +185,7 @@ typedef struct {
void uvg_cu_loc_ctor(cu_loc_t *loc, int x, int y, int width, int height);
void uvg_get_split_locs(const cu_loc_t* const origin, enum split_type split, cu_loc_t out[4]);
#define CU_GET_MV_CAND(cu_info_ptr, reflist) \
(((reflist) == 0) ? (cu_info_ptr)->inter.mv_cand0 : (cu_info_ptr)->inter.mv_cand1)

View file

@ -1336,22 +1336,19 @@ static double search_cu(
// It is ok to interrupt the search as soon as it is known that
// 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) {
cu_loc_t new_cu_loc;
cu_loc_t new_cu_loc[4];
uvg_get_split_locs(cu_loc, QT_SPLIT, new_cu_loc);
if (split_cost < cost) {
uvg_cu_loc_ctor(&new_cu_loc, x, y, half_cu, half_cu);
split_cost += search_cu(state, &new_cu_loc, work_tree, tree_type, new_split);
split_cost += search_cu(state, &new_cu_loc[0], work_tree, tree_type, new_split);
}
if (split_cost < cost) {
uvg_cu_loc_ctor(&new_cu_loc, x + half_cu, y, half_cu, half_cu);
split_cost += search_cu(state, &new_cu_loc, work_tree, tree_type, new_split);
split_cost += search_cu(state, &new_cu_loc[1], work_tree, tree_type, new_split);
}
if (split_cost < cost) {
uvg_cu_loc_ctor(&new_cu_loc, x, y + half_cu, half_cu, half_cu);
split_cost += search_cu(state, &new_cu_loc, work_tree, tree_type, new_split);
split_cost += search_cu(state, &new_cu_loc[2], work_tree, tree_type, new_split);
}
if (split_cost < cost) {
uvg_cu_loc_ctor(&new_cu_loc, x + half_cu, y + half_cu, half_cu, half_cu);
split_cost += search_cu(state, &new_cu_loc, work_tree, tree_type, new_split);
split_cost += search_cu(state, &new_cu_loc[3], work_tree, tree_type, new_split);
}
} else {
split_cost = INT_MAX;