static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)

{

    const HEVCSPS *sps = s->ps.sps;

    int max_poc_lsb    = 1 << sps->log2_max_poc_lsb;

    int prev_delta_msb = 0;

    unsigned int nb_sps = 0, nb_sh;

    int i;



    rps->nb_refs = 0;

    if (!sps->long_term_ref_pics_present_flag)

        return 0;



    if (sps->num_long_term_ref_pics_sps > 0)

        nb_sps = get_ue_golomb_long(gb);

    nb_sh = get_ue_golomb_long(gb);



    if (nb_sps > sps->num_long_term_ref_pics_sps)

        return AVERROR_INVALIDDATA;

    if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))

        return AVERROR_INVALIDDATA;



    rps->nb_refs = nb_sh + nb_sps;



    for (i = 0; i < rps->nb_refs; i++) {

        uint8_t delta_poc_msb_present;



        if (i < nb_sps) {

            uint8_t lt_idx_sps = 0;



            if (sps->num_long_term_ref_pics_sps > 1)

                lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));



            rps->poc[i]  = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];

            rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];

        } else {

            rps->poc[i]  = get_bits(gb, sps->log2_max_poc_lsb);

            rps->used[i] = get_bits1(gb);

        }



        delta_poc_msb_present = get_bits1(gb);

        if (delta_poc_msb_present) {

            int delta = get_ue_golomb_long(gb);



            if (i && i != nb_sps)

                delta += prev_delta_msb;



            rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;

            prev_delta_msb = delta;

        }

    }



    return 0;

}
