Commit 0ab1c46f authored by Donny Yang's avatar Donny Yang Committed by Michael Niedermayer

avcodec/apng: Add blending support for non-alpha pixel formats

Signed-off-by: 's avatarDonny Yang <work@kota.moe>
Reviewed-by: 's avatarPaul B Mahol <onemda@gmail.com>
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent ed09bb37
...@@ -58,6 +58,7 @@ typedef struct PNGDecContext { ...@@ -58,6 +58,7 @@ typedef struct PNGDecContext {
int channels; int channels;
int bits_per_pixel; int bits_per_pixel;
int bpp; int bpp;
int has_trns;
uint8_t *image_buf; uint8_t *image_buf;
int image_linesize; int image_linesize;
...@@ -732,6 +733,8 @@ static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s, ...@@ -732,6 +733,8 @@ static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s,
} }
bytestream2_skip(&s->gb, 4); /* crc */ bytestream2_skip(&s->gb, 4); /* crc */
s->has_trns = 1;
return 0; return 0;
} }
...@@ -848,6 +851,18 @@ static int decode_fctl_chunk(AVCodecContext *avctx, PNGDecContext *s, ...@@ -848,6 +851,18 @@ static int decode_fctl_chunk(AVCodecContext *avctx, PNGDecContext *s,
s->dispose_op = APNG_DISPOSE_OP_BACKGROUND; s->dispose_op = APNG_DISPOSE_OP_BACKGROUND;
} }
if (s->dispose_op == APNG_BLEND_OP_OVER && !s->has_trns && (
avctx->pix_fmt == AV_PIX_FMT_RGB24 ||
avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
avctx->pix_fmt == AV_PIX_FMT_PAL8 ||
avctx->pix_fmt == AV_PIX_FMT_GRAY8 ||
avctx->pix_fmt == AV_PIX_FMT_GRAY16BE ||
avctx->pix_fmt == AV_PIX_FMT_MONOBLACK
)) {
// APNG_DISPOSE_OP_OVER is the same as APNG_DISPOSE_OP_SOURCE when there is no alpha channel
s->dispose_op = APNG_BLEND_OP_SOURCE;
}
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment