Mercurial > mplayer.hg
annotate libmpdemux/demux_gif.c @ 34415:55ff5df09657
Port libtheora glue code to Theora 1.0 API.
patch by Giorgio Vazzana, mywing81 gmail com
author | diego |
---|---|
date | Wed, 04 Jan 2012 22:08:36 +0000 |
parents | 4558e2b7e68b |
children | 9eeba22fd78a |
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 |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29263
diff
changeset
|
50 static int my_read_gif(GifFileType *gif, uint8_t *buf, int len) |
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29263
diff
changeset
|
51 { |
9344
bd7b5078475e
1) codecs.conf changed recently and demux_gif no longer needs to spit
arpi
parents:
9133
diff
changeset
|
52 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
|
53 } |
9463
93375ee56629
gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9345
diff
changeset
|
54 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
55 |
16175 | 56 static int gif_check_file(demuxer_t *demuxer) |
9133 | 57 { |
58 if (stream_read_int24(demuxer->stream) == GIF_SIGNATURE) | |
16175 | 59 return DEMUXER_TYPE_GIF; |
9133 | 60 return 0; |
61 } | |
62 | |
21920
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
63 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
|
64 int dstride, int sstride, int transp, uint8_t trans_col) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
65 if (transp) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
66 dstride -= w; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
67 sstride -= w; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
68 while (h-- > 0) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
69 int wleft = w; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
70 while (wleft-- > 0) { |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
71 if (*src != trans_col) |
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 dst++; src++; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
74 } |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
75 dst += dstride; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
76 src += sstride; |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
77 } |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
78 } else |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
79 memcpy_pic(dst, src, w, h, dstride, sstride); |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
80 } |
65b2a9b3bd35
"Cosmetics" Introduce a memcpy function doing both transparent
reimar
parents:
21896
diff
changeset
|
81 |
16175 | 82 static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) |
9133 | 83 { |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
84 gif_priv_t *priv = demuxer->priv; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
85 GifFileType *gif = priv->gif; |
9133 | 86 GifRecordType type = UNDEFINED_RECORD_TYPE; |
87 int len = 0; | |
88 demux_packet_t *dp = NULL; | |
89 ColorMapObject *effective_map = NULL; | |
21921 | 90 uint8_t *buf = NULL; |
21891 | 91 int refmode = 0; |
21895 | 92 int transparency = 0; |
93 uint8_t transparent_col; | |
9133 | 94 |
95 while (type != IMAGE_DESC_RECORD_TYPE) { | |
96 if (DGifGetRecordType(gif, &type) == GIF_ERROR) { | |
97 PrintGifError(); | |
98 return 0; // oops | |
99 } | |
100 if (type == TERMINATE_RECORD_TYPE) | |
101 return 0; // eof | |
102 if (type == SCREEN_DESC_RECORD_TYPE) { | |
103 if (DGifGetScreenDesc(gif) == GIF_ERROR) { | |
104 PrintGifError(); | |
105 return 0; // oops | |
106 } | |
107 } | |
108 if (type == EXTENSION_RECORD_TYPE) { | |
109 int code; | |
110 unsigned char *p = NULL; | |
111 if (DGifGetExtension(gif, &code, &p) == GIF_ERROR) { | |
112 PrintGifError(); | |
113 return 0; // oops | |
114 } | |
115 if (code == 0xF9) { | |
116 int frametime = 0; | |
117 if (p[0] == 4) // is the length correct? | |
21891 | 118 { |
21895 | 119 transparency = p[1] & 1; |
21896 | 120 refmode = (p[1] >> 2) & 3; |
22020
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
121 // HACK: specification says |
a40f222a31df
Hack: use refmode == 1 instead of == 0, as browsers behave like this
reimar
parents:
22019
diff
changeset
|
122 // > 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
|
123 // 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
|
124 // > 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
|
125 // 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
|
126 // 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
|
127 if (refmode == 0) refmode = 1; |
21875
d81cf0be50f0
Frametime was being read from the wrong offset, compare
diego
parents:
18958
diff
changeset
|
128 frametime = (p[3] << 8) | p[2]; // set the time, centiseconds |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
129 transparent_col = p[4]; |
21891 | 130 } |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
131 priv->current_pts += frametime; |
9133 | 132 } else if ((code == 0xFE) && (verbose)) { // comment extension |
133 // print iff verbose | |
134 printf("GIF comment: "); | |
135 while (p != NULL) { | |
136 int length = p[0]; | |
137 char *comments = p + 1; | |
138 comments[length] = 0; | |
139 printf("%s", comments); | |
140 if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) { | |
141 PrintGifError(); | |
142 return 0; // oops | |
143 } | |
144 } | |
145 printf("\n"); | |
146 } | |
147 while (p != NULL) { | |
148 if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) { | |
149 PrintGifError(); | |
150 return 0; // oops | |
151 } | |
152 } | |
153 } | |
154 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
155 |
9133 | 156 if (DGifGetImageDesc(gif) == GIF_ERROR) { |
157 PrintGifError(); | |
158 return 0; // oops | |
159 } | |
160 | |
161 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
|
162 dp = new_demux_packet(priv->w * priv->h); |
21890 | 163 buf = calloc(gif->Image.Width, gif->Image.Height); |
21891 | 164 if (priv->useref) |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22605
diff
changeset
|
165 fast_memcpy(dp->buffer, priv->refimg, priv->w * priv->h); |
21891 | 166 else |
167 memset(dp->buffer, gif->SBackGroundColor, priv->w * priv->h); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
168 |
9133 | 169 if (DGifGetLine(gif, buf, len) == GIF_ERROR) { |
170 PrintGifError(); | |
32614 | 171 free(buf); |
9133 | 172 return 0; // oops |
173 } | |
174 | |
175 effective_map = gif->Image.ColorMap; | |
176 if (effective_map == NULL) effective_map = gif->SColorMap; | |
177 | |
178 { | |
179 int y; | |
21883 | 180 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
|
181 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
|
182 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
|
183 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
|
184 int h = av_clip(gif->Image.Height, 0, priv->h - t); |
21885 | 185 unsigned char *dest = dp->buffer + priv->w * t + l; |
9133 | 186 |
21876 | 187 // copy the palette |
21881
a10888bc9758
Fix invalid read for gifs with a palette for less than 256 colors
reimar
parents:
21880
diff
changeset
|
188 for (y = 0; y < cnt; y++) { |
21893 | 189 priv->palette[(y * 4) + 0] = effective_map->Colors[y].Blue; |
190 priv->palette[(y * 4) + 1] = effective_map->Colors[y].Green; | |
191 priv->palette[(y * 4) + 2] = effective_map->Colors[y].Red; | |
192 priv->palette[(y * 4) + 3] = 0; | |
9133 | 193 } |
194 | |
21922 | 195 if (gif->Image.Interlace) { |
196 uint8_t *s = buf; | |
22024 | 197 int ih = (h - 0 + 7) >> 3; |
198 memcpy_transp_pic(dest, s, w, ih, | |
21922 | 199 priv->w << 3, gif->Image.Width, |
200 transparency, transparent_col); | |
22024 | 201 s += ih * w; |
202 ih = (h - 4 + 7) >> 3; | |
203 memcpy_transp_pic(dest + (priv->w << 2), s, w, ih, | |
21922 | 204 priv->w << 3, gif->Image.Width, |
205 transparency, transparent_col); | |
22024 | 206 s += ih * w; |
207 ih = (h - 2 + 3) >> 2; | |
208 memcpy_transp_pic(dest + (priv->w << 1), s, w, ih, | |
21922 | 209 priv->w << 2, gif->Image.Width, |
210 transparency, transparent_col); | |
22024 | 211 s += ih * w; |
212 ih = (h - 1 + 1) >> 1; | |
213 memcpy_transp_pic(dest + priv->w, s, w, ih, | |
21922 | 214 priv->w << 1, gif->Image.Width, |
215 transparency, transparent_col); | |
216 } else | |
217 memcpy_transp_pic(dest, buf, w, h, priv->w, gif->Image.Width, | |
218 transparency, transparent_col); | |
21892 | 219 |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22605
diff
changeset
|
220 if (refmode == 1) fast_memcpy(priv->refimg, dp->buffer, priv->w * priv->h); |
21892 | 221 if (refmode == 2 && priv->useref) { |
222 dest = priv->refimg + priv->w * t + l; | |
223 memset(buf, gif->SBackGroundColor, len); | |
224 memcpy_pic(dest, buf, w, h, priv->w, gif->Image.Width); | |
225 } | |
21894 | 226 if (!(refmode & 2)) priv->useref = refmode & 1; |
9133 | 227 } |
228 | |
229 free(buf); | |
230 | |
231 demuxer->video->dpos++; | |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
232 dp->pts = ((float)priv->current_pts) / 100; |
9133 | 233 dp->pos = stream_tell(demuxer->stream); |
234 ds_add_packet(demuxer->video, dp); | |
235 | |
236 return 1; | |
237 } | |
238 | |
16175 | 239 static demuxer_t* demux_open_gif(demuxer_t* demuxer) |
9133 | 240 { |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
241 gif_priv_t *priv = calloc(1, sizeof(gif_priv_t)); |
9133 | 242 sh_video_t *sh_video = NULL; |
243 GifFileType *gif = NULL; | |
244 | |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
245 priv->current_pts = 0; |
9133 | 246 demuxer->seekable = 0; // FIXME |
247 | |
248 // go back to the beginning | |
9345 | 249 stream_seek(demuxer->stream,demuxer->stream->start_pos); |
9133 | 250 |
27385
2113bd9c6bd9
Rename preprocessor directives related to image libraries.
diego
parents:
25707
diff
changeset
|
251 #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
|
252 // 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
|
253 // 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
|
254 // 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
|
255 // 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
|
256 // 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
|
257 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
|
258 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
|
259 #else |
9344
bd7b5078475e
1) codecs.conf changed recently and demux_gif no longer needs to spit
arpi
parents:
9133
diff
changeset
|
260 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
|
261 #endif |
9133 | 262 if (!gif) { |
263 PrintGifError(); | |
32614 | 264 free(priv); |
9133 | 265 return NULL; |
266 } | |
267 | |
268 // create a new video stream header | |
269 sh_video = new_sh_video(demuxer, 0); | |
270 | |
271 // make sure the demuxer knows about the new video stream header | |
272 // (even though new_sh_video() ought to take care of it) | |
273 demuxer->video->sh = sh_video; | |
274 | |
275 // make sure that the video demuxer stream header knows about its | |
276 // parent video demuxer stream (this is getting wacky), or else | |
277 // video_read_properties() will choke | |
278 sh_video->ds = demuxer->video; | |
279 | |
280 sh_video->format = mmioFOURCC(8, 'R', 'G', 'B'); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
281 |
9133 | 282 sh_video->fps = 5.0f; |
283 sh_video->frametime = 1.0f / sh_video->fps; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
284 |
32123 | 285 sh_video->bih = malloc(sizeof(*sh_video->bih) + (256 * 4)); |
9133 | 286 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
|
287 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
|
288 sh_video->bih->biHeight = priv->h = (uint16_t)gif->SHeight; |
9133 | 289 sh_video->bih->biBitCount = 8; |
290 sh_video->bih->biPlanes = 2; | |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
291 priv->palette = (unsigned char *)(sh_video->bih + 1); |
21891 | 292 priv->refimg = malloc(priv->w * priv->h); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
293 |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
294 priv->gif = gif; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
295 demuxer->priv = priv; |
9133 | 296 |
297 return demuxer; | |
298 } | |
299 | |
16175 | 300 static void demux_close_gif(demuxer_t* demuxer) |
9133 | 301 { |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
302 gif_priv_t *priv = demuxer->priv; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
303 if (!priv) return; |
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
304 if (priv->gif && DGifCloseFile(priv->gif) == GIF_ERROR) |
9133 | 305 PrintGifError(); |
21891 | 306 free(priv->refimg); |
21880
4e22e06485c6
Move global variables in gif demuxer into priv struct
reimar
parents:
21876
diff
changeset
|
307 free(priv); |
9133 | 308 } |
16175 | 309 |
310 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
23457
diff
changeset
|
311 const demuxer_desc_t demuxer_desc_gif = { |
16175 | 312 "GIF demuxer", |
313 "gif", | |
314 "GIF", | |
315 "Joey Parrish", | |
316 "", | |
317 DEMUXER_TYPE_GIF, | |
318 0, // unsafe autodetect | |
319 gif_check_file, | |
320 demux_gif_fill_buffer, | |
321 demux_open_gif, | |
322 demux_close_gif, | |
323 NULL, | |
324 NULL | |
325 }; |