mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-30 12:44:07 +00:00
[inter] Fix HMVP mv candidate derivation for more than one reference frame
This commit is contained in:
parent
907fa6a36a
commit
901bf561ff
23
src/inter.c
23
src/inter.c
|
@ -1184,8 +1184,7 @@ static INLINE bool add_mvp_candidate(const encoder_state_t *state,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cand->inter.mv_dir & (1 << cand_list) &&
|
if (state->frame->ref_LX[cand_list][cand->inter.mv_ref[cand_list]] ==
|
||||||
state->frame->ref_LX[cand_list][cand->inter.mv_ref[cand_list]] ==
|
|
||||||
state->frame->ref_LX[reflist][cur_cu->inter.mv_ref[reflist]])
|
state->frame->ref_LX[reflist][cur_cu->inter.mv_ref[reflist]])
|
||||||
{
|
{
|
||||||
mv_cand_out[0] = cand->inter.mv[cand_list][0];
|
mv_cand_out[0] = cand->inter.mv[cand_list][0];
|
||||||
|
@ -1266,11 +1265,21 @@ static void get_mv_cand_from_candidates(const encoder_state_t * const state,
|
||||||
const uint32_t ctu_row = (y >> LOG2_LCU_WIDTH);
|
const uint32_t ctu_row = (y >> LOG2_LCU_WIDTH);
|
||||||
const uint32_t ctu_row_mul_five = ctu_row * MAX_NUM_HMVP_CANDS;
|
const uint32_t ctu_row_mul_five = ctu_row * MAX_NUM_HMVP_CANDS;
|
||||||
int32_t num_cand = state->frame->hmvp_size[ctu_row];
|
int32_t num_cand = state->frame->hmvp_size[ctu_row];
|
||||||
for (int i = num_cand-1; i >= 0; i--) { // ToDo: VVC: Handle B-frames
|
for (int i = 0; i < MIN(/*MAX_NUM_HMVP_AVMPCANDS*/4,num_cand); i++) {
|
||||||
mv_cand[candidates][0] = state->frame->hmvp_lut[ctu_row_mul_five + i].inter.mv[0][0];
|
for (int pred_source = 0; pred_source < 2; pred_source++) {
|
||||||
mv_cand[candidates][1] = state->frame->hmvp_lut[ctu_row_mul_five + i].inter.mv[0][1];
|
const int cand_list = pred_source == 0 ? reflist : !reflist;
|
||||||
candidates++;
|
cu_info_t* cand = &state->frame->hmvp_lut[ctu_row_mul_five + num_cand - 1 - i];
|
||||||
if (candidates == AMVP_MAX_NUM_CANDS) return;
|
if ((cand->inter.mv_dir & (1 << cand_list)) == 0) continue;
|
||||||
|
// Make sure the candidate points to the same reference frame
|
||||||
|
if (state->frame->ref_LX[cand_list][cand->inter.mv_ref[cand_list]] ==
|
||||||
|
state->frame->ref_LX[reflist][cur_cu->inter.mv_ref[reflist]])
|
||||||
|
{
|
||||||
|
mv_cand[candidates][0] = cand->inter.mv[cand_list][0];
|
||||||
|
mv_cand[candidates][1] = cand->inter.mv[cand_list][1];
|
||||||
|
candidates++;
|
||||||
|
if (candidates == AMVP_MAX_NUM_CANDS) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue