| @@ -50,6 +50,7 @@ typedef struct GifState { | |||||
| /* intermediate buffer for storing color indices | /* intermediate buffer for storing color indices | ||||
| * obtained from lzw-encoded data stream */ | * obtained from lzw-encoded data stream */ | ||||
| uint8_t *idx_line; | uint8_t *idx_line; | ||||
| int idx_line_size; | |||||
| /* after the frame is displayed, the disposal method is used */ | /* after the frame is displayed, the disposal method is used */ | ||||
| int gce_prev_disposal; | int gce_prev_disposal; | ||||
| @@ -60,6 +61,7 @@ typedef struct GifState { | |||||
| * drawn on the canvas or background color that | * drawn on the canvas or background color that | ||||
| * should be used upon disposal */ | * should be used upon disposal */ | ||||
| uint32_t * stored_img; | uint32_t * stored_img; | ||||
| int stored_img_size; | |||||
| int stored_bg_color; | int stored_bg_color; | ||||
| /* LZW compatible decoder */ | /* LZW compatible decoder */ | ||||
| @@ -205,12 +207,9 @@ static int gif_read_image(GifState *s) | |||||
| else | else | ||||
| s->stored_bg_color = s->bg_color; | s->stored_bg_color = s->bg_color; | ||||
| } else if (s->gce_disposal == GCE_DISPOSAL_RESTORE) { | } else if (s->gce_disposal == GCE_DISPOSAL_RESTORE) { | ||||
| if (!s->stored_img) { | |||||
| s->stored_img = av_malloc(s->picture.linesize[0] * s->picture.height); | |||||
| if (!s->stored_img) | |||||
| return AVERROR(ENOMEM); | |||||
| } | |||||
| av_fast_malloc(&s->stored_img, &s->stored_img_size, s->picture.linesize[0] * s->picture.height); | |||||
| if (!s->stored_img) | |||||
| return AVERROR(ENOMEM); | |||||
| gif_copy_img_rect((uint32_t *)s->picture.data[0], s->stored_img, | gif_copy_img_rect((uint32_t *)s->picture.data[0], s->stored_img, | ||||
| s->picture.linesize[0] / sizeof(uint32_t), left, top, width, height); | s->picture.linesize[0] / sizeof(uint32_t), left, top, width, height); | ||||
| @@ -379,7 +378,7 @@ static int gif_read_header1(GifState *s) | |||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| } | } | ||||
| s->idx_line = av_malloc(s->screen_width); | |||||
| av_fast_malloc(&s->idx_line, &s->idx_line_size, s->screen_width); | |||||
| if (!s->idx_line) | if (!s->idx_line) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||