avcodec/pngdec: create a function to decode tRNS chunk.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
pull/96/head
Benoit Fouet 10 years ago committed by Michael Niedermayer
parent 4f313a50ee
commit 6499e63f7b
  1. 33
      libavcodec/pngdec.c

@ -694,6 +694,25 @@ static int decode_plte_chunk(AVCodecContext *avctx, PNGDecContext *s,
return 0; 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, static int decode_frame_png(AVCodecContext *avctx,
void *data, int *got_frame, void *data, int *got_frame,
AVPacket *avpkt) AVPacket *avpkt)
@ -771,20 +790,8 @@ static int decode_frame_png(AVCodecContext *avctx,
goto skip_tag; goto skip_tag;
break; break;
case MKTAG('t', 'R', 'N', 'S'): case MKTAG('t', 'R', 'N', 'S'):
{ if (decode_trns_chunk(avctx, s, length) < 0)
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))
goto skip_tag; 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; break;
case MKTAG('t', 'E', 'X', 't'): case MKTAG('t', 'E', 'X', 't'):
if (decode_text_chunk(s, length, 0, &metadata) < 0) if (decode_text_chunk(s, length, 0, &metadata) < 0)

Loading…
Cancel
Save