Mercurial > mplayer.hg
annotate libmpdemux/demux_gif.c @ 29269:4d9de809b174
Add a hack to detect when we are writing into a Windows pipe since the fseek
incorrectly does not fail like it should.
This ensures we will not incorrectly append the file header at the end.
Based on patch by Zhou Zongyi [zhouzongyi at pset.suntec.net]
author | reimar |
---|---|
date | Sat, 16 May 2009 13:59:53 +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 }; |