Mercurial > mplayer.hg
annotate libmpdemux/demux_gif.c @ 30490:c1d375bca9e1
Support GEOV video codec: Hangs on exit
author | cehoyos |
---|---|
date | Thu, 11 Feb 2010 01:12:37 +0000 |
parents | 0f1b5b68af32 |
children | 98dc6ae7ede2 |
rev | line source |
---|---|
9133 | 1 /* |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
2 * GIF file parser |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
3 * Copyright (C) 2003 Joey Parrish |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
4 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
5 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
6 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
7 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
10 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
11 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
12 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
15 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
16 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27385
diff
changeset
|
20 */ |
9133 | 21 |
22 #include <stdio.h> | |
23 #include <stdlib.h> | |
24 #include <unistd.h> | |
25 | |
26 #include "config.h" | |
27 | |
28 #include "mp_msg.h" | |
29 #include "help_mp.h" | |
30 | |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22377
diff
changeset
|
31 #include "stream/stream.h" |
9133 | 32 #include "demuxer.h" |
33 #include "stheader.h" | |
34 | |
35 #include <gif_lib.h> | |
21885 | 36 #include "libvo/fastmemcpy.h" |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
37 typedef struct { |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
38 int current_pts; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
39 unsigned char *palette; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
40 GifFileType *gif; |
21882
68ebac1f2b8d
Fix crash for gif images that have Top or Left set
reimar
parents:
21881
diff
changeset
|
41 int w, h; |
21891 | 42 int useref; |
21921 | 43 uint8_t *refimg; |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
44 } gif_priv_t; |
9133 | 45 |
46 #define GIF_SIGNATURE (('G' << 16) | ('I' << 8) | 'F') | |
47 | |
27385
2113bd9c6bd9
Rename preprocessor directives related to image libraries.
diego
parents:
25707
diff
changeset
|
48 #ifndef CONFIG_GIF_TVT_HACK |
9463
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
49 // not supported by certain versions of the library |
9344
bd7b5078475e
1) codecs.conf changed recently and demux_gif no longer needs to spit
arpi
parents:
9133
diff
changeset
|
50 int my_read_gif(GifFileType *gif, uint8_t *buf, int len) { |
bd7b5078475e
1) codecs.conf changed recently and demux_gif no longer needs to spit
arpi
parents:
9133
diff
changeset
|
51 return stream_read(gif->UserData, buf, len); |
bd7b5078475e
1) codecs.conf changed recently and demux_gif no longer needs to spit
arpi
parents:
9133
diff
changeset
|
52 } |
9463
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
53 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
54 |
16175 | 55 static int gif_check_file(demuxer_t *demuxer) |
9133 | 56 { |
57 if (stream_read_int24(demuxer->stream) == GIF_SIGNATURE) | |
16175 | 58 return DEMUXER_TYPE_GIF; |
9133 | 59 return 0; |
60 } | |
61 | |
21920
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
62 static void memcpy_transp_pic(uint8_t *dst, uint8_t *src, int w, int h, |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
63 int dstride, int sstride, int transp, uint8_t trans_col) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
64 if (transp) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
65 dstride -= w; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
66 sstride -= w; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
67 while (h-- > 0) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
68 int wleft = w; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
69 while (wleft-- > 0) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
70 if (*src != trans_col) |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
71 *dst = *src; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
72 dst++; src++; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
73 } |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
74 dst += dstride; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
75 src += sstride; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
76 } |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
77 } else |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
78 memcpy_pic(dst, src, w, h, dstride, sstride); |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
79 } |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
80 |
16175 | 81 static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) |
9133 | 82 { |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
83 gif_priv_t *priv = demuxer->priv; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
84 GifFileType *gif = priv->gif; |
9133 | 85 GifRecordType type = UNDEFINED_RECORD_TYPE; |
86 int len = 0; | |
87 demux_packet_t *dp = NULL; | |
88 ColorMapObject *effective_map = NULL; | |
21921 | 89 uint8_t *buf = NULL; |
21891 | 90 int refmode = 0; |
21895 | 91 int transparency = 0; |
92 uint8_t transparent_col; | |
9133 | 93 |
94 while (type != IMAGE_DESC_RECORD_TYPE) { | |
95 if (DGifGetRecordType(gif, &type) == GIF_ERROR) { | |
96 PrintGifError(); | |
97 return 0; // oops | |
98 } | |
99 if (type == TERMINATE_RECORD_TYPE) | |
100 return 0; // eof | |
101 if (type == SCREEN_DESC_RECORD_TYPE) { | |
102 if (DGifGetScreenDesc(gif) == GIF_ERROR) { | |
103 PrintGifError(); | |
104 return 0; // oops | |
105 } | |
106 } | |
107 if (type == EXTENSION_RECORD_TYPE) { | |
108 int code; | |
109 unsigned char *p = NULL; | |
110 if (DGifGetExtension(gif, &code, &p) == GIF_ERROR) { | |
111 PrintGifError(); | |
112 return 0; // oops | |
113 } | |
114 if (code == 0xF9) { | |
115 int frametime = 0; | |
116 if (p[0] == 4) // is the length correct? | |
21891 | 117 { |
21895 | 118 transparency = p[1] & 1; |
21896 | 119 refmode = (p[1] >> 2) & 3; |
22020
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
120 // HACK: specification says |
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
121 // > 0 - No disposal specified. The decoder is not required to take any action. |
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
122 // but browsers treat it the same way as |
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
123 // > 1 - Do not dispose. The graphic is to be left in place. |
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
124 // Some broken files rely on this, e.g. |
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
125 // http://samples.mplayerhq.hu/GIF/broken-gif/CLAIRE.GIF |
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
126 if (refmode == 0) refmode = 1; |
21875
d81cf0be50f0
Frametime was being read from the wrong offset, compare
diego
parents:
18958
diff
changeset
|
127 frametime = (p[3] << 8) | p[2]; // set the time, centiseconds |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
128 transparent_col = p[4]; |
21891 | 129 } |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
130 priv->current_pts += frametime; |
9133 | 131 } else if ((code == 0xFE) && (verbose)) { // comment extension |
132 // print iff verbose | |
133 printf("GIF comment: "); | |
134 while (p != NULL) { | |
135 int length = p[0]; | |
136 char *comments = p + 1; | |
137 comments[length] = 0; | |
138 printf("%s", comments); | |
139 if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) { | |
140 PrintGifError(); | |
141 return 0; // oops | |
142 } | |
143 } | |
144 printf("\n"); | |
145 } | |
146 while (p != NULL) { | |
147 if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) { | |
148 PrintGifError(); | |
149 return 0; // oops | |
150 } | |
151 } | |
152 } | |
153 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
154 |
9133 | 155 if (DGifGetImageDesc(gif) == GIF_ERROR) { |
156 PrintGifError(); | |
157 return 0; // oops | |
158 } | |
159 | |
160 len = gif->Image.Width * gif->Image.Height; | |
21882
68ebac1f2b8d
Fix crash for gif images that have Top or Left set
reimar
parents:
21881
diff
changeset
|
161 dp = new_demux_packet(priv->w * priv->h); |
21890 | 162 buf = calloc(gif->Image.Width, gif->Image.Height); |
21891 | 163 if (priv->useref) |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22605
diff
changeset
|
164 fast_memcpy(dp->buffer, priv->refimg, priv->w * priv->h); |
21891 | 165 else |
166 memset(dp->buffer, gif->SBackGroundColor, priv->w * priv->h); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
167 |
9133 | 168 if (DGifGetLine(gif, buf, len) == GIF_ERROR) { |
169 PrintGifError(); | |
170 return 0; // oops | |
171 } | |
172 | |
173 effective_map = gif->Image.ColorMap; | |
174 if (effective_map == NULL) effective_map = gif->SColorMap; | |
175 | |
176 { | |
177 int y; | |
21883 | 178 int cnt = FFMIN(effective_map->ColorCount, 256); |
22377
fd54975f9135
Use libavutil's av_clip* instead of unreadable MIN/MAX chaos.
reimar
parents:
22024
diff
changeset
|
179 int l = av_clip(gif->Image.Left, 0, priv->w); |
fd54975f9135
Use libavutil's av_clip* instead of unreadable MIN/MAX chaos.
reimar
parents:
22024
diff
changeset
|
180 int t = av_clip(gif->Image.Top, 0, priv->h); |
fd54975f9135
Use libavutil's av_clip* instead of unreadable MIN/MAX chaos.
reimar
parents:
22024
diff
changeset
|
181 int w = av_clip(gif->Image.Width, 0, priv->w - l); |
fd54975f9135
Use libavutil's av_clip* instead of unreadable MIN/MAX chaos.
reimar
parents:
22024
diff
changeset
|
182 int h = av_clip(gif->Image.Height, 0, priv->h - t); |
21885 | 183 unsigned char *dest = dp->buffer + priv->w * t + l; |
9133 | 184 |
21876 | 185 // copy the palette |
21881
a10888bc9758
Fix invalid read for gifs with a palette for less than 256 colors
reimar
parents:
21880
diff
changeset
|
186 for (y = 0; y < cnt; y++) { |
21893 | 187 priv->palette[(y * 4) + 0] = effective_map->Colors[y].Blue; |
188 priv->palette[(y * 4) + 1] = effective_map->Colors[y].Green; | |
189 priv->palette[(y * 4) + 2] = effective_map->Colors[y].Red; | |
190 priv->palette[(y * 4) + 3] = 0; | |
9133 | 191 } |
192 | |
21922 | 193 if (gif->Image.Interlace) { |
194 uint8_t *s = buf; | |
22024 | 195 int ih = (h - 0 + 7) >> 3; |
196 memcpy_transp_pic(dest, s, w, ih, | |
21922 | 197 priv->w << 3, gif->Image.Width, |
198 transparency, transparent_col); | |
22024 | 199 s += ih * w; |
200 ih = (h - 4 + 7) >> 3; | |
201 memcpy_transp_pic(dest + (priv->w << 2), s, w, ih, | |
21922 | 202 priv->w << 3, gif->Image.Width, |
203 transparency, transparent_col); | |
22024 | 204 s += ih * w; |
205 ih = (h - 2 + 3) >> 2; | |
206 memcpy_transp_pic(dest + (priv->w << 1), s, w, ih, | |
21922 | 207 priv->w << 2, gif->Image.Width, |
208 transparency, transparent_col); | |
22024 | 209 s += ih * w; |
210 ih = (h - 1 + 1) >> 1; | |
211 memcpy_transp_pic(dest + priv->w, s, w, ih, | |
21922 | 212 priv->w << 1, gif->Image.Width, |
213 transparency, transparent_col); | |
214 } else | |
215 memcpy_transp_pic(dest, buf, w, h, priv->w, gif->Image.Width, | |
216 transparency, transparent_col); | |
21892 | 217 |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22605
diff
changeset
|
218 if (refmode == 1) fast_memcpy(priv->refimg, dp->buffer, priv->w * priv->h); |
21892 | 219 if (refmode == 2 && priv->useref) { |
220 dest = priv->refimg + priv->w * t + l; | |
221 memset(buf, gif->SBackGroundColor, len); | |
222 memcpy_pic(dest, buf, w, h, priv->w, gif->Image.Width); | |
223 } | |
21894 | 224 if (!(refmode & 2)) priv->useref = refmode & 1; |
9133 | 225 } |
226 | |
227 free(buf); | |
228 | |
229 demuxer->video->dpos++; | |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
230 dp->pts = ((float)priv->current_pts) / 100; |
9133 | 231 dp->pos = stream_tell(demuxer->stream); |
232 ds_add_packet(demuxer->video, dp); | |
233 | |
234 return 1; | |
235 } | |
236 | |
16175 | 237 static demuxer_t* demux_open_gif(demuxer_t* demuxer) |
9133 | 238 { |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
239 gif_priv_t *priv = calloc(1, sizeof(gif_priv_t)); |
9133 | 240 sh_video_t *sh_video = NULL; |
241 GifFileType *gif = NULL; | |
242 | |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
243 priv->current_pts = 0; |
9133 | 244 demuxer->seekable = 0; // FIXME |
245 | |
246 // go back to the beginning | |
9345 | 247 stream_seek(demuxer->stream,demuxer->stream->start_pos); |
9133 | 248 |
27385
2113bd9c6bd9
Rename preprocessor directives related to image libraries.
diego
parents:
25707
diff
changeset
|
249 #ifdef CONFIG_GIF_TVT_HACK |
9463
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
250 // without the TVT functionality of libungif, a hard seek must be |
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
251 // done to the beginning of the file. this is because libgif is |
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
252 // unable to use mplayer's cache, and without this lseek libgif will |
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
253 // not read from the beginning of the file and the command will fail. |
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
254 // with this hack enabled, you will lose the ability to stream a GIF. |
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
255 lseek(demuxer->stream->fd, 0, SEEK_SET); |
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
256 gif = DGifOpenFileHandle(demuxer->stream->fd); |
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
257 #else |
9344
bd7b5078475e
1) codecs.conf changed recently and demux_gif no longer needs to spit
arpi
parents:
9133
diff
changeset
|
258 gif = DGifOpen(demuxer->stream, my_read_gif); |
9463
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
259 #endif |
9133 | 260 if (!gif) { |
261 PrintGifError(); | |
262 return NULL; | |
263 } | |
264 | |
265 // create a new video stream header | |
266 sh_video = new_sh_video(demuxer, 0); | |
267 | |
268 // make sure the demuxer knows about the new video stream header | |
269 // (even though new_sh_video() ought to take care of it) | |
270 demuxer->video->sh = sh_video; | |
271 | |
272 // make sure that the video demuxer stream header knows about its | |
273 // parent video demuxer stream (this is getting wacky), or else | |
274 // video_read_properties() will choke | |
275 sh_video->ds = demuxer->video; | |
276 | |
277 sh_video->format = mmioFOURCC(8, 'R', 'G', 'B'); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
278 |
9133 | 279 sh_video->fps = 5.0f; |
280 sh_video->frametime = 1.0f / sh_video->fps; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
281 |
9133 | 282 sh_video->bih = malloc(sizeof(BITMAPINFOHEADER) + (256 * 4)); |
283 sh_video->bih->biCompression = sh_video->format; | |
22019
f43d02e9b58b
Set sh_video->bih->biWidth properly, fixes decoding after latest dec_video.c change
reimar
parents:
21922
diff
changeset
|
284 sh_video->bih->biWidth = priv->w = (uint16_t)gif->SWidth; |
f43d02e9b58b
Set sh_video->bih->biWidth properly, fixes decoding after latest dec_video.c change
reimar
parents:
21922
diff
changeset
|
285 sh_video->bih->biHeight = priv->h = (uint16_t)gif->SHeight; |
9133 | 286 sh_video->bih->biBitCount = 8; |
287 sh_video->bih->biPlanes = 2; | |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
288 priv->palette = (unsigned char *)(sh_video->bih + 1); |
21891 | 289 priv->refimg = malloc(priv->w * priv->h); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
290 |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
291 priv->gif = gif; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
292 demuxer->priv = priv; |
9133 | 293 |
294 return demuxer; | |
295 } | |
296 | |
16175 | 297 static void demux_close_gif(demuxer_t* demuxer) |
9133 | 298 { |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
299 gif_priv_t *priv = demuxer->priv; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
300 if (!priv) return; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
301 if (priv->gif && DGifCloseFile(priv->gif) == GIF_ERROR) |
9133 | 302 PrintGifError(); |
21891 | 303 free(priv->refimg); |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
304 free(priv); |
9133 | 305 } |
16175 | 306 |
307 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
23457
diff
changeset
|
308 const demuxer_desc_t demuxer_desc_gif = { |
16175 | 309 "GIF demuxer", |
310 "gif", | |
311 "GIF", | |
312 "Joey Parrish", | |
313 "", | |
314 DEMUXER_TYPE_GIF, | |
315 0, // unsafe autodetect | |
316 gif_check_file, | |
317 demux_gif_fill_buffer, | |
318 demux_open_gif, | |
319 demux_close_gif, | |
320 NULL, | |
321 NULL | |
322 }; |