diff options
author | Benoit Fouet <benoit.fouet@free.fr> | 2014-11-14 10:17:35 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-11-14 16:58:37 +0100 |
commit | 6499e63f7b9e73d5b6b601f25803f9244de99bf6 (patch) | |
tree | 4f870a5046a48fe208e1b9530befff8a5600af91 | |
parent | 4f313a50ee786fdcf01d094b3d0455906aaa4aa3 (diff) | |
download | ffmpeg-6499e63f7b9e73d5b6b601f25803f9244de99bf6.tar.gz |
avcodec/pngdec: create a function to decode tRNS chunk.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/pngdec.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 9b5d5dd574..92ed59d94d 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -694,6 +694,25 @@ static int decode_plte_chunk(AVCodecContext *avctx, PNGDecContext *s, return 0; } +static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s, + uint32_t length) +{ + int v, i; + + /* read the transparency. XXX: Only palette mode supported */ + if (s->color_type != PNG_COLOR_TYPE_PALETTE || + length > 256 || + !(s->state & PNG_PLTE)) + return AVERROR_INVALIDDATA; + for (i = 0; i < length; i++) { + v = bytestream2_get_byte(&s->gb); + s->palette[i] = (s->palette[i] & 0x00ffffff) | (v << 24); + } + bytestream2_skip(&s->gb, 4); /* crc */ + + return 0; +} + static int decode_frame_png(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) @@ -771,20 +790,8 @@ static int decode_frame_png(AVCodecContext *avctx, goto skip_tag; break; case MKTAG('t', 'R', 'N', 'S'): - { - int v, i; - - /* read the transparency. XXX: Only palette mode supported */ - if (s->color_type != PNG_COLOR_TYPE_PALETTE || - length > 256 || - !(s->state & PNG_PLTE)) + if (decode_trns_chunk(avctx, s, length) < 0) goto skip_tag; - for (i = 0; i < length; i++) { - v = bytestream2_get_byte(&s->gb); - s->palette[i] = (s->palette[i] & 0x00ffffff) | (v << 24); - } - bytestream2_skip(&s->gb, 4); /* crc */ - } break; case MKTAG('t', 'E', 'X', 't'): if (decode_text_chunk(s, length, 0, &metadata) < 0) |