diff options
-rw-r--r-- | gst/passthrough/gstpassthrough.c | 184 | ||||
-rw-r--r-- | gst/passthrough/gstpassthrough.h | 14 |
2 files changed, 83 insertions, 115 deletions
diff --git a/gst/passthrough/gstpassthrough.c b/gst/passthrough/gstpassthrough.c index d9f0bac1..af9c674c 100644 --- a/gst/passthrough/gstpassthrough.c +++ b/gst/passthrough/gstpassthrough.c @@ -23,7 +23,8 @@ #include <gst/audio/audio.h> #include "gstpassthrough.h" - +#define PASSTHRU_BUF_SIZE 4096 +#define PASSTHRU_NUM_BUFS 4 static GstElementDetails passthrough_details = { "Passthrough", @@ -35,13 +36,13 @@ static GstElementDetails passthrough_details = { "(C) 2001", }; - -/* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; +/* static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; */ + enum { ARG_0, ARG_SILENT @@ -52,13 +53,13 @@ passthrough_sink_factory (void) { static GstPadTemplate *template = NULL; - if (!template) { + if (! template) { template = gst_padtemplate_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - gst_caps_append(gst_caps_new ("sink_int", "audio/raw", - GST_AUDIO_INT_PAD_TEMPLATE_PROPS), - gst_caps_new ("sink_float", "audio/raw", - GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS)), + gst_caps_append (gst_caps_new ("sink_int", "audio/raw", + GST_AUDIO_INT_PAD_TEMPLATE_PROPS), + gst_caps_new ("sink_float", "audio/raw", + GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS)), NULL); } return template; @@ -69,7 +70,7 @@ passthrough_src_factory (void) { static GstPadTemplate *template = NULL; - if (!template) + if (! template) template = gst_padtemplate_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_caps_append (gst_caps_new ("src_float", "audio/raw", @@ -85,17 +86,16 @@ static void passthrough_class_init (GstPassthroughClass *klass); static void passthrough_init (GstPassthrough *filter); static void passthrough_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void passthrough_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void passthrough_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static gint passthrough_parse_caps (GstPassthrough *filter, GstCaps *caps); +static GstPadConnectReturn passthrough_connect_sink (GstPad *pad, GstCaps *caps); -static void passthrough_chain (GstPad *pad, GstBuffer *buf); +static void passthrough_chain (GstPad *pad, GstBuffer *buf); static void inline passthrough_fast_float_chain (gfloat* data, guint numsamples); static void inline passthrough_fast_16bit_chain (gint16* data, guint numsamples); -static void inline passthrough_fast_8bit_chain (gint8* data, guint numsamples); +static void inline passthrough_fast_8bit_chain (gint8* data, guint numsamples); static GstElementClass *parent_class = NULL; -//static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; static GstBufferPool* passthrough_get_bufferpool (GstPad *pad) @@ -107,96 +107,73 @@ passthrough_get_bufferpool (GstPad *pad) return gst_pad_get_bufferpool (filter->srcpad); } -/* -static GstPadNegotiateReturn -passthrough_negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data) +static GstPadConnectReturn +passthrough_connect_sink (GstPad *pad, GstCaps *caps) { - GstPassthrough* filter = GST_PASSTHROUGH (gst_pad_get_parent (pad)); - - if (*caps==NULL) - return GST_PAD_NEGOTIATE_FAIL; - - if (passthrough_parse_caps(filter, *caps)) - return GST_PAD_NEGOTIATE_FAIL; + const gchar *format; + GstPassthrough *filter; - return gst_pad_negotiate_proxy(pad,filter->sinkpad,caps); -} + g_return_val_if_fail (pad != NULL, GST_PAD_CONNECT_DELAYED); + g_return_val_if_fail (caps != NULL, GST_PAD_CONNECT_DELAYED); -static GstPadNegotiateReturn -passthrough_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data) -{ - GstPassthrough* filter = GST_PASSTHROUGH (gst_pad_get_parent (pad)); - - if (*caps==NULL) - return GST_PAD_NEGOTIATE_FAIL; - - if (passthrough_parse_caps(filter, *caps)) - return GST_PAD_NEGOTIATE_FAIL; - - return gst_pad_negotiate_proxy(pad,filter->srcpad,caps); -} -*/ + filter = GST_PASSTHROUGH (gst_pad_get_parent (pad)); + g_return_if_fail (filter != NULL); + g_return_if_fail (GST_IS_PASSTHROUGH (filter)); -static gint -passthrough_parse_caps (GstPassthrough *filter, GstCaps *caps) -{ - const gchar *format; - - g_return_val_if_fail(filter!=NULL,-1); - g_return_val_if_fail(caps!=NULL,-1); - format = gst_caps_get_string(caps, "format"); filter->rate = gst_caps_get_int (caps, "rate"); filter->channels = gst_caps_get_int (caps, "channels"); - if (strcmp(format, "int")==0) { + if (strcmp (format, "int") == 0) { filter->format = GST_PASSTHROUGH_FORMAT_INT; filter->width = gst_caps_get_int (caps, "width"); filter->depth = gst_caps_get_int (caps, "depth"); filter->law = gst_caps_get_int (caps, "law"); filter->endianness = gst_caps_get_int (caps, "endianness"); filter->is_signed = gst_caps_get_int (caps, "signed"); - if (!filter->silent) { + if (! filter->silent) { g_print ("Passthrough : channels %d, rate %d\n", filter->channels, filter->rate); g_print ("Passthrough : format int, bit width %d, endianness %d, signed %s\n", filter->width, filter->endianness, filter->is_signed ? "yes" : "no"); } - } else if (strcmp(format, "float")==0) { + } else if (strcmp (format, "float") == 0) { filter->format = GST_PASSTHROUGH_FORMAT_FLOAT; - filter->layout = gst_caps_get_string(caps, "layout"); - filter->intercept = gst_caps_get_float(caps, "intercept"); - filter->slope = gst_caps_get_float(caps, "slope"); - if (!filter->silent) { + filter->layout = gst_caps_get_string (caps, "layout"); + filter->intercept = gst_caps_get_float (caps, "intercept"); + filter->slope = gst_caps_get_float (caps, "slope"); + if (! filter->silent) { g_print ("Passthrough : channels %d, rate %d\n", filter->channels, filter->rate); g_print ("Passthrough : format float, layout %s, intercept %f, slope %f\n", filter->layout, filter->intercept, filter->slope); } - } else { - return -1; } - return 0; -} + if (GST_CAPS_IS_FIXED (caps) && ! gst_pad_try_set_caps (filter->srcpad, caps)) + return GST_PAD_CONNECT_REFUSED; + + return GST_PAD_CONNECT_DELAYED; +} GType -gst_passthrough_get_type(void) { +gst_passthrough_get_type (void) +{ static GType passthrough_type = 0; if (!passthrough_type) { static const GTypeInfo passthrough_info = { - sizeof(GstPassthroughClass), NULL, + sizeof (GstPassthroughClass), NULL, NULL, - (GClassInitFunc)passthrough_class_init, + (GClassInitFunc) passthrough_class_init, NULL, NULL, - sizeof(GstPassthrough), + sizeof (GstPassthrough), 0, - (GInstanceInitFunc)passthrough_init, + (GInstanceInitFunc) passthrough_init, }; - passthrough_type = g_type_register_static(GST_TYPE_ELEMENT, "GstPassthrough", &passthrough_info, 0); + passthrough_type = g_type_register_static (GST_TYPE_ELEMENT, "GstPassthrough", &passthrough_info, 0); } return passthrough_type; } @@ -207,14 +184,14 @@ passthrough_class_init (GstPassthroughClass *klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass*) klass; + gstelement_class = (GstElementClass*) klass; parent_class = g_type_class_ref(GST_TYPE_ELEMENT); g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SILENT, g_param_spec_boolean("silent","silent","silent", - TRUE,G_PARAM_READWRITE)); // CHECKME + TRUE, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = passthrough_set_property; gobject_class->get_property = passthrough_get_property; @@ -223,15 +200,15 @@ passthrough_class_init (GstPassthroughClass *klass) static void passthrough_init (GstPassthrough *filter) { - filter->sinkpad = gst_pad_new_from_template(passthrough_sink_factory (),"sink"); - //gst_pad_set_negotiate_function(filter->sinkpad,passthrough_negotiate_sink); - gst_pad_set_bufferpool_function(filter->sinkpad,passthrough_get_bufferpool); - filter->srcpad = gst_pad_new_from_template(passthrough_src_factory (),"src"); - //gst_pad_set_negotiate_function(filter->srcpad,passthrough_negotiate_src); - - gst_element_add_pad(GST_ELEMENT(filter),filter->sinkpad); - gst_element_add_pad(GST_ELEMENT(filter),filter->srcpad); - gst_pad_set_chain_function(filter->sinkpad,passthrough_chain); + filter->srcpad = gst_pad_new_from_template (passthrough_src_factory (),"src"); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + filter->sinkpad = gst_pad_new_from_template (passthrough_sink_factory (),"sink"); + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + + gst_pad_set_connect_function (filter->sinkpad, passthrough_connect_sink); + gst_pad_set_bufferpool_function (filter->sinkpad, passthrough_get_bufferpool); + gst_pad_set_chain_function (filter->sinkpad, passthrough_chain); + filter->silent = FALSE; } @@ -242,52 +219,54 @@ passthrough_chain (GstPad *pad, GstBuffer *buf) gint16 *int_data; gfloat *float_data; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); - filter = GST_PASSTHROUGH(GST_OBJECT_PARENT (pad)); - g_return_if_fail(filter != NULL); - g_return_if_fail(GST_IS_PASSTHROUGH(filter)); + filter = GST_PASSTHROUGH (gst_pad_get_parent (pad)); + g_return_if_fail (filter != NULL); + g_return_if_fail (GST_IS_PASSTHROUGH (filter)); + + filter->bufpool = gst_pad_get_bufferpool (filter->srcpad); + if (filter->bufpool == NULL) { + filter->bufpool = gst_buffer_pool_get_default (PASSTHRU_BUF_SIZE, PASSTHRU_NUM_BUFS); + } switch (filter->format) { case GST_PASSTHROUGH_FORMAT_INT: - int_data = (gint16 *)GST_BUFFER_DATA(buf); + int_data = (gint16 *) GST_BUFFER_DATA (buf); switch (filter->width) { case 16: - passthrough_fast_16bit_chain(int_data,GST_BUFFER_SIZE(buf)/2); + passthrough_fast_16bit_chain (int_data, GST_BUFFER_SIZE (buf) / 2); break; case 8: - passthrough_fast_8bit_chain((gint8*)int_data,GST_BUFFER_SIZE(buf)); + passthrough_fast_8bit_chain ((gint8*) int_data, GST_BUFFER_SIZE (buf)); break; } break; case GST_PASSTHROUGH_FORMAT_FLOAT: - float_data = (gfloat *)GST_BUFFER_DATA(buf); + float_data = (gfloat *) GST_BUFFER_DATA (buf); - passthrough_fast_float_chain(float_data,GST_BUFFER_SIZE(buf)/sizeof(float)); + passthrough_fast_float_chain (float_data, GST_BUFFER_SIZE (buf) / sizeof (gfloat)); break; } - gst_pad_push(filter->srcpad,buf); + gst_pad_push (filter->srcpad, buf); } static void inline -passthrough_fast_float_chain(gfloat* data, - guint num_samples) +passthrough_fast_float_chain(gfloat* data, guint num_samples) #include "filter.func" static void inline -passthrough_fast_16bit_chain(gint16* data, - guint num_samples) +passthrough_fast_16bit_chain(gint16* data, guint num_samples) #include "filter.func" static void inline -passthrough_fast_8bit_chain(gint8* data, - guint num_samples) +passthrough_fast_8bit_chain(gint8* data, guint num_samples) #include "filter.func" static void @@ -295,9 +274,8 @@ passthrough_set_property (GObject *object, guint prop_id, const GValue *value, G { GstPassthrough *filter; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_PASSTHROUGH(object)); - filter = GST_PASSTHROUGH(object); + g_return_if_fail (GST_IS_PASSTHROUGH (object)); + filter = GST_PASSTHROUGH (object); switch (prop_id) { @@ -314,9 +292,8 @@ passthrough_get_property (GObject *object, guint prop_id, GValue *value, GParamS { GstPassthrough *filter; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_PASSTHROUGH(object)); - filter = GST_PASSTHROUGH(object); + g_return_if_fail (GST_IS_PASSTHROUGH (object)); + filter = GST_PASSTHROUGH (object); switch (prop_id) { case ARG_SILENT: @@ -333,9 +310,8 @@ plugin_init (GModule *module, GstPlugin *plugin) { GstElementFactory *factory; - factory = gst_elementfactory_new("passthrough",GST_TYPE_PASSTHROUGH, - &passthrough_details); - g_return_val_if_fail(factory != NULL, FALSE); + factory = gst_elementfactory_new ("passthrough", GST_TYPE_PASSTHROUGH, &passthrough_details); + g_return_val_if_fail (factory != NULL, FALSE); gst_elementfactory_add_padtemplate (factory, passthrough_src_factory ()); gst_elementfactory_add_padtemplate (factory, passthrough_sink_factory ()); diff --git a/gst/passthrough/gstpassthrough.h b/gst/passthrough/gstpassthrough.h index d8c2f63e..74c4cf68 100644 --- a/gst/passthrough/gstpassthrough.h +++ b/gst/passthrough/gstpassthrough.h @@ -25,7 +25,6 @@ #include <config.h> #include <gst/gst.h> -// #include <gst/meta/audioraw.h> #ifdef __cplusplus @@ -46,7 +45,7 @@ extern "C" { typedef struct _GstPassthrough GstPassthrough; typedef struct _GstPassthroughClass GstPassthroughClass; -typedef enum _GstPassthroughFormat GstPassthroughFormat; +typedef enum _GstPassthroughFormat GstPassthroughFormat; enum _GstPassthroughFormat { GST_PASSTHROUGH_FORMAT_INT, @@ -57,35 +56,28 @@ struct _GstPassthrough { GstElement element; GstPad *sinkpad, *srcpad; + GstBufferPool *bufpool; gboolean silent; /* the next three are valid for both int and float */ GstPassthroughFormat format; - - guint rate; - + guint rate; guint channels; /* the next five are valid only for format==GST_PASSTHROUGH_FORMAT_INT */ guint width; - guint depth; - guint endianness; - guint law; - gboolean is_signed; /* the next three are valid only for format==GST_PASSTHROUGH_FORMAT_FLOAT */ const gchar *layout; - gfloat slope; - gfloat intercept; }; |