diff mbox

[FFmpeg-devel,4/6] avcodec/gif: enable encoding single gif image per frame

Message ID 20181212163257.9109-4-onemda@gmail.com
State Accepted
Commit bb0984cc29e93e56506722fe0ce5c6d43b6d4326
Headers show

Commit Message

Paul B Mahol Dec. 12, 2018, 4:32 p.m. UTC
Unbreaks gif image2 muxer.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 libavcodec/gif.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

Comments

Carl Eugen Hoyos Dec. 12, 2018, 6:09 p.m. UTC | #1
2018-12-12 17:32 GMT+01:00, Paul B Mahol <onemda@gmail.com>:
> Unbreaks gif image2 muxer.

If you commit the patches together I believe this one needs
a micro version bump, alternative is to add it to some of the
commits.

Thank you!

Carl Eugen
diff mbox

Patch

diff --git a/libavcodec/gif.c b/libavcodec/gif.c
index c158ae3180..19c0f1b318 100644
--- a/libavcodec/gif.c
+++ b/libavcodec/gif.c
@@ -51,6 +51,7 @@  typedef struct GIFContext {
     int is_first_frame;
     AVFrame *last_frame;
     int flags;
+    int image;
     uint32_t palette[AVPALETTE_COUNT];  ///< local reference palette for !pal8
     int palette_loaded;
     int transparent_index;
@@ -422,6 +423,9 @@  static int gif_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     outbuf_ptr = pkt->data;
     end        = pkt->data + pkt->size;
 
+    if (s->image)
+        s->is_first_frame = 1;
+
     if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
         palette = (uint32_t*)pict->data[1];
 
@@ -436,19 +440,22 @@  static int gif_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 
     gif_image_write_image(avctx, &outbuf_ptr, end, palette,
                           pict->data[0], pict->linesize[0], pkt);
-    if (!s->last_frame) {
+    if (!s->last_frame && !s->image) {
         s->last_frame = av_frame_alloc();
         if (!s->last_frame)
             return AVERROR(ENOMEM);
     }
 
-    av_frame_unref(s->last_frame);
-    ret = av_frame_ref(s->last_frame, (AVFrame*)pict);
-    if (ret < 0)
-        return ret;
+    if (!s->image) {
+        av_frame_unref(s->last_frame);
+        ret = av_frame_ref(s->last_frame, (AVFrame*)pict);
+        if (ret < 0)
+            return ret;
+    }
 
     pkt->size   = outbuf_ptr - pkt->data;
-    pkt->flags |= AV_PKT_FLAG_KEY;
+    if (s->is_first_frame)
+        pkt->flags |= AV_PKT_FLAG_KEY;
     *got_packet = 1;
 
     return 0;
@@ -472,6 +479,7 @@  static const AVOption gif_options[] = {
     { "gifflags", "set GIF flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = GF_OFFSETTING|GF_TRANSDIFF}, 0, INT_MAX, FLAGS, "flags" },
         { "offsetting", "enable picture offsetting", 0, AV_OPT_TYPE_CONST, {.i64=GF_OFFSETTING}, INT_MIN, INT_MAX, FLAGS, "flags" },
         { "transdiff", "enable transparency detection between frames", 0, AV_OPT_TYPE_CONST, {.i64=GF_TRANSDIFF}, INT_MIN, INT_MAX, FLAGS, "flags" },
+    { "gifimage", "enable encoding only images per frame", OFFSET(image), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "flags" },
     { NULL }
 };