[MPlayer-cvslog] r36367 - in trunk: configure libmpdemux/demux_gif.c libvo/vo_gif89a.c
al
subversion at mplayerhq.hu
Sat Jul 27 23:16:06 CEST 2013
Author: al
Date: Sat Jul 27 23:16:06 2013
New Revision: 36367
Log:
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
Modified:
trunk/configure
trunk/libmpdemux/demux_gif.c
trunk/libvo/vo_gif89a.c
Modified: trunk/configure
==============================================================================
--- trunk/configure Mon Jul 22 15:05:13 2013 (r36366)
+++ trunk/configure Sat Jul 27 23:16:06 2013 (r36367)
@@ -5090,7 +5090,8 @@ fi
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
Modified: trunk/libmpdemux/demux_gif.c
==============================================================================
--- trunk/libmpdemux/demux_gif.c Mon Jul 22 15:05:13 2013 (r36366)
+++ trunk/libmpdemux/demux_gif.c Sat Jul 27 23:16:06 2013 (r36367)
@@ -45,6 +45,32 @@ typedef struct {
#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 @@ static int demux_gif_fill_buffer(demuxer
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 @@ static int demux_gif_fill_buffer(demuxer
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 @@ static int demux_gif_fill_buffer(demuxer
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 @@ static int demux_gif_fill_buffer(demuxer
}
while (p != NULL) {
if (DGifGetExtensionNext(gif, &p) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
}
@@ -154,7 +180,7 @@ static int demux_gif_fill_buffer(demuxer
}
if (DGifGetImageDesc(gif) == GIF_ERROR) {
- PrintGifError();
+ print_gif_error(priv->gif);
return 0; // oops
}
@@ -167,7 +193,7 @@ static int demux_gif_fill_buffer(demuxer
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 @@ static demuxer_t* demux_open_gif(demuxer
gif = DGifOpen(demuxer->stream, my_read_gif);
#endif
if (!gif) {
- PrintGifError();
+ print_gif_error(NULL);
free(priv);
return NULL;
}
@@ -303,7 +329,7 @@ static void demux_close_gif(demuxer_t* d
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);
}
Modified: trunk/libvo/vo_gif89a.c
==============================================================================
--- trunk/libvo/vo_gif89a.c Mon Jul 22 15:05:13 2013 (r36366)
+++ trunk/libvo/vo_gif89a.c Sat Jul 27 23:16:06 2013 (r36367)
@@ -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 @@ static const vo_info_t info = {
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 @@ static int config(uint32_t s_width, uint
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 @@ static int config(uint32_t s_width, uint
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 @@ static int config(uint32_t s_width, uint
// 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.
More information about the MPlayer-cvslog
mailing list