1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
Support newer GIFLIB versions
This is an adapted upstream patch. This patch is incomplete so a new
patch needs to be added after this one.
Upstream commit:
https://github.com/pigoz/mplayer-svn/commit/a0ddaef5457e222dade386901bf448c5e3ac7b89
Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
From a0ddaef5457e222dade386901bf448c5e3ac7b89 Mon Sep 17 00:00:00 2001
From: al <al@b3059339-0415-0410-9bf9-f77b7e298cf2>
Date: Sat, 27 Jul 2013 21:16:06 +0000
Subject: [PATCH] Support newer GIFLIB versions
Work with GIFLIB version >= 4.2
Several functions have been renamed or changed in signature.
GIFLIB is used by vo gif89a and demuxer gif.
Note about GIFLIB Version 4.2:
It does not work with vanilla GIFLIB 4.2 but it works with
versions that have re-added quantize support like e.g. the
package from arch linux.
Note about GIFLIB Version 5:
The newly added GCB functions use size_t but the necessary
standard headers are not included in gif_lib.h . To workaround
this:
* configure: use statement_check_broken to include stdlib.h
* vo gif89: include gif_lib.h after stdlib.h
* demuxer gif: no workaround needed,
gif_lib.h is already included after stdlib.h
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@36367 b3059339-0415-0410-9bf9-f77b7e298cf2
---
configure | 1 +
libmpdemux/demux_gif.c | 44 +++++++++++++++++++++++++++++++++++---------
libvo/vo_gif89a.c | 35 ++++++++++++++++++++++++-----------
3 files changed, 61 insertions(+), 21 deletions(-)
diff --git a/configure b/configure
index e9152a8..4cd378d 100755
--- a/configure
+++ b/configure
@@ -4938,6 +4938,7 @@ if test "$_gif" = auto ; then
_gif=no
for ld_gif in "-lungif" "-lgif" ; do
statement_check gif_lib.h 'QuantizeBuffer(0, 0, 0, 0, 0, 0, 0, 0)' $ld_gif && _gif=yes && break
+ statement_check_broken stdlib.h gif_lib.h 'GifQuantizeBuffer(0, 0, 0, 0, 0, 0, 0, 0)' $ld_gif && _gif=yes && break
done
fi
diff --git a/libmpdemux/demux_gif.c b/libmpdemux/demux_gif.c
index 804ce8c..0a11322 100644
--- a/libmpdemux/demux_gif.c
+++ b/libmpdemux/demux_gif.c
@@ -45,6 +45,32 @@ typedef struct {
#define GIF_SIGNATURE (('G' << 16) | ('I' << 8) | 'F')
+#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5
+#define DGifOpen(a, b) DGifOpen(a, b, NULL)
+#define DGifOpenFileHandle(a) DGifOpenFileHandle(a, NULL)
+#define GifError() (gif ? gif->Error : 0)
+#define GifErrorString() GifErrorString(gif->Error)
+#endif
+
+/* >= 4.2 prior GIFLIB did not have MAJOR/MINOR defines */
+#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 4
+static void print_gif_error(GifFileType *gif)
+{
+ int err = GifError();
+ char *err_str = GifErrorString();
+
+ if (err_str)
+ mp_msg(MSGT_DEMUX, MSGL_ERR, "\n[gif] GIF-LIB error: %s.\n", err_str);
+ else
+ mp_msg(MSGT_DEMUX, MSGL_ERR, "\n[gif] GIF-LIB undefined error %d.\n", err);
+}
+#else
+static void print_gif_error(GifFileType *gif)
+{
+ PrintGifError();
+}
+#endif
+
#ifndef CONFIG_GIF_TVT_HACK
// not supported by certain versions of the library
static int my_read_gif(GifFileType *gif, uint8_t *buf, int len)
@@ -94,14 +120,14 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
while (type != IMAGE_DESC_RECORD_TYPE) {
if (DGifGetRecordType(gif, &type) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
if (type == TERMINATE_RECORD_TYPE)
return 0; // eof
if (type == SCREEN_DESC_RECORD_TYPE) {
if (DGifGetScreenDesc(gif) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
}
@@ -109,7 +135,7 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
int code;
unsigned char *p = NULL;
if (DGifGetExtension(gif, &code, &p) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
if (code == 0xF9) {
@@ -138,7 +164,7 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
comments[length] = 0;
printf("%s", comments);
if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
}
@@ -146,7 +172,7 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
}
while (p != NULL) {
if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
}
@@ -154,7 +180,7 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
}
if (DGifGetImageDesc(gif) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
@@ -167,7 +193,7 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
memset(dp->buffer, gif->SBackGroundColor, priv->w * priv->h);
if (DGifGetLine(gif, buf, len) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
free(buf);
free_demux_packet(dp);
return 0; // oops
@@ -261,7 +287,7 @@ static demuxer_t* demux_open_gif(demuxer_t* demuxer)
gif = DGifOpen(demuxer->stream, my_read_gif);
#endif
if (!gif) {
- PrintGifError();
+ print_gif_error(NULL);
free(priv);
return NULL;
}
@@ -303,7 +329,7 @@ static void demux_close_gif(demuxer_t* demuxer)
gif_priv_t *priv = demuxer->priv;
if (!priv) return;
if (priv->gif && DGifCloseFile(priv->gif) == GIF_ERROR)
- PrintGifError();
+ print_gif_error(priv->gif);
free(priv->refimg);
free(priv);
}
diff --git a/libvo/vo_gif89a.c b/libvo/vo_gif89a.c
index b808f81..160291a 100644
--- a/libvo/vo_gif89a.c
+++ b/libvo/vo_gif89a.c
@@ -44,13 +44,13 @@
* entire argument being interpretted as the filename.
*/
-#include <gif_lib.h>
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <gif_lib.h>
+
#include "config.h"
#include "subopt-helper.h"
#include "video_out.h"
@@ -69,6 +69,12 @@ static const vo_info_t info = {
const LIBVO_EXTERN(gif89a)
+#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5
+#define EGifOpenFileName(a, b) EGifOpenFileName(a, b, NULL)
+#define MakeMapObject GifMakeMapObject
+#define FreeMapObject GifFreeMapObject
+#define QuantizeBuffer GifQuantizeBuffer
+#endif
// how many frames per second we are aiming for during output.
static float target_fps;
@@ -156,7 +162,7 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width,
uint32_t d_height, uint32_t flags, char *title,
uint32_t format)
{
-#ifdef CONFIG_GIF_4
+#if defined CONFIG_GIF_4 || GIFLIB_MAJOR >= 5
// these are control blocks for the gif looping extension.
char LB1[] = "NETSCAPE2.0";
char LB2[] = { 1, 0, 0 };
@@ -185,23 +191,25 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width,
return 1;
}
+ new_gif = EGifOpenFileName(gif_filename, 0);
+ if (new_gif == NULL) {
+ mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: error opening file \"%s\" for output.\n", gif_filename);
+ return 1;
+ }
+
+#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5
+ EGifSetGifVersion(new_gif, 1);
+#elif defined CONFIG_GIF_4
// the EGifSetGifVersion line causes segfaults in certain
// earlier versions of libungif. i don't know exactly which,
// but certainly in all those before v4. if you have problems,
// you need to upgrade your gif library.
-#ifdef CONFIG_GIF_4
EGifSetGifVersion("89a");
#else
mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Your version of libungif needs to be upgraded.\n");
mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Some functionality has been disabled.\n");
#endif
- new_gif = EGifOpenFileName(gif_filename, 0);
- if (new_gif == NULL) {
- mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: error opening file \"%s\" for output.\n", gif_filename);
- return 1;
- }
-
slice_data = malloc(img_width * img_height * 3);
if (slice_data == NULL) {
mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: malloc failed.\n");
@@ -231,7 +239,12 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width,
// set the initial width and height info.
EGifPutScreenDesc(new_gif, s_width, s_height, 256, 0, reduce_cmap);
-#ifdef CONFIG_GIF_4
+#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5
+ EGifPutExtensionLeader(new_gif, 0xFF);
+ EGifPutExtensionBlock(new_gif, 11, LB1);
+ EGifPutExtensionBlock(new_gif, 3, LB2);
+ EGifPutExtensionTrailer(new_gif);
+#elif defined CONFIG_GIF_4
// version 3 of libungif does not support multiple control blocks.
// looping requires multiple control blocks.
// therefore, looping is only enabled for v4 and up.
--
1.7.1
|