avcodec/pngdec: do not blend on transparent black
authorBenoit Fouet <benoit.fouet@free.fr>
Fri, 28 Nov 2014 09:43:01 +0000 (10:43 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 28 Nov 2014 14:51:23 +0000 (15:51 +0100)
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 <michaelni@gmx.at>
libavcodec/pngdec.c

index 4c9d32107e21a3a104c462d826f1af961ba720d0..da852c4100fa375980933088113ffcc8e21c9c49 100644 (file)
@@ -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) {