# HG changeset patch # User alex # Date 1045673714 0 # Node ID 93375ee5662949e4639fea18ff232531e70abf5b # Parent 8b02e80e9c6526c81902cb8befec7eecc1d4998a gif library incompatibility fixes and prefere libungif over libgif. Patch by Joey Parrish diff -r 8b02e80e9c65 -r 93375ee56629 configure --- 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 +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 diff -r 8b02e80e9c65 -r 93375ee56629 libmpdemux/demux_gif.c --- 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;