From patchwork Wed Dec 12 16:32:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 11386 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id EBAED44DF29 for ; Wed, 12 Dec 2018 18:38:33 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3BFD568A7C1; Wed, 12 Dec 2018 18:38:24 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9404468A76B for ; Wed, 12 Dec 2018 18:38:17 +0200 (EET) Received: by mail-wm1-f68.google.com with SMTP id y139so6398059wmc.5 for ; Wed, 12 Dec 2018 08:38:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=uAs7Vt40fhv9afvGjEfhuUjF4ZgioEeWGp7j2zi2MnQ=; b=O6JyjPsfJWnrRP0JmSBSt68o5HpnqHHibiYfJCmWc5I4ueirjYrRL7bydbrZCoE+e4 iYF30QyKwuEIlkJWO3VX2NHQ89FTDPOOreMBVVQ2vb/RDH2oaFkBiN4hji1HpGq5/l/0 JwpsP4/k58NHZJPS/Z2ks0BSE+oaKtStPF6X8wsiczFMsoGGWL4NlStJsNeqKR3kgZQP LvHapyJAuvPdpyc9EjuZBqB4rtZAU9lVCjZBoPRmlXnriF8kSZW4XFwJYTUvl23TKZUQ px9Sy3He8oliYhwCiJNkYE1l/5OsmLxBjUxNjI61GBVEA11WrihwQBcaf8XDDIcJmjhJ 89xQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=uAs7Vt40fhv9afvGjEfhuUjF4ZgioEeWGp7j2zi2MnQ=; b=Ced5mDqMkVneW5BKSMS+bX6p1epIzGh/hBsIOrQU2VrP2RVFKZEbuavojf9XKAmxBf FyHdwuKxfhliC7ykAzN2TnKnrZMXI7lVETMJNlxs53MY8/dST+z1vChx4eOOhFlaKHTa gve0YcLRiz8zfAJCpIr3Z/e3n+Z8cn/pcSlkqZcG0UAdiN/Cgh8OtdPgc2wlgHGEVpcS Ht+v9uV2kF4p8uEpsscBO/Vlwi0Itn+v0bxwLNDnIcl0MqrzJKYQ1cJeSb3c1xNu5ejM IFJGEtupjOvbTWBMs3wSY5kfaMNh4H9RsNQFYT5ZnA0gPuWe1Td8rfEEArKqwmeb1j8t +Rpg== X-Gm-Message-State: AA+aEWbMyUWMfSaMiupqwx2Z/Pn458v093NkU267FGUfgXWCbBEnUSNC 5uUnmB5tznk7RajshXKO+NUODt2U X-Google-Smtp-Source: AFSGD/Xrs/a/Vqp7BToFJjPd8PBpTaEUcmH2oQ/69ItJnqS7jykUNtjJ4NvueGPDu5GV/gFP1ajm6A== X-Received: by 2002:a1c:6a09:: with SMTP id f9mr7300177wmc.150.1544632393221; Wed, 12 Dec 2018 08:33:13 -0800 (PST) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id g129sm3165446wmf.39.2018.12.12.08.33.12 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Dec 2018 08:33:12 -0800 (PST) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Wed, 12 Dec 2018 17:32:55 +0100 Message-Id: <20181212163257.9109-4-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181212163257.9109-1-onemda@gmail.com> References: <20181212163257.9109-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 4/6] avcodec/gif: enable encoding single gif image per frame X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Unbreaks gif image2 muxer. Signed-off-by: Paul B Mahol --- libavcodec/gif.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) 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 } };