From 21dd80fa24962e9cefd6ff095ef93676b5c8c34e Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Mon, 23 Sep 2002 09:39:33 +0000 Subject: [PATCH] talk about a painful merge Original commit message from CVS: talk about a painful merge --- gst/adder/gstadder.c | 324 +++++++++++++------------------------------ 1 file changed, 97 insertions(+), 227 deletions(-) diff --git a/gst/adder/gstadder.c b/gst/adder/gstadder.c index 6dbb8c6a75..d4eae88712 100644 --- a/gst/adder/gstadder.c +++ b/gst/adder/gstadder.c @@ -48,10 +48,6 @@ enum { enum { ARG_0, ARG_NUM_PADS, - ARG_FORMAT, - ARG_RATE, - ARG_WIDTH, - ARG_CHANNELS /* FILL ME */ }; @@ -59,81 +55,33 @@ GST_PAD_TEMPLATE_FACTORY (gst_adder_src_template_factory, "src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "int_src", - "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_LIST (GST_PROPS_INT (8), - GST_PROPS_INT (16)), - "depth", GST_PROPS_LIST (GST_PROPS_INT (8), - GST_PROPS_INT (16)), - "rate", GST_PROPS_INT_RANGE (GST_AUDIO_MIN_RATE, - GST_AUDIO_MAX_RATE), - "channels", GST_PROPS_INT_RANGE (1, 2) - ), - GST_CAPS_NEW ( - "float_src", - "audio/raw", - "format", GST_PROPS_STRING ("float"), - "layout", GST_PROPS_STRING ("gfloat"), - "intercept", GST_PROPS_FLOAT (0.0), - "slope", GST_PROPS_FLOAT (1.0), - "rate", GST_PROPS_INT_RANGE (GST_AUDIO_MIN_RATE, - GST_AUDIO_MAX_RATE), - "channels", GST_PROPS_INT_RANGE (1, 2) - ) + gst_caps_new ("int_src", "audio/raw", + GST_AUDIO_INT_PAD_TEMPLATE_PROPS), + gst_caps_new ("float_src", "audio/raw", + GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS) ); GST_PAD_TEMPLATE_FACTORY (gst_adder_sink_template_factory, "sink%d", GST_PAD_SINK, GST_PAD_REQUEST, - GST_CAPS_NEW ( - "int_sink", - "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_LIST (GST_PROPS_INT (8), - GST_PROPS_INT (16)), - "depth", GST_PROPS_LIST (GST_PROPS_INT (8), - GST_PROPS_INT (16)), - "rate", GST_PROPS_INT_RANGE (GST_AUDIO_MIN_RATE, - GST_AUDIO_MAX_RATE), - "channels", GST_PROPS_INT_RANGE (1, 2) - ), - GST_CAPS_NEW ( - "float_sink", - "audio/raw", - "format", GST_PROPS_STRING ("float"), - "layout", GST_PROPS_STRING ("gfloat"), - "intercept", GST_PROPS_FLOAT (0.0), - "slope", GST_PROPS_FLOAT (1.0), - "rate", GST_PROPS_INT_RANGE (GST_AUDIO_MIN_RATE, - GST_AUDIO_MAX_RATE), - "channels", GST_PROPS_INT_RANGE (1, 2) - ) + gst_caps_new ("int_sink", "audio/raw", + GST_AUDIO_INT_PAD_TEMPLATE_PROPS), + gst_caps_new ("float_sink", "audio/raw", + GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS) ); -static void gst_adder_class_init (GstAdderClass *klass); -static void gst_adder_init (GstAdder *adder); +static void gst_adder_class_init (GstAdderClass *klass); +static void gst_adder_init (GstAdder *adder); -static void gst_adder_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -static void gst_adder_set_property (GObject *object, guint prop_id, - const GValue *value, - GParamSpec *pspec); +static void gst_adder_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec); -static GstPad* gst_adder_request_new_pad (GstElement *element, - GstPadTemplate *temp, - const gchar *unused); +static GstPad* gst_adder_request_new_pad (GstElement *element, GstPadTemplate *temp, + const gchar *unused); /* we do need a loop function */ -static void gst_adder_loop (GstElement *element); +static void gst_adder_loop (GstElement *element); static GstElementClass *parent_class = NULL; /* static guint gst_adder_signals[LAST_SIGNAL] = { 0 }; */ @@ -146,8 +94,7 @@ gst_adder_get_type (void) { static const GTypeInfo adder_info = { sizeof (GstAdderClass), NULL, NULL, (GClassInitFunc) gst_adder_class_init, NULL, NULL, - sizeof (GstAdder), - 0, + sizeof (GstAdder), 0, (GInstanceInitFunc) gst_adder_init, }; adder_type = g_type_register_static (GST_TYPE_ELEMENT, "GstAdder", @@ -165,7 +112,8 @@ gst_adder_parse_caps (GstAdder *adder, GstCaps *caps) gst_caps_get_string (caps, "format", &format); if (adder->format == GST_ADDER_FORMAT_UNSET) { - /* the caps haven't been set yet at all, so we need to go ahead and set all + /* the caps haven't been set yet at all, + * so we need to go ahead and set all the relevant values. */ if (strcmp (format, "int") == 0) { GST_DEBUG (GST_CAT_PLUGIN_INFO, "parse_caps sets adder to format int"); @@ -200,32 +148,31 @@ gst_adder_parse_caps (GstAdder *adder, GstCaps *caps) /* provide an error message if we can't connect */ if (adder->format != GST_ADDER_FORMAT_INT) { - gst_element_error (el, - "can't connect a non-int pad to an int adder"); - return FALSE; + gst_element_error (el, "can't connect a non-int pad to an int adder"); + return FALSE; } if (adder->channels != channels) { - gst_element_error (el, - "can't connect %d-channel pad with %d-channel adder", - channels, adder->channels); - return FALSE; + gst_element_error (el, + "can't connect %d-channel pad with %d-channel adder", + channels, adder->channels); + return FALSE; } if (adder->rate != rate) { - gst_element_error (el, "can't connect %d Hz pad with %d Hz adder", - rate, adder->rate); - return FALSE; + gst_element_error (el, "can't connect %d Hz pad with %d Hz adder", + rate, adder->rate); + return FALSE; } if (adder->width != width) { - gst_element_error (el, "can't connect %d-bit pad with %d-bit adder", - width, adder->width); - return FALSE; + gst_element_error (el, "can't connect %d-bit pad with %d-bit adder", + width, adder->width); + return FALSE; } if (adder->is_signed != is_signed) { - gst_element_error (el, - "can't connect %ssigned pad with %ssigned adder", - adder->is_signed ? "" : "un", - is_signed ? "" : "un"); - return FALSE; + gst_element_error (el, + "can't connect %ssigned pad with %ssigned adder", + adder->is_signed ? "" : "un", + is_signed ? "" : "un"); + return FALSE; } } else if (strcmp (format, "float") == 0) { gint channels, rate; @@ -234,25 +181,24 @@ gst_adder_parse_caps (GstAdder *adder, GstCaps *caps) gst_caps_get_int (caps, "rate", &rate); if (adder->format != GST_ADDER_FORMAT_FLOAT) { - gst_element_error (el, + gst_element_error (el, "can't connect a non-float pad to a float adder"); - return FALSE; + return FALSE; } if (adder->channels != channels) { - gst_element_error (el, - "can't connect %d-channel pad with %d-channel adder", - channels, adder->channels); - return FALSE; + gst_element_error (el, + "can't connect %d-channel pad with %d-channel adder", + channels, adder->channels); + return FALSE; } if (adder->rate != rate) { - gst_element_error (el, "can't connect %d Hz pad with %d Hz adder", - rate, adder->rate); - return FALSE; + gst_element_error (el, "can't connect %d Hz pad with %d Hz adder", + rate, adder->rate); + return FALSE; + } else { + /* whoa, we don't know what's trying to connect with us ! barf ! */ + return FALSE; } - } else { - /* whoa, we don't know what's trying to connect with us ! barf ! */ - gst_element_error (el, "can't connect unknown type of pad to adder"); - return FALSE; } } return TRUE; @@ -277,9 +223,9 @@ gst_adder_connect (GstPad *pad, GstCaps *caps) return GST_PAD_CONNECT_REFUSED; if (pad == adder->srcpad || gst_pad_try_set_caps (adder->srcpad, caps) > 0) { - sinkpads = gst_element_get_pad_list ((GstElement*) adder); + sinkpads = gst_element_get_pad_list ((GstElement *) adder); while (sinkpads) { - p = (GstPad*) sinkpads->data; + p = (GstPad *) sinkpads->data; if (p != pad && p != adder->srcpad) { if (gst_pad_try_set_caps (p, caps) <= 0) { GST_DEBUG (GST_CAT_PLUGIN_INFO, @@ -299,10 +245,11 @@ gst_adder_connect (GstPad *pad, GstCaps *caps) restart: channels = adder->input_channels; while (channels) { - GstAdderInputChannel *channel = (GstAdderInputChannel*) channels->data; + GstAdderInputChannel *channel; + channel = (GstAdderInputChannel*) channels->data; if (channel->sinkpad == GST_PAD_CAST (remove->data)) { gst_bytestream_destroy (channel->bytestream); - adder->input_channels = g_slist_remove_link (adder->input_channels, + adder->input_channels = g_slist_remove_link (adder->input_channels, channels); adder->numsinkpads--; goto restart; @@ -326,32 +273,16 @@ gst_adder_class_init (GstAdderClass *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_NUM_PADS, - g_param_spec_int ("num_pads", "number of pads", "Number Of Pads", - 0, G_MAXINT, 0, G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FORMAT, - g_param_spec_string ("format", "data format", "Format of Data (int/float)", - "int", G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RATE, - g_param_spec_int ("rate", "Rate", "Sample Rate (Hz)", - GST_AUDIO_MIN_RATE, GST_AUDIO_MAX_RATE, - GST_AUDIO_DEF_RATE, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH, - g_param_spec_int ("width", "Bit Width", "Bit Width", - 8, 16, - 16, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHANNELS, - g_param_spec_int ("channels", "Channels", "Number of channels", - 1, G_MAXINT, - 2, G_PARAM_READWRITE)); + g_param_spec_int ("num_pads","number of pads","Number Of Pads", + 0, G_MAXINT, 0, G_PARAM_READABLE)); - gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_adder_get_property); - gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_adder_set_property); + gobject_class->get_property = gst_adder_get_property; gstelement_class->request_new_pad = gst_adder_request_new_pad; } @@ -367,12 +298,6 @@ gst_adder_init (GstAdder *adder) adder->format = GST_ADDER_FORMAT_UNSET; - /* defaults */ - adder->rate = GST_AUDIO_DEF_RATE; - adder->channels = 1; - adder->width = 16; - adder->depth = 16; - /* keep track of the sinkpads requested */ adder->numsinkpads = 0; @@ -398,7 +323,7 @@ gst_adder_request_new_pad (GstElement *element, GstPadTemplate *templ, input = (GstAdderInputChannel *) g_malloc (sizeof (GstAdderInputChannel)); if (input == NULL) { - g_warning ("gstadder: could not allocate memory for adder input channel !\n"); + g_warning ("gstadder: could not allocate adder input channel !\n"); return NULL; } @@ -422,8 +347,7 @@ gst_adder_request_new_pad (GstElement *element, GstPadTemplate *templ, } static void -gst_adder_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_adder_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GstAdder *adder; @@ -436,88 +360,12 @@ gst_adder_get_property (GObject *object, guint prop_id, case ARG_NUM_PADS: g_value_set_int (value, adder->numsinkpads); break; - case ARG_FORMAT: - /* FIXME: check if this causes memleaks */ - if (adder->format == GST_ADDER_FORMAT_INT) - g_value_set_string (value, g_strdup ("int")); - else if (adder->format == GST_ADDER_FORMAT_FLOAT) - g_value_set_string (value, g_strdup ("float")); - else - g_value_set_string (value, g_strdup ("unknown")); - break; - case ARG_RATE: - g_value_set_int (value, adder->rate); - break; - case ARG_WIDTH: - g_value_set_int (value, adder->depth); - break; - case ARG_CHANNELS: - g_value_set_int (value, adder->channels); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } -static void -gst_adder_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - GstAdder *adder; - GstElementState state; - - g_return_if_fail (GST_IS_ADDER (object)); - - adder = GST_ADDER (object); - state = gst_element_get_state (GST_ELEMENT (adder)); - - /* none of these properties can be set when not in NULL */ - if (state != GST_STATE_NULL) - { - gst_element_error (GST_ELEMENT (adder), - "trying to set properties on adder when not in NULL."); - return; - } - switch (prop_id) { - case ARG_NUM_PADS: - g_warning ("Trying to change read-only parameter num_pads\n"); - break; - case ARG_FORMAT: - if (strcmp (g_value_get_string (value), "int") == 0) - { - GST_DEBUG (GST_CAT_PLUGIN_INFO, "adder: setting format to int\n"); - adder->format = GST_ADDER_FORMAT_INT; - } - else if (strcmp (g_value_get_string (value), "float") == 0) - { - GST_DEBUG (GST_CAT_PLUGIN_INFO, "adder: setting format to float\n"); - adder->format = GST_ADDER_FORMAT_FLOAT; - } - else - { - g_warning ("adder: unknown format %s specified\n", - g_value_get_string (value)); - adder->format = GST_ADDER_FORMAT_UNSET; - } - break; - - case ARG_RATE: - adder->rate = g_value_get_int (value); - break; - case ARG_WIDTH: - adder->width = g_value_get_int (value); - adder->depth = g_value_get_int (value); - break; - case ARG_CHANNELS: - adder->channels = g_value_get_int (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - /* use this loop */ static void gst_adder_loop (GstElement *element) @@ -540,7 +388,6 @@ gst_adder_loop (GstElement *element) GSList *inputs; GstAdderInputChannel *input; - gint8 *zero_out; guint8 *raw_in; guint32 waiting; guint32 got_bytes; @@ -563,12 +410,11 @@ gst_adder_loop (GstElement *element) buf_out = gst_buffer_new_from_pool (adder->bufpool, 0, 0); if (buf_out == NULL) - GST_ERROR (GST_ELEMENT (adder), "could not get new output buffer !"); + gst_element_error (GST_ELEMENT (adder), + "could not get new output buffer !\n"); /* initialize the output data to 0 */ - zero_out = (gint8 *) GST_BUFFER_DATA (buf_out); - for (i = 0; i < GST_BUFFER_SIZE (buf_out); i++) - zero_out[i] = 0; + memset (GST_BUFFER_DATA (buf_out), 0, GST_BUFFER_SIZE (buf_out)); /* get data from all of the sinks */ inputs = adder->input_channels; @@ -588,14 +434,14 @@ gst_adder_loop (GstElement *element) } /* Get data from the bytestream of each input channel. - * We need to check for events before passing on the data to - * the output buffer. */ - got_bytes = gst_bytestream_peek_bytes (input->bytestream, &raw_in, + * We need to check for events before passing on the data + * to the output buffer. */ + got_bytes = gst_bytestream_peek_bytes (input->bytestream, &raw_in, GST_BUFFER_SIZE (buf_out)); - /* FIXME we should do something with the data - * if got_bytes is more than zero */ - if (got_bytes < GST_BUFFER_SIZE (buf_out)) { + /* FIXME we should do something with the data if + * got_bytes is more than zero */ + if (got_bytes < GST_BUFFER_SIZE(buf_out)) { /* we need to check for an event. */ gst_bytestream_get_status (input->bytestream, &waiting, &event); @@ -662,6 +508,29 @@ gst_adder_loop (GstElement *element) inputs = g_slist_next (inputs); } + if (adder->format == GST_ADDER_FORMAT_UNSET) { + GstCaps *caps = + gst_caps_new ("default_adder_caps", + "audio/raw", + gst_props_new ("format", GST_PROPS_STRING ("int"), + "width", GST_PROPS_INT (16), + "depth", GST_PROPS_INT (16), + "rate", GST_PROPS_INT (44100), + "channels", GST_PROPS_INT (2), + "law", GST_PROPS_INT (0), + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "signed", GST_PROPS_BOOLEAN (TRUE), + NULL)); + + if (gst_pad_try_set_caps (adder->srcpad, caps) < 0) { + gst_element_error (GST_ELEMENT (adder), + "Couldn't set the default caps, " + "use connect_filtered instead"); + return; + } + gst_adder_parse_caps (adder, caps); + } + GST_BUFFER_TIMESTAMP (buf_out) = timestamp; if (adder->format == GST_ADDER_FORMAT_FLOAT) offset += GST_BUFFER_SIZE (buf_out) / sizeof (gfloat) / adder->channels; @@ -684,15 +553,16 @@ plugin_init (GModule *module, GstPlugin *plugin) { GstElementFactory *factory; - factory = gst_element_factory_new("adder",GST_TYPE_ADDER, - &adder_details); - g_return_val_if_fail(factory != NULL, FALSE); + factory = gst_element_factory_new ("adder", GST_TYPE_ADDER, &adder_details); + g_return_val_if_fail (factory != NULL, FALSE); if (! gst_library_load ("gstbytestream")) return FALSE; - gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (gst_adder_src_template_factory)); - gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (gst_adder_sink_template_factory)); + gst_element_factory_add_pad_template (factory, + GST_PAD_TEMPLATE_GET (gst_adder_src_template_factory)); + gst_element_factory_add_pad_template (factory, + GST_PAD_TEMPLATE_GET (gst_adder_sink_template_factory)); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));