From aff50ae1d176edacf7ff3fb24db9d25ebe9a4b2e Mon Sep 17 00:00:00 2001 From: Benoit Fouet Date: Fri, 28 Nov 2014 10:43:01 +0100 Subject: [PATCH] avcodec/pngdec: do not blend on transparent black There is no need to memset the zlib output buffer, as there is no blending happening there. Instead, do not blend when the dispose operation is set to 'background' (tranparent black). Signed-off-by: Michael Niedermayer --- libavcodec/pngdec.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 4c9d32107e..da852c4100 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -674,10 +674,6 @@ static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s, s->crow_buf = s->buffer + 15; s->zstream.avail_out = s->crow_size; s->zstream.next_out = s->crow_buf; - - if (avctx->codec_id == AV_CODEC_ID_APNG && - s->dispose_op == APNG_DISPOSE_OP_BACKGROUND) - memset(s->zstream.next_out, 0, s->zstream.avail_out); } s->state |= PNG_IDAT; if ((ret = png_decode_idat(s, length)) < 0) @@ -887,7 +883,7 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s, pd_last += s->image_linesize; } - if (s->blend_op == APNG_BLEND_OP_OVER) { + if (s->dispose_op != APNG_DISPOSE_OP_BACKGROUND && s->blend_op == APNG_BLEND_OP_OVER) { uint8_t ri, gi, bi, ai; if (avctx->pix_fmt == AV_PIX_FMT_RGBA) {