[FFmpeg-cvslog] avcodec/pngdec: do not blend on transparent black

Benoit Fouet git at videolan.org
Fri Nov 28 16:26:55 CET 2014


ffmpeg | branch: master | Benoit Fouet <benoit.fouet at free.fr> | Fri Nov 28 10:43:01 2014 +0100| [aff50ae1d176edacf7ff3fb24db9d25ebe9a4b2e] | committer: Michael Niedermayer

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 <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=aff50ae1d176edacf7ff3fb24db9d25ebe9a4b2e
---

 libavcodec/pngdec.c |    6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 4c9d321..da852c4 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) {



More information about the ffmpeg-cvslog mailing list