[FFmpeg-devel] [PATCH v2 7/7] Gif decoder code tidy.
Vitaliy E Sugrobov
vsugrob at hotmail.com
Fri Nov 30 09:58:58 CET 2012
This concludes patch series related to animated gif demuxer/decoder.
Signed-off-by: Vitaliy E Sugrobov <vsugrob at hotmail.com>
---
libavcodec/gifdec.c | 49 ++++++++++++++++++++++++++++++-------------------
1 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/libavcodec/gifdec.c b/libavcodec/gifdec.c
index f46e669..aee90c6 100755
--- a/libavcodec/gifdec.c
+++ b/libavcodec/gifdec.c
@@ -2,6 +2,7 @@
* GIF decoder
* Copyright (c) 2003 Fabrice Bellard
* Copyright (c) 2006 Baptiste Coudurier
+ * Copyright (c) 2012 Vitaliy E Sugrobov
*
* This file is part of FFmpeg.
*
@@ -46,7 +47,7 @@ typedef struct GifState {
int background_color_index;
int transparent_color_index;
int color_resolution;
- /* intermediate buffer for storing color indices
+ /** intermediate buffer for storing color indices
* obtained from lzw-encoded data stream */
uint8_t *idx_line;
@@ -130,24 +131,25 @@ static void gif_copy_img_rect(const uint32_t *src, uint32_t *dst,
static int gif_read_image(GifState *s)
{
- int left, top, width, height, bits_per_pixel, code_size, flags;
- int is_interleaved, has_local_palette, y, pass, y1, linesize, pal_size;
+ int left, top, width, height,
+ bits_per_pixel, code_size, flags,
+ is_interleaved, has_local_palette,
+ y, pass, y1, linesize, pal_size, ret;
uint32_t *ptr, *pal, *px, *pr, *ptr1;
- int ret;
uint8_t *idx;
/* At least 9 bytes of Image Descriptor. */
if (s->bytestream_end < s->bytestream + 9)
return AVERROR_INVALIDDATA;
- left = bytestream_get_le16(&s->bytestream);
- top = bytestream_get_le16(&s->bytestream);
- width = bytestream_get_le16(&s->bytestream);
+ left = bytestream_get_le16(&s->bytestream);
+ top = bytestream_get_le16(&s->bytestream);
+ width = bytestream_get_le16(&s->bytestream);
height = bytestream_get_le16(&s->bytestream);
- flags = bytestream_get_byte(&s->bytestream);
- is_interleaved = flags & 0x40;
+ flags = bytestream_get_byte(&s->bytestream);
+ is_interleaved = flags & 0x40;
has_local_palette = flags & 0x80;
- bits_per_pixel = (flags & 0x07) + 1;
+ bits_per_pixel = (flags & 0x07) + 1;
av_dlog(s->avctx, "image x=%d y=%d w=%d h=%d\n", left, top, width, height);
@@ -234,6 +236,7 @@ static int gif_read_image(GifState *s)
ptr = ptr1;
pass = 0;
y1 = 0;
+
for (y = 0; y < height; y++) {
if (ff_lzw_decode(s->lzw, s->idx_line, width) == 0)
goto decode_tail;
@@ -292,7 +295,8 @@ static int gif_read_image(GifState *s)
static int gif_read_extension(GifState *s)
{
- int ext_code, ext_len, i, gce_flags, gce_transparent_index;
+ int ext_code, ext_len, i,
+ gce_flags, gce_transparent_index;
/* There must be at least 2 bytes:
* 1 for extension label and 1 for extension length. */
@@ -318,12 +322,13 @@ static int gif_read_extension(GifState *s)
gce_flags = bytestream_get_byte(&s->bytestream);
bytestream_get_le16(&s->bytestream); // delay during which the frame is shown
gce_transparent_index = bytestream_get_byte(&s->bytestream);
+
if (gce_flags & 0x01)
s->transparent_color_index = gce_transparent_index;
else
s->transparent_color_index = -1;
- s->gce_disposal = (gce_flags >> 2) & 0x7;
+ s->gce_disposal = (gce_flags >> 2) & 0x7;
av_dlog(s->avctx, "gce_flags=%x tcolor=%d disposal=%d\n",
gce_flags,
s->transparent_color_index, s->gce_disposal);
@@ -350,14 +355,14 @@ static int gif_read_extension(GifState *s)
av_dlog(s->avctx, "ext_len1=%d\n", ext_len);
}
+
return 0;
}
static int gif_read_header1(GifState *s)
{
uint8_t sig[6];
- int v, n;
- int background_color_index;
+ int v, n, background_color_index;
if (s->bytestream_end < s->bytestream + 13)
return AVERROR_INVALIDDATA;
@@ -372,8 +377,9 @@ static int gif_read_header1(GifState *s)
s->transparent_color_index = -1;
s->screen_width = bytestream_get_le16(&s->bytestream);
s->screen_height = bytestream_get_le16(&s->bytestream);
- if( (unsigned)s->screen_width > 32767
- || (unsigned)s->screen_height > 32767){
+
+ if ((unsigned)s->screen_width > 32767 ||
+ (unsigned)s->screen_height > 32767) {
av_log(s->avctx, AV_LOG_ERROR, "picture size too large\n");
return AVERROR_INVALIDDATA;
}
@@ -411,6 +417,7 @@ static int gif_parse_next_image(GifState *s, int *got_picture)
{
int ret;
*got_picture = sizeof(AVPicture);
+
while (s->bytestream < s->bytestream_end) {
int code = bytestream_get_byte(&s->bytestream);
@@ -432,6 +439,7 @@ static int gif_parse_next_image(GifState *s, int *got_picture)
return AVERROR_INVALIDDATA;
}
}
+
return AVERROR_EOF;
}
@@ -440,12 +448,12 @@ static av_cold int gif_decode_init(AVCodecContext *avctx)
GifState *s = avctx->priv_data;
s->avctx = avctx;
-
avctx->pix_fmt = AV_PIX_FMT_RGB32;
avcodec_get_frame_defaults(&s->picture);
- avctx->coded_frame= &s->picture;
+ avctx->coded_frame = &s->picture;
s->picture.data[0] = NULL;
ff_lzw_decode_open(&s->lzw);
+
return 0;
}
@@ -477,6 +485,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_picture,
if ((ret = av_image_check_size(s->screen_width, s->screen_height, 0, avctx)) < 0)
return ret;
+
avcodec_set_dimensions(avctx, s->screen_width, s->screen_height);
if (s->picture.data[0])
@@ -500,6 +509,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_picture,
}
ret = gif_parse_next_image(s, got_picture);
+
if (ret < 0)
return ret;
else if (*got_picture)
@@ -513,7 +523,8 @@ static av_cold int gif_decode_close(AVCodecContext *avctx)
GifState *s = avctx->priv_data;
ff_lzw_decode_close(&s->lzw);
- if(s->picture.data[0])
+
+ if (s->picture.data[0])
avctx->release_buffer(avctx, &s->picture);
av_freep(&s->idx_line);
--
1.7.2.5
More information about the ffmpeg-devel
mailing list