*
* 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.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
/**
*
* An existing pad of an element can be retrieved by name with
* gst_element_get_static_pad(). A new dynamic pad can be created using
- * gst_element_request_pad() with a #GstPadTemplate or
- * gst_element_get_request_pad() with the template name such as "src_\%u".
+ * gst_element_request_pad() with a #GstPadTemplate.
* An iterator of all pads can be retrieved with gst_element_iterate_pads().
*
* Elements can be linked through their pads.
* #GST_ELEMENT_FLAG_REQUIRE_CLOCK() flag is set, a clock should be set on the
* element with gst_element_set_clock().
*
- * Note that clock slection and distribution is normally handled by the
+ * Note that clock selection and distribution is normally handled by the
* toplevel #GstPipeline so the clock functions are only to be used in very
* specific situations.
- *
- * Last reviewed on 2012-03-28 (0.11.3)
*/
#include "gst_private.h"
#include "gst-i18n-lib.h"
#include "glib-compat-private.h"
+#ifndef GST_DISABLE_GST_DEBUG
+#include "printf/printf.h"
+#endif
+
/* Element signals and args */
enum
{
static gboolean gst_element_set_clock_func (GstElement * element,
GstClock * clock);
static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
+static gboolean gst_element_post_message_default (GstElement * element,
+ GstMessage * message);
static gboolean gst_element_default_send_event (GstElement * element,
GstEvent * event);
klass->query = GST_DEBUG_FUNCPTR (gst_element_default_query);
klass->send_event = GST_DEBUG_FUNCPTR (gst_element_default_send_event);
klass->numpadtemplates = 0;
+ klass->post_message = GST_DEBUG_FUNCPTR (gst_element_post_message_default);
klass->elementfactory = NULL;
}
element_class->elementfactory =
g_type_get_qdata (G_TYPE_FROM_CLASS (element_class),
__gst_elementclass_factory);
- GST_DEBUG ("type %s : factory %p", G_OBJECT_CLASS_NAME (element_class),
- element_class->elementfactory);
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "type %s : factory %p",
+ G_OBJECT_CLASS_NAME (element_class), element_class->elementfactory);
}
static void
* @pad: the #GstPad to release.
*
* Makes the element free the previously requested pad as obtained
- * with gst_element_get_request_pad().
+ * with gst_element_request_pad().
*
* This does not unref the pad. If the pad was created by using
- * gst_element_get_request_pad(), gst_element_release_request_pad() needs to be
+ * gst_element_request_pad(), gst_element_release_request_pad() needs to be
* followed by gst_object_unref() to free the @pad.
*
* MT safe.
*
* This function is used by plugin developers and should not be used
* by applications. Pads that were dynamically requested from elements
- * with gst_element_get_request_pad() should be released with the
+ * with gst_element_request_pad() should be released with the
* gst_element_release_request_pad() function instead.
*
* Pads are not automatically deactivated so elements should perform the needed
break;
}
element->pads = g_list_remove (element->pads, pad);
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_NEED_PARENT);
element->numpads--;
element->pads_cookie++;
GST_OBJECT_UNLOCK (element);
* The order of pads returned by the iterator will be the order in which
* the pads were added to the element.
*
- * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
- * after use.
+ * Returns: (transfer full): the #GstIterator of #GstPad.
*
* MT safe.
*/
* The order of pads returned by the iterator will be the order in which
* the pads were added to the element.
*
- * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
- * after use.
+ * Returns: (transfer full): the #GstIterator of #GstPad.
*
* MT safe.
*/
* The order of pads returned by the iterator will be the order in which
* the pads were added to the element.
*
- * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
- * after use.
+ * Returns: (transfer full): the #GstIterator of #GstPad.
*
* MT safe.
*/
const gchar * description, const gchar * author)
{
g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+ g_return_if_fail (longname != NULL && *longname != '\0');
+ g_return_if_fail (classification != NULL && *classification != '\0');
+ g_return_if_fail (description != NULL && *description != '\0');
+ g_return_if_fail (author != NULL && *author != '\0');
gst_structure_id_set ((GstStructure *) klass->metadata,
GST_QUARK (ELEMENT_METADATA_LONGNAME), G_TYPE_STRING, longname,
GValue val = G_VALUE_INIT;
g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+ g_return_if_fail (longname != NULL && *longname != '\0');
+ g_return_if_fail (classification != NULL && *classification != '\0');
+ g_return_if_fail (description != NULL && *description != '\0');
+ g_return_if_fail (author != NULL && *author != '\0');
g_value_init (&val, G_TYPE_STRING);
* event handler, the event will be pushed on a random linked sink pad for
* upstream events or a random linked source pad for downstream events.
*
- * This function takes owership of the provided event so you should
+ * This function takes ownership of the provided event so you should
* gst_event_ref() it if you want to reuse the event after this call.
*
* MT safe.
*
* Please note that some queries might need a running pipeline to work.
*
- * Returns: TRUE if the query could be performed.
+ * Returns: %TRUE if the query could be performed.
*
* MT safe.
*/
gboolean
gst_element_query (GstElement * element, GstQuery * query)
{
- GstElementClass *oclass;
- gboolean result = FALSE;
+ GstElementClass *klass;
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
g_return_val_if_fail (query != NULL, FALSE);
- oclass = GST_ELEMENT_GET_CLASS (element);
-
- if (oclass->query) {
+ klass = GST_ELEMENT_GET_CLASS (element);
+ if (klass->query) {
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send query on element %s",
GST_ELEMENT_NAME (element));
- result = oclass->query (element, query);
+ return klass->query (element, query);
}
- return result;
+
+ return FALSE;
}
-/**
- * gst_element_post_message:
- * @element: a #GstElement posting the message
- * @message: (transfer full): a #GstMessage to post
- *
- * Post a message on the element's #GstBus. This function takes ownership of the
- * message; if you want to access the message after this call, you should add an
- * additional reference before calling.
- *
- * Returns: %TRUE if the message was successfully posted. The function returns
- * %FALSE if the element did not have a bus.
- *
- * MT safe.
- */
-gboolean
-gst_element_post_message (GstElement * element, GstMessage * message)
+static gboolean
+gst_element_post_message_default (GstElement * element, GstMessage * message)
{
GstBus *bus;
gboolean result = FALSE;
}
/**
+ * gst_element_post_message:
+ * @element: a #GstElement posting the message
+ * @message: (transfer full): a #GstMessage to post
+ *
+ * Post a message on the element's #GstBus. This function takes ownership of the
+ * message; if you want to access the message after this call, you should add an
+ * additional reference before calling.
+ *
+ * Returns: %TRUE if the message was successfully posted. The function returns
+ * %FALSE if the element did not have a bus.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_post_message (GstElement * element, GstMessage * message)
+{
+ GstElementClass *klass;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (message != NULL, FALSE);
+
+ klass = GST_ELEMENT_GET_CLASS (element);
+ if (klass->post_message)
+ return klass->post_message (element, message);
+
+ return FALSE;
+}
+
+/**
* _gst_element_error_printf:
* @format: the printf-like format to use, or %NULL
*
{
va_list args;
gchar *buffer;
+ int len;
if (format == NULL)
return NULL;
return NULL;
va_start (args, format);
- buffer = g_strdup_vprintf (format, args);
+
+ len = __gst_vasprintf (&buffer, format, args);
+
va_end (args);
+
+ if (len < 0)
+ buffer = NULL;
+
return buffer;
}
*
* MT safe.
*
- * Returns: TRUE, if the element's state is locked.
+ * Returns: %TRUE, if the element's state is locked.
*/
gboolean
gst_element_is_locked_state (GstElement * element)
/**
* gst_element_set_locked_state:
* @element: a #GstElement
- * @locked_state: TRUE to lock the element's state
+ * @locked_state: %TRUE to lock the element's state
*
* Locks the state of an element, so state changes of the parent don't affect
* this element anymore.
*
* MT safe.
*
- * Returns: TRUE if the state was changed, FALSE if bad parameters were given
+ * Returns: %TRUE if the state was changed, %FALSE if bad parameters were given
* or the elements state-locking needed no change.
*/
gboolean
* @element: a #GstElement.
*
* Tries to change the state of the element to the same as its parent.
- * If this function returns FALSE, the state of element is undefined.
+ * If this function returns %FALSE, the state of element is undefined.
*
- * Returns: TRUE, if the element's state could be synced to the parent's state.
+ * Returns: %TRUE, if the element's state could be synced to the parent's state.
*
* MT safe.
*/
* element will perform the remainder of the state change asynchronously in
* another thread.
* An application can use gst_element_get_state() to wait for the completion
- * of the state change or it can wait for a state change message on the bus.
+ * of the state change or it can wait for a %GST_MESSAGE_ASYNC_DONE or
+ * %GST_MESSAGE_STATE_CHANGED on the bus.
*
* State changes to %GST_STATE_READY or %GST_STATE_NULL never return
* #GST_STATE_CHANGE_ASYNC.
return result;
}
+
+/**
+ * gst_element_set_context:
+ * @element: a #GstElement to set the context of.
+ * @context: (transfer none): the #GstContext to set.
+ *
+ * Sets the context of the element. Increases the refcount of the context.
+ *
+ * MT safe.
+ */
+void
+gst_element_set_context (GstElement * element, GstContext * context)
+{
+ GstElementClass *oclass;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CONTEXT, element,
+ "set context %p %" GST_PTR_FORMAT, context,
+ gst_context_get_structure (context));
+
+ if (oclass->set_context)
+ oclass->set_context (element, context);
+}