[FFmpeg-devel] [PATCH] animated gif decoding
Baptiste Coudurier
baptiste.coudurier
Sun May 31 07:20:46 CEST 2009
Michael Niedermayer wrote:
> On Fri, May 29, 2009 at 10:29:33PM -0700, Baptiste Coudurier wrote:
>> Hi guys,
>>
>> $subject, it uses CODEC_CAP_DELAY for this.
>> Comments and suggestions welcome.
>>
>> --
>> Baptiste COUDURIER GnuPG Key Id: 0x5C1ABAAA
>> Key fingerprint 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
>> FFmpeg maintainer http://www.ffmpeg.org
>
>> gifdec.c | 64 +++++++++++++++++++++++++++++++++++++++++++++------------------
>> 1 file changed, 46 insertions(+), 18 deletions(-)
>> 62382a9c697506f29c2d2ba3781e8e3856ef8c06 animated_gif.patch
>> Index: libavcodec/gifdec.c
>> ===================================================================
>> --- libavcodec/gifdec.c (revision 18990)
>> +++ libavcodec/gifdec.c (working copy)
>> @@ -41,6 +41,9 @@
>> int color_resolution;
>> uint32_t *image_palette;
>>
>> + uint8_t *buf; ///< gif image copied
>
> gif image copY ?
>
>
>> + int buf_size;
>> +
>> /* after the frame is displayed, the disposal method is used */
>> int gce_disposal;
>> /* delay during which the frame is shown */
>> @@ -152,7 +155,7 @@
>> /* read the garbage data until end marker is found */
>> ff_lzw_decode_tail(s->lzw);
>> s->bytestream = ff_lzw_cur_ptr(s->lzw);
>> - return 0;
>> + return 1;
>> }
>>
>> static int gif_read_extension(GifState *s)
>> @@ -202,19 +205,12 @@
>>
>> static int gif_read_header1(GifState *s)
>> {
>> - uint8_t sig[6];
>> int v, n;
>> int has_global_palette;
>>
>> - if (s->bytestream_end < s->bytestream + 13)
>> + if (s->bytestream_end < s->bytestream + 7)
>> return -1;
>>
>> - /* read gif signature */
>> - bytestream_get_buffer(&s->bytestream, sig, 6);
>> - if (memcmp(sig, gif87a_sig, 6) != 0 &&
>> - memcmp(sig, gif89a_sig, 6) != 0)
>> - return -1;
>> -
>> /* read screen header */
>> s->transparent_color_index = -1;
>> s->screen_width = bytestream_get_le16(&s->bytestream);
>
>> @@ -259,8 +255,8 @@
>> if (gif_read_extension(s) < 0)
>> return -1;
>> break;
>> - case ';':
>> - /* end of image */
>> + case ';': /* end of image */
>
> cosmetic
>
>
>> + return 0;
>> default:
>> /* error or erroneous EOF */
>> return -1;
>
>> @@ -290,11 +286,32 @@
>> AVFrame *picture = data;
>> int ret;
>>
>> - s->bytestream = buf;
>> - s->bytestream_end = buf + buf_size;
>> - if (gif_read_header1(s) < 0)
>> + *data_size = 0;
>> +
>> + if (buf) {
>> + if ((int64_t)s->buf_size+buf_size >= UINT_MAX)
>> + return -1;
>
>> + s->buf = av_realloc(s->buf, s->buf_size+buf_size);
>> + if (!s->buf)
>> + return -1;
>
> memleak
>
Adressed. Updated patch attached.
--
Baptiste COUDURIER GnuPG Key Id: 0x5C1ABAAA
Key fingerprint 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
FFmpeg maintainer http://www.ffmpeg.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: animated_gif2.patch
Type: text/x-diff
Size: 3610 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090530/22633513/attachment.patch>
More information about the ffmpeg-devel
mailing list