diff --git a/gst/gst.c b/gst/gst.c index 9b8676406a..09b198a961 100644 --- a/gst/gst.c +++ b/gst/gst.c @@ -199,6 +199,16 @@ load_plugin_func (gpointer data, gpointer user_data) g_free (data); } +static void +parse_number (gchar *number, guint32 *val) +{ + /* handle either 0xHEX or dec */ + if (*(number+1) == 'x') { + sscanf (number+2, "%08x", val); + } else { + sscanf (number, "%d", val); + } +} /* returns FALSE if the program can be aborted */ static gboolean @@ -219,13 +229,7 @@ gst_init_check (int *argc, if (!strncmp ("--gst-info-mask=", (*argv)[i], 16)) { guint32 val; - /* handle either 0xHEX or dec */ - if (*((*argv)[i]+17) == 'x') { - sscanf ((*argv)[i]+18, "%08x", &val); - } else { - sscanf ((*argv)[i]+16, "%d", &val); - } - + parse_number ((*argv)[i]+16, &val); gst_info_set_categories (val); (*argv)[i] = NULL; @@ -233,13 +237,7 @@ gst_init_check (int *argc, else if (!strncmp ("--gst-debug-mask=", (*argv)[i], 17)) { guint32 val; - /* handle either 0xHEX or dec */ - if (*((*argv)[i]+18) == 'x') { - sscanf ((*argv)[i]+19, "%08x", &val); - } else { - sscanf ((*argv)[i]+17, "%d", &val); - } - + parse_number ((*argv)[i]+17, &val); gst_debug_set_categories (val); (*argv)[i] = NULL; @@ -247,13 +245,7 @@ gst_init_check (int *argc, else if (!strncmp ("--gst-mask=", (*argv)[i], 11)) { guint32 val; - /* handle either 0xHEX or dec */ - if (*((*argv)[i]+12) == 'x') { - sscanf ((*argv)[i]+13, "%08x", &val); - } else { - sscanf ((*argv)[i]+11, "%d", &val); - } - + parse_number ((*argv)[i]+11, &val); gst_debug_set_categories (val); gst_info_set_categories (val); diff --git a/gst/gstbin.c b/gst/gstbin.c index cda319a56a..1bac78474e 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -381,10 +381,11 @@ gst_bin_child_state_change (GstBin *bin, GstElementState old, GstElementState ne for (i = GST_NUM_STATES - 1; i >= 0; i--) { if (bin->child_states[i] != 0) { - if (GST_STATE (bin) != (1 << i)) { + gint state = (1 << i); + if (GST_STATE (bin) != state) { GST_INFO (GST_CAT_STATES, "bin %s need state change to %s", - GST_ELEMENT_NAME (bin), gst_element_statename (1 << i)); - GST_STATE_PENDING (bin) = (1 << i); + GST_ELEMENT_NAME (bin), gst_element_statename (state)); + GST_STATE_PENDING (bin) = state; gst_bin_change_state_norecurse (bin); } break; diff --git a/gst/gstobject.c b/gst/gstobject.c index f7a34a0de5..081fd1cf10 100644 --- a/gst/gstobject.c +++ b/gst/gstobject.c @@ -102,20 +102,20 @@ gst_object_class_init (GstObjectClass *klass) gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_object_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_object_get_property); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_NAME, + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NAME, g_param_spec_string ("name", "Name", "The name of the object", NULL, G_PARAM_READWRITE)); gst_object_signals[PARENT_SET] = - g_signal_new("parent_set", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, + g_signal_new ("parent_set", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstObjectClass, parent_set), NULL, NULL, - g_cclosure_marshal_VOID__OBJECT,G_TYPE_NONE,1, + g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); #ifndef GST_DISABLE_LOADSAVE_REGISTRY gst_object_signals[OBJECT_SAVED] = - g_signal_new("object_saved", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, + g_signal_new ("object_saved", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstObjectClass, object_saved), NULL, NULL, - g_cclosure_marshal_VOID__POINTER,G_TYPE_NONE,1, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); #endif diff --git a/gst/gstprops.c b/gst/gstprops.c index 3524be3a96..4d4cb3b170 100644 --- a/gst/gstprops.c +++ b/gst/gstprops.c @@ -590,7 +590,28 @@ gst_props_copy_on_write (GstProps *props) gst_props_unref (props); } - return props; + return new; +} + +static GstPropsEntry* +gst_props_get_entry_func (GstProps *props, const gchar *name) +{ + GList *lentry; + GQuark quark; + + g_return_val_if_fail (props != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + quark = g_quark_from_string (name); + + lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func); + + if (lentry) { + GstPropsEntry *thisentry; + thisentry = (GstPropsEntry *)lentry->data; + return thisentry; + } + return NULL; } /** @@ -605,24 +626,13 @@ gst_props_copy_on_write (GstProps *props) gint gst_props_get_int (GstProps *props, const gchar *name) { - GList *lentry; - GQuark quark; - - g_return_val_if_fail (props != NULL, 0); - g_return_val_if_fail (name != NULL, 0); + GstPropsEntry *thisentry; - quark = g_quark_from_string (name); - - lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func); - - if (lentry) { - GstPropsEntry *thisentry; - - thisentry = (GstPropsEntry *)lentry->data; + thisentry = gst_props_get_entry_func (props, name); + if (thisentry) { return thisentry->data.int_data; } - return 0; } @@ -638,21 +648,13 @@ gst_props_get_int (GstProps *props, const gchar *name) gfloat gst_props_get_float (GstProps *props, const gchar *name) { - GList *lentry; - GQuark quark; - - quark = g_quark_from_string (name); + GstPropsEntry *thisentry; - lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func); - - if (lentry) { - GstPropsEntry *thisentry; - - thisentry = (GstPropsEntry *)lentry->data; + thisentry = gst_props_get_entry_func (props, name); + if (thisentry) { return thisentry->data.float_data; } - return 0.0F; } @@ -668,24 +670,13 @@ gst_props_get_float (GstProps *props, const gchar *name) gulong gst_props_get_fourcc_int (GstProps *props, const gchar *name) { - GList *lentry; - GQuark quark; - - g_return_val_if_fail (props != NULL, 0); - g_return_val_if_fail (name != NULL, 0); + GstPropsEntry *thisentry; - quark = g_quark_from_string (name); - - lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func); - - if (lentry) { - GstPropsEntry *thisentry; - - thisentry = (GstPropsEntry *)lentry->data; + thisentry = gst_props_get_entry_func (props, name); + if (thisentry) { return thisentry->data.fourcc_data; } - return 0; } @@ -701,24 +692,13 @@ gst_props_get_fourcc_int (GstProps *props, const gchar *name) gboolean gst_props_get_boolean (GstProps *props, const gchar *name) { - GList *lentry; - GQuark quark; - - g_return_val_if_fail (props != NULL, FALSE); - g_return_val_if_fail (name != NULL, FALSE); + GstPropsEntry *thisentry; - quark = g_quark_from_string (name); - - lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func); - - if (lentry) { - GstPropsEntry *thisentry; - - thisentry = (GstPropsEntry *)lentry->data; + thisentry = gst_props_get_entry_func (props, name); + if (thisentry) { return thisentry->data.bool_data; } - return 0; } @@ -734,24 +714,13 @@ gst_props_get_boolean (GstProps *props, const gchar *name) const gchar* gst_props_get_string (GstProps *props, const gchar *name) { - GList *lentry; - GQuark quark; - - g_return_val_if_fail (props != NULL, NULL); - g_return_val_if_fail (name != NULL, NULL); + GstPropsEntry *thisentry; - quark = g_quark_from_string (name); - - lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func); - - if (lentry) { - GstPropsEntry *thisentry; - - thisentry = (GstPropsEntry *)lentry->data; + thisentry = gst_props_get_entry_func (props, name); + if (thisentry) { return thisentry->data.string_data.string; } - return NULL; } @@ -973,7 +942,7 @@ gst_props_check_compatibility (GstProps *fromprops, GstProps *toprops) } if (!gst_props_entry_check_compatibility (entry1, entry2)) { - compatible = FALSE; + compatible = FALSE; GST_DEBUG (GST_CAT_PROPERTIES, "%s are not compatible: \n", g_quark_to_string (entry1->propid)); gst_props_debug_entry (entry1); diff --git a/gst/schedulers/gstbasicscheduler.c b/gst/schedulers/gstbasicscheduler.c index 0fc128b2d2..3027380d23 100644 --- a/gst/schedulers/gstbasicscheduler.c +++ b/gst/schedulers/gstbasicscheduler.c @@ -341,17 +341,18 @@ static void gst_basic_scheduler_chainhandler_proxy (GstPad * pad, GstBuffer * buf) { GstRealPad *peer = GST_RPAD_PEER (pad); + gint loop_count = 100; GST_DEBUG_ENTER ("(%s:%s)", GST_DEBUG_PAD_NAME (pad)); GST_DEBUG (GST_CAT_DATAFLOW, "putting buffer %p in peer \"%s:%s\"'s pen\n", buf, GST_DEBUG_PAD_NAME (peer)); - /* FIXME this should be bounded + /* * loop until the bufferpen is empty so we can fill it up again */ - while (GST_RPAD_BUFPEN (pad) != NULL) { - GST_DEBUG (GST_CAT_DATAFLOW, "switching to %p to empty bufpen\n", - GST_ELEMENT_THREADSTATE (GST_PAD_PARENT (pad))); + while (GST_RPAD_BUFPEN (GST_RPAD_PEER (pad)) != NULL && --loop_count) { + GST_DEBUG (GST_CAT_DATAFLOW, "switching to %p to empty bufpen %d\n", + GST_ELEMENT_THREADSTATE (GST_PAD_PARENT (pad)), loop_count); cothread_switch (GST_ELEMENT_THREADSTATE (GST_PAD_PARENT (pad))); /* we may no longer be the same pad, check. */ @@ -361,6 +362,11 @@ gst_basic_scheduler_chainhandler_proxy (GstPad * pad, GstBuffer * buf) } } + if (loop_count == 0) { + gst_element_error (GST_PAD_PARENT (pad), + "(internal error) maximum number of switches exceeded"); + return; + } g_assert (GST_RPAD_BUFPEN (GST_RPAD_PEER (pad)) == NULL); /* now fill the bufferpen and switch so it can be consumed */ GST_RPAD_BUFPEN (GST_RPAD_PEER (pad)) = buf; @@ -374,8 +380,6 @@ gst_basic_scheduler_chainhandler_proxy (GstPad * pad, GstBuffer * buf) static void gst_basic_scheduler_select_proxy (GstPad * pad, GstBuffer * buf) { - g_print ("select proxy (%s:%s)\n", GST_DEBUG_PAD_NAME (pad)); - GST_DEBUG_ENTER ("(%s:%s)", GST_DEBUG_PAD_NAME (pad)); GST_DEBUG (GST_CAT_DATAFLOW, "putting buffer %p in peer's pen\n", buf); @@ -385,13 +389,10 @@ gst_basic_scheduler_select_proxy (GstPad * pad, GstBuffer * buf) GST_RPAD_BUFPEN (GST_RPAD_PEER (pad)) = buf; GST_DEBUG (GST_CAT_DATAFLOW, "switching to %p\n", GST_ELEMENT_THREADSTATE (GST_PAD_PARENT (pad))); - g_print ("%p %s\n", GST_ELEMENT (GST_PAD_PARENT (pad)), - gst_element_get_name (GST_ELEMENT (GST_PAD_PARENT (pad)))); GST_ELEMENT (GST_PAD_PARENT (pad))->select_pad = pad; cothread_switch (GST_ELEMENT_THREADSTATE (GST_PAD_PARENT (pad))); - g_print ("done switching\n"); GST_DEBUG (GST_CAT_DATAFLOW, "done switching\n"); } @@ -1165,7 +1166,6 @@ gst_basic_scheduler_pad_select (GstScheduler * sched, GList * padlist) pad = GST_PAD (padlist2->data); if (gst_pad_peek (pad)) { - g_print ("found something in pad %s:%s\n", GST_DEBUG_PAD_NAME (pad)); return pad; } @@ -1185,12 +1185,9 @@ gst_basic_scheduler_pad_select (GstScheduler * sched, GList * padlist) cothread_switch (GST_ELEMENT_THREADSTATE (GST_PAD_PARENT (peer))); - g_print ("%p %s\n", GST_ELEMENT (GST_PAD_PARENT (pad)), - gst_element_get_name (GST_ELEMENT (GST_PAD_PARENT (pad)))); pad = GST_ELEMENT (GST_PAD_PARENT (pad))->select_pad; g_assert (pad != NULL); - g_print ("back from select (%s:%s)\n", GST_DEBUG_PAD_NAME (pad)); } return pad; }