summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrantišek Dvořák <valtri@users.sourceforge.net>2004-02-28 19:56:41 +0000
committerFrantišek Dvořák <valtri@users.sourceforge.net>2004-02-28 19:56:41 +0000
commita657c3df2f453941b115de0ece3ad8d849d58a6b (patch)
tree8546f3fa258309d8169853ebd7bf24fb95ccb7c1
parent29508eee9641ffeba9b372da6197f5176c2c58dc (diff)
downloadxine-lib-a657c3df2f453941b115de0ece3ad8d849d58a6b.tar.gz
xine-lib-a657c3df2f453941b115de0ece3ad8d849d58a6b.tar.bz2
New caca video output plugin - color ASCII art.
CVS patchset: 6191 CVS date: 2004/02/28 19:56:41
-rw-r--r--AUTHORS3
-rw-r--r--ChangeLog1
-rw-r--r--configure.ac11
-rw-r--r--include/xine.h.in3
-rw-r--r--m4/Makefile.am1
-rw-r--r--m4/caca.m4163
-rw-r--r--src/video_out/Makefile.am12
-rw-r--r--src/video_out/video_out_caca.c343
8 files changed, 535 insertions, 2 deletions
diff --git a/AUTHORS b/AUTHORS
index 69938fcbf..8d37e38f5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -455,4 +455,7 @@ Tilmann Bitterberg <transcode@tibit.org>
Paul Eggleton <paul@softec.co.nz>
Amiga MOD support
+Jeff Smith <whydoubt@yahoo.com>
+ CACA video output plugin
+
(let us know if we've forgotten anyone)
diff --git a/ChangeLog b/ChangeLog
index 620434ae1..a4c9a6e7b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -35,6 +35,7 @@ xine-lib (1-rc4)
* documentation about xine fonts
* make the protocol in MMS configurable - TCP, HTTP or autoprobe
* added video output plugin for Sun PGX32 framebuffers
+ * new video out plugin using CACA - Colored ASCII Art
xine-lib (1-rc3a)
* new subtitle formats: jacobsub, subviewer 2.0, subrip 0.9
diff --git a/configure.ac b/configure.ac
index eae9a5be9..923411e88 100644
--- a/configure.ac
+++ b/configure.ac
@@ -604,6 +604,14 @@ AM_CONDITIONAL(HAVE_AA, test x$no_aalib != "xyes")
dnl ---------------------------------------------
+dnl Checks for Color AsCii Art library
+dnl ---------------------------------------------
+
+AM_PATH_CACA(0.3,, AC_MSG_RESULT([*** All CACA-dependent parts will be disabled ***]))
+AM_CONDITIONAL(HAVE_CACA, test x$no_caca != "xyes")
+
+
+dnl ---------------------------------------------
dnl Check solaris framebuffer device support
dnl ---------------------------------------------
@@ -2201,6 +2209,9 @@ fi
if test x$no_aalib != "xyes"; then
echo " - aa (Ascii ART)"
fi
+if test x$no_caca != "xyes"; then
+ echo " - caca (Color AsCii Art)"
+fi
if test x$have_fb = "xyes"; then
echo " - fb (Linux framebuffer device)"
fi
diff --git a/include/xine.h.in b/include/xine.h.in
index 14fbddf72..dd766f710 100644
--- a/include/xine.h.in
+++ b/include/xine.h.in
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine.h.in,v 1.115 2004/01/11 15:31:53 mroi Exp $
+ * $Id: xine.h.in,v 1.116 2004/02/28 19:56:41 valtri Exp $
*
* public xine-lib (libxine) interface and documentation
*
@@ -166,6 +166,7 @@ void xine_close_video_driver (xine_t *self, xine_video_port_t *driver);
#define XINE_VISUAL_TYPE_DFB 5
#define XINE_VISUAL_TYPE_PM 6 /* used by the OS/2 port */
#define XINE_VISUAL_TYPE_DIRECTX 7 /* used by the win32/msvc port */
+#define XINE_VISUAL_TYPE_CACA 8
/*
* free all resources, close all plugins, close engine.
diff --git a/m4/Makefile.am b/m4/Makefile.am
index f01b7e597..cbfc67273 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -13,6 +13,7 @@ EXTRA_DIST = \
alsa.m4 \
arts.m4 \
as.m4 \
+ caca.m4 \
codeset.m4 \
dvdnav.m4 \
esd.m4 \
diff --git a/m4/caca.m4 b/m4/caca.m4
new file mode 100644
index 000000000..269f69f22
--- /dev/null
+++ b/m4/caca.m4
@@ -0,0 +1,163 @@
+dnl Configure paths and dependencies for libcaca.
+dnl
+dnl Jeffrey S Smith <whydoubt@yahoo.com> 09-Dec-2003
+dnl based on aa.m4 as found in xinelib
+dnl
+dnl AM_PATH_CACA([MINIMUM-VERSION, [ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND ]]])
+dnl Test for CACA, and define CACA_CFLAGS, CACA_LIBS.
+dnl
+dnl ***********************
+dnl 09-Dec-2003
+dnl * new m4 for libcaca
+dnl
+AC_DEFUN([AM_PATH_CACA],
+[dnl
+dnl
+AC_ARG_WITH(caca-prefix,
+ [ --with-caca-prefix=PFX Prefix where CACA is installed (optional)],
+ caca_config_prefix="$withval", caca_config_prefix="")
+AC_ARG_WITH(caca-exec-prefix,
+ [ --with-caca-exec-prefix=PFX Exec prefix where CACA is installed (optional)],
+ caca_config_exec_prefix="$withval", caca_config_exec_prefix="")
+AC_ARG_ENABLE(cacatest,
+ [ --disable-cacatest Do not try to compile and run a test CACA program],, enable_cacatest=yes)
+
+ if test x$caca_config_exec_prefix != x ; then
+ caca_config_args="$caca_config_args --exec-prefix=$caca_config_exec_prefix"
+ if test x${CACA_CONFIG+set} != xset ; then
+ CACA_CONFIG=$caca_config_exec_prefix/bin/caca-config
+ fi
+ fi
+ if test x$caca_config_prefix != x ; then
+ caca_config_args="$caca_config_args --prefix=$caca_config_prefix"
+ if test x${CACA_CONFIG+set} != xset ; then
+ CACA_CONFIG=$caca_config_prefix/bin/caca-config
+ fi
+ fi
+
+ min_caca_version=ifelse([$1], ,0.3,$1)
+
+ if test x"$enable_cacatest" != "xyes"; then
+ AC_MSG_CHECKING([for CACA version >= $min_caca_version])
+ else
+ if test ! -x "$CACA_CONFIG"; then
+ CACA_CONFIG=""
+ fi
+ AC_PATH_PROG(CACA_CONFIG, caca-config, no)
+
+ if test "$CACA_CONFIG" = "no" ; then
+dnl
+dnl caca-config is missing
+dnl
+ no_caca=yes
+ else
+ AC_MSG_CHECKING([for CACA version >= $min_caca_version])
+ no_caca=""
+ CACA_CFLAGS=`$CACA_CONFIG $caca_config_args --cflags`
+ CACA_LIBS=`$CACA_CONFIG $caca_config_args --plugin-libs`
+ caca_major_version=`$CACA_CONFIG $caca_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ caca_minor_version=`$CACA_CONFIG $caca_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $CACA_CFLAGS"
+ LIBS="$CACA_LIBS $LIBS"
+dnl
+dnl Now check if the installed CACA is sufficiently new. (Also sanity
+dnl checks the results of caca-config to some extent)
+dnl
+ AC_LANG_SAVE()
+ AC_LANG_C()
+ rm -f conf.cacatest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <caca.h>
+
+int main ()
+{
+ int major, minor;
+ char *tmp_version;
+
+ system("touch conf.cacatest");
+
+ tmp_version = (char *) strdup("$min_caca_version");
+ if (sscanf(tmp_version, "%d.%d", &major, &minor) != 2) {
+ printf("%s, bad version string\n", "$min_caca_version");
+ exit(1);
+ }
+
+ if (($caca_major_version > major) ||
+ (($caca_major_version == major) && ($caca_minor_version >= minor)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** 'caca-config --version' returned %d.%d, but the minimum version\n", $caca_major_version, $caca_minor_version);
+ printf("*** of CACA required is %d.%d. If caca-config is correct, then it is\n", major, minor);
+ printf("*** best to upgrade to the required version.\n");
+ printf("*** If caca-config was wrong, set the environment variable CACA_CONFIG\n");
+ printf("*** to point to the correct copy of caca-config, and remove the file\n");
+ printf("*** config.cache before re-running configure\n");
+ return 1;
+ }
+}
+
+],, no_caca=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi dnl CACA_CONFIG
+
+ if test "x$no_caca" = x; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$CACA_CONFIG" = "no"; then
+ echo "*** The caca-config program installed by CACA could not be found"
+ echo "*** If CACA was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or use --with-caca-prefix to set the prefix"
+ echo "*** where CACA is installed."
+ else
+ if test -f conf.cacatest ; then
+ :
+ else
+ echo "*** Could not run CACA test program, checking why..."
+ CFLAGS="$CFLAGS $CACA_CFLAGS"
+ LIBS="$LIBS $CACA_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include <caca.h>
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding CACA or finding the wrong"
+ echo "*** version of CACA. If it is not finding CACA, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+ echo "***"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means CACA was incorrectly installed"
+ echo "*** or that you have moved CACA since it was installed." ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ CACA_CFLAGS=""
+ CACA_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(CACA_CFLAGS)
+ AC_SUBST(CACA_LIBS)
+ AC_LANG_RESTORE()
+ rm -f conf.cacatest
+])
diff --git a/src/video_out/Makefile.am b/src/video_out/Makefile.am
index a00573cba..41b2fdb0f 100644
--- a/src/video_out/Makefile.am
+++ b/src/video_out/Makefile.am
@@ -10,7 +10,7 @@ VIDIX_CFLAGS = -I$(top_builddir)/src/video_out/vidix \
AM_CFLAGS = $(X_CFLAGS) \
-DXINE_COMPILE $(SDL_CFLAGS) $(VIDIX_CFLAGS) \
$(AALIB_CFLAGS) $(MLIB_CFLAGS) $(LIBSTK_CFLAGS) \
- $(DIRECTFB_CFLAGS) $(DIRECTX_CFLAGS)
+ $(DIRECTFB_CFLAGS) $(DIRECTX_CFLAGS) $(CACA_CFLAGS)
libdir = $(XINE_PLUGINDIR)
@@ -44,6 +44,10 @@ if HAVE_AA
aa_module = xineplug_vo_out_aa.la
endif
+if HAVE_CACA
+caca_module = xineplug_vo_out_caca.la
+endif
+
if HAVE_FB
fb_module = xineplug_vo_out_fb.la
endif
@@ -79,6 +83,7 @@ lib_LTLIBRARIES = $(xshm_module) $(xv_module) $(xvmc_module) \
$(sdl_module) \
$(stk_module) \
$(directx_module) \
+ $(caca_module) \
xineplug_vo_out_none.la
xineplug_vo_out_xshm_la_SOURCES = yuv2rgb.c yuv2rgb_mmx.c yuv2rgb_mlib.c \
@@ -122,6 +127,11 @@ xineplug_vo_out_aa_la_SOURCES = video_out_aa.c
xineplug_vo_out_aa_la_LIBADD = $(AALIB_LIBS)
xineplug_vo_out_aa_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
+xineplug_vo_out_caca_la_SOURCES = yuv2rgb.c yuv2rgb_mmx.c yuv2rgb_mlib.c \
+ video_out_caca.c
+xineplug_vo_out_caca_la_LIBADD = $(CACA_LIBS)
+xineplug_vo_out_caca_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@
+
xineplug_vo_out_fb_la_SOURCES = yuv2rgb.c yuv2rgb_mmx.c yuv2rgb_mlib.c \
alphablend.c video_out_fb.c
xineplug_vo_out_fb_la_LIBADD = $(MLIB_LIBS) $(XINE_LIB)
diff --git a/src/video_out/video_out_caca.c b/src/video_out/video_out_caca.c
new file mode 100644
index 000000000..c53d48548
--- /dev/null
+++ b/src/video_out/video_out_caca.c
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2003, 2004 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * xine is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * $Id: video_out_caca.c,v 1.1 2004/02/28 19:56:42 valtri Exp $
+ *
+ * video_out_caca.c, Color AsCii Art output plugin for xine
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+
+#include <caca.h>
+
+#include "xine.h"
+#include "video_out.h"
+#include "xine_internal.h"
+#include "yuv2rgb.h"
+#include "xineutils.h"
+
+/*
+ * structures
+ */
+
+typedef struct caca_frame_s {
+
+ vo_frame_t vo_frame;
+
+ struct caca_bitmap *pixmap_s; /* pixmap info structure */
+ uint8_t *pixmap_d; /* pixmap data */
+ int width, height;
+ uint8_t *mem[3];
+
+ int format; /* XINE_IMGFMT_* flags */
+
+ yuv2rgb_t *yuv2rgb;
+
+} caca_frame_t;
+
+typedef struct {
+ vo_driver_t vo_driver;
+
+ config_values_t *config;
+ xine_t *xine;
+ int user_ratio;
+
+ yuv2rgb_factory_t *yuv2rgb_factory;
+
+} caca_driver_t;
+
+typedef struct {
+
+ video_driver_class_t driver_class;
+ config_values_t *config;
+ xine_t *xine;
+
+} caca_class_t;
+
+/*
+ * video driver
+ */
+static uint32_t caca_get_capabilities (vo_driver_t *this) {
+ return VO_CAP_YV12 | VO_CAP_YUY2;
+}
+
+static void caca_dispose_frame (vo_frame_t *vo_img) {
+ caca_frame_t *frame = (caca_frame_t *)vo_img;
+
+ if (frame->mem[0])
+ free (frame->mem[0]);
+ if (frame->mem[1])
+ free (frame->mem[1]);
+ if (frame->mem[2])
+ free (frame->mem[2]);
+
+ if (frame->pixmap_d)
+ free (frame->pixmap_d);
+ if (frame->pixmap_s)
+ caca_free_bitmap (frame->pixmap_s);
+
+ frame->yuv2rgb->dispose (frame->yuv2rgb);
+
+ free (frame);
+}
+
+static void caca_frame_field (vo_frame_t *vo_img, int which_field) {
+ /* nothing to be done here */
+}
+
+
+static vo_frame_t *caca_alloc_frame(vo_driver_t *this_gen) {
+ caca_driver_t *this = (caca_driver_t*) this_gen;
+ caca_frame_t *frame;
+
+ frame = (caca_frame_t *) xine_xmalloc (sizeof (caca_frame_t));
+ if (!frame)
+ return NULL;
+
+ frame->vo_frame.proc_slice = NULL;
+ frame->vo_frame.proc_frame = NULL;
+ frame->vo_frame.field = caca_frame_field;
+ frame->vo_frame.dispose = caca_dispose_frame;
+ frame->vo_frame.driver = this_gen;
+
+ /* colorspace converter for this frame */
+ frame->yuv2rgb =
+ this->yuv2rgb_factory->create_converter (this->yuv2rgb_factory);
+
+ return (vo_frame_t*) frame;
+}
+
+static void caca_update_frame_format (vo_driver_t *this_gen, vo_frame_t *img,
+ uint32_t width, uint32_t height,
+ double ratio, int format, int flags) {
+ caca_driver_t *this = (caca_driver_t*) this_gen;
+ caca_frame_t *frame = (caca_frame_t *) img;
+
+ if ((frame->width != width) || (frame->height != height)
+ || (frame->format != format)) {
+
+ if (frame->mem[0]) {
+ free (frame->mem[0]);
+ frame->mem[0] = NULL;
+ }
+ if (frame->mem[1]) {
+ free (frame->mem[1]);
+ frame->mem[1] = NULL;
+ }
+ if (frame->mem[2]) {
+ free (frame->mem[2]);
+ frame->mem[2] = NULL;
+ }
+
+ if (frame->pixmap_d) {
+ free (frame->pixmap_d);
+ frame->pixmap_d = NULL;
+ }
+ if (frame->pixmap_s) {
+ caca_free_bitmap (frame->pixmap_s);
+ frame->pixmap_s = NULL;
+ }
+
+ frame->width = width;
+ frame->height = height;
+ frame->format = format;
+
+ frame->pixmap_d = (uint8_t *) xine_xmalloc (height * width * 4);
+ frame->pixmap_s = caca_create_bitmap (32, width, height, width * 4,
+ 0xff0000, 0xff00, 0xff, 0);
+
+ if (format == XINE_IMGFMT_YV12) {
+ frame->vo_frame.pitches[0] = 8*((width + 7) / 8);
+ frame->vo_frame.pitches[1] = 8*((width + 15) / 16);
+ frame->vo_frame.pitches[2] = 8*((width + 15) / 16);
+ frame->vo_frame.base[0] = xine_xmalloc_aligned(16,
+ frame->vo_frame.pitches[0] * height, (void**) &frame->mem[0]);
+ frame->vo_frame.base[1] = xine_xmalloc_aligned(16,
+ frame->vo_frame.pitches[1] * ((height+1)/2), (void**) &frame->mem[1]);
+ frame->vo_frame.base[2] = xine_xmalloc_aligned(16,
+ frame->vo_frame.pitches[2] * ((height+1)/2), (void**) &frame->mem[2]);
+ frame->yuv2rgb->configure (frame->yuv2rgb,
+ width, height, frame->vo_frame.pitches[0], frame->vo_frame.pitches[1],
+ width, height, width * 4);
+ } else if (format == XINE_IMGFMT_YUY2) {
+ frame->vo_frame.pitches[0] = 8*((width + 3) / 4);
+ frame->vo_frame.base[0] = xine_xmalloc_aligned(16,
+ frame->vo_frame.pitches[0] * height, (void**) &frame->mem[0]);
+ frame->yuv2rgb->configure (frame->yuv2rgb,
+ width, height, frame->vo_frame.pitches[0], frame->vo_frame.pitches[0],
+ width, height, width * 4);
+ } else {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "alert! unsupported image format %04x\n", format);
+ abort();
+ }
+ }
+}
+
+static void caca_display_frame (vo_driver_t *this_gen, vo_frame_t *frame_gen) {
+ /* caca_driver_t *this = (caca_driver_t*) this_gen; */
+ caca_frame_t *frame = (caca_frame_t *) frame_gen;
+
+ if (frame->format == XINE_IMGFMT_YV12) {
+ frame->yuv2rgb->yuv2rgb_fun (frame->yuv2rgb, frame->pixmap_d,
+ frame->vo_frame.base[0],
+ frame->vo_frame.base[1],
+ frame->vo_frame.base[2]);
+ } else { /* frame->format == XINE_IMGFMT_YUY2 */
+ frame->yuv2rgb->yuy22rgb_fun (frame->yuv2rgb, frame->pixmap_d,
+ frame->vo_frame.base[0]);
+ }
+
+ frame->vo_frame.free (&frame->vo_frame);
+
+ caca_draw_bitmap(0, 0, caca_get_width()-1, caca_get_height()-1,
+ frame->pixmap_s, frame->pixmap_d);
+ caca_refresh ();
+}
+
+static int caca_get_property (vo_driver_t *this_gen, int property) {
+ caca_driver_t *this = (caca_driver_t*) this_gen;
+
+ if ( property == VO_PROP_ASPECT_RATIO) {
+ return this->user_ratio;
+ } else {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG,
+ "video_out_caca: tried to get unsupported property %d\n", property);
+ }
+
+ return 0;
+}
+
+static int caca_set_property (vo_driver_t *this_gen,
+ int property, int value) {
+ caca_driver_t *this = (caca_driver_t*) this_gen;
+
+ if ( property == VO_PROP_ASPECT_RATIO) {
+ if (value>=XINE_VO_ASPECT_NUM_RATIOS)
+ value = XINE_VO_ASPECT_AUTO;
+ this->user_ratio = value;
+
+ } else {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG,
+ "video_out_caca: tried to set unsupported property %d\n", property);
+ }
+
+ return value;
+}
+
+static void caca_get_property_min_max (vo_driver_t *this_gen,
+ int property, int *min, int *max) {
+ *min = 0;
+ *max = 0;
+}
+
+static void caca_dispose_driver (vo_driver_t *this_gen) {
+ caca_driver_t *this = (caca_driver_t*) this_gen;
+ this->yuv2rgb_factory->dispose (this->yuv2rgb_factory);
+
+ caca_end();
+}
+
+static int caca_redraw_needed (vo_driver_t *this_gen) {
+ return 0;
+}
+
+static vo_driver_t *open_plugin (video_driver_class_t *class_gen, const void *visual_gen) {
+ caca_class_t *class = (caca_class_t *) class_gen;
+ caca_driver_t *this;
+
+ this = (caca_driver_t*) xine_xmalloc (sizeof (caca_driver_t));
+
+ this->config = class->config;
+ this->xine = class->xine;
+
+ this->vo_driver.get_capabilities = caca_get_capabilities;
+ this->vo_driver.alloc_frame = caca_alloc_frame;
+ this->vo_driver.update_frame_format = caca_update_frame_format;
+ this->vo_driver.display_frame = caca_display_frame;
+ this->vo_driver.overlay_begin = NULL;
+ this->vo_driver.overlay_blend = NULL;
+ this->vo_driver.overlay_end = NULL;
+ this->vo_driver.get_property = caca_get_property;
+ this->vo_driver.set_property = caca_set_property;
+ this->vo_driver.get_property_min_max = caca_get_property_min_max;
+ this->vo_driver.gui_data_exchange = NULL;
+ this->vo_driver.redraw_needed = caca_redraw_needed;
+ this->vo_driver.dispose = caca_dispose_driver;
+
+ this->yuv2rgb_factory = yuv2rgb_factory_init(MODE_32_RGB, 0, NULL);
+ this->yuv2rgb_factory->set_csc_levels(this->yuv2rgb_factory, 0, 128, 128);
+
+ caca_init();
+ caca_refresh();
+
+ return &this->vo_driver;
+}
+
+static char* get_identifier (video_driver_class_t *this_gen) {
+ return "CACA";
+}
+
+static char* get_description (video_driver_class_t *this_gen) {
+ return _("xine video output plugin using the Color AsCii Art library");
+}
+
+static void dispose_class (video_driver_class_t *this_gen) {
+ caca_class_t *this = (caca_class_t *) this_gen;
+ free(this);
+}
+static void *init_class (xine_t *xine, void *visual_gen) {
+ caca_class_t *this;
+
+ this = (caca_class_t *) xine_xmalloc(sizeof(caca_class_t));
+
+ this->driver_class.open_plugin = open_plugin;
+ this->driver_class.get_identifier = get_identifier;
+ this->driver_class.get_description = get_description;
+ this->driver_class.dispose = dispose_class;
+
+ this->config = xine->config;
+ this->xine = xine;
+
+ return this;
+}
+
+static vo_info_t vo_info_caca = {
+ 6,
+ XINE_VISUAL_TYPE_CACA
+};
+
+plugin_info_t xine_plugin_info[] = {
+ /* type, API, "name", version, special_info, init_function */
+ { PLUGIN_VIDEO_OUT, 19, "caca", XINE_VERSION_CODE, &vo_info_caca, init_class },
+ { PLUGIN_NONE, 0, "", 0, NULL, NULL }
+};