mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-30 12:44:07 +00:00
[mtt] search works completely with everything except RDOQ deblock and ISP
This commit is contained in:
parent
6a6bed7f1f
commit
b988c60dd1
|
@ -657,7 +657,7 @@ static void encode_transform_coeff(
|
||||||
split_cu_loc[i].chroma_height = split_cu_loc[i].height;
|
split_cu_loc[i].chroma_height = split_cu_loc[i].height;
|
||||||
}
|
}
|
||||||
encode_transform_coeff(state, &split_cu_loc[i], only_chroma,
|
encode_transform_coeff(state, &split_cu_loc[i], only_chroma,
|
||||||
coeff, NULL, tree_type, true, false, luma_cbf_ctx, &split_cu_loc[i], chroma_loc);
|
coeff, NULL, tree_type, true, false, luma_cbf_ctx, &split_cu_loc[i], chroma_loc ? &split_cu_loc[i] : NULL);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1399,7 +1399,7 @@ void uvg_encode_coding_tree(
|
||||||
|
|
||||||
DBG_YUVIEW_VALUE(state->frame->poc, DBG_YUVIEW_CU_TYPE, abs_x, abs_y, cu_width, cu_height, cur_cu->type-1);
|
DBG_YUVIEW_VALUE(state->frame->poc, DBG_YUVIEW_CU_TYPE, abs_x, abs_y, cu_width, cu_height, cur_cu->type-1);
|
||||||
|
|
||||||
fprintf(stderr, "%4d %4d %2d %2d %d\n", x, y, cu_width, cu_height, has_chroma);
|
// fprintf(stderr, "%4d %4d %2d %2d %d\n", x, y, cu_width, cu_height, has_chroma);
|
||||||
|
|
||||||
if (ctrl->cfg.lossless) {
|
if (ctrl->cfg.lossless) {
|
||||||
cabac->cur_ctx = &cabac->ctx.cu_transquant_bypass;
|
cabac->cur_ctx = &cabac->ctx.cu_transquant_bypass;
|
||||||
|
@ -1616,8 +1616,9 @@ void uvg_encode_coding_tree(
|
||||||
|
|
||||||
if (tree_type != UVG_CHROMA_T) {
|
if (tree_type != UVG_CHROMA_T) {
|
||||||
encode_lfnst_idx(state, cabac, cur_cu, is_local_dual_tree && state->encoder_control->chroma_format != UVG_CSP_400 ? UVG_LUMA_T : tree_type, COLOR_Y, cu_loc);
|
encode_lfnst_idx(state, cabac, cur_cu, is_local_dual_tree && state->encoder_control->chroma_format != UVG_CSP_400 ? UVG_LUMA_T : tree_type, COLOR_Y, cu_loc);
|
||||||
}
|
|
||||||
encode_mts_idx(state, cabac, cur_cu, cu_loc);
|
encode_mts_idx(state, cabac, cur_cu, cu_loc);
|
||||||
|
}
|
||||||
|
|
||||||
// For 4x4 the chroma PU/TU is coded after the last
|
// For 4x4 the chroma PU/TU is coded after the last
|
||||||
if (state->encoder_control->chroma_format != UVG_CSP_400 &&
|
if (state->encoder_control->chroma_format != UVG_CSP_400 &&
|
||||||
|
@ -1777,7 +1778,7 @@ double uvg_mock_encode_coding_unit(
|
||||||
int8_t luma_dir = uvg_get_co_located_luma_mode(chroma_loc,cu_loc , cur_cu, tree_type != UVG_CHROMA_T ? lcu : NULL,
|
int8_t luma_dir = uvg_get_co_located_luma_mode(chroma_loc,cu_loc , cur_cu, tree_type != UVG_CHROMA_T ? lcu : NULL,
|
||||||
tree_type == UVG_CHROMA_T ? state->tile->frame->cu_array : NULL,
|
tree_type == UVG_CHROMA_T ? state->tile->frame->cu_array : NULL,
|
||||||
is_separate_tree ? UVG_CHROMA_T : tree_type);
|
is_separate_tree ? UVG_CHROMA_T : tree_type);
|
||||||
encode_chroma_intra_cu(cabac, cur_cu, state->encoder_control->cfg.cclm && uvg_cclm_is_allowed(state, cu_loc, cur_cu, tree_type), luma_dir, &bits);
|
encode_chroma_intra_cu(cabac, cur_cu, state->encoder_control->cfg.cclm && uvg_cclm_is_allowed(state, chroma_loc, cur_cu, tree_type), luma_dir, &bits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
41
src/search.c
41
src/search.c
|
@ -76,7 +76,9 @@ static INLINE void copy_cu_info(lcu_t *from, lcu_t *to, const cu_loc_t* const cu
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static INLINE void initialize_partial_work_tree(lcu_t* from, lcu_t *to, const cu_loc_t * const cu_loc, const enum uvg_tree_type tree_type) {
|
static INLINE void initialize_partial_work_tree(lcu_t* from, lcu_t *to, const cu_loc_t * const cu_loc, const cu_loc_t* const
|
||||||
|
chroma_loc,
|
||||||
|
const enum uvg_tree_type tree_type) {
|
||||||
|
|
||||||
const int y_limit = LCU_WIDTH >> (tree_type == UVG_CHROMA_T);
|
const int y_limit = LCU_WIDTH >> (tree_type == UVG_CHROMA_T);
|
||||||
const int x_limit = LCU_WIDTH >> (tree_type == UVG_CHROMA_T);
|
const int x_limit = LCU_WIDTH >> (tree_type == UVG_CHROMA_T);
|
||||||
|
@ -90,8 +92,8 @@ static INLINE void initialize_partial_work_tree(lcu_t* from, lcu_t *to, const cu
|
||||||
uvg_pixels_blit(from->rec.y, to->rec.y, cu_loc->local_x, LCU_WIDTH, LCU_WIDTH, LCU_WIDTH);
|
uvg_pixels_blit(from->rec.y, to->rec.y, cu_loc->local_x, LCU_WIDTH, LCU_WIDTH, LCU_WIDTH);
|
||||||
}
|
}
|
||||||
if(tree_type != UVG_LUMA_T && from->ref.chroma_format != UVG_CSP_400) {
|
if(tree_type != UVG_LUMA_T && from->ref.chroma_format != UVG_CSP_400) {
|
||||||
uvg_pixels_blit(from->rec.u, to->rec.u, cu_loc->local_x / 2, LCU_WIDTH_C, LCU_WIDTH_C, LCU_WIDTH_C);
|
uvg_pixels_blit(from->rec.u, to->rec.u, chroma_loc->local_x / 2, LCU_WIDTH_C, LCU_WIDTH_C, LCU_WIDTH_C);
|
||||||
uvg_pixels_blit(from->rec.v, to->rec.v, cu_loc->local_x / 2, LCU_WIDTH_C, LCU_WIDTH_C, LCU_WIDTH_C);
|
uvg_pixels_blit(from->rec.v, to->rec.v, chroma_loc->local_x / 2, LCU_WIDTH_C, LCU_WIDTH_C, LCU_WIDTH_C);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,11 +108,11 @@ static INLINE void initialize_partial_work_tree(lcu_t* from, lcu_t *to, const cu
|
||||||
LCU_WIDTH, LCU_WIDTH);
|
LCU_WIDTH, LCU_WIDTH);
|
||||||
}
|
}
|
||||||
if (tree_type != UVG_LUMA_T && from->ref.chroma_format != UVG_CSP_400) {
|
if (tree_type != UVG_LUMA_T && from->ref.chroma_format != UVG_CSP_400) {
|
||||||
uvg_pixels_blit(&from->rec.u[cu_loc->local_x / 2], &to->rec.u[cu_loc->local_x / 2],
|
uvg_pixels_blit(&from->rec.u[chroma_loc->local_x / 2], &to->rec.u[chroma_loc->local_x / 2],
|
||||||
LCU_WIDTH_C - cu_loc->local_x / 2, cu_loc->local_y / 2,
|
LCU_WIDTH_C - chroma_loc->local_x / 2, chroma_loc->local_y / 2,
|
||||||
LCU_WIDTH_C, LCU_WIDTH_C);
|
LCU_WIDTH_C, LCU_WIDTH_C);
|
||||||
uvg_pixels_blit(&from->rec.v[cu_loc->local_x / 2], &to->rec.v[cu_loc->local_x / 2],
|
uvg_pixels_blit(&from->rec.v[chroma_loc->local_x / 2], &to->rec.v[chroma_loc->local_x / 2],
|
||||||
LCU_WIDTH_C - cu_loc->local_x / 2, cu_loc->local_y / 2,
|
LCU_WIDTH_C - chroma_loc->local_x / 2, chroma_loc->local_y / 2,
|
||||||
LCU_WIDTH_C, LCU_WIDTH_C);
|
LCU_WIDTH_C, LCU_WIDTH_C);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,16 +131,15 @@ static INLINE void initialize_partial_work_tree(lcu_t* from, lcu_t *to, const cu
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tree_type != UVG_LUMA_T && from->ref.chroma_format != UVG_CSP_400) {
|
if(tree_type != UVG_LUMA_T && from->ref.chroma_format != UVG_CSP_400) {
|
||||||
const int offset = cu_loc->local_x / 2 + cu_loc->local_y / 2 * LCU_WIDTH_C;
|
const int offset = chroma_loc->local_x / 2 + chroma_loc->local_y / 2 * LCU_WIDTH_C;
|
||||||
uvg_pixels_blit(&from->ref.u[offset], &to->ref.u[offset], cu_loc->chroma_width, cu_loc->chroma_height, LCU_WIDTH_C, LCU_WIDTH_C);
|
uvg_pixels_blit(&from->ref.u[offset], &to->ref.u[offset], chroma_loc->chroma_width, chroma_loc->chroma_height, LCU_WIDTH_C, LCU_WIDTH_C);
|
||||||
uvg_pixels_blit(&from->ref.v[offset], &to->ref.v[offset], cu_loc->chroma_width, cu_loc->chroma_height, LCU_WIDTH_C, LCU_WIDTH_C);
|
uvg_pixels_blit(&from->ref.v[offset], &to->ref.v[offset], chroma_loc->chroma_width, chroma_loc->chroma_height, LCU_WIDTH_C, LCU_WIDTH_C);
|
||||||
}
|
}
|
||||||
|
|
||||||
const int y_start = (cu_loc->local_y >> (tree_type == UVG_CHROMA_T)) - 4;
|
const int y_start = (cu_loc->local_y >> (tree_type == UVG_CHROMA_T)) - 4;
|
||||||
const int x_start = (cu_loc->local_x >> (tree_type == UVG_CHROMA_T)) - 4;
|
const int x_start = (cu_loc->local_x >> (tree_type == UVG_CHROMA_T)) - 4;
|
||||||
for (int y = y_start; y < y_limit; y += SCU_WIDTH) {
|
for (int y = y_start; y < y_limit; y += SCU_WIDTH) {
|
||||||
*LCU_GET_CU_AT_PX(to, x_start, y) = *LCU_GET_CU_AT_PX(from, x_start, y);
|
*LCU_GET_CU_AT_PX(to, x_start, y) = *LCU_GET_CU_AT_PX(from, x_start, y);
|
||||||
|
|
||||||
}
|
}
|
||||||
for (int x = x_start; x < x_limit; x += SCU_WIDTH) {
|
for (int x = x_start; x < x_limit; x += SCU_WIDTH) {
|
||||||
*LCU_GET_CU_AT_PX(to, x, y_start) = *LCU_GET_CU_AT_PX(from, x, y_start);
|
*LCU_GET_CU_AT_PX(to, x, y_start) = *LCU_GET_CU_AT_PX(from, x, y_start);
|
||||||
|
@ -149,6 +150,22 @@ static INLINE void initialize_partial_work_tree(lcu_t* from, lcu_t *to, const cu
|
||||||
memset(LCU_GET_CU_AT_PX(to, x, y), 0, sizeof(cu_info_t));
|
memset(LCU_GET_CU_AT_PX(to, x, y), 0, sizeof(cu_info_t));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(chroma_loc->local_y != cu_loc->local_y || chroma_loc->local_x != cu_loc->local_x && tree_type == UVG_BOTH_T) {
|
||||||
|
const int y_start = (chroma_loc->local_y >> (tree_type == UVG_CHROMA_T)) - 4;
|
||||||
|
const int x_start = (chroma_loc->local_x >> (tree_type == UVG_CHROMA_T)) - 4;
|
||||||
|
for (int y = y_start; y < y_limit; y += SCU_WIDTH) {
|
||||||
|
*LCU_GET_CU_AT_PX(to, x_start, y) = *LCU_GET_CU_AT_PX(from, x_start, y);
|
||||||
|
}
|
||||||
|
if (chroma_loc->local_x == 0) {
|
||||||
|
to->left_ref = from->left_ref;
|
||||||
|
*LCU_GET_TOP_RIGHT_CU(to) = *LCU_GET_TOP_RIGHT_CU(from);
|
||||||
|
}
|
||||||
|
if (chroma_loc->local_y == 0) {
|
||||||
|
to->top_ref = from->top_ref;
|
||||||
|
*LCU_GET_TOP_RIGHT_CU(to) = *LCU_GET_TOP_RIGHT_CU(from);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE void copy_cu_pixels(
|
static INLINE void copy_cu_pixels(
|
||||||
|
@ -1425,7 +1442,7 @@ static double search_cu(
|
||||||
cu_loc_t new_cu_loc[4];
|
cu_loc_t new_cu_loc[4];
|
||||||
uint8_t separate_chroma = 0;
|
uint8_t separate_chroma = 0;
|
||||||
const int splits = uvg_get_split_locs(cu_loc, split_type, new_cu_loc, &separate_chroma);
|
const int splits = uvg_get_split_locs(cu_loc, split_type, new_cu_loc, &separate_chroma);
|
||||||
initialize_partial_work_tree(lcu, &split_lcu[split_type - 1], cu_loc, tree_type);
|
initialize_partial_work_tree(lcu, &split_lcu[split_type - 1], cu_loc, separate_chroma ? chroma_loc : cu_loc , tree_type);
|
||||||
for (int split = 0; split < splits; ++split) {
|
for (int split = 0; split < splits; ++split) {
|
||||||
new_split.part_index = split;
|
new_split.part_index = split;
|
||||||
split_cost += search_cu(state,
|
split_cost += search_cu(state,
|
||||||
|
|
|
@ -377,7 +377,8 @@ static double search_intra_trdepth(
|
||||||
pred_cu->mts_last_scan_pos = 0;
|
pred_cu->mts_last_scan_pos = 0;
|
||||||
pred_cu->violates_mts_coeff_constraint = 0;
|
pred_cu->violates_mts_coeff_constraint = 0;
|
||||||
|
|
||||||
if (trafo == MTS_SKIP && (width > (1 << state->encoder_control->cfg.trskip_max_size)
|
if (trafo == MTS_SKIP && ((width > (1 << state->encoder_control->cfg.trskip_max_size)
|
||||||
|
|| (height > (1 << state->encoder_control->cfg.trskip_max_size)))
|
||||||
|| !state->encoder_control->cfg.trskip_enable)) {
|
|| !state->encoder_control->cfg.trskip_enable)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue