static int set_sps(HEVCContext *s, const HEVCSPS *sps)

{

    int ret;

    int num = 0, den = 0;



    pic_arrays_free(s);

    ret = pic_arrays_init(s, sps);

    if (ret < 0)

        goto fail;



    s->avctx->coded_width         = sps->width;

    s->avctx->coded_height        = sps->height;

    s->avctx->width               = sps->output_width;

    s->avctx->height              = sps->output_height;

    s->avctx->pix_fmt             = sps->pix_fmt;

    s->avctx->sample_aspect_ratio = sps->vui.sar;

    s->avctx->has_b_frames        = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;



    if (sps->vui.video_signal_type_present_flag)

        s->avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG

                                                               : AVCOL_RANGE_MPEG;

    else

        s->avctx->color_range = AVCOL_RANGE_MPEG;



    if (sps->vui.colour_description_present_flag) {

        s->avctx->color_primaries = sps->vui.colour_primaries;

        s->avctx->color_trc       = sps->vui.transfer_characteristic;

        s->avctx->colorspace      = sps->vui.matrix_coeffs;

    } else {

        s->avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;

        s->avctx->color_trc       = AVCOL_TRC_UNSPECIFIED;

        s->avctx->colorspace      = AVCOL_SPC_UNSPECIFIED;

    }



    ff_hevc_pred_init(&s->hpc,     sps->bit_depth);

    ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);

    ff_videodsp_init (&s->vdsp,    sps->bit_depth);



    if (sps->sao_enabled) {

        av_frame_unref(s->tmp_frame);

        ret = ff_get_buffer(s->avctx, s->tmp_frame, AV_GET_BUFFER_FLAG_REF);

        if (ret < 0)

            goto fail;

        s->frame = s->tmp_frame;

    }



    s->sps = sps;

    s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;



    if (s->vps->vps_timing_info_present_flag) {

        num = s->vps->vps_num_units_in_tick;

        den = s->vps->vps_time_scale;

    } else if (sps->vui.vui_timing_info_present_flag) {

        num = sps->vui.vui_num_units_in_tick;

        den = sps->vui.vui_time_scale;

    }



    if (num != 0 && den != 0)

        av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den,

                  num, den, 1 << 30);



    return 0;



fail:

    pic_arrays_free(s);

    s->sps = NULL;

    return ret;

}
