[FFmpeg-devel] [PATCH v3 3/4] avformat/webpenc: better detection of anim chunks

Martin Reboredo yakoyoku at gmail.com
Sun Sep 12 23:20:09 EEST 2021


Receiving RIFF chunks as `av_packet`s from `webpdec.c` in `webpenc.c` it wasn't doing proper animated frame detection/enumeration.
Check for `ANIM`/`ANMF` chunks to see if the package is an animated WebP packet and for the `ANMF`/`ALPH`/`VP8 `/`VP8L` chunks if it's an actual frame.

Signed-off-by: Martin Reboredo <yakoyoku at gmail.com>
---
 libavformat/webpenc.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/libavformat/webpenc.c b/libavformat/webpenc.c
index 9599fe7b85..50bee91910 100644
--- a/libavformat/webpenc.c
+++ b/libavformat/webpenc.c
@@ -55,13 +55,18 @@ static int is_animated_webp_packet(AVPacket *pkt)
 {
     int skip = 0;
     unsigned flags = 0;
+    int fourcc = AV_RL32(pkt->data);
 
     if (pkt->size < 4)
         return AVERROR_INVALIDDATA;
-    if (AV_RL32(pkt->data) == AV_RL32("RIFF"))
+    if (fourcc == AV_RL32("RIFF"))
         skip = 12;
+    else if (fourcc == AV_RL32("ANIM"))
+        return 1;
+    else if (fourcc == AV_RL32("ANMF"))
+        return 1;
     // Safe to do this as a valid WebP bitstream is >=30 bytes.
-    if (pkt->size < skip + 4)
+    if (pkt->size < skip + 4 && pkt->size != 12)
         return AVERROR_INVALIDDATA;
     if (AV_RL32(pkt->data + skip) == AV_RL32("VP8X")) {
         flags |= pkt->data[skip + 4 + 4];
@@ -143,6 +148,7 @@ static int flush(AVFormatContext *s, int trailer, int64_t pts)
 static int webp_write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     WebpContext *w = s->priv_data;
+    int fourcc = AV_RL32(pkt->data);
     int ret;
 
     if (!pkt->size)
@@ -161,7 +167,9 @@ static int webp_write_packet(AVFormatContext *s, AVPacket *pkt)
             return ret;
         av_packet_ref(&w->last_pkt, pkt);
     }
-    ++w->frame_count;
+    if (fourcc == AV_RL32("ANMF") || fourcc == AV_RL32("ALPH") ||
+        fourcc == AV_RL32("VP8 ") || fourcc == AV_RL32("VP8L"))
+        ++w->frame_count;
 
     return 0;
 }
-- 
2.32.0



More information about the ffmpeg-devel mailing list