Mercurial > mplayer.hg
annotate libmpdemux/demux_gif.c @ 33787:42feff0f8a7b
Start all file dialogs always in last active directory.
This starts the "add subtitle" and "add external audio" dialogs
in the directory of the chosen or started movie.
Don't change the directory just to retrieve its name and prepend
the active directory instead of appending it.
This closes Bugzilla #977.
author | ib |
---|---|
date | Mon, 11 Jul 2011 14:54:25 +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 }; |