summaryrefslogtreecommitdiff
path: root/libavcodec/pngdec.c
diff options
context:
space:
mode:
authorBenoit Fouet <benoit.fouet@free.fr>2014-11-14 10:17:34 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-11-14 16:17:00 +0100
commit4f313a50ee786fdcf01d094b3d0455906aaa4aa3 (patch)
treef922c921f1a008a329eeadddfff3781b6078b530 /libavcodec/pngdec.c
parentb35fa041521cf2b183e94697d57584c63c64dc3f (diff)
avcodec/pngdec: create a function to decode PLTE chunk.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/pngdec.c')
-rw-r--r--libavcodec/pngdec.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 8199bd8236..9b5d5dd574 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -671,6 +671,29 @@ static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s,
return 0;
}
+static int decode_plte_chunk(AVCodecContext *avctx, PNGDecContext *s,
+ uint32_t length)
+{
+ int n, i, r, g, b;
+
+ if ((length % 3) != 0 || length > 256 * 3)
+ return AVERROR_INVALIDDATA;
+ /* read the palette */
+ n = length / 3;
+ for (i = 0; i < n; i++) {
+ r = bytestream2_get_byte(&s->gb);
+ g = bytestream2_get_byte(&s->gb);
+ b = bytestream2_get_byte(&s->gb);
+ s->palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | b;
+ }
+ for (; i < 256; i++)
+ s->palette[i] = (0xFFU << 24);
+ s->state |= PNG_PLTE;
+ bytestream2_skip(&s->gb, 4); /* crc */
+
+ return 0;
+}
+
static int decode_frame_png(AVCodecContext *avctx,
void *data, int *got_frame,
AVPacket *avpkt)
@@ -744,24 +767,8 @@ static int decode_frame_png(AVCodecContext *avctx,
goto fail;
break;
case MKTAG('P', 'L', 'T', 'E'):
- {
- int n, i, r, g, b;
-
- if ((length % 3) != 0 || length > 256 * 3)
+ if (decode_plte_chunk(avctx, s, length) < 0)
goto skip_tag;
- /* read the palette */
- n = length / 3;
- for (i = 0; i < n; i++) {
- r = bytestream2_get_byte(&s->gb);
- g = bytestream2_get_byte(&s->gb);
- b = bytestream2_get_byte(&s->gb);
- s->palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | b;
- }
- for (; i < 256; i++)
- s->palette[i] = (0xFFU << 24);
- s->state |= PNG_PLTE;
- bytestream2_skip(&s->gb, 4); /* crc */
- }
break;
case MKTAG('t', 'R', 'N', 'S'):
{