Mercurial > mplayer.hg
changeset 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 | cc9eed01e8e7 |
children | aa0011dfbfdc |
files | configure libmpdemux/demux_gif.c libvo/vo_gif89a.c |
diffstat | 3 files changed, 61 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/configure Mon Jul 22 13:05:13 2013 +0000 +++ b/configure Sat Jul 27 21:16:06 2013 +0000 @@ -5090,7 +5090,8 @@ 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); PrintGifError()' $ld_gif && _gif=yes && break + statement_check gif_lib.h 'QuantizeBuffer(0, 0, 0, 0, 0, 0, 0, 0)' $ld_gif && _gif=yes && break + statement_check_broken stdlib.h gif_lib.h 'GifQuantizeBuffer(0, 0, 0, 0, 0, 0, 0, 0)' $ld_gif && _gif=yes && break done fi
--- 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); }
--- a/libvo/vo_gif89a.c Mon Jul 22 13:05:13 2013 +0000 +++ b/libvo/vo_gif89a.c Sat Jul 27 21:16:06 2013 +0000 @@ -44,13 +44,13 @@ * entire argument being interpretted as the filename. */ -#include <gif_lib.h> - #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <gif_lib.h> + #include "config.h" #include "subopt-helper.h" #include "video_out.h" @@ -69,6 +69,12 @@ const LIBVO_EXTERN(gif89a) +#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 +#define EGifOpenFileName(a, b) EGifOpenFileName(a, b, NULL) +#define MakeMapObject GifMakeMapObject +#define FreeMapObject GifFreeMapObject +#define QuantizeBuffer GifQuantizeBuffer +#endif // how many frames per second we are aiming for during output. static float target_fps; @@ -156,7 +162,7 @@ uint32_t d_height, uint32_t flags, char *title, uint32_t format) { -#ifdef CONFIG_GIF_4 +#if defined CONFIG_GIF_4 || GIFLIB_MAJOR >= 5 // these are control blocks for the gif looping extension. char LB1[] = "NETSCAPE2.0"; char LB2[] = { 1, 0, 0 }; @@ -185,23 +191,25 @@ return 1; } + new_gif = EGifOpenFileName(gif_filename, 0); + if (new_gif == NULL) { + mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: error opening file \"%s\" for output.\n", gif_filename); + return 1; + } + +#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 + EGifSetGifVersion(new_gif, 1); +#elif defined CONFIG_GIF_4 // the EGifSetGifVersion line causes segfaults in certain // earlier versions of libungif. i don't know exactly which, // but certainly in all those before v4. if you have problems, // you need to upgrade your gif library. -#ifdef CONFIG_GIF_4 EGifSetGifVersion("89a"); #else mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Your version of libungif needs to be upgraded.\n"); mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Some functionality has been disabled.\n"); #endif - new_gif = EGifOpenFileName(gif_filename, 0); - if (new_gif == NULL) { - mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: error opening file \"%s\" for output.\n", gif_filename); - return 1; - } - slice_data = malloc(img_width * img_height * 3); if (slice_data == NULL) { mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: malloc failed.\n"); @@ -231,7 +239,12 @@ // set the initial width and height info. EGifPutScreenDesc(new_gif, s_width, s_height, 256, 0, reduce_cmap); -#ifdef CONFIG_GIF_4 +#if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 + EGifPutExtensionLeader(new_gif, 0xFF); + EGifPutExtensionBlock(new_gif, 11, LB1); + EGifPutExtensionBlock(new_gif, 3, LB2); + EGifPutExtensionTrailer(new_gif); +#elif defined CONFIG_GIF_4 // version 3 of libungif does not support multiple control blocks. // looping requires multiple control blocks. // therefore, looping is only enabled for v4 and up.