[mrl] Fix issues transmitting multi ref idx during search. Change multi ref idx type to uint.

This commit is contained in:
siivonek 2021-12-06 19:12:08 +02:00
parent 54505e0250
commit 3a81a389c3
6 changed files with 22 additions and 21 deletions

View file

@ -856,7 +856,7 @@ static void encode_intra_coding_unit(encoder_state_t * const state,
bool allow_isp = enough_samples;
// Code MRL related bits
int multi_ref_idx = cur_cu->intra.multi_ref_idx;
int multi_ref_idx = cur_cu->type == CU_INTRA ? cur_cu->intra.multi_ref_idx : 0;
bool enable_mrl = state->encoder_control->cfg.mrl;
if (cur_cu->type == CU_INTRA && (y % LCU_WIDTH) != 0 && !cur_cu->bdpcmMode && enable_mrl) {

View file

@ -967,7 +967,7 @@ void kvz_intra_build_reference(
kvz_intra_references *const refs,
bool entropy_sync,
kvz_pixel *extra_ref_lines,
int8_t multi_ref_idx)
uint8_t multi_ref_idx)
{
assert(!(extra_ref_lines == NULL && multi_ref_idx != 0) && "Trying to use MRL with NULL extra references.");
@ -1012,7 +1012,7 @@ static void intra_recon_tb_leaf(
int x_scu = SUB_SCU(x);
int y_scu = SUB_SCU(y);
const vector2d_t lcu_px = {x_scu >> shift, y_scu >> shift };
uint8_t multi_ref_index = multi_ref_idx;
uint8_t multi_ref_index = color == COLOR_Y ? multi_ref_idx : 0;
kvz_intra_references refs;
// Extra reference lines for use with MRL. Extra lines needed only for left edge.
@ -1097,6 +1097,7 @@ void kvz_intra_recon_cu(
int8_t mode_chroma,
cu_info_t *cur_cu,
cclm_parameters_t *cclm_params,
uint8_t multi_ref_idx,
lcu_t *lcu)
{
const vector2d_t lcu_px = { SUB_SCU(x), SUB_SCU(y) };
@ -1104,7 +1105,7 @@ void kvz_intra_recon_cu(
if (cur_cu == NULL) {
cur_cu = LCU_GET_CU_AT_PX(lcu, lcu_px.x, lcu_px.y);
}
uint8_t multi_ref_index = cur_cu->intra.multi_ref_idx;
uint8_t multi_ref_index = multi_ref_idx;
// Reset CBFs because CBFs might have been set
// for depth earlier
@ -1122,10 +1123,10 @@ void kvz_intra_recon_cu(
const int32_t x2 = x + offset;
const int32_t y2 = y + offset;
kvz_intra_recon_cu(state, x, y, depth + 1, mode_luma, mode_chroma, NULL, NULL, lcu);
kvz_intra_recon_cu(state, x2, y, depth + 1, mode_luma, mode_chroma, NULL, NULL, lcu);
kvz_intra_recon_cu(state, x, y2, depth + 1, mode_luma, mode_chroma, NULL, NULL, lcu);
kvz_intra_recon_cu(state, x2, y2, depth + 1, mode_luma, mode_chroma, NULL, NULL, lcu);
kvz_intra_recon_cu(state, x, y, depth + 1, mode_luma, mode_chroma, NULL, NULL, multi_ref_index, lcu);
kvz_intra_recon_cu(state, x2, y, depth + 1, mode_luma, mode_chroma, NULL, NULL, multi_ref_index, lcu);
kvz_intra_recon_cu(state, x, y2, depth + 1, mode_luma, mode_chroma, NULL, NULL, multi_ref_index, lcu);
kvz_intra_recon_cu(state, x2, y2, depth + 1, mode_luma, mode_chroma, NULL, NULL, multi_ref_index, lcu);
// Propagate coded block flags from child CUs to parent CU.
uint16_t child_cbfs[3] = {

View file

@ -99,7 +99,7 @@ void kvz_intra_build_reference(
kvz_intra_references *const refs,
bool entropy_sync,
kvz_pixel *extra_refs,
int8_t multi_ref_idx);
uint8_t multi_ref_idx);
/**
* \brief Generate intra predictions.
@ -129,6 +129,7 @@ void kvz_intra_recon_cu(
int8_t mode_chroma,
cu_info_t *cur_cu,
cclm_parameters_t* cclm_params,
uint8_t multi_ref_idx,
lcu_t *lcu);

View file

@ -724,7 +724,7 @@ static double search_cu(encoder_state_t * const state, int x, int y, int depth,
int8_t intra_mode;
int8_t intra_trafo;
double intra_cost;
int8_t multi_ref_index = 0;
uint8_t multi_ref_index = 0;
kvz_search_cu_intra(state, x, y, depth, lcu,
&intra_mode, &intra_trafo, &intra_cost, &multi_ref_index);
if (intra_cost < cost) {
@ -749,7 +749,7 @@ static double search_cu(encoder_state_t * const state, int x, int y, int depth,
x, y,
depth,
cur_cu->intra.mode, -1, // skip chroma
NULL, NULL, lcu);
NULL, NULL, cur_cu->intra.multi_ref_idx, lcu);
downsample_cclm_rec(
state, x, y, cu_width / 2, cu_width / 2, lcu->rec.y, lcu->left_ref.y[64]
@ -771,7 +771,7 @@ static double search_cu(encoder_state_t * const state, int x, int y, int depth,
x & ~7, y & ~7, // TODO: as does this
depth,
-1, cur_cu->intra.mode_chroma, // skip luma
NULL, cclm_params, lcu);
NULL, cclm_params, 0, lcu);
}
} else if (cur_cu->type == CU_INTER) {
@ -931,7 +931,7 @@ static double search_cu(encoder_state_t * const state, int x, int y, int depth,
x, y,
depth,
cur_cu->intra.mode, mode_chroma,
NULL,NULL, lcu);
NULL,NULL, 0, lcu);
cost += kvz_cu_rd_cost_luma(state, x_local, y_local, depth, cur_cu, lcu);
if (has_chroma) {

View file

@ -333,7 +333,7 @@ static double search_intra_trdepth(encoder_state_t * const state,
x_px, y_px,
depth,
intra_mode, -1,
pred_cu, cclm_params, lcu);
pred_cu, cclm_params, pred_cu->intra.multi_ref_idx, lcu);
// TODO: Not sure if this should be 0 or 1 but at least seems to work with 1
if (pred_cu->tr_idx > 1)
@ -361,7 +361,7 @@ static double search_intra_trdepth(encoder_state_t * const state,
x_px, y_px,
depth,
-1, chroma_mode,
pred_cu, cclm_params, lcu);
pred_cu, cclm_params, 0, lcu);
best_rd_cost += kvz_cu_rd_cost_chroma(state, lcu_px.x, lcu_px.y, depth, pred_cu, lcu);
}
pred_cu->tr_skip = best_tr_idx == MTS_SKIP;
@ -716,7 +716,7 @@ static int8_t search_intra_rdo(encoder_state_t * const state,
int modes_to_check,
int8_t modes[67], int8_t trafo[67], double costs[67],
lcu_t *lcu,
int8_t multi_ref_idx)
uint8_t multi_ref_idx)
{
const int tr_depth = CLIP(1, MAX_PU_DEPTH, depth + state->encoder_control->cfg.tr_depth_intra);
const int width = LCU_WIDTH >> depth;
@ -901,7 +901,7 @@ int8_t kvz_search_intra_chroma_rdo(encoder_state_t * const state,
x_px, y_px,
depth,
-1, chroma.mode, // skip luma
NULL, NULL, lcu);
NULL, NULL, 0, lcu);
}
else {
@ -934,8 +934,7 @@ int8_t kvz_search_intra_chroma_rdo(encoder_state_t * const state,
x_px, y_px,
depth,
-1, chroma.mode, // skip luma
NULL, cclm_params, lcu
);
NULL, cclm_params, 0, lcu);
}
chroma.cost = kvz_cu_rd_cost_chroma(state, lcu_px.x, lcu_px.y, depth, tr_cu, lcu);
@ -1025,7 +1024,7 @@ void kvz_search_cu_intra(encoder_state_t * const state,
int8_t *mode_out,
int8_t *trafo_out,
double *cost_out,
int8_t *multi_ref_idx_out)
uint8_t *multi_ref_idx_out)
{
const vector2d_t lcu_px = { SUB_SCU(x_px), SUB_SCU(y_px) };
const int8_t cu_width = LCU_WIDTH >> depth;

View file

@ -60,6 +60,6 @@ void kvz_search_cu_intra(encoder_state_t * const state,
int8_t *mode_out,
int8_t *trafo_out,
double *cost_out,
int8_t *multi_ref_idx_out);
uint8_t *multi_ref_idx_out);
#endif // SEARCH_INTRA_H_