changeset 9463:93375ee56629

gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish <joey@nicewarrior.org>
author alex
date Wed, 19 Feb 2003 16:55:14 +0000
parents 8b02e80e9c65
children a4e50ab9ac14
files configure libmpdemux/demux_gif.c
diffstat 2 files changed, 42 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/configure	Wed Feb 19 16:49:28 2003 +0000
+++ b/configure	Wed Feb 19 16:55:14 2003 +0000
@@ -2916,18 +2916,18 @@
   return 0;
 }
 EOF
-  if cc_check -lgif && "$TMPO" >> "$TMPLOG" ; then
+  if cc_check -lungif && "$TMPO" >> "$TMPLOG" ; then
+    _gif=yes
+    _ld_gif="-lungif"
+  elif cc_check -lungif $_ld_x11 && "$TMPO" >> "$TMPLOG" ; then
+    _gif=yes
+    _ld_gif="-lungif $_ld_x11"
+  elif cc_check -lgif && "$TMPO" >> "$TMPLOG" ; then
     _gif=yes
     _ld_gif="-lgif"
-  elif cc_check -lungif && "$TMPO" >> "$TMPLOG" ; then
-    _gif=yes
-    _ld_gif="-lungif"
   elif cc_check -lgif $_ld_x11 && "$TMPO" >> "$TMPLOG" ; then
     _gif=yes
     _ld_gif="-lgif $_ld_x11"
-  elif cc_check -lungif $_ld_x11 && "$TMPO" >> "$TMPLOG" ; then
-    _gif=yes
-    _ld_gif="-lungif $_ld_x11"
   fi
 fi
 
@@ -2965,6 +2965,27 @@
 echores "$_gif"
 
 
+if test "$_gif" = yes ; then
+  echocheck "broken giflib workaround"
+  _def_gif_tvt_hack='#define HAVE_GIF_TVT_HACK 1'
+
+  cat > $TMPC << EOF
+#include <gif_lib.h>
+int main(void) {
+  GifFileType gif;
+  printf("UserData is at address %p\n", gif.UserData);
+  return 0;
+}
+EOF
+  if cc_check "$_ld_gif" && ( "$TMPO" ) >>"$TMPLOG" 2>&1 ; then
+    _def_gif_tvt_hack='#undef HAVE_GIF_TVT_HACK'
+    echores "disabled"
+  else
+    echores "enabled"
+  fi
+fi
+
+
 if test "$_vesa" != no ; then
 echocheck "VESA support"
 if x86 && linux ; then
@@ -5293,6 +5314,7 @@
 /* enable GIF support */
 $_def_gif
 $_def_gif_4
+$_def_gif_tvt_hack
 
 /* enable FreeType support */
 $_def_freetype
--- a/libmpdemux/demux_gif.c	Wed Feb 19 16:49:28 2003 +0000
+++ b/libmpdemux/demux_gif.c	Wed Feb 19 16:55:14 2003 +0000
@@ -24,9 +24,12 @@
 
 #define GIF_SIGNATURE (('G' << 16) | ('I' << 8) | 'F')
 
+#ifndef HAVE_GIF_TVT_HACK
+// not supported by certain versions of the library
 int my_read_gif(GifFileType *gif, uint8_t *buf, int len) {
   return stream_read(gif->UserData, buf, len);
 }
+#endif
   
 int gif_check_file(demuxer_t *demuxer)
 {
@@ -156,7 +159,17 @@
   // go back to the beginning
   stream_seek(demuxer->stream,demuxer->stream->start_pos);
 
+#ifdef HAVE_GIF_TVT_HACK
+  // without the TVT functionality of libungif, a hard seek must be
+  // done to the beginning of the file.  this is because libgif is
+  // unable to use mplayer's cache, and without this lseek libgif will
+  // 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);
+#else
   gif = DGifOpen(demuxer->stream, my_read_gif);
+#endif
   if (!gif) {
     PrintGifError();
     return NULL;