X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fhevcdec.c;h=967f8f1def560c5c113f15f58c874ffe03ec2af1;hb=c2631dfd0a0a12050cc1765fd41702c5e93abee5;hp=c8877626d2e4356bb3c3c6559514893a0cebe356;hpb=0ac379863231dbf84a97a01845c6d00cc00610c1;p=ffmpeg diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index c8877626d2e..967f8f1def5 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -409,6 +409,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) #endif break; case AV_PIX_FMT_YUV420P12: + case AV_PIX_FMT_YUV444P: + case AV_PIX_FMT_YUV444P10: + case AV_PIX_FMT_YUV444P12: #if CONFIG_HEVC_NVDEC_HWACCEL *fmt++ = AV_PIX_FMT_CUDA; #endif @@ -2919,7 +2922,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) if ( (s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) || (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) || - (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IDR(s))) { + (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s))) { break; } @@ -2942,6 +2945,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) s->max_ra = INT_MIN; } + s->overlap ++; ret = hevc_frame_start(s); if (ret < 0) return ret; @@ -3020,11 +3024,12 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) s->ref = NULL; s->last_eos = s->eos; s->eos = 0; + s->overlap = 0; /* split the input packet into NAL units, so we know the upper bound on the * number of slices in the frame */ ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff, - s->nal_length_size, s->avctx->codec_id, 1); + s->nal_length_size, s->avctx->codec_id, 1, 0); if (ret < 0) { av_log(s->avctx, AV_LOG_ERROR, "Error splitting the input into NAL units.\n"); @@ -3054,6 +3059,8 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) continue; ret = decode_nal_unit(s, nal); + if (ret >= 0 && s->overlap > 2) + ret = AVERROR_INVALIDDATA; if (ret < 0) { av_log(s->avctx, AV_LOG_WARNING, "Error parsing NAL unit #%d.\n", i); @@ -3358,6 +3365,7 @@ fail: return AVERROR(ENOMEM); } +#if HAVE_THREADS static int hevc_update_thread_context(AVCodecContext *dst, const AVCodecContext *src) { @@ -3439,6 +3447,7 @@ static int hevc_update_thread_context(AVCodecContext *dst, return 0; } +#endif static av_cold int hevc_decode_init(AVCodecContext *avctx) { @@ -3478,6 +3487,7 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) return 0; } +#if HAVE_THREADS static av_cold int hevc_init_thread_copy(AVCodecContext *avctx) { HEVCContext *s = avctx->priv_data; @@ -3491,6 +3501,7 @@ static av_cold int hevc_init_thread_copy(AVCodecContext *avctx) return 0; } +#endif static void hevc_decode_flush(AVCodecContext *avctx) { @@ -3529,8 +3540,8 @@ AVCodec ff_hevc_decoder = { .close = hevc_decode_free, .decode = hevc_decode_frame, .flush = hevc_decode_flush, - .update_thread_context = hevc_update_thread_context, - .init_thread_copy = hevc_init_thread_copy, + .update_thread_context = ONLY_IF_THREADS_ENABLED(hevc_update_thread_context), + .init_thread_copy = ONLY_IF_THREADS_ENABLED(hevc_init_thread_copy), .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING,