X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fgifdec.c;h=80f1ba0cce6607d6c66a97a8804147c27bcaa5ab;hb=a247ac640df3da573cd661065bf53f37863e2b46;hp=2eeed4c4c701b1e79af8dc4fdcbee107f86113ac;hpb=64425e005edf3bdd77c34c078c3e74ab5ecef557;p=ffmpeg diff --git a/libavcodec/gifdec.c b/libavcodec/gifdec.c index 2eeed4c4c70..80f1ba0cce6 100644 --- a/libavcodec/gifdec.c +++ b/libavcodec/gifdec.c @@ -179,12 +179,20 @@ static int gif_read_image(GifState *s, AVFrame *frame) } /* verify that all the image is inside the screen dimensions */ - if (!width || width > s->screen_width || left >= s->screen_width) { - av_log(s->avctx, AV_LOG_ERROR, "Invalid image width.\n"); + if (!width || width > s->screen_width) { + av_log(s->avctx, AV_LOG_WARNING, "Invalid image width: %d, truncating.\n", width); + width = s->screen_width; + } + if (left >= s->screen_width) { + av_log(s->avctx, AV_LOG_ERROR, "Invalid left position: %d.\n", left); return AVERROR_INVALIDDATA; } - if (!height || height > s->screen_height || top >= s->screen_height) { - av_log(s->avctx, AV_LOG_ERROR, "Invalid image height.\n"); + if (!height || height > s->screen_height) { + av_log(s->avctx, AV_LOG_WARNING, "Invalid image height: %d, truncating.\n", height); + height = s->screen_height; + } + if (top >= s->screen_height) { + av_log(s->avctx, AV_LOG_ERROR, "Invalid top position: %d.\n", top); return AVERROR_INVALIDDATA; } if (left + width > s->screen_width) { @@ -451,6 +459,8 @@ static av_cold int gif_decode_init(AVCodecContext *avctx) if (!s->frame) return AVERROR(ENOMEM); ff_lzw_decode_open(&s->lzw); + if (!s->lzw) + return AVERROR(ENOMEM); return 0; } @@ -462,11 +472,6 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, A bytestream2_init(&s->gb, avpkt->data, avpkt->size); s->frame->pts = avpkt->pts; -#if FF_API_PKT_PTS -FF_DISABLE_DEPRECATION_WARNINGS - s->frame->pkt_pts = avpkt->pts; -FF_ENABLE_DEPRECATION_WARNINGS -#endif s->frame->pkt_dts = avpkt->dts; s->frame->pkt_duration = avpkt->duration; @@ -503,7 +508,7 @@ FF_ENABLE_DEPRECATION_WARNINGS return AVERROR_INVALIDDATA; } - if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) + if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0) return ret; s->frame->pict_type = AV_PICTURE_TYPE_P; @@ -549,7 +554,7 @@ static const AVClass decoder_class = { .category = AV_CLASS_CATEGORY_DECODER, }; -AVCodec ff_gif_decoder = { +const AVCodec ff_gif_decoder = { .name = "gif", .long_name = NULL_IF_CONFIG_SMALL("GIF (Graphics Interchange Format)"), .type = AVMEDIA_TYPE_VIDEO, @@ -559,5 +564,7 @@ AVCodec ff_gif_decoder = { .close = gif_decode_close, .decode = gif_decode_frame, .capabilities = AV_CODEC_CAP_DR1, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, .priv_class = &decoder_class, };