mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-30 07:42:32 +00:00
element: Add API to get the last set context from an element
Elements should override GstElement::set_context() and also call gst_element_set_context() to keep this context up-to-date with the very latest context they internally use.
This commit is contained in:
parent
782511d8f6
commit
dd831b8114
5 changed files with 46 additions and 10 deletions
|
@ -774,6 +774,7 @@ gst_element_get_start_time
|
||||||
gst_element_set_bus
|
gst_element_set_bus
|
||||||
gst_element_get_bus
|
gst_element_get_bus
|
||||||
gst_element_set_context
|
gst_element_set_context
|
||||||
|
gst_element_get_context
|
||||||
gst_element_get_factory
|
gst_element_get_factory
|
||||||
gst_element_set_name
|
gst_element_set_name
|
||||||
gst_element_get_name
|
gst_element_get_name
|
||||||
|
|
|
@ -189,8 +189,6 @@ struct _GstBinPrivate
|
||||||
|
|
||||||
guint32 structure_cookie;
|
guint32 structure_cookie;
|
||||||
|
|
||||||
GstContext *context;
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* cached index */
|
/* cached index */
|
||||||
GstIndex *index;
|
GstIndex *index;
|
||||||
|
@ -1144,8 +1142,8 @@ gst_bin_add_func (GstBin * bin, GstElement * element)
|
||||||
* a new clock will be selected */
|
* a new clock will be selected */
|
||||||
gst_element_set_clock (element, GST_ELEMENT_CLOCK (bin));
|
gst_element_set_clock (element, GST_ELEMENT_CLOCK (bin));
|
||||||
|
|
||||||
if (bin->priv->context)
|
if (GST_ELEMENT_CAST (bin)->context)
|
||||||
gst_element_set_context (element, bin->priv->context);
|
gst_element_set_context (element, GST_ELEMENT_CAST (bin)->context);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* set the cached index on the children */
|
/* set the cached index on the children */
|
||||||
|
@ -3966,9 +3964,6 @@ gst_bin_set_context (GstElement * element, GstContext * context)
|
||||||
while (gst_iterator_foreach (children, set_context,
|
while (gst_iterator_foreach (children, set_context,
|
||||||
context) == GST_ITERATOR_RESYNC);
|
context) == GST_ITERATOR_RESYNC);
|
||||||
gst_iterator_free (children);
|
gst_iterator_free (children);
|
||||||
GST_OBJECT_LOCK (bin);
|
|
||||||
gst_context_replace (&bin->priv->context, context);
|
|
||||||
GST_OBJECT_UNLOCK (bin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
|
|
|
@ -132,7 +132,8 @@ static gboolean gst_element_set_clock_func (GstElement * element,
|
||||||
static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
|
static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
|
||||||
static gboolean gst_element_post_message_default (GstElement * element,
|
static gboolean gst_element_post_message_default (GstElement * element,
|
||||||
GstMessage * message);
|
GstMessage * message);
|
||||||
|
static void gst_element_set_context_func (GstElement * element,
|
||||||
|
GstContext * context);
|
||||||
|
|
||||||
static gboolean gst_element_default_send_event (GstElement * element,
|
static gboolean gst_element_default_send_event (GstElement * element,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
|
@ -239,6 +240,7 @@ gst_element_class_init (GstElementClass * klass)
|
||||||
klass->send_event = GST_DEBUG_FUNCPTR (gst_element_default_send_event);
|
klass->send_event = GST_DEBUG_FUNCPTR (gst_element_default_send_event);
|
||||||
klass->numpadtemplates = 0;
|
klass->numpadtemplates = 0;
|
||||||
klass->post_message = GST_DEBUG_FUNCPTR (gst_element_post_message_default);
|
klass->post_message = GST_DEBUG_FUNCPTR (gst_element_post_message_default);
|
||||||
|
klass->set_context = GST_DEBUG_FUNCPTR (gst_element_set_context_func);
|
||||||
|
|
||||||
klass->elementfactory = NULL;
|
klass->elementfactory = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2902,6 +2904,7 @@ gst_element_dispose (GObject * object)
|
||||||
bus_p = &element->bus;
|
bus_p = &element->bus;
|
||||||
gst_object_replace ((GstObject **) clock_p, NULL);
|
gst_object_replace ((GstObject **) clock_p, NULL);
|
||||||
gst_object_replace ((GstObject **) bus_p, NULL);
|
gst_object_replace ((GstObject **) bus_p, NULL);
|
||||||
|
gst_context_replace (&element->context, NULL);
|
||||||
GST_OBJECT_UNLOCK (element);
|
GST_OBJECT_UNLOCK (element);
|
||||||
|
|
||||||
GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "parent class dispose");
|
GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "parent class dispose");
|
||||||
|
@ -3012,9 +3015,17 @@ gst_element_get_bus (GstElement * element)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_element_set_context_func (GstElement * element, GstContext * context)
|
||||||
|
{
|
||||||
|
GST_OBJECT_LOCK (element);
|
||||||
|
gst_context_replace (&element->context, context);
|
||||||
|
GST_OBJECT_UNLOCK (element);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_element_set_context:
|
* gst_element_set_context:
|
||||||
* @element: a #GstElement to set the bus of.
|
* @element: a #GstElement to set the context of.
|
||||||
* @context: (transfer none): the #GstContext to set.
|
* @context: (transfer none): the #GstContext to set.
|
||||||
*
|
*
|
||||||
* Sets the context of the element. Increases the refcount of the context.
|
* Sets the context of the element. Increases the refcount of the context.
|
||||||
|
@ -3037,3 +3048,28 @@ gst_element_set_context (GstElement * element, GstContext * context)
|
||||||
if (oclass->set_context)
|
if (oclass->set_context)
|
||||||
oclass->set_context (element, context);
|
oclass->set_context (element, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_element_get_context:
|
||||||
|
* @element: a #GstElement to get the context from.
|
||||||
|
*
|
||||||
|
* Gets the current context of the element.
|
||||||
|
*
|
||||||
|
* MT safe.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): The current context of the element
|
||||||
|
*/
|
||||||
|
GstContext *
|
||||||
|
gst_element_get_context (GstElement * element)
|
||||||
|
{
|
||||||
|
GstContext *context = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (element);
|
||||||
|
if (element->context)
|
||||||
|
context = gst_context_ref (element->context);
|
||||||
|
GST_OBJECT_UNLOCK (element);
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
|
@ -568,8 +568,10 @@ struct _GstElement
|
||||||
GList *sinkpads;
|
GList *sinkpads;
|
||||||
guint32 pads_cookie;
|
guint32 pads_cookie;
|
||||||
|
|
||||||
|
GstContext *context;
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
gpointer _gst_reserved[GST_PADDING-1];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -742,6 +744,7 @@ GstBus * gst_element_get_bus (GstElement * element);
|
||||||
|
|
||||||
/* context */
|
/* context */
|
||||||
void gst_element_set_context (GstElement * element, GstContext * context);
|
void gst_element_set_context (GstElement * element, GstContext * context);
|
||||||
|
GstContext * gst_element_get_context (GstElement * element);
|
||||||
|
|
||||||
/* pad management */
|
/* pad management */
|
||||||
gboolean gst_element_add_pad (GstElement *element, GstPad *pad);
|
gboolean gst_element_add_pad (GstElement *element, GstPad *pad);
|
||||||
|
|
|
@ -387,6 +387,7 @@ EXPORTS
|
||||||
gst_element_get_clock
|
gst_element_get_clock
|
||||||
gst_element_get_compatible_pad
|
gst_element_get_compatible_pad
|
||||||
gst_element_get_compatible_pad_template
|
gst_element_get_compatible_pad_template
|
||||||
|
gst_element_get_context
|
||||||
gst_element_get_factory
|
gst_element_get_factory
|
||||||
gst_element_get_request_pad
|
gst_element_get_request_pad
|
||||||
gst_element_get_start_time
|
gst_element_get_start_time
|
||||||
|
|
Loading…
Reference in a new issue