X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fgstelement.c;h=25870f59d81294a7c3686b93b4ea1e01e7a1f495;hb=e10266e3f3cf9b05b69198b1ac6faa9a62840e30;hp=fa2c3bcd84d15373cb6b8822479dad4ced5b5f3e;hpb=f05b0e222f9cf4fff35327c7d109be42fbf27eb7;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst/gstelement.c b/gst/gstelement.c index fa2c3bc..25870f5 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -16,8 +16,8 @@ * * 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. */ /** @@ -43,8 +43,7 @@ * * 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. @@ -72,11 +71,9 @@ * #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" @@ -97,6 +94,10 @@ #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 { @@ -130,6 +131,8 @@ static GstStateChangeReturn gst_element_set_state_func (GstElement * element, 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); @@ -235,6 +238,7 @@ gst_element_class_init (GstElementClass * klass) 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; } @@ -267,8 +271,8 @@ gst_element_base_class_init (gpointer g_class) 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 @@ -301,10 +305,10 @@ gst_element_init (GstElement * element) * @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. @@ -668,17 +672,17 @@ gst_element_add_pad (GstElement * element, GstPad * pad) /* add it to the list */ switch (gst_pad_get_direction (pad)) { case GST_PAD_SRC: - element->srcpads = g_list_prepend (element->srcpads, pad); + element->srcpads = g_list_append (element->srcpads, pad); element->numsrcpads++; break; case GST_PAD_SINK: - element->sinkpads = g_list_prepend (element->sinkpads, pad); + element->sinkpads = g_list_append (element->sinkpads, pad); element->numsinkpads++; break; default: goto no_direction; } - element->pads = g_list_prepend (element->pads, pad); + element->pads = g_list_append (element->pads, pad); element->numpads++; element->pads_cookie++; GST_OBJECT_UNLOCK (element); @@ -728,7 +732,7 @@ no_direction: * * 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 @@ -791,6 +795,7 @@ gst_element_remove_pad (GstElement * element, GstPad * pad) 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); @@ -1114,8 +1119,10 @@ gst_element_iterate_pad_list (GstElement * element, GList ** padlist) * be freed after usage. Also more specialized iterators exists such as * gst_element_iterate_src_pads() or gst_element_iterate_sink_pads(). * - * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad - * after use. + * 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. * * MT safe. */ @@ -1133,8 +1140,10 @@ gst_element_iterate_pads (GstElement * element) * * Retrieves an iterator of @element's source pads. * - * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad - * after use. + * 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. * * MT safe. */ @@ -1152,8 +1161,10 @@ gst_element_iterate_src_pads (GstElement * element) * * Retrieves an iterator of @element's sink pads. * - * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad - * after use. + * 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. * * MT safe. */ @@ -1274,6 +1285,10 @@ gst_element_class_set_metadata (GstElementClass * klass, 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, @@ -1311,6 +1326,10 @@ gst_element_class_set_static_metadata (GstElementClass * klass, 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); @@ -1514,7 +1533,7 @@ gst_element_default_send_event (GstElement * element, GstEvent * event) * 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. @@ -1622,45 +1641,30 @@ gst_element_default_query (GstElement * element, GstQuery * query) * * 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; @@ -1696,6 +1700,35 @@ no_bus: } /** + * 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 * @@ -1711,6 +1744,7 @@ _gst_element_error_printf (const gchar * format, ...) { va_list args; gchar *buffer; + int len; if (format == NULL) return NULL; @@ -1718,8 +1752,14 @@ _gst_element_error_printf (const gchar * format, ...) 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; } @@ -1833,7 +1873,7 @@ void gst_element_message_full * * 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) @@ -1852,14 +1892,14 @@ 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 @@ -1904,9 +1944,9 @@ was_ok: * @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. */ @@ -2393,7 +2433,8 @@ only_async_start: * 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. @@ -2978,3 +3019,29 @@ gst_element_get_bus (GstElement * element) 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); +}