void ff_hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW,

                              int nPbH, int log2_cb_size, int part_idx,

                              int merge_idx, MvField *mv,

                              int mvp_lx_flag, int LX)

{

    HEVCLocalContext *lc = s->HEVClc;

    MvField *tab_mvf = s->ref->tab_mvf;

    int isScaledFlag_L0 = 0;

    int availableFlagLXA0 = 1;

    int availableFlagLXB0 = 1;

    int numMVPCandLX = 0;

    int min_pu_width = s->sps->min_pu_width;



    int xA0, yA0;

    int is_available_a0;

    int xA1, yA1;

    int is_available_a1;

    int xB0, yB0;

    int is_available_b0;

    int xB1, yB1;

    int is_available_b1;

    int xB2, yB2;

    int is_available_b2;



    Mv mvpcand_list[2] = { { 0 } };

    Mv mxA;

    Mv mxB;

    int ref_idx_curr = 0;

    int ref_idx = 0;

    int pred_flag_index_l0;

    int pred_flag_index_l1;



    const int cand_bottom_left = lc->na.cand_bottom_left;

    const int cand_left        = lc->na.cand_left;

    const int cand_up_left     = lc->na.cand_up_left;

    const int cand_up          = lc->na.cand_up;

    const int cand_up_right    = lc->na.cand_up_right_sap;

    ref_idx_curr       = LX;

    ref_idx            = mv->ref_idx[LX];

    pred_flag_index_l0 = LX;

    pred_flag_index_l1 = !LX;



    // left bottom spatial candidate

    xA0 = x0 - 1;

    yA0 = y0 + nPbH;



    is_available_a0 = AVAILABLE(cand_bottom_left, A0) &&

                      yA0 < s->sps->height &&

                      PRED_BLOCK_AVAILABLE(A0);



    //left spatial merge candidate

    xA1    = x0 - 1;

    yA1    = y0 + nPbH - 1;



    is_available_a1 = AVAILABLE(cand_left, A1);

    if (is_available_a0 || is_available_a1)

        isScaledFlag_L0 = 1;



    if (is_available_a0) {

        if (MP_MX(A0, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX(A0, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }



    if (is_available_a1) {

        if (MP_MX(A1, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX(A1, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }



    if (is_available_a0) {

        if (MP_MX_LT(A0, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX_LT(A0, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }



    if (is_available_a1) {

        if (MP_MX_LT(A1, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX_LT(A1, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }

    availableFlagLXA0 = 0;



b_candidates:

    // B candidates

    // above right spatial merge candidate

    xB0    = x0 + nPbW;

    yB0    = y0 - 1;



    is_available_b0 =  AVAILABLE(cand_up_right, B0) &&

                       xB0 < s->sps->width &&

                       PRED_BLOCK_AVAILABLE(B0);



    // above spatial merge candidate

    xB1    = x0 + nPbW - 1;

    yB1    = y0 - 1;

    is_available_b1 = AVAILABLE(cand_up, B1);



    // above left spatial merge candidate

    xB2 = x0 - 1;

    yB2 = y0 - 1;

    is_available_b2 = AVAILABLE(cand_up_left, B2);



    // above right spatial merge candidate

    if (is_available_b0) {

        if (MP_MX(B0, pred_flag_index_l0, mxB)) {

            goto scalef;

        }

        if (MP_MX(B0, pred_flag_index_l1, mxB)) {

            goto scalef;

        }

    }



    // above spatial merge candidate

    if (is_available_b1) {

        if (MP_MX(B1, pred_flag_index_l0, mxB)) {

            goto scalef;

        }

        if (MP_MX(B1, pred_flag_index_l1, mxB)) {

            goto scalef;

        }

    }



    // above left spatial merge candidate

    if (is_available_b2) {

        if (MP_MX(B2, pred_flag_index_l0, mxB)) {

            goto scalef;

        }

        if (MP_MX(B2, pred_flag_index_l1, mxB)) {

            goto scalef;

        }

    }

    availableFlagLXB0 = 0;



scalef:

    if (!isScaledFlag_L0) {

        if (availableFlagLXB0) {

            availableFlagLXA0 = 1;

            mxA = mxB;

        }

        availableFlagLXB0 = 0;



        // XB0 and L1

        if (is_available_b0) {

            availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l0, mxB);

            if (!availableFlagLXB0)

                availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l1, mxB);

        }



        if (is_available_b1 && !availableFlagLXB0) {

            availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l0, mxB);

            if (!availableFlagLXB0)

                availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l1, mxB);

        }



        if (is_available_b2 && !availableFlagLXB0) {

            availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l0, mxB);

            if (!availableFlagLXB0)

                availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l1, mxB);

        }

    }



    if (availableFlagLXA0)

        mvpcand_list[numMVPCandLX++] = mxA;



    if (availableFlagLXB0 && (!availableFlagLXA0 || mxA.x != mxB.x || mxA.y != mxB.y))

        mvpcand_list[numMVPCandLX++] = mxB;



    //temporal motion vector prediction candidate

    if (numMVPCandLX < 2 && s->sh.slice_temporal_mvp_enabled_flag &&

        mvp_lx_flag == numMVPCandLX) {

        Mv mv_col;

        int available_col = temporal_luma_motion_vector(s, x0, y0, nPbW,

                                                        nPbH, ref_idx,

                                                        &mv_col, LX);

        if (available_col)

            mvpcand_list[numMVPCandLX++] = mv_col;

    }



    mv->mv[LX] = mvpcand_list[mvp_lx_flag];

}

void ff_hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW,

                              int nPbH, int log2_cb_size, int part_idx,

                              int merge_idx, MvField *mv,

                              int mvp_lx_flag, int LX)

{

    HEVCLocalContext *lc = s->HEVClc;

    MvField *tab_mvf = s->ref->tab_mvf;

    int isScaledFlag_L0 = 0;

    int availableFlagLXA0 = 1;

    int availableFlagLXB0 = 1;

    int numMVPCandLX = 0;

    int min_pu_width = s->sps->min_pu_width;



    int xA0, yA0;

    int is_available_a0;

    int xA1, yA1;

    int is_available_a1;

    int xB0, yB0;

    int is_available_b0;

    int xB1, yB1;

    int is_available_b1;

    int xB2, yB2;

    int is_available_b2;



    Mv mvpcand_list[2] = { { 0 } };

    Mv mxA;

    Mv mxB;

    int ref_idx_curr = 0;

    int ref_idx = 0;

    int pred_flag_index_l0;

    int pred_flag_index_l1;



    const int cand_bottom_left = lc->na.cand_bottom_left;

    const int cand_left        = lc->na.cand_left;

    const int cand_up_left     = lc->na.cand_up_left;

    const int cand_up          = lc->na.cand_up;

    const int cand_up_right    = lc->na.cand_up_right_sap;

    ref_idx_curr       = LX;

    ref_idx            = mv->ref_idx[LX];

    pred_flag_index_l0 = LX;

    pred_flag_index_l1 = !LX;



    

    xA0 = x0 - 1;

    yA0 = y0 + nPbH;



    is_available_a0 = AVAILABLE(cand_bottom_left, A0) &&

                      yA0 < s->sps->height &&

                      PRED_BLOCK_AVAILABLE(A0);



    

    xA1    = x0 - 1;

    yA1    = y0 + nPbH - 1;



    is_available_a1 = AVAILABLE(cand_left, A1);

    if (is_available_a0 || is_available_a1)

        isScaledFlag_L0 = 1;



    if (is_available_a0) {

        if (MP_MX(A0, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX(A0, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }



    if (is_available_a1) {

        if (MP_MX(A1, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX(A1, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }



    if (is_available_a0) {

        if (MP_MX_LT(A0, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX_LT(A0, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }



    if (is_available_a1) {

        if (MP_MX_LT(A1, pred_flag_index_l0, mxA)) {

            goto b_candidates;

        }

        if (MP_MX_LT(A1, pred_flag_index_l1, mxA)) {

            goto b_candidates;

        }

    }

    availableFlagLXA0 = 0;



b_candidates:

    

    

    xB0    = x0 + nPbW;

    yB0    = y0 - 1;



    is_available_b0 =  AVAILABLE(cand_up_right, B0) &&

                       xB0 < s->sps->width &&

                       PRED_BLOCK_AVAILABLE(B0);



    

    xB1    = x0 + nPbW - 1;

    yB1    = y0 - 1;

    is_available_b1 = AVAILABLE(cand_up, B1);



    

    xB2 = x0 - 1;

    yB2 = y0 - 1;

    is_available_b2 = AVAILABLE(cand_up_left, B2);



    

    if (is_available_b0) {

        if (MP_MX(B0, pred_flag_index_l0, mxB)) {

            goto scalef;

        }

        if (MP_MX(B0, pred_flag_index_l1, mxB)) {

            goto scalef;

        }

    }



    

    if (is_available_b1) {

        if (MP_MX(B1, pred_flag_index_l0, mxB)) {

            goto scalef;

        }

        if (MP_MX(B1, pred_flag_index_l1, mxB)) {

            goto scalef;

        }

    }



    

    if (is_available_b2) {

        if (MP_MX(B2, pred_flag_index_l0, mxB)) {

            goto scalef;

        }

        if (MP_MX(B2, pred_flag_index_l1, mxB)) {

            goto scalef;

        }

    }

    availableFlagLXB0 = 0;



scalef:

    if (!isScaledFlag_L0) {

        if (availableFlagLXB0) {

            availableFlagLXA0 = 1;

            mxA = mxB;

        }

        availableFlagLXB0 = 0;



        

        if (is_available_b0) {

            availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l0, mxB);

            if (!availableFlagLXB0)

                availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l1, mxB);

        }



        if (is_available_b1 && !availableFlagLXB0) {

            availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l0, mxB);

            if (!availableFlagLXB0)

                availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l1, mxB);

        }



        if (is_available_b2 && !availableFlagLXB0) {

            availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l0, mxB);

            if (!availableFlagLXB0)

                availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l1, mxB);

        }

    }



    if (availableFlagLXA0)

        mvpcand_list[numMVPCandLX++] = mxA;



    if (availableFlagLXB0 && (!availableFlagLXA0 || mxA.x != mxB.x || mxA.y != mxB.y))

        mvpcand_list[numMVPCandLX++] = mxB;



    

    if (numMVPCandLX < 2 && s->sh.slice_temporal_mvp_enabled_flag &&

        mvp_lx_flag == numMVPCandLX) {

        Mv mv_col;

        int available_col = temporal_luma_motion_vector(s, x0, y0, nPbW,

                                                        nPbH, ref_idx,

                                                        &mv_col, LX);

        if (available_col)

            mvpcand_list[numMVPCandLX++] = mv_col;

    }



    mv->mv[LX] = mvpcand_list[mvp_lx_flag];

}

void FUNC_0(HEVCContext *VAR_0, int VAR_1, int VAR_2, int VAR_3,

                              int VAR_4, int VAR_5, int VAR_6,

                              int VAR_7, MvField *VAR_8,

                              int VAR_9, int VAR_10)

{

    HEVCLocalContext *lc = VAR_0->HEVClc;

    MvField *tab_mvf = VAR_0->ref->tab_mvf;

    int VAR_11 = 0;

    int VAR_12 = 1;

    int VAR_13 = 1;

    int VAR_14 = 0;

    int VAR_15 = VAR_0->sps->VAR_15;



    int VAR_16, VAR_17;

    int VAR_18;

    int VAR_19, VAR_20;

    int VAR_21;

    int VAR_22, VAR_23;

    int VAR_24;

    int VAR_25, VAR_26;

    int VAR_27;

    int VAR_28, VAR_29;

    int VAR_30;



    Mv mvpcand_list[2] = { { 0 } };

    Mv mxA;

    Mv mxB;

    int VAR_31 = 0;

    int VAR_32 = 0;

    int VAR_33;

    int VAR_34;



    const int VAR_35 = lc->na.VAR_35;

    const int VAR_36        = lc->na.VAR_36;

    const int VAR_37     = lc->na.VAR_37;

    const int VAR_38          = lc->na.VAR_38;

    const int VAR_39    = lc->na.cand_up_right_sap;

    VAR_31       = VAR_10;

    VAR_32            = VAR_8->VAR_32[VAR_10];

    VAR_33 = VAR_10;

    VAR_34 = !VAR_10;



    

    VAR_16 = VAR_1 - 1;

    VAR_17 = VAR_2 + VAR_4;



    VAR_18 = AVAILABLE(VAR_35, A0) &&

                      VAR_17 < VAR_0->sps->height &&

                      PRED_BLOCK_AVAILABLE(A0);



    

    VAR_19    = VAR_1 - 1;

    VAR_20    = VAR_2 + VAR_4 - 1;



    VAR_21 = AVAILABLE(VAR_36, A1);

    if (VAR_18 || VAR_21)

        VAR_11 = 1;



    if (VAR_18) {

        if (MP_MX(A0, VAR_33, mxA)) {

            goto b_candidates;

        }

        if (MP_MX(A0, VAR_34, mxA)) {

            goto b_candidates;

        }

    }



    if (VAR_21) {

        if (MP_MX(A1, VAR_33, mxA)) {

            goto b_candidates;

        }

        if (MP_MX(A1, VAR_34, mxA)) {

            goto b_candidates;

        }

    }



    if (VAR_18) {

        if (MP_MX_LT(A0, VAR_33, mxA)) {

            goto b_candidates;

        }

        if (MP_MX_LT(A0, VAR_34, mxA)) {

            goto b_candidates;

        }

    }



    if (VAR_21) {

        if (MP_MX_LT(A1, VAR_33, mxA)) {

            goto b_candidates;

        }

        if (MP_MX_LT(A1, VAR_34, mxA)) {

            goto b_candidates;

        }

    }

    VAR_12 = 0;



b_candidates:

    

    

    VAR_22    = VAR_1 + VAR_3;

    VAR_23    = VAR_2 - 1;



    VAR_24 =  AVAILABLE(VAR_39, B0) &&

                       VAR_22 < VAR_0->sps->width &&

                       PRED_BLOCK_AVAILABLE(B0);



    

    VAR_25    = VAR_1 + VAR_3 - 1;

    VAR_26    = VAR_2 - 1;

    VAR_27 = AVAILABLE(VAR_38, B1);



    

    VAR_28 = VAR_1 - 1;

    VAR_29 = VAR_2 - 1;

    VAR_30 = AVAILABLE(VAR_37, B2);



    

    if (VAR_24) {

        if (MP_MX(B0, VAR_33, mxB)) {

            goto scalef;

        }

        if (MP_MX(B0, VAR_34, mxB)) {

            goto scalef;

        }

    }



    

    if (VAR_27) {

        if (MP_MX(B1, VAR_33, mxB)) {

            goto scalef;

        }

        if (MP_MX(B1, VAR_34, mxB)) {

            goto scalef;

        }

    }



    

    if (VAR_30) {

        if (MP_MX(B2, VAR_33, mxB)) {

            goto scalef;

        }

        if (MP_MX(B2, VAR_34, mxB)) {

            goto scalef;

        }

    }

    VAR_13 = 0;



scalef:

    if (!VAR_11) {

        if (VAR_13) {

            VAR_12 = 1;

            mxA = mxB;

        }

        VAR_13 = 0;



        

        if (VAR_24) {

            VAR_13 = MP_MX_LT(B0, VAR_33, mxB);

            if (!VAR_13)

                VAR_13 = MP_MX_LT(B0, VAR_34, mxB);

        }



        if (VAR_27 && !VAR_13) {

            VAR_13 = MP_MX_LT(B1, VAR_33, mxB);

            if (!VAR_13)

                VAR_13 = MP_MX_LT(B1, VAR_34, mxB);

        }



        if (VAR_30 && !VAR_13) {

            VAR_13 = MP_MX_LT(B2, VAR_33, mxB);

            if (!VAR_13)

                VAR_13 = MP_MX_LT(B2, VAR_34, mxB);

        }

    }



    if (VAR_12)

        mvpcand_list[VAR_14++] = mxA;



    if (VAR_13 && (!VAR_12 || mxA.x != mxB.x || mxA.y != mxB.y))

        mvpcand_list[VAR_14++] = mxB;



    

    if (VAR_14 < 2 && VAR_0->sh.slice_temporal_mvp_enabled_flag &&

        VAR_9 == VAR_14) {

        Mv mv_col;

        int VAR_40 = temporal_luma_motion_vector(VAR_0, VAR_1, VAR_2, VAR_3,

                                                        VAR_4, VAR_32,

                                                        &mv_col, VAR_10);

        if (VAR_40)

            mvpcand_list[VAR_14++] = mv_col;

    }



    VAR_8->VAR_8[VAR_10] = mvpcand_list[VAR_9];

}

void FUNC_0(HEVCContext *VAR_0, int VAR_1, int VAR_2, int VAR_3,
int VAR_4, int VAR_5, int VAR_6,
int VAR_7, MvField *VAR_8,
int VAR_9, int VAR_10)
{ HEVCLocalContext *lc = VAR_0->HEVClc; MvField *tab_mvf = VAR_0->ref->tab_mvf; int VAR_11 = 0; int VAR_12 = 1; int VAR_13 = 1; int VAR_14 = 0; int VAR_15 = VAR_0->sps->VAR_15; int VAR_16, VAR_17; int VAR_18; int VAR_19, VAR_20; int VAR_21; int VAR_22, VAR_23; int VAR_24; int VAR_25, VAR_26; int VAR_27; int VAR_28, VAR_29; int VAR_30; Mv mvpcand_list[2] = { { 0 } }; Mv mxA; Mv mxB; int VAR_31 = 0; int VAR_32 = 0; int VAR_33; int VAR_34; const int VAR_35 = lc->na.VAR_35; const int VAR_36        = lc->na.VAR_36; const int VAR_37     = lc->na.VAR_37; const int VAR_38          = lc->na.VAR_38; const int VAR_39    = lc->na.cand_up_right_sap; VAR_31       = VAR_10; VAR_32            = VAR_8->VAR_32[VAR_10]; VAR_33 = VAR_10; VAR_34 = !VAR_10; VAR_16 = VAR_1 - 1; VAR_17 = VAR_2 + VAR_4; VAR_18 = AVAILABLE(VAR_35, A0) &&
VAR_17 < VAR_0->sps->height &&
PRED_BLOCK_AVAILABLE(A0); VAR_19    = VAR_1 - 1; VAR_20    = VAR_2 + VAR_4 - 1; VAR_21 = AVAILABLE(VAR_36, A1); if (VAR_18 || VAR_21)
VAR_11 = 1; if (VAR_18) { if (MP_MX(A0, VAR_33, mxA)) { goto b_candidates; } if (MP_MX(A0, VAR_34, mxA)) { goto b_candidates; } } if (VAR_21) { if (MP_MX(A1, VAR_33, mxA)) { goto b_candidates; } if (MP_MX(A1, VAR_34, mxA)) { goto b_candidates; } } if (VAR_18) { if (MP_MX_LT(A0, VAR_33, mxA)) { goto b_candidates; } if (MP_MX_LT(A0, VAR_34, mxA)) { goto b_candidates; } } if (VAR_21) { if (MP_MX_LT(A1, VAR_33, mxA)) { goto b_candidates; } if (MP_MX_LT(A1, VAR_34, mxA)) { goto b_candidates; } } VAR_12 = 0; b_candidates:
VAR_22    = VAR_1 + VAR_3; VAR_23    = VAR_2 - 1; VAR_24 =  AVAILABLE(VAR_39, B0) &&
VAR_22 < VAR_0->sps->width &&
PRED_BLOCK_AVAILABLE(B0); VAR_25    = VAR_1 + VAR_3 - 1; VAR_26    = VAR_2 - 1; VAR_27 = AVAILABLE(VAR_38, B1); VAR_28 = VAR_1 - 1; VAR_29 = VAR_2 - 1; VAR_30 = AVAILABLE(VAR_37, B2); if (VAR_24) { if (MP_MX(B0, VAR_33, mxB)) { goto scalef; } if (MP_MX(B0, VAR_34, mxB)) { goto scalef; } } if (VAR_27) { if (MP_MX(B1, VAR_33, mxB)) { goto scalef; } if (MP_MX(B1, VAR_34, mxB)) { goto scalef; } } if (VAR_30) { if (MP_MX(B2, VAR_33, mxB)) { goto scalef; } if (MP_MX(B2, VAR_34, mxB)) { goto scalef; } } VAR_13 = 0; scalef:
if (!VAR_11) { if (VAR_13) { VAR_12 = 1; mxA = mxB; } VAR_13 = 0; if (VAR_24) { VAR_13 = MP_MX_LT(B0, VAR_33, mxB); if (!VAR_13)
VAR_13 = MP_MX_LT(B0, VAR_34, mxB); } if (VAR_27 && !VAR_13) { VAR_13 = MP_MX_LT(B1, VAR_33, mxB); if (!VAR_13)
VAR_13 = MP_MX_LT(B1, VAR_34, mxB); } if (VAR_30 && !VAR_13) { VAR_13 = MP_MX_LT(B2, VAR_33, mxB); if (!VAR_13)
VAR_13 = MP_MX_LT(B2, VAR_34, mxB); } } if (VAR_12)
mvpcand_list[VAR_14++] = mxA; if (VAR_13 && (!VAR_12 || mxA.x != mxB.x || mxA.y != mxB.y))
mvpcand_list[VAR_14++] = mxB; if (VAR_14 < 2 && VAR_0->sh.slice_temporal_mvp_enabled_flag &&
VAR_9 == VAR_14) { Mv mv_col; int VAR_40 = temporal_luma_motion_vector(VAR_0, VAR_1, VAR_2, VAR_3,
VAR_4, VAR_32,
&mv_col, VAR_10); if (VAR_40)
mvpcand_list[VAR_14++] = mv_col; } VAR_8->VAR_8[VAR_10] = mvpcand_list[VAR_9]; }