#include "gstutils.h"
#include "gstinfo.h"
#include "gstquark.h"
-#include "gsttracer.h"
+#include "gsttracerutils.h"
#include "gstvalue.h"
#include "gst-i18n-lib.h"
#include "glib-compat-private.h"
static void gst_element_base_class_init (gpointer g_class);
static void gst_element_base_class_finalize (gpointer g_class);
+static void gst_element_constructed (GObject * object);
static void gst_element_dispose (GObject * object);
static void gst_element_finalize (GObject * object);
gobject_class->dispose = gst_element_dispose;
gobject_class->finalize = gst_element_finalize;
+ gobject_class->constructed = gst_element_constructed;
klass->change_state = GST_DEBUG_FUNCPTR (gst_element_change_state_func);
klass->set_state = GST_DEBUG_FUNCPTR (gst_element_set_state_func);
g_cond_init (&element->state_cond);
}
+static void
+gst_element_constructed (GObject * object)
+{
+ GST_TRACER_ELEMENT_NEW (GST_ELEMENT_CAST (object));
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+}
+
/**
* gst_element_release_request_pad:
* @element: a #GstElement to release the request pad of.
gst_element_add_pad (GstElement * element, GstPad * pad)
{
gchar *pad_name;
- gboolean flushing;
+ gboolean active;
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
pad_name = g_strdup (GST_PAD_NAME (pad));
GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "adding pad '%s'",
GST_STR_NULL (pad_name));
- flushing = GST_PAD_IS_FLUSHING (pad);
+ active = GST_PAD_IS_ACTIVE (pad);
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_NEED_PARENT);
GST_OBJECT_UNLOCK (pad);
GST_OBJECT_CAST (element))))
goto had_parent;
- /* check for flushing pads */
- if (flushing && (GST_STATE (element) > GST_STATE_READY ||
+ /* check for active pads */
+ if (!active && (GST_STATE (element) > GST_STATE_READY ||
GST_STATE_NEXT (element) == GST_STATE_PAUSED)) {
- g_warning ("adding flushing pad '%s' to running element '%s', you need to "
+ g_warning ("adding inactive pad '%s' to running element '%s', you need to "
"use gst_pad_set_active(pad,TRUE) before adding it.",
GST_STR_NULL (pad_name), GST_ELEMENT_NAME (element));
- /* unset flushing */
- GST_OBJECT_LOCK (pad);
- GST_PAD_UNSET_FLUSHING (pad);
- GST_OBJECT_UNLOCK (pad);
+ gst_pad_set_active (pad, TRUE);
}
g_free (pad_name);
/* emit the PAD_ADDED signal */
g_signal_emit (element, gst_element_signals[PAD_ADDED], 0, pad);
-
+ GST_TRACER_ELEMENT_ADD_PAD (element, pad);
return TRUE;
/* ERROR cases */
/* emit the PAD_REMOVED signal before unparenting and losing the last ref. */
g_signal_emit (element, gst_element_signals[PAD_REMOVED], 0, pad);
-
+ GST_TRACER_ELEMENT_REMOVE_PAD (element, pad);
gst_object_unparent (GST_OBJECT_CAST (pad));
return TRUE;
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send %s event on element %s",
GST_EVENT_TYPE_NAME (event), GST_ELEMENT_NAME (element));
result = oclass->send_event (element, event);
+ } else {
+ gst_event_unref (event);
}
GST_STATE_UNLOCK (element);
res = klass->query (element, query);
}
- GST_TRACER_ELEMENT_QUERY_POST (element, res);
+ GST_TRACER_ELEMENT_QUERY_POST (element, query, res);
return res;
}
klass = GST_ELEMENT_GET_CLASS (element);
if (klass->post_message)
res = klass->post_message (element, message);
+ else
+ gst_message_unref (message);
GST_TRACER_ELEMENT_POST_MESSAGE_POST (element, res);
return res;
oclass = GST_ELEMENT_GET_CLASS (element);
+ GST_TRACER_ELEMENT_CHANGE_STATE_PRE (element, transition);
+
/* call the state change function so it can set the state */
if (oclass->change_state)
ret = (oclass->change_state) (element, transition);
else
ret = GST_STATE_CHANGE_FAILURE;
+ GST_TRACER_ELEMENT_CHANGE_STATE_POST (element, transition, ret);
+
switch (ret) {
case GST_STATE_CHANGE_FAILURE:
GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,