diff libmpdemux/demux_gif.c @ 36271:1a889d9a4540

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
author al
date Sat, 27 Jul 2013 21:16:06 +0000
parents 9eeba22fd78a
children f3c835ddce85
line wrap: on
line diff
--- a/libmpdemux/demux_gif.c	Mon Jul 22 13:05:13 2013 +0000
+++ b/libmpdemux/demux_gif.c	Sat Jul 27 21:16:06 2013 +0000
@@ -45,6 +45,32 @@
 
 #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 @@
 
   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 @@
       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 @@
 	  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 @@
       }
       while (p != NULL) {
         if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) {
-          PrintGifError();
+          print_gif_error(priv->gif);
           return 0; // oops
         }
       }
@@ -154,7 +180,7 @@
   }
 
   if (DGifGetImageDesc(gif) == GIF_ERROR) {
-    PrintGifError();
+    print_gif_error(priv->gif);
     return 0; // oops
   }
 
@@ -167,7 +193,7 @@
     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 @@
   gif = DGifOpen(demuxer->stream, my_read_gif);
 #endif
   if (!gif) {
-    PrintGifError();
+    print_gif_error(NULL);
     free(priv);
     return NULL;
   }
@@ -303,7 +329,7 @@
   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);
 }