From 250d8661abdbe2929bfef17e699adfab10a9c67c Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Sun, 25 Apr 2021 01:43:26 +0200 Subject: [PATCH] avcodec/pngenc: Avoid copying APNG data, allow user-supplied buffer The APNG encoder already uses internal buffers, so that the packet size is already known before allocating the packet; therefore one can avoid another (implicit) intermediate buffer by switching to ff_get_encode_buffer(), thereby also supporting user-supplied buffers. Reviewed-by: James Almer Signed-off-by: Andreas Rheinhardt --- libavcodec/pngenc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c index 5a376765cf..894b44197e 100644 --- a/libavcodec/pngenc.c +++ b/libavcodec/pngenc.c @@ -20,6 +20,7 @@ */ #include "avcodec.h" +#include "encode.h" #include "internal.h" #include "bytestream.h" #include "lossless_videoencdsp.h" @@ -887,12 +888,11 @@ static int encode_apng(AVCodecContext *avctx, AVPacket *pkt, if (!s->last_frame_packet) return AVERROR(ENOMEM); } else if (s->last_frame) { - ret = ff_alloc_packet2(avctx, pkt, max_packet_size, 0); + ret = ff_get_encode_buffer(avctx, pkt, s->last_frame_packet_size, 0); if (ret < 0) return ret; memcpy(pkt->data, s->last_frame_packet, s->last_frame_packet_size); - pkt->size = s->last_frame_packet_size; pkt->pts = pkt->dts = s->last_frame->pts; } @@ -1148,11 +1148,11 @@ const AVCodec ff_apng_encoder = { .long_name = NULL_IF_CONFIG_SMALL("APNG (Animated Portable Network Graphics) image"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_APNG, + .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, .priv_data_size = sizeof(PNGEncContext), .init = png_enc_init, .close = png_enc_close, .encode2 = encode_apng, - .capabilities = AV_CODEC_CAP_DELAY, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB48BE, AV_PIX_FMT_RGBA64BE,