diff options
author | František Dvořák <valtri@users.sourceforge.net> | 2004-02-28 19:56:41 +0000 |
---|---|---|
committer | František Dvořák <valtri@users.sourceforge.net> | 2004-02-28 19:56:41 +0000 |
commit | a657c3df2f453941b115de0ece3ad8d849d58a6b (patch) | |
tree | 8546f3fa258309d8169853ebd7bf24fb95ccb7c1 | |
parent | 29508eee9641ffeba9b372da6197f5176c2c58dc (diff) | |
download | xine-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-- | AUTHORS | 3 | ||||
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | configure.ac | 11 | ||||
-rw-r--r-- | include/xine.h.in | 3 | ||||
-rw-r--r-- | m4/Makefile.am | 1 | ||||
-rw-r--r-- | m4/caca.m4 | 163 | ||||
-rw-r--r-- | src/video_out/Makefile.am | 12 | ||||
-rw-r--r-- | src/video_out/video_out_caca.c | 343 |
8 files changed, 535 insertions, 2 deletions
@@ -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) @@ -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 } +}; |