avcodec/apng: Add blending support for non-alpha pixel formats
Signed-off-by: Donny Yang <work@kota.moe> Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
ed09bb3782
commit
0ab1c46fe0
@ -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,
|
|||||||
}
|
}
|
||||||
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,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user