lavc/hevcdec: do not pass HEVCContext to ff_hevc_frame_nb_refs()

Pass the only things required from it - slice header and PPS -
explicitly.

Will be useful in the following commits to avoid mofiying HEVCContext in
hls_slice_header().
release/7.1
Anton Khirnov 6 months ago
parent 07eb60c0da
commit 381b70e173
  1. 2
      libavcodec/hevc/hevcdec.c
  2. 2
      libavcodec/hevc/hevcdec.h
  3. 8
      libavcodec/hevc/refs.c
  4. 2
      libavcodec/nvdec_hevc.c
  5. 2
      libavcodec/vdpau_hevc.c

@ -795,7 +795,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb)
sh->rpl_modification_flag[0] = 0;
sh->rpl_modification_flag[1] = 0;
nb_refs = ff_hevc_frame_nb_refs(s);
nb_refs = ff_hevc_frame_nb_refs(sh, pps);
if (!nb_refs) {
av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
return AVERROR_INVALIDDATA;

@ -614,7 +614,7 @@ int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx);
/**
* Get the number of candidate references for the current frame.
*/
int ff_hevc_frame_nb_refs(const HEVCContext *s);
int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps);
int ff_hevc_set_new_ref(HEVCContext *s, int poc);

@ -526,12 +526,12 @@ fail:
return ret;
}
int ff_hevc_frame_nb_refs(const HEVCContext *s)
int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps)
{
int ret = 0;
int i;
const ShortTermRPS *rps = s->sh.short_term_rps;
const LongTermRPS *long_rps = &s->sh.long_term_rps;
const ShortTermRPS *rps = sh->short_term_rps;
const LongTermRPS *long_rps = &sh->long_term_rps;
if (rps) {
for (i = 0; i < rps->num_negative_pics; i++)
@ -545,7 +545,7 @@ int ff_hevc_frame_nb_refs(const HEVCContext *s)
ret += !!long_rps->used[i];
}
if (s->pps->pps_curr_pic_ref_enabled_flag)
if (pps->pps_curr_pic_ref_enabled_flag)
ret++;
return ret;

@ -187,7 +187,7 @@ static int nvdec_hevc_start_frame(AVCodecContext *avctx,
.NumBitsForShortTermRPSInSlice = s->sh.short_term_rps ? s->sh.short_term_ref_pic_set_size : 0,
.NumDeltaPocsOfRefRpsIdx = s->sh.short_term_rps ? s->sh.short_term_rps->rps_idx_num_delta_pocs : 0,
.NumPocTotalCurr = ff_hevc_frame_nb_refs(s),
.NumPocTotalCurr = ff_hevc_frame_nb_refs(&s->sh, pps),
.NumPocStCurrBefore = s->rps[ST_CURR_BEF].nb_refs,
.NumPocStCurrAfter = s->rps[ST_CURR_AFT].nb_refs,
.NumPocLtCurr = s->rps[LT_CURR].nb_refs,

@ -205,7 +205,7 @@ static int vdpau_hevc_start_frame(AVCodecContext *avctx,
}
}
/* See section 7.4.7.2 of the specification. */
info->NumPocTotalCurr = ff_hevc_frame_nb_refs(h);
info->NumPocTotalCurr = ff_hevc_frame_nb_refs(&h->sh, pps);
if (sh->short_term_ref_pic_set_sps_flag == 0 && sh->short_term_rps) {
/* Corresponds to specification field, NumDeltaPocs[RefRpsIdx].
Only applicable when short_term_ref_pic_set_sps_flag == 0.

Loading…
Cancel
Save