diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 804cceac3e..9abae3260d 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -594,6 +594,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) SliceHeader *sh = &s->sh; const HEVCPPS *pps; const HEVCSPS *sps; + unsigned pps_id; int i, ret; // Coded parameters @@ -612,40 +613,23 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if (IS_IRAP(s)) sh->no_output_of_prior_pics_flag = get_bits1(gb); - sh->pps_id = get_ue_golomb_long(gb); - if (sh->pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[sh->pps_id]) { - av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id); + pps_id = get_ue_golomb_long(gb); + if (pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[pps_id]) { + av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id); return AVERROR_INVALIDDATA; } - if (!sh->first_slice_in_pic_flag && - s->pps != s->ps.pps_list[sh->pps_id]) { + if (!sh->first_slice_in_pic_flag && pps_id != sh->pps_id) { av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n"); return AVERROR_INVALIDDATA; } - ff_refstruct_replace(&s->pps, s->ps.pps_list[sh->pps_id]); - pps = s->pps; + sh->pps_id = pps_id; + + pps = s->ps.pps_list[pps_id]; sps = pps->sps; if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1) sh->no_output_of_prior_pics_flag = 1; - if (s->ps.sps != sps) { - enum AVPixelFormat pix_fmt; - - ff_hevc_clear_refs(s); - - ret = set_sps(s, sps, sps->pix_fmt); - if (ret < 0) - return ret; - - pix_fmt = get_format(s, sps); - if (pix_fmt < 0) - return pix_fmt; - s->avctx->pix_fmt = pix_fmt; - - s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; - } - sh->dependent_slice_segment_flag = 0; if (!sh->first_slice_in_pic_flag) { int slice_address_length; @@ -2935,12 +2919,30 @@ static int set_side_data(HEVCContext *s) static int hevc_frame_start(HEVCContext *s) { - const HEVCPPS *const pps = s->pps; + const HEVCPPS *const pps = s->ps.pps_list[s->sh.pps_id]; const HEVCSPS *const sps = pps->sps; int pic_size_in_ctb = ((sps->width >> sps->log2_min_cb_size) + 1) * ((sps->height >> sps->log2_min_cb_size) + 1); int ret; + ff_refstruct_replace(&s->pps, pps); + if (s->ps.sps != sps) { + enum AVPixelFormat pix_fmt; + + ff_hevc_clear_refs(s); + + ret = set_sps(s, sps, sps->pix_fmt); + if (ret < 0) + return ret; + + pix_fmt = get_format(s, sps); + if (pix_fmt < 0) + return pix_fmt; + s->avctx->pix_fmt = pix_fmt; + + s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; + } + memset(s->horizontal_bs, 0, s->bs_width * s->bs_height); memset(s->vertical_bs, 0, s->bs_width * s->bs_height); memset(s->cbf_luma, 0, sps->min_tb_width * sps->min_tb_height);