summarylogtreecommitdiffstats
path: root/giflib-5.0.patch
blob: 9eaa6e98e1fc872a597b87a24c0013615640320a (plain)
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
diff --git a/libvo/vo_gif89a.c b/libvo/vo_gif89a.c
index b808f81..c61d86c 100644
--- a/libvo/vo_gif89a.c
+++ b/libvo/vo_gif89a.c
@@ -196,7 +196,11 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width,
 	mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Some functionality has been disabled.\n");
 #endif
 
+#if GIFLIB_MAJOR > 4
+	new_gif = EGifOpenFileName(gif_filename, 0, NULL);
+#else
 	new_gif = EGifOpenFileName(gif_filename, 0);
+#endif
 	if (new_gif == NULL) {
 		mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: error opening file \"%s\" for output.\n", gif_filename);
 		return 1;
@@ -215,7 +219,11 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width,
 		return 1;
 	}
 
+#if GIFLIB_MAJOR > 4
+	reduce_cmap = GifMakeMapObject(256, NULL);
+#else
 	reduce_cmap = MakeMapObject(256, NULL);
+#endif
 	if (reduce_cmap == NULL) {
 		free(slice_data); slice_data = NULL;
 		free(reduce_data); reduce_data = NULL;
@@ -267,7 +275,11 @@ static int gif_reduce(int width, int height, uint8_t *src, uint8_t *dst, GifColo
 	}
 
 	R = Ra; G = Ga; B = Ba;
+#if GIFLIB_MAJOR > 4
+	return GifQuantizeBuffer(width, height, &size, R, G, B, dst, colors);
+#else
 	return QuantizeBuffer(width, height, &size, R, G, B, dst, colors);
+#endif
 }
 
 static void flip_page(void)
@@ -365,8 +377,11 @@ static void uninit(void)
 	free(gif_filename);
 	free(slice_data);
 	free(reduce_data);
+#if GIFLIB_MAJOR > 4
+	if (reduce_cmap != NULL) GifFreeMapObject(reduce_cmap);
+#else
 	if (reduce_cmap != NULL) FreeMapObject(reduce_cmap);
-
+#endif
 	// set the pointers back to null.
 	new_gif = NULL;
 	gif_filename = NULL;

diff --git a/configure b/configure
index 95a5ae8..d9c826f 100755
--- a/configure
+++ b/configure
@@ -3659,6 +3659,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 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 eee7a85..a764474 100644
--- a/libmpdemux/demux_gif.c
+++ b/libmpdemux/demux_gif.c
@@ -44,6 +44,16 @@ typedef struct {
 
 #define GIF_SIGNATURE (('G' << 16) | ('I' << 8) | 'F')
 
+static void PrintGifError(errcode)
+{
+  char *Err = GifErrorString(errcode);
+
+  if (Err != NULL)
+    fprintf(stderr, "\nGIF-LIB error: %s.\n", Err);
+  else
+    fprintf(stderr, "\nGIF-LIB undefined error %d.\n", errcode);
+}
+
 #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)
@@ -240,6 +250,7 @@ static demuxer_t* demux_open_gif(demuxer_t* demuxer)
   gif_priv_t *priv = calloc(1, sizeof(gif_priv_t));
   sh_video_t *sh_video = NULL;
   GifFileType *gif = NULL;
+  int GifError;
 
   priv->current_pts = 0;
   demuxer->seekable = 0; // FIXME
@@ -254,12 +265,12 @@ static demuxer_t* demux_open_gif(demuxer_t* demuxer)
   // not read from the beginning of the file and the command will fail.
   // with this hack enabled, you will lose the ability to stream a GIF.
   lseek(demuxer->stream->fd, 0, SEEK_SET);
-  gif = DGifOpenFileHandle(demuxer->stream->fd);
+  gif = DGifOpenFileHandle(demuxer->stream->fd, &GifError);
 #else
-  gif = DGifOpen(demuxer->stream, my_read_gif);
+  gif = DGifOpen(demuxer->stream, my_read_gif, &GifError);
 #endif
   if (!gif) {
-    PrintGifError();
+    PrintGifError(GifError);
     free(priv);
     return NULL;
   }