mirror of https://git.ffmpeg.org/ffmpeg.git
lavc/hevcdec: set active PPS/SPS in hevc_frame_start()
Not in hls_slice_header(), as it should only be done once per frame.
This commit is contained in:
parent
47d34ba7fb
commit
a2e77caf37
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue