From cbcc2cc3c185b5799f34a7918b44b743a70decab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20=27Flameeyes=27=20Petten=C3=B2?= Date: Wed, 4 Apr 2007 22:05:54 +0200 Subject: Move the Vorbis decoder from libvorbis to libxineadec, as it's a single file. --HG-- rename : src/libvorbis/xine_decoder.c => src/libxineadec/xine_vorbis_decoder.c --- configure.ac | 1 - src/Makefile.am | 1 - src/libvorbis/Makefile.am | 14 -- src/libvorbis/xine_decoder.c | 354 ---------------------------------- src/libxineadec/Makefile.am | 11 +- src/libxineadec/xine_vorbis_decoder.c | 354 ++++++++++++++++++++++++++++++++++ 6 files changed, 364 insertions(+), 371 deletions(-) delete mode 100644 src/libvorbis/Makefile.am delete mode 100644 src/libvorbis/xine_decoder.c create mode 100644 src/libxineadec/xine_vorbis_decoder.c diff --git a/configure.ac b/configure.ac index 724b87ff4..1e910bbca 100644 --- a/configure.ac +++ b/configure.ac @@ -2647,7 +2647,6 @@ src/libspucc/Makefile src/libspucmml/Makefile src/libspudvb/Makefile src/libsputext/Makefile -src/libvorbis/Makefile src/libtheora/Makefile src/libspeex/Makefile src/libw32dll/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 90f51ee50..86832bf18 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,7 +22,6 @@ SUBDIRS = \ libw32dll \ libxinevdec \ libxineadec \ - libvorbis \ libtheora \ libspeex \ libreal \ diff --git a/src/libvorbis/Makefile.am b/src/libvorbis/Makefile.am deleted file mode 100644 index 09abced93..000000000 --- a/src/libvorbis/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -libdir = $(XINE_PLUGINDIR) - -if HAVE_VORBIS -vorbis_module = xineplug_decode_vorbis.la -endif - -lib_LTLIBRARIES = $(vorbis_module) - -xineplug_decode_vorbis_la_SOURCES = xine_decoder.c -xineplug_decode_vorbis_la_LIBADD = $(VORBIS_LIBS) $(OGG_LIBS) $(XINE_LIB) -xineplug_decode_vorbis_la_CFLAGS = $(VORBIS_CFLAGS) $(VISIBILITY_FLAG) -xineplug_decode_vorbis_la_LDFLAGS = -avoid-version -module diff --git a/src/libvorbis/xine_decoder.c b/src/libvorbis/xine_decoder.c deleted file mode 100644 index ef8575949..000000000 --- a/src/libvorbis/xine_decoder.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (C) 2000-2003 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: xine_decoder.c,v 1.48 2006/12/04 13:59:38 dgp85 Exp $ - * - * (ogg/)vorbis audio decoder plugin (libvorbis wrapper) for xine - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#define LOG_MODULE "vorbis_decoder" -#define LOG_VERBOSE -/* -#define LOG -*/ - -#include "xine_internal.h" -#include "audio_out.h" -#include "buffer.h" - -#include -#include - -#define MAX_NUM_SAMPLES 4096 - -typedef struct { - audio_decoder_class_t decoder_class; -} vorbis_class_t; - -typedef struct vorbis_decoder_s { - audio_decoder_t audio_decoder; - - int64_t pts; - - int output_sampling_rate; - int output_open; - int output_mode; - - ogg_packet op; /* we must use this struct to sent data to libvorbis */ - - /* vorbis stuff */ - vorbis_info vi; /* stores static vorbis bitstream settings */ - vorbis_comment vc; - vorbis_dsp_state vd; /* central working state for packet->PCM decoder */ - vorbis_block vb; /* local working state for packet->PCM decoder */ - - int16_t convbuffer[MAX_NUM_SAMPLES]; - int convsize; - - int header_count; - - xine_stream_t *stream; - -} vorbis_decoder_t; - - -static void vorbis_reset (audio_decoder_t *this_gen) { - - vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; - - if( !this->header_count ) - vorbis_block_init(&this->vd,&this->vb); -} - -static void vorbis_discontinuity (audio_decoder_t *this_gen) { - - vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; - - this->pts=0; -} - -/* Known vorbis comment keys from ogg123 sources*/ -static struct { - char *key; /* includes the '=' for programming convenience */ - int xine_metainfo_index; -} vorbis_comment_keys[] = { - {"ARTIST=", XINE_META_INFO_ARTIST}, - {"ALBUM=", XINE_META_INFO_ALBUM}, - {"TITLE=", XINE_META_INFO_TITLE}, - {"GENRE=", XINE_META_INFO_GENRE}, - {"DESCRIPTION=", XINE_META_INFO_COMMENT}, - {"COMMENT=", XINE_META_INFO_COMMENT}, - {"DATE=", XINE_META_INFO_YEAR}, - {"TRACKNUMBER=", XINE_META_INFO_TRACK_NUMBER}, - {NULL, 0} -}; - -static void get_metadata (vorbis_decoder_t *this) { - - char **ptr=this->vc.user_comments; - while(*ptr){ - - char *comment = *ptr; - int i; - - lprintf("%s\n", comment); - - for (i = 0; vorbis_comment_keys[i].key != NULL; i++) { - - if ( !strncasecmp (vorbis_comment_keys[i].key, comment, - strlen(vorbis_comment_keys[i].key)) ) { - - lprintf ("known metadata %d %d\n", - i, vorbis_comment_keys[i].xine_metainfo_index); - - _x_meta_info_set_utf8(this->stream, vorbis_comment_keys[i].xine_metainfo_index, - comment + strlen(vorbis_comment_keys[i].key)); - - } - } - ++ptr; - } - - _x_meta_info_set_utf8(this->stream, XINE_META_INFO_AUDIOCODEC, "vorbis"); -} - -static void vorbis_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) { - - vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; - - memset( &this->op, 0, sizeof(this->op) ); - this->op.packet = buf->content; - this->op.bytes = buf->size; - - if ( (buf->decoder_flags & BUF_FLAG_HEADER) && - !(buf->decoder_flags & BUF_FLAG_STDHEADER) ) { - lprintf ("%d headers to go\n", this->header_count); - - if (this->header_count) { - int res = 0; - - if (this->header_count == 3) - this->op.b_o_s = 1; - - - if( (res = vorbis_synthesis_headerin(&this->vi,&this->vc,&this->op)) < 0 ){ - /* error case; not a vorbis header */ - xine_log(this->stream->xine, XINE_LOG_MSG, "libvorbis: this bitstream does not contain vorbis audio data. Following first 64 bytes (return: %d).\n", res); - xine_hexdump(this->op.packet, this->op.bytes < 64 ? this->op.bytes : 64); - return; - } - - this->header_count--; - - if (!this->header_count) { - - int mode = AO_CAP_MODE_MONO; - - get_metadata (this); - - mode = _x_ao_channels2mode(this->vi.channels); - - this->convsize=MAX_NUM_SAMPLES/this->vi.channels; - - if (!this->output_open) { - this->output_open = this->stream->audio_out->open(this->stream->audio_out, - this->stream, - 16, - this->vi.rate, - mode) ; - - _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITRATE, - this->vi.bitrate_nominal); - - } - - /* OK, got and parsed all three headers. Initialize the Vorbis - * packet->PCM decoder. */ - lprintf("all three headers parsed. initializing decoder.\n"); - /* initialize central decode state */ - vorbis_synthesis_init(&this->vd,&this->vi); - /* initialize local state for most of the decode so multiple - * block decodes can proceed in parallel. We could init - * multiple vorbis_block structures for vd here */ - vorbis_block_init(&this->vd,&this->vb); - } - } - - } else if (this->output_open) { - - float **pcm; - int samples; - - if(vorbis_synthesis(&this->vb,&this->op)==0) - vorbis_synthesis_blockin(&this->vd,&this->vb); - - if (buf->pts!=0) - this->pts=buf->pts; - - while ((samples=vorbis_synthesis_pcmout(&this->vd,&pcm))>0){ - - /* **pcm is a multichannel float vector. In stereo, for - * example, pcm[0][...] is left, and pcm[1][...] is right. - * samples is the size of each channel. Convert the float - * values (-1.<=range<=1.) to whatever PCM format and write - * it out - */ - - int i,j; - int clipflag=0; - int bout=(samplesconvsize?samples:this->convsize); - audio_buffer_t *audio_buffer; - - audio_buffer = this->stream->audio_out->get_buffer (this->stream->audio_out); - - /* convert floats to 16 bit signed ints (host order) and - interleave */ - for(i=0;ivi.channels;i++){ - ogg_int16_t *ptr=audio_buffer->mem+i; - float *mono=pcm[i]; - for(j=0;j32767){ - val=32767; - clipflag=1; - } - if(val<-32768){ - val=-32768; - clipflag=1; - } - *ptr=val; - ptr+=this->vi.channels; - } - } - - audio_buffer->vpts = this->pts; - this->pts=0; - audio_buffer->num_frames = bout; - - this->stream->audio_out->put_buffer (this->stream->audio_out, audio_buffer, this->stream); - - buf->pts=0; - - /* tell libvorbis how many samples we actually consumed */ - vorbis_synthesis_read(&this->vd,bout); - } - } - lprintf("output not open\n"); -} - -static void vorbis_dispose (audio_decoder_t *this_gen) { - - vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; - - if( !this->header_count ) { - lprintf("deinitializing decoder\n"); - - vorbis_block_clear(&this->vb); - vorbis_dsp_clear(&this->vd); - } - - vorbis_comment_clear(&this->vc); - - vorbis_info_clear(&this->vi); /* must be called last */ - - if (this->output_open) - this->stream->audio_out->close (this->stream->audio_out, this->stream); - - lprintf("libvorbis instance destroyed\n"); - - free (this_gen); -} - -static audio_decoder_t *open_plugin (audio_decoder_class_t *class_gen, - xine_stream_t *stream) { - - vorbis_decoder_t *this ; - - this = (vorbis_decoder_t *) xine_xmalloc (sizeof (vorbis_decoder_t)); - - this->audio_decoder.decode_data = vorbis_decode_data; - this->audio_decoder.reset = vorbis_reset; - this->audio_decoder.discontinuity = vorbis_discontinuity; - this->audio_decoder.dispose = vorbis_dispose; - this->stream = stream; - - this->output_open = 0; - this->header_count = 3; - this->convsize = 0; - - vorbis_info_init(&this->vi); - vorbis_comment_init(&this->vc); - - lprintf("libvorbis decoder instance created\n"); - - return (audio_decoder_t *) this; -} - -/* - * vorbis plugin class - */ - -static char *get_identifier (audio_decoder_class_t *this) { - return "vorbis"; -} - -static char *get_description (audio_decoder_class_t *this) { - return "vorbis audio decoder plugin"; -} - -static void dispose_class (audio_decoder_class_t *this) { - free (this); -} - -static void *init_plugin (xine_t *xine, void *data) { - - vorbis_class_t *this; - - this = (vorbis_class_t *) xine_xmalloc (sizeof (vorbis_class_t)); - - this->decoder_class.open_plugin = open_plugin; - this->decoder_class.get_identifier = get_identifier; - this->decoder_class.get_description = get_description; - this->decoder_class.dispose = dispose_class; - - return this; -} - -static uint32_t audio_types[] = { - BUF_AUDIO_VORBIS, 0 - }; - -static const decoder_info_t dec_info_audio = { - audio_types, /* supported types */ - 5 /* priority */ -}; - -const plugin_info_t xine_plugin_info[] EXPORTED = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_AUDIO_DECODER, 15, "vorbis", XINE_VERSION_CODE, &dec_info_audio, init_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; diff --git a/src/libxineadec/Makefile.am b/src/libxineadec/Makefile.am index 373347aaa..f2e3b4aa0 100644 --- a/src/libxineadec/Makefile.am +++ b/src/libxineadec/Makefile.am @@ -6,10 +6,15 @@ SUBDIRS = gsm610 nosefart AM_LDFLAGS = $(xineplug_ldflags) +if HAVE_VORBIS +vorbis_module = xineplug_decode_vorbis.la +endif + xineplug_LTLIBRARIES = \ xineplug_decode_gsm610.la \ xineplug_decode_nsf.la \ - xineplug_decode_lpcm.la + xineplug_decode_lpcm.la \ + $(vorbis_module) xineplug_decode_gsm610_la_SOURCES = gsm610.c xineplug_decode_gsm610_la_CFLAGS = $(VISIBILITY_FLAG) @@ -22,3 +27,7 @@ xineplug_decode_nsf_la_LIBADD = $(XINE_LIB) -lm nosefart/libnosefart.la xineplug_decode_lpcm_la_SOURCES = xine_lpcm_decoder.c xineplug_decode_lpcm_la_CFLAGS = $(VISIBILITY_FLAG) xineplug_decode_lpcm_la_LIBADD = $(XINE_LIB) + +xineplug_decode_vorbis_la_SOURCES = xine_vorbis_decoder.c +xineplug_decode_vorbis_la_LIBADD = $(XINE_LIB) $(VORBIS_LIBS) $(OGG_LIBS) +xineplug_decode_vorbis_la_CFLAGS = $(VISIBILITY_FLAG) $(VORBIS_CFLAGS) diff --git a/src/libxineadec/xine_vorbis_decoder.c b/src/libxineadec/xine_vorbis_decoder.c new file mode 100644 index 000000000..ef8575949 --- /dev/null +++ b/src/libxineadec/xine_vorbis_decoder.c @@ -0,0 +1,354 @@ +/* + * Copyright (C) 2000-2003 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: xine_decoder.c,v 1.48 2006/12/04 13:59:38 dgp85 Exp $ + * + * (ogg/)vorbis audio decoder plugin (libvorbis wrapper) for xine + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#define LOG_MODULE "vorbis_decoder" +#define LOG_VERBOSE +/* +#define LOG +*/ + +#include "xine_internal.h" +#include "audio_out.h" +#include "buffer.h" + +#include +#include + +#define MAX_NUM_SAMPLES 4096 + +typedef struct { + audio_decoder_class_t decoder_class; +} vorbis_class_t; + +typedef struct vorbis_decoder_s { + audio_decoder_t audio_decoder; + + int64_t pts; + + int output_sampling_rate; + int output_open; + int output_mode; + + ogg_packet op; /* we must use this struct to sent data to libvorbis */ + + /* vorbis stuff */ + vorbis_info vi; /* stores static vorbis bitstream settings */ + vorbis_comment vc; + vorbis_dsp_state vd; /* central working state for packet->PCM decoder */ + vorbis_block vb; /* local working state for packet->PCM decoder */ + + int16_t convbuffer[MAX_NUM_SAMPLES]; + int convsize; + + int header_count; + + xine_stream_t *stream; + +} vorbis_decoder_t; + + +static void vorbis_reset (audio_decoder_t *this_gen) { + + vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; + + if( !this->header_count ) + vorbis_block_init(&this->vd,&this->vb); +} + +static void vorbis_discontinuity (audio_decoder_t *this_gen) { + + vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; + + this->pts=0; +} + +/* Known vorbis comment keys from ogg123 sources*/ +static struct { + char *key; /* includes the '=' for programming convenience */ + int xine_metainfo_index; +} vorbis_comment_keys[] = { + {"ARTIST=", XINE_META_INFO_ARTIST}, + {"ALBUM=", XINE_META_INFO_ALBUM}, + {"TITLE=", XINE_META_INFO_TITLE}, + {"GENRE=", XINE_META_INFO_GENRE}, + {"DESCRIPTION=", XINE_META_INFO_COMMENT}, + {"COMMENT=", XINE_META_INFO_COMMENT}, + {"DATE=", XINE_META_INFO_YEAR}, + {"TRACKNUMBER=", XINE_META_INFO_TRACK_NUMBER}, + {NULL, 0} +}; + +static void get_metadata (vorbis_decoder_t *this) { + + char **ptr=this->vc.user_comments; + while(*ptr){ + + char *comment = *ptr; + int i; + + lprintf("%s\n", comment); + + for (i = 0; vorbis_comment_keys[i].key != NULL; i++) { + + if ( !strncasecmp (vorbis_comment_keys[i].key, comment, + strlen(vorbis_comment_keys[i].key)) ) { + + lprintf ("known metadata %d %d\n", + i, vorbis_comment_keys[i].xine_metainfo_index); + + _x_meta_info_set_utf8(this->stream, vorbis_comment_keys[i].xine_metainfo_index, + comment + strlen(vorbis_comment_keys[i].key)); + + } + } + ++ptr; + } + + _x_meta_info_set_utf8(this->stream, XINE_META_INFO_AUDIOCODEC, "vorbis"); +} + +static void vorbis_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) { + + vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; + + memset( &this->op, 0, sizeof(this->op) ); + this->op.packet = buf->content; + this->op.bytes = buf->size; + + if ( (buf->decoder_flags & BUF_FLAG_HEADER) && + !(buf->decoder_flags & BUF_FLAG_STDHEADER) ) { + lprintf ("%d headers to go\n", this->header_count); + + if (this->header_count) { + int res = 0; + + if (this->header_count == 3) + this->op.b_o_s = 1; + + + if( (res = vorbis_synthesis_headerin(&this->vi,&this->vc,&this->op)) < 0 ){ + /* error case; not a vorbis header */ + xine_log(this->stream->xine, XINE_LOG_MSG, "libvorbis: this bitstream does not contain vorbis audio data. Following first 64 bytes (return: %d).\n", res); + xine_hexdump(this->op.packet, this->op.bytes < 64 ? this->op.bytes : 64); + return; + } + + this->header_count--; + + if (!this->header_count) { + + int mode = AO_CAP_MODE_MONO; + + get_metadata (this); + + mode = _x_ao_channels2mode(this->vi.channels); + + this->convsize=MAX_NUM_SAMPLES/this->vi.channels; + + if (!this->output_open) { + this->output_open = this->stream->audio_out->open(this->stream->audio_out, + this->stream, + 16, + this->vi.rate, + mode) ; + + _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITRATE, + this->vi.bitrate_nominal); + + } + + /* OK, got and parsed all three headers. Initialize the Vorbis + * packet->PCM decoder. */ + lprintf("all three headers parsed. initializing decoder.\n"); + /* initialize central decode state */ + vorbis_synthesis_init(&this->vd,&this->vi); + /* initialize local state for most of the decode so multiple + * block decodes can proceed in parallel. We could init + * multiple vorbis_block structures for vd here */ + vorbis_block_init(&this->vd,&this->vb); + } + } + + } else if (this->output_open) { + + float **pcm; + int samples; + + if(vorbis_synthesis(&this->vb,&this->op)==0) + vorbis_synthesis_blockin(&this->vd,&this->vb); + + if (buf->pts!=0) + this->pts=buf->pts; + + while ((samples=vorbis_synthesis_pcmout(&this->vd,&pcm))>0){ + + /* **pcm is a multichannel float vector. In stereo, for + * example, pcm[0][...] is left, and pcm[1][...] is right. + * samples is the size of each channel. Convert the float + * values (-1.<=range<=1.) to whatever PCM format and write + * it out + */ + + int i,j; + int clipflag=0; + int bout=(samplesconvsize?samples:this->convsize); + audio_buffer_t *audio_buffer; + + audio_buffer = this->stream->audio_out->get_buffer (this->stream->audio_out); + + /* convert floats to 16 bit signed ints (host order) and + interleave */ + for(i=0;ivi.channels;i++){ + ogg_int16_t *ptr=audio_buffer->mem+i; + float *mono=pcm[i]; + for(j=0;j32767){ + val=32767; + clipflag=1; + } + if(val<-32768){ + val=-32768; + clipflag=1; + } + *ptr=val; + ptr+=this->vi.channels; + } + } + + audio_buffer->vpts = this->pts; + this->pts=0; + audio_buffer->num_frames = bout; + + this->stream->audio_out->put_buffer (this->stream->audio_out, audio_buffer, this->stream); + + buf->pts=0; + + /* tell libvorbis how many samples we actually consumed */ + vorbis_synthesis_read(&this->vd,bout); + } + } + lprintf("output not open\n"); +} + +static void vorbis_dispose (audio_decoder_t *this_gen) { + + vorbis_decoder_t *this = (vorbis_decoder_t *) this_gen; + + if( !this->header_count ) { + lprintf("deinitializing decoder\n"); + + vorbis_block_clear(&this->vb); + vorbis_dsp_clear(&this->vd); + } + + vorbis_comment_clear(&this->vc); + + vorbis_info_clear(&this->vi); /* must be called last */ + + if (this->output_open) + this->stream->audio_out->close (this->stream->audio_out, this->stream); + + lprintf("libvorbis instance destroyed\n"); + + free (this_gen); +} + +static audio_decoder_t *open_plugin (audio_decoder_class_t *class_gen, + xine_stream_t *stream) { + + vorbis_decoder_t *this ; + + this = (vorbis_decoder_t *) xine_xmalloc (sizeof (vorbis_decoder_t)); + + this->audio_decoder.decode_data = vorbis_decode_data; + this->audio_decoder.reset = vorbis_reset; + this->audio_decoder.discontinuity = vorbis_discontinuity; + this->audio_decoder.dispose = vorbis_dispose; + this->stream = stream; + + this->output_open = 0; + this->header_count = 3; + this->convsize = 0; + + vorbis_info_init(&this->vi); + vorbis_comment_init(&this->vc); + + lprintf("libvorbis decoder instance created\n"); + + return (audio_decoder_t *) this; +} + +/* + * vorbis plugin class + */ + +static char *get_identifier (audio_decoder_class_t *this) { + return "vorbis"; +} + +static char *get_description (audio_decoder_class_t *this) { + return "vorbis audio decoder plugin"; +} + +static void dispose_class (audio_decoder_class_t *this) { + free (this); +} + +static void *init_plugin (xine_t *xine, void *data) { + + vorbis_class_t *this; + + this = (vorbis_class_t *) xine_xmalloc (sizeof (vorbis_class_t)); + + this->decoder_class.open_plugin = open_plugin; + this->decoder_class.get_identifier = get_identifier; + this->decoder_class.get_description = get_description; + this->decoder_class.dispose = dispose_class; + + return this; +} + +static uint32_t audio_types[] = { + BUF_AUDIO_VORBIS, 0 + }; + +static const decoder_info_t dec_info_audio = { + audio_types, /* supported types */ + 5 /* priority */ +}; + +const plugin_info_t xine_plugin_info[] EXPORTED = { + /* type, API, "name", version, special_info, init_function */ + { PLUGIN_AUDIO_DECODER, 15, "vorbis", XINE_VERSION_CODE, &dec_info_audio, init_plugin }, + { PLUGIN_NONE, 0, "", 0, NULL, NULL } +}; -- cgit v1.2.3