From a50b19e9216dbbf9c76569bdde171f550d476db8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 16 Dec 2002 19:49:42 +0000 Subject: [PATCH] Added non functional speex plugin. speex decoding needs a container. Original commit message from CVS: Added non functional speex plugin. speex decoding needs a container. --- ext/speex/Makefile.am | 10 ++ ext/speex/gstspeex.c | 110 +++++++++++++++++++++ ext/speex/gstspeexdec.c | 154 +++++++++++++++++++++++++++++ ext/speex/gstspeexdec.h | 67 +++++++++++++ ext/speex/gstspeexenc.c | 251 ++++++++++++++++++++++++++++++++++++++++++++++++ ext/speex/gstspeexenc.h | 87 +++++++++++++++++ 6 files changed, 679 insertions(+) create mode 100644 ext/speex/Makefile.am create mode 100644 ext/speex/gstspeex.c create mode 100644 ext/speex/gstspeexdec.c create mode 100644 ext/speex/gstspeexdec.h create mode 100644 ext/speex/gstspeexenc.c create mode 100644 ext/speex/gstspeexenc.h diff --git a/ext/speex/Makefile.am b/ext/speex/Makefile.am new file mode 100644 index 0000000..7d0a65f --- /dev/null +++ b/ext/speex/Makefile.am @@ -0,0 +1,10 @@ +plugindir = $(libdir)/gst + +plugin_LTLIBRARIES = libgstspeex.la + +libgstspeex_la_SOURCES = gstspeex.c gstspeexdec.c gstspeexenc.c +libgstspeex_la_CFLAGS = $(GST_CFLAGS) +libgstspeex_la_LIBADD = -lspeex +libgstspeex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +noinst_HEADERS = gstspeexenc.h gstspeexdec.h diff --git a/ext/speex/gstspeex.c b/ext/speex/gstspeex.c new file mode 100644 index 0000000..f167749 --- /dev/null +++ b/ext/speex/gstspeex.c @@ -0,0 +1,110 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include "gstspeexdec.h" +#include "gstspeexenc.h" + +/* elementfactory information */ +extern GstElementDetails gst_speexdec_details; +extern GstElementDetails gst_speexenc_details; + +GstPadTemplate *speexdec_src_template, *speexdec_sink_template; +GstPadTemplate *speexenc_src_template, *speexenc_sink_template; + +GST_CAPS_FACTORY (speex_caps_factory, + GST_CAPS_NEW ( + "speex_speex", + "audio/x-speex", + "rate", GST_PROPS_INT_RANGE (1000, 48000) + ) +) + +GST_CAPS_FACTORY (raw_caps_factory, + GST_CAPS_NEW ( + "speex_raw", + "audio/raw", + "format", GST_PROPS_STRING ("int"), + "law", GST_PROPS_INT (0), + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "signed", GST_PROPS_BOOLEAN (TRUE), + "width", GST_PROPS_INT (16), + "depth", GST_PROPS_INT (16), + "rate", GST_PROPS_INT_RANGE (1000, 48000), + "channels", GST_PROPS_INT (1) + ) +) + +static gboolean +plugin_init (GModule *module, GstPlugin *plugin) +{ + GstElementFactory *dec, *enc; + GstCaps *raw_caps, *speex_caps; + + /* create an elementfactory for the speexdec element */ + enc = gst_element_factory_new("speexenc",GST_TYPE_SPEEXENC, + &gst_speexenc_details); + g_return_val_if_fail(enc != NULL, FALSE); + + raw_caps = GST_CAPS_GET (raw_caps_factory); + speex_caps = GST_CAPS_GET (speex_caps_factory); + + /* register sink pads */ + speexenc_sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, + GST_PAD_ALWAYS, + raw_caps, NULL); + gst_element_factory_add_pad_template (enc, speexenc_sink_template); + + /* register src pads */ + speexenc_src_template = gst_pad_template_new ("src", GST_PAD_SRC, + GST_PAD_ALWAYS, + speex_caps, NULL); + gst_element_factory_add_pad_template (enc, speexenc_src_template); + + gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (enc)); + + /* create an elementfactory for the speexdec element */ + dec = gst_element_factory_new("speexdec",GST_TYPE_SPEEXDEC, + &gst_speexdec_details); + g_return_val_if_fail(dec != NULL, FALSE); + gst_element_factory_set_rank (dec, GST_ELEMENT_RANK_PRIMARY); + + /* register sink pads */ + speexdec_sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, + GST_PAD_ALWAYS, + speex_caps, NULL); + gst_element_factory_add_pad_template (dec, speexdec_sink_template); + + /* register src pads */ + speexdec_src_template = gst_pad_template_new ("src", GST_PAD_SRC, + GST_PAD_ALWAYS, + raw_caps, NULL); + gst_element_factory_add_pad_template (dec, speexdec_src_template); + + gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (dec)); + + return TRUE; +} + +GstPluginDesc plugin_desc = { + GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "speex", + plugin_init +}; diff --git a/ext/speex/gstspeexdec.c b/ext/speex/gstspeexdec.c new file mode 100644 index 0000000..c696e89 --- /dev/null +++ b/ext/speex/gstspeexdec.c @@ -0,0 +1,154 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include + +#include "gstspeexdec.h" + +extern GstPadTemplate *speexdec_src_template, *speexdec_sink_template; + +/* elementfactory information */ +GstElementDetails gst_speexdec_details = { + "speex audio decoder", + "Codec/Audio/Decoder", + ".speex", + VERSION, + "Wim Taymans ", + "(C) 2000", +}; + +/* SpeexDec signals and args */ +enum { + /* FILL ME */ + LAST_SIGNAL +}; + +enum { + ARG_0, + /* FILL ME */ +}; + +static void gst_speexdec_class_init (GstSpeexDec *klass); +static void gst_speexdec_init (GstSpeexDec *speexdec); + +static void gst_speexdec_chain (GstPad *pad, GstBuffer *buf); +static GstPadConnectReturn gst_speexdec_sinkconnect (GstPad *pad, GstCaps *caps); + +static GstElementClass *parent_class = NULL; +/*static guint gst_speexdec_signals[LAST_SIGNAL] = { 0 }; */ + +GType +gst_speexdec_get_type(void) { + static GType speexdec_type = 0; + + if (!speexdec_type) { + static const GTypeInfo speexdec_info = { + sizeof(GstSpeexDecClass), NULL, + NULL, + (GClassInitFunc)gst_speexdec_class_init, + NULL, + NULL, + sizeof(GstSpeexDec), + 0, + (GInstanceInitFunc)gst_speexdec_init, + }; + speexdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSpeexDec", &speexdec_info, 0); + } + return speexdec_type; +} + +static void +gst_speexdec_class_init (GstSpeexDec *klass) +{ + GstElementClass *gstelement_class; + + gstelement_class = (GstElementClass*)klass; + + parent_class = g_type_class_ref(GST_TYPE_ELEMENT); +} + +static void +gst_speexdec_init (GstSpeexDec *speexdec) +{ + GST_DEBUG (0,"gst_speexdec_init: initializing"); + + /* create the sink and src pads */ + speexdec->sinkpad = gst_pad_new_from_template (speexdec_sink_template, "sink"); + gst_element_add_pad (GST_ELEMENT (speexdec), speexdec->sinkpad); + gst_pad_set_chain_function (speexdec->sinkpad, gst_speexdec_chain); + gst_pad_set_connect_function (speexdec->sinkpad, gst_speexdec_sinkconnect); + + speexdec->srcpad = gst_pad_new_from_template (speexdec_src_template, "src"); + gst_element_add_pad (GST_ELEMENT (speexdec), speexdec->srcpad); + +} + +static GstPadConnectReturn +gst_speexdec_sinkconnect (GstPad *pad, GstCaps *caps) +{ + GstSpeexDec *speexdec; + gint rate; + + speexdec = GST_SPEEXDEC (gst_pad_get_parent (pad)); + + if (!GST_CAPS_IS_FIXED (caps)) + return GST_PAD_CONNECT_DELAYED; + + gst_caps_get_int (caps, "rate", &rate); + + if (gst_pad_try_set_caps (speexdec->srcpad, + GST_CAPS_NEW ( + "speex_raw", + "audio/raw", + "format", GST_PROPS_STRING ("int"), + "law", GST_PROPS_INT (0), + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "signed", GST_PROPS_BOOLEAN (TRUE), + "width", GST_PROPS_INT (16), + "depth", GST_PROPS_INT (16), + "rate", GST_PROPS_INT (rate), + "channels", GST_PROPS_INT (1) + ))) + { + return GST_PAD_CONNECT_OK; + } + return GST_PAD_CONNECT_REFUSED; +} + +static void +gst_speexdec_chain (GstPad *pad, GstBuffer *buf) +{ + GstSpeexDec *speexdec; + gchar *data; + guint size; + + g_return_if_fail(pad != NULL); + g_return_if_fail(GST_IS_PAD(pad)); + g_return_if_fail(buf != NULL); + /*g_return_if_fail(GST_IS_BUFFER(buf)); */ + + speexdec = GST_SPEEXDEC (gst_pad_get_parent (pad)); + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + gst_buffer_unref(buf); +} + diff --git a/ext/speex/gstspeexdec.h b/ext/speex/gstspeexdec.h new file mode 100644 index 0000000..c6fe3e9 --- /dev/null +++ b/ext/speex/gstspeexdec.h @@ -0,0 +1,67 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __GST_SPEEXDEC_H__ +#define __GST_SPEEXDEC_H__ + + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define GST_TYPE_SPEEXDEC \ + (gst_speexdec_get_type()) +#define GST_SPEEXDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPEEXDEC,GstSpeexDec)) +#define GST_SPEEXDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPEEXDEC,GstSpeexDec)) +#define GST_IS_SPEEXDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEEXDEC)) +#define GST_IS_SPEEXDEC_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEXDEC)) + +typedef struct _GstSpeexDec GstSpeexDec; +typedef struct _GstSpeexDecClass GstSpeexDecClass; + +struct _GstSpeexDec { + GstElement element; + + /* pads */ + GstPad *sinkpad,*srcpad; +}; + +struct _GstSpeexDecClass { + GstElementClass parent_class; +}; + +GType gst_speexdec_get_type(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __GST_SPEEXDEC_H__ */ diff --git a/ext/speex/gstspeexenc.c b/ext/speex/gstspeexenc.c new file mode 100644 index 0000000..20bce44 --- /dev/null +++ b/ext/speex/gstspeexenc.c @@ -0,0 +1,251 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include + +#include "gstspeexenc.h" + +extern GstPadTemplate *speexenc_src_template, *speexenc_sink_template; + +/* elementfactory information */ +GstElementDetails gst_speexenc_details = { + "speex audio encoder", + "Codec/Audio/Encoder", + ".speex", + VERSION, + "Wim Taymans ", + "(C) 2000", +}; + +/* SpeexEnc signals and args */ +enum { + FRAME_ENCODED, + /* FILL ME */ + LAST_SIGNAL +}; + +enum { + ARG_0, + /* FILL ME */ +}; + +static void gst_speexenc_class_init (GstSpeexEnc *klass); +static void gst_speexenc_init (GstSpeexEnc *speexenc); + +static void gst_speexenc_chain (GstPad *pad,GstBuffer *buf); +static GstPadConnectReturn gst_speexenc_sinkconnect (GstPad *pad, GstCaps *caps); + +static GstElementClass *parent_class = NULL; +static guint gst_speexenc_signals[LAST_SIGNAL] = { 0 }; + +GType +gst_speexenc_get_type (void) +{ + static GType speexenc_type = 0; + + if (!speexenc_type) { + static const GTypeInfo speexenc_info = { + sizeof (GstSpeexEncClass), + NULL, + NULL, + (GClassInitFunc) gst_speexenc_class_init, + NULL, + NULL, + sizeof (GstSpeexEnc), + 0, + (GInstanceInitFunc) gst_speexenc_init, + }; + speexenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSpeexEnc", &speexenc_info, 0); + } + return speexenc_type; +} + +static void +gst_speexenc_class_init (GstSpeexEnc *klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass*) klass; + gstelement_class = (GstElementClass*) klass; + + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + + gst_speexenc_signals[FRAME_ENCODED] = + g_signal_new ("frame_encoded", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstSpeexEncClass, frame_encoded), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); +} + + +static void +gst_speexenc_init (GstSpeexEnc *speexenc) +{ + /* create the sink and src pads */ + speexenc->sinkpad = gst_pad_new_from_template (speexenc_sink_template, "sink"); + gst_element_add_pad (GST_ELEMENT (speexenc), speexenc->sinkpad); + gst_pad_set_chain_function (speexenc->sinkpad, gst_speexenc_chain); + gst_pad_set_connect_function (speexenc->sinkpad, gst_speexenc_sinkconnect); + + speexenc->srcpad = gst_pad_new_from_template (speexenc_src_template, "src"); + gst_element_add_pad (GST_ELEMENT (speexenc), speexenc->srcpad); + + speex_bits_init(&speexenc->bits); + speexenc->mode = &speex_nb_mode; + speexenc->bufsize = 0; + speexenc->packet_count = 0; + speexenc->n_packets = 20; +} + +static GstPadConnectReturn +gst_speexenc_sinkconnect (GstPad *pad, GstCaps *caps) +{ + GstSpeexEnc *speexenc; + + speexenc = GST_SPEEXENC (gst_pad_get_parent (pad)); + + if (!GST_CAPS_IS_FIXED (caps)) + return GST_PAD_CONNECT_DELAYED; + + gst_caps_get_int (caps, "rate", &speexenc->rate); + if (gst_pad_try_set_caps (speexenc->srcpad, GST_CAPS_NEW ( + "speex_speex", + "audio/x-speex", + "rate", GST_PROPS_INT (speexenc->rate) + ))) + { + speex_init_header(&speexenc->header, speexenc->rate, 1, speexenc->mode); + speexenc->header.frames_per_packet = speexenc->n_packets; + + speexenc->state = speex_encoder_init(speexenc->mode); + speex_encoder_ctl(speexenc->state, SPEEX_GET_FRAME_SIZE, &speexenc->frame_size); + + return GST_PAD_CONNECT_OK; + } + return GST_PAD_CONNECT_REFUSED; + +} + +static void +gst_speexenc_chain (GstPad *pad, GstBuffer *buf) +{ + GstSpeexEnc *speexenc; + GstBuffer *outbuf; + gint16 *data; + guint8 *header_data; + gint size; + float input[1000]; + gint frame_size; + gint i; + + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); + + speexenc = GST_SPEEXENC (GST_OBJECT_PARENT (pad)); + + if (!GST_PAD_CAPS (speexenc->srcpad)) { + + if (!gst_pad_try_set_caps (speexenc->srcpad, + GST_CAPS_NEW ( + "speex_enc", + "audio/x-speex", + "rate", GST_PROPS_INT (speexenc->rate) + ))) + { + gst_element_error (GST_ELEMENT (speexenc), "could not negotiate"); + return; + } + } + + if (speexenc->packet_count == 0) { + header_data = speex_header_to_packet(&speexenc->header, &size); + + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = header_data; + GST_BUFFER_SIZE (outbuf) = size; + + gst_pad_push (speexenc->srcpad, outbuf); + } + + data = (gint16 *) GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf) / sizeof (gint16); + + frame_size = speexenc->frame_size; + + if (speexenc->bufsize && (speexenc->bufsize + size >= frame_size)) { + memcpy (speexenc->buffer + speexenc->bufsize, data, (frame_size - speexenc->bufsize) * sizeof (gint16)); + + for (i = 0; i < frame_size; i++) + input[i] = speexenc->buffer[i]; + + speex_encode (speexenc->state, input, &speexenc->bits); + speexenc->packet_count++; + + if (speexenc->packet_count % speexenc->n_packets == 0) { + GstBuffer *outbuf; + + outbuf = gst_buffer_new_and_alloc (frame_size * speexenc->n_packets); + GST_BUFFER_SIZE (outbuf) = speex_bits_write(&speexenc->bits, + GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); + GST_BUFFER_TIMESTAMP (outbuf) = speexenc->next_ts; + speex_bits_reset(&speexenc->bits); + + gst_pad_push (speexenc->srcpad, outbuf); + speexenc->next_ts += frame_size * GST_SECOND / speexenc->rate; + } + + size -= (speexenc->frame_size - speexenc->bufsize); + data += (speexenc->frame_size - speexenc->bufsize); + + speexenc->bufsize = 0; + } + + while (size >= frame_size) { + for (i = 0; i < frame_size; i++) + input[i] = data[i]; + + speex_encode (speexenc->state, input, &speexenc->bits); + speexenc->packet_count++; + + if (speexenc->packet_count % speexenc->n_packets == 0) { + GstBuffer *outbuf; + + outbuf = gst_buffer_new_and_alloc (frame_size * speexenc->n_packets); + GST_BUFFER_SIZE (outbuf) = speex_bits_write(&speexenc->bits, + GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); + GST_BUFFER_TIMESTAMP (outbuf) = speexenc->next_ts; + speex_bits_reset(&speexenc->bits); + + gst_pad_push (speexenc->srcpad, outbuf); + speexenc->next_ts += frame_size * GST_SECOND / speexenc->rate; + } + + size -= frame_size; + data += frame_size; + } + + if (size) { + memcpy (speexenc->buffer + speexenc->bufsize, data, size * sizeof (gint16)); + speexenc->bufsize += size; + } + + gst_buffer_unref(buf); +} diff --git a/ext/speex/gstspeexenc.h b/ext/speex/gstspeexenc.h new file mode 100644 index 0000000..a7fa772 --- /dev/null +++ b/ext/speex/gstspeexenc.h @@ -0,0 +1,87 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __GST_SPEEXENC_H__ +#define __GST_SPEEXENC_H__ + + +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define GST_TYPE_SPEEXENC \ + (gst_speexenc_get_type()) +#define GST_SPEEXENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPEEXENC,GstSpeexEnc)) +#define GST_SPEEXENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPEEXENC,GstSpeexEnc)) +#define GST_IS_SPEEXENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEEXENC)) +#define GST_IS_SPEEXENC_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEXENC)) + +typedef struct _GstSpeexEnc GstSpeexEnc; +typedef struct _GstSpeexEncClass GstSpeexEncClass; + +struct _GstSpeexEnc { + GstElement element; + + /* pads */ + GstPad *sinkpad, + *srcpad; + + gint packet_count; + gint n_packets; + + SpeexBits bits; + SpeexHeader header; + SpeexMode *mode; + void *state; + gint frame_size; + gint16 buffer[2000]; + gint bufsize; + guint64 next_ts; + + gint rate; +}; + +struct _GstSpeexEncClass { + GstElementClass parent_class; + + /* signals */ + void (*frame_encoded) (GstElement *element); +}; + +GType gst_speexenc_get_type(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __GST_SPEEXENC_H__ */ -- 2.7.4