Commit 3a3f5e24a9 for ffmpeg
commit 3a3f5e24a95b744d237d0cb01dccb647e44b9457
Author: Ramiro Polla <ramiro.polla@gmail.com>
Date: Wed Oct 28 14:58:12 2026 +0100
avformat/webp_anim_dec: skip rereading of metadata after seek or looping
This prevents spurious warnings (even when looping) and an error when
AV_EF_EXPLODE is set.
diff --git a/libavformat/webp_anim_dec.c b/libavformat/webp_anim_dec.c
index 6cd90b3315..81c575c3d0 100644
--- a/libavformat/webp_anim_dec.c
+++ b/libavformat/webp_anim_dec.c
@@ -65,9 +65,10 @@ typedef struct WebPAnimDemuxContext {
int vp8x_flags;
int has_iccp;
- int has_exif;
int has_anim;
- int has_xmp;
+
+ int64_t exif_offset;
+ int64_t xmp_offset;
int usebgcolor;
} WebPAnimDemuxContext;
@@ -280,7 +281,9 @@ static int webp_anim_read_packet(AVFormatContext *s, AVPacket *pkt)
pkt->duration = FFMIN(duration, ctx->max_delay);
return ret;
case MKTAG('E', 'X', 'I', 'F'):
- if (ctx->has_exif) {
+ if (offset == ctx->exif_offset) {
+ avio_skip(pb, size);
+ } else if (ctx->exif_offset) {
av_log(s, loglevel, "Extra EXIF chunk found\n");
if (explode)
return AVERROR_INVALIDDATA;
@@ -304,11 +307,13 @@ static int webp_anim_read_packet(AVFormatContext *s, AVPacket *pkt)
av_packet_side_data_remove(st->codecpar->coded_side_data, &st->codecpar->nb_coded_side_data, AV_PKT_DATA_EXIF);
return ret;
}
- ctx->has_exif = 1;
+ ctx->exif_offset = offset;
}
break;
case MKTAG('X', 'M', 'P', ' '):
- if (ctx->has_xmp) {
+ if (offset == ctx->xmp_offset) {
+ avio_skip(pb, size);
+ } else if (ctx->xmp_offset) {
av_log(s, loglevel, "Extra XMP chunk found\n");
if (explode)
return AVERROR_INVALIDDATA;
@@ -331,7 +336,7 @@ static int webp_anim_read_packet(AVFormatContext *s, AVPacket *pkt)
}
xmp[size] = '\0';
av_dict_set(&s->metadata, "xmp", xmp, AV_DICT_DONT_STRDUP_VAL);
- ctx->has_xmp = 1;
+ ctx->xmp_offset = offset;
}
break;
default: