Mercurial > mplayer.hg
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); }