|
|
|
@ -50,6 +50,7 @@ typedef struct GifState { |
|
|
|
|
/* intermediate buffer for storing color indices
|
|
|
|
|
* obtained from lzw-encoded data stream */ |
|
|
|
|
uint8_t *idx_line; |
|
|
|
|
int idx_line_size; |
|
|
|
|
|
|
|
|
|
/* after the frame is displayed, the disposal method is used */ |
|
|
|
|
int gce_prev_disposal; |
|
|
|
@ -60,6 +61,7 @@ typedef struct GifState { |
|
|
|
|
* drawn on the canvas or background color that |
|
|
|
|
* should be used upon disposal */ |
|
|
|
|
uint32_t * stored_img; |
|
|
|
|
int stored_img_size; |
|
|
|
|
int stored_bg_color; |
|
|
|
|
|
|
|
|
|
/* LZW compatible decoder */ |
|
|
|
@ -205,12 +207,9 @@ static int gif_read_image(GifState *s) |
|
|
|
|
else |
|
|
|
|
s->stored_bg_color = s->bg_color; |
|
|
|
|
} 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, |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
|
|