Commit c4d63cd2 authored by Mickaël Raulet's avatar Mickaël Raulet Committed by Michael Niedermayer

hevc/mvs: simplifying derive_spatial_merge_candidates function

cherry picked from commit 99be11cf08a5628d0bb6ac7f4958bf9dd35cda62
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent e9bb45ba
...@@ -329,8 +329,6 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0, ...@@ -329,8 +329,6 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
const int nb_refs = (s->sh.slice_type == P_SLICE) ? const int nb_refs = (s->sh.slice_type == P_SLICE) ?
s->sh.nb_refs[0] : FFMIN(s->sh.nb_refs[0], s->sh.nb_refs[1]); s->sh.nb_refs[0] : FFMIN(s->sh.nb_refs[0], s->sh.nb_refs[1]);
int check_MER = 1;
int check_MER_1 = 1;
int zero_idx = 0; int zero_idx = 0;
...@@ -343,8 +341,6 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0, ...@@ -343,8 +341,6 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
int is_available_b1; int is_available_b1;
int is_available_b2; int is_available_b2;
//first left spatial merge candidate
is_available_a1 = AVAILABLE(cand_left, A1);
if (!singleMCLFlag && part_idx == 1 && if (!singleMCLFlag && part_idx == 1 &&
(lc->cu.part_mode == PART_Nx2N || (lc->cu.part_mode == PART_Nx2N ||
...@@ -352,84 +348,65 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0, ...@@ -352,84 +348,65 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
lc->cu.part_mode == PART_nRx2N) || lc->cu.part_mode == PART_nRx2N) ||
isDiffMER(s, xA1, yA1, x0, y0)) { isDiffMER(s, xA1, yA1, x0, y0)) {
is_available_a1 = 0; is_available_a1 = 0;
} else {
is_available_a1 = AVAILABLE(cand_left, A1);
if (is_available_a1) {
mergecandlist[nb_merge_cand] = TAB_MVF_PU(A1);
if (merge_idx == 0) return;
nb_merge_cand++;
}
} }
if (is_available_a1) {
mergecandlist[0] = TAB_MVF_PU(A1);
if (merge_idx == 0) return;
nb_merge_cand++;
}
// above spatial merge candidate
is_available_b1 = AVAILABLE(cand_up, B1);
if (!singleMCLFlag && part_idx == 1 && if (!singleMCLFlag && part_idx == 1 &&
(lc->cu.part_mode == PART_2NxN || (lc->cu.part_mode == PART_2NxN ||
lc->cu.part_mode == PART_2NxnU || lc->cu.part_mode == PART_2NxnU ||
lc->cu.part_mode == PART_2NxnD) || lc->cu.part_mode == PART_2NxnD) ||
isDiffMER(s, xB1, yB1, x0, y0)) { isDiffMER(s, xB1, yB1, x0, y0)) {
is_available_b1 = 0; is_available_b1 = 0;
} else {
is_available_b1 = AVAILABLE(cand_up, B1);
if (is_available_b1 &&
!(is_available_a1 && COMPARE_MV_REFIDX(B1, A1))) {
mergecandlist[nb_merge_cand] = TAB_MVF_PU(B1);
if (merge_idx == nb_merge_cand) return;
nb_merge_cand++;
}
} }
if (is_available_a1 && is_available_b1)
check_MER = !COMPARE_MV_REFIDX(B1, A1);
if (is_available_b1 && check_MER)
mergecandlist[nb_merge_cand++] = TAB_MVF_PU(B1);
// above right spatial merge candidate // above right spatial merge candidate
check_MER = 1;
is_available_b0 = AVAILABLE(cand_up_right, B0) && is_available_b0 = AVAILABLE(cand_up_right, B0) &&
xB0 < s->sps->width && xB0 < s->sps->width &&
PRED_BLOCK_AVAILABLE(B0); PRED_BLOCK_AVAILABLE(B0) &&
!isDiffMER(s, xB0, yB0, x0, y0);
if (isDiffMER(s, xB0, yB0, x0, y0))
is_available_b0 = 0;
if (is_available_b1 && is_available_b0) if (is_available_b0 &&
check_MER = !COMPARE_MV_REFIDX(B0, B1); !(is_available_b1 && COMPARE_MV_REFIDX(B0, B1))) {
if (is_available_b0 && check_MER) {
mergecandlist[nb_merge_cand] = TAB_MVF_PU(B0); mergecandlist[nb_merge_cand] = TAB_MVF_PU(B0);
if (merge_idx == nb_merge_cand) return; if (merge_idx == nb_merge_cand) return;
nb_merge_cand++; nb_merge_cand++;
} }
// left bottom spatial merge candidate // left bottom spatial merge candidate
check_MER = 1;
is_available_a0 = AVAILABLE(cand_bottom_left, A0) && is_available_a0 = AVAILABLE(cand_bottom_left, A0) &&
yA0 < s->sps->height && yA0 < s->sps->height &&
PRED_BLOCK_AVAILABLE(A0); PRED_BLOCK_AVAILABLE(A0) &&
!isDiffMER(s, xA0, yA0, x0, y0);
if (isDiffMER(s, xA0, yA0, x0, y0)) if (is_available_a0 &&
is_available_a0 = 0; !(is_available_a1 && COMPARE_MV_REFIDX(A0, A1))) {
if (is_available_a1 && is_available_a0)
check_MER = !COMPARE_MV_REFIDX(A0, A1);
if (is_available_a0 && check_MER) {
mergecandlist[nb_merge_cand] = TAB_MVF_PU(A0); mergecandlist[nb_merge_cand] = TAB_MVF_PU(A0);
if (merge_idx == nb_merge_cand) return; if (merge_idx == nb_merge_cand) return;
nb_merge_cand++; nb_merge_cand++;
} }
// above left spatial merge candidate // above left spatial merge candidate
check_MER = 1; is_available_b2 = AVAILABLE(cand_up_left, B2) &&
!isDiffMER(s, xB2, yB2, x0, y0);
is_available_b2 = AVAILABLE(cand_up_left, B2);
if (isDiffMER(s, xB2, yB2, x0, y0))
is_available_b2 = 0;
if (is_available_a1 && is_available_b2)
check_MER = !COMPARE_MV_REFIDX(B2, A1);
if (is_available_b1 && is_available_b2)
check_MER_1 = !COMPARE_MV_REFIDX(B2, B1);
if (is_available_b2 && check_MER && check_MER_1 && nb_merge_cand != 4) { if (is_available_b2 &&
!(is_available_a1 && COMPARE_MV_REFIDX(B2, A1)) &&
!(is_available_b1 && COMPARE_MV_REFIDX(B2, B1)) &&
nb_merge_cand != 4) {
mergecandlist[nb_merge_cand] = TAB_MVF_PU(B2); mergecandlist[nb_merge_cand] = TAB_MVF_PU(B2);
if (merge_idx == nb_merge_cand) return; if (merge_idx == nb_merge_cand) return;
nb_merge_cand++; nb_merge_cand++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment