/**
* gst_proxy_pad_event_default:
* @pad: a #GstPad to push the event to.
+ * @parent: the parent of @pad or NULL
* @event: (transfer full): the #GstEvent to send to the pad.
*
* Invoke the default event of the proxy pad.
* Since: 0.10.36
*/
gboolean
-gst_proxy_pad_event_default (GstPad * pad, GstEvent * event)
+gst_proxy_pad_event_default (GstPad * pad, GstObject * parent, GstEvent * event)
{
gboolean res;
GstPad *internal;
return res;
}
+static gboolean
+gst_proxy_pad_query_caps (GstPad * pad, GstQuery * query)
+{
+ gboolean res;
+ GstPad *target;
+ GstCaps *result;
+ GstPadTemplate *templ;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
+
+ templ = GST_PAD_PAD_TEMPLATE (pad);
+ target = gst_proxy_pad_get_target (pad);
+ if (target) {
+ /* if we have a real target, proxy the call */
+ res = gst_pad_query (target, query);
+
+ GST_DEBUG_OBJECT (pad, "get caps of target %s:%s : %" GST_PTR_FORMAT,
+ GST_DEBUG_PAD_NAME (target), query);
+
+ gst_object_unref (target);
+
+ /* filter against the template */
+ if (templ && res) {
+ GstCaps *filt, *tmp;
+
+ filt = GST_PAD_TEMPLATE_CAPS (templ);
+ if (filt) {
+ gst_query_parse_caps_result (query, &result);
+ tmp = gst_caps_intersect_full (result, filt, GST_CAPS_INTERSECT_FIRST);
+ gst_query_set_caps_result (query, tmp);
+ GST_DEBUG_OBJECT (pad,
+ "filtered against template gives %" GST_PTR_FORMAT, tmp);
+ gst_caps_unref (tmp);
+ }
+ }
+ } else {
+ GstCaps *filter;
+
+ res = TRUE;
+
+ gst_query_parse_caps (query, &filter);
+
+ /* else, if we have a template, use its caps. */
+ if (templ) {
+ result = GST_PAD_TEMPLATE_CAPS (templ);
+ GST_DEBUG_OBJECT (pad,
+ "using pad template %p with caps %p %" GST_PTR_FORMAT, templ, result,
+ result);
+
+ if (filter) {
+ GstCaps *intersection;
+
+ GST_DEBUG_OBJECT (pad, "intersect with filter");
+ intersection =
+ gst_caps_intersect_full (filter, result, GST_CAPS_INTERSECT_FIRST);
+ gst_query_set_caps_result (query, intersection);
+ gst_caps_unref (intersection);
+ } else {
+ gst_query_set_caps_result (query, result);
+ }
+ goto done;
+ }
+
+ /* If there's a filter, return that */
+ if (filter != NULL) {
+ GST_DEBUG_OBJECT (pad, "return filter");
+ gst_query_set_caps_result (query, filter);
+ goto done;
+ }
+
+ /* last resort, any caps */
+ GST_DEBUG_OBJECT (pad, "pad has no template, returning ANY");
+ result = gst_caps_new_any ();
+ gst_query_set_caps_result (query, result);
+ gst_caps_unref (result);
+ }
+
+done:
+ return res;
+}
+
/**
* gst_proxy_pad_query_default:
* @pad: a #GstPad to invoke the default query on.
+ * @parent: the parent of @pad or NULL
* @query: (transfer none): the #GstQuery to perform.
*
* Invoke the default query function of the proxy pad.
* Since: 0.10.36
*/
gboolean
-gst_proxy_pad_query_default (GstPad * pad, GstQuery * query)
+gst_proxy_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query)
{
gboolean res;
GstPad *target;
g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
- target = gst_proxy_pad_get_target (pad);
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_ACCEPT_CAPS:
{
+ target = gst_proxy_pad_get_target (pad);
if (target) {
res = gst_pad_query (target, query);
gst_object_unref (target);
}
break;
}
+ case GST_QUERY_CAPS:
+ {
+ res = gst_proxy_pad_query_caps (pad, query);
+ break;
+ }
default:
{
+ target = gst_proxy_pad_get_target (pad);
if (target) {
res = gst_pad_query (target, query);
gst_object_unref (target);
/**
* gst_proyx_pad_iterate_internal_links_default:
* @pad: the #GstPad to get the internal links of.
+ * @parent: the parent of @pad or NULL
*
* Invoke the default iterate internal links function of the proxy pad.
*
* Since: 0.10.36
*/
GstIterator *
-gst_proxy_pad_iterate_internal_links_default (GstPad * pad)
+gst_proxy_pad_iterate_internal_links_default (GstPad * pad, GstObject * parent)
{
GstIterator *res = NULL;
GstPad *internal;
/**
* gst_proxy_pad_chain_default:
* @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
+ * @parent: the parent of @pad or NULL
* @buffer: (transfer full): the #GstBuffer to send, return GST_FLOW_ERROR
* if not.
*
* Since: 0.10.36
*/
GstFlowReturn
-gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer)
+gst_proxy_pad_chain_default (GstPad * pad, GstObject * parent,
+ GstBuffer * buffer)
{
GstFlowReturn res;
GstPad *internal;
/**
* gst_proxy_pad_chain_list_default:
* @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
+ * @parent: the parent of @pad or NULL
* @list: (transfer full): the #GstBufferList to send, return GST_FLOW_ERROR
* if not.
*
* Since: 0.10.36
*/
GstFlowReturn
-gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list)
+gst_proxy_pad_chain_list_default (GstPad * pad, GstObject * parent,
+ GstBufferList * list)
{
GstFlowReturn res;
GstPad *internal;
* Since: 0.10.36
*/
GstFlowReturn
-gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size,
- GstBuffer ** buffer)
+gst_proxy_pad_getrange_default (GstPad * pad, GstObject * parent,
+ guint64 offset, guint size, GstBuffer ** buffer)
{
GstFlowReturn res;
GstPad *internal;
return res;
}
-/**
- * gst_proxy_pad_getcaps_default:
- * @pad: a #GstPad to get the capabilities of.
- * @filter: a #GstCaps filter.
- *
- * Invoke the default getcaps function of the proxy pad.
- *
- * Returns: (transfer full): the caps of the pad with incremented ref-count
- *
- * Since: 0.10.36
- */
-GstCaps *
-gst_proxy_pad_getcaps_default (GstPad * pad, GstCaps * filter)
-{
- GstPad *target;
- GstCaps *res;
- GstPadTemplate *templ;
-
- g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL);
-
- templ = GST_PAD_PAD_TEMPLATE (pad);
- target = gst_proxy_pad_get_target (pad);
- if (target) {
- /* if we have a real target, proxy the call */
- res = gst_pad_get_caps (target, filter);
-
- GST_DEBUG_OBJECT (pad, "get caps of target %s:%s : %" GST_PTR_FORMAT,
- GST_DEBUG_PAD_NAME (target), res);
-
- gst_object_unref (target);
-
- /* filter against the template */
- if (templ && res) {
- GstCaps *filt, *tmp;
-
- filt = GST_PAD_TEMPLATE_CAPS (templ);
- if (filt) {
- tmp = gst_caps_intersect_full (res, filt, GST_CAPS_INTERSECT_FIRST);
- gst_caps_unref (res);
- res = tmp;
- GST_DEBUG_OBJECT (pad,
- "filtered against template gives %" GST_PTR_FORMAT, res);
- }
- }
- } else {
- /* else, if we have a template, use its caps. */
- if (templ) {
- res = GST_PAD_TEMPLATE_CAPS (templ);
- GST_DEBUG_OBJECT (pad,
- "using pad template %p with caps %p %" GST_PTR_FORMAT, templ, res,
- res);
- res = gst_caps_ref (res);
-
- if (filter) {
- GstCaps *intersection =
- gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
-
- gst_caps_unref (res);
- res = intersection;
- }
-
- goto done;
- }
-
- /* If there's a filter, return that */
- if (filter != NULL) {
- res = gst_caps_ref (filter);
- goto done;
- }
-
- /* last resort, any caps */
- GST_DEBUG_OBJECT (pad, "pad has no template, returning ANY");
- res = gst_caps_new_any ();
- }
-
-done:
- return res;
-}
-
-/**
- * gst_proxy_pad_acceptcaps_default:
- * @pad: a #GstPad to check
- * @caps: a #GstCaps to check on the pad
- *
- * Invoke the default acceptcaps function of the proxy pad.
- *
- * Returns: TRUE if the pad can accept the caps.
- *
- * Since: 0.10.36
- */
-gboolean
-gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps)
-{
- GstPad *target;
- gboolean res;
-
- g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
- g_return_val_if_fail (caps == NULL || GST_IS_CAPS (caps), FALSE);
-
- target = gst_proxy_pad_get_target (pad);
- if (target) {
- res = gst_pad_accept_caps (target, caps);
- gst_object_unref (target);
- } else {
- GST_DEBUG_OBJECT (pad, "no target");
- /* We don't have a target, we return TRUE and we assume that any future
- * target will be able to deal with any configured caps. */
- res = TRUE;
- }
-
- return res;
-}
-
-/**
- * gst_proxy_pad_fixatecaps_default:
- * @pad: a #GstPad to fixate
- * @caps: the #GstCaps to fixate
- *
- * Invoke the default fixatecaps function of the proxy pad.
- *
- * Since: 0.10.36
- */
-void
-gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps)
-{
- GstPad *target;
-
- g_return_if_fail (GST_IS_PROXY_PAD (pad));
- g_return_if_fail (GST_IS_CAPS (caps));
-
- if (!(target = gst_proxy_pad_get_target (pad)))
- goto no_target;
-
- gst_pad_fixate_caps (target, caps);
- gst_object_unref (target);
-
- return;
-
- /* ERRORS */
-no_target:
- {
- GST_DEBUG_OBJECT (pad, "no target");
- return;
- }
-}
-
static GstPad *
gst_proxy_pad_get_target (GstPad * pad)
{
GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_event_default);
GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_query_default);
GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_iterate_internal_links_default);
- GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_getcaps_default);
- GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_acceptcaps_default);
- GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_fixatecaps_default);
GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_unlink_default);
GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_default);
GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_list_default);
gst_pad_set_iterate_internal_links_function (pad,
gst_proxy_pad_iterate_internal_links_default);
- gst_pad_set_getcaps_function (pad, gst_proxy_pad_getcaps_default);
- gst_pad_set_fixatecaps_function (pad, gst_proxy_pad_fixatecaps_default);
gst_pad_set_unlink_function (pad, gst_proxy_pad_unlink_default);
}
static void gst_ghost_pad_dispose (GObject * object);
-/**
- * gst_ghost_pad_internal_activate_push_default:
- * @pad: the #GstPad to activate or deactivate.
- * @active: whether the pad should be active or not.
- *
- * Invoke the default activate push function of a proxy pad that is
- * owned by a ghost pad.
- *
- * Returns: %TRUE if the operation was successful.
- *
- * Since: 0.10.36
- */
-gboolean
-gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active)
+static gboolean
+gst_ghost_pad_internal_activate_push_default (GstPad * pad, GstObject * parent,
+ gboolean active)
{
gboolean ret;
GstPad *other;
- g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
-
GST_LOG_OBJECT (pad, "%sactivate push on %s:%s, we're ok",
(active ? "" : "de"), GST_DEBUG_PAD_NAME (pad));
/* in both cases (SRC and SINK) we activate just the internal pad. The targets
* will be activated later (or already in case of a ghost sinkpad). */
other = GST_PROXY_PAD_INTERNAL (pad);
- ret = gst_pad_activate_push (other, active);
+ ret = gst_pad_activate_mode (other, GST_PAD_MODE_PUSH, active);
return ret;
}
-/**
- * gst_ghost_pad_internal_activate_pull_default:
- * @pad: the #GstPad to activate or deactivate.
- * @active: whether the pad should be active or not.
- *
- * Invoke the default activate pull function of a proxy pad that is
- * owned by a ghost pad.
- *
- * Returns: %TRUE if the operation was successful.
- *
- * Since: 0.10.36
- */
-gboolean
-gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active)
+static gboolean
+gst_ghost_pad_internal_activate_pull_default (GstPad * pad, GstObject * parent,
+ gboolean active)
{
gboolean ret;
GstPad *other;
- g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
-
GST_LOG_OBJECT (pad, "%sactivate pull on %s:%s", (active ? "" : "de"),
GST_DEBUG_PAD_NAME (pad));
* further upstream */
GST_LOG_OBJECT (pad, "pad is src, activate internal");
other = GST_PROXY_PAD_INTERNAL (pad);
- ret = gst_pad_activate_pull (other, active);
+ ret = gst_pad_activate_mode (other, GST_PAD_MODE_PULL, active);
} else if (G_LIKELY ((other = gst_pad_get_peer (pad)))) {
/* We are SINK, the ghostpad is SRC, we propagate the activation upstream
* since we hold a pointer to the upstream peer. */
GST_LOG_OBJECT (pad, "activating peer");
- ret = gst_pad_activate_pull (other, active);
+ ret = gst_pad_activate_mode (other, GST_PAD_MODE_PULL, active);
gst_object_unref (other);
} else {
/* this is failure, we can't activate pull if there is no peer */
}
/**
- * gst_ghost_pad_activate_push_default:
+ * gst_ghost_pad_internal_activate_mode_default:
* @pad: the #GstPad to activate or deactivate.
+ * @parent: the parent of @pad or NULL
+ * @mode: the requested activation mode
* @active: whether the pad should be active or not.
*
- * Invoke the default activate push function of a ghost pad.
+ * Invoke the default activate mode function of a proxy pad that is
+ * owned by a ghost pad.
*
* Returns: %TRUE if the operation was successful.
- *
- * Since: 0.10.36
*/
gboolean
-gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active)
+gst_ghost_pad_internal_activate_mode_default (GstPad * pad, GstObject * parent,
+ GstPadMode mode, gboolean active)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
+
+ switch (mode) {
+ case GST_PAD_MODE_PULL:
+ res = gst_ghost_pad_internal_activate_pull_default (pad, parent, active);
+ break;
+ case GST_PAD_MODE_PUSH:
+ res = gst_ghost_pad_internal_activate_push_default (pad, parent, active);
+ break;
+ default:
+ GST_LOG_OBJECT (pad, "unknown activation mode %d", mode);
+ res = FALSE;
+ break;
+ }
+ return res;
+}
+
+static gboolean
+gst_ghost_pad_activate_push_default (GstPad * pad, GstObject * parent,
+ gboolean active)
{
gboolean ret;
GstPad *other;
/* just activate the internal pad */
other = GST_PROXY_PAD_INTERNAL (pad);
- ret = gst_pad_activate_push (other, active);
+ ret = gst_pad_activate_mode (other, GST_PAD_MODE_PUSH, active);
return ret;
}
-/**
- * gst_ghost_pad_activate_pull_default:
- * @pad: the #GstPad to activate or deactivate.
- * @active: whether the pad should be active or not.
- *
- * Invoke the default activate pull function of a ghost pad.
- *
- * Returns: %TRUE if the operation was successful.
- *
- * Since: 0.10.36
- */
-gboolean
-gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active)
+static gboolean
+gst_ghost_pad_activate_pull_default (GstPad * pad, GstObject * parent,
+ gboolean active)
{
gboolean ret;
GstPad *other;
- g_return_val_if_fail (GST_IS_GHOST_PAD (pad), FALSE);
-
GST_LOG_OBJECT (pad, "%sactivate pull on %s:%s", (active ? "" : "de"),
GST_DEBUG_PAD_NAME (pad));
* upstream */
GST_LOG_OBJECT (pad, "pad is src, activate internal");
other = GST_PROXY_PAD_INTERNAL (pad);
- ret = gst_pad_activate_pull (other, active);
+ ret = gst_pad_activate_mode (other, GST_PAD_MODE_PULL, active);
} else if (G_LIKELY ((other = gst_pad_get_peer (pad)))) {
/* We are SINK and activated by the internal pad, propagate activation
* upstream because we hold a ref to the upstream peer */
GST_LOG_OBJECT (pad, "activating peer");
- ret = gst_pad_activate_pull (other, active);
+ ret = gst_pad_activate_mode (other, GST_PAD_MODE_PULL, active);
gst_object_unref (other);
} else {
/* no peer, we fail */
}
/**
+ * gst_ghost_pad_activate_mode_default:
+ * @pad: the #GstPad to activate or deactivate.
+ * @parent: the parent of @pad or NULL
+ * @mode: the requested activation mode
+ * @active: whether the pad should be active or not.
+ *
+ * Invoke the default activate mode function of a ghost pad.
+ *
+ * Returns: %TRUE if the operation was successful.
+ */
+gboolean
+gst_ghost_pad_activate_mode_default (GstPad * pad, GstObject * parent,
+ GstPadMode mode, gboolean active)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_GHOST_PAD (pad), FALSE);
+
+ switch (mode) {
+ case GST_PAD_MODE_PULL:
+ res = gst_ghost_pad_activate_pull_default (pad, parent, active);
+ break;
+ case GST_PAD_MODE_PUSH:
+ res = gst_ghost_pad_activate_push_default (pad, parent, active);
+ break;
+ default:
+ GST_LOG_OBJECT (pad, "unknown activation mode %d", mode);
+ res = FALSE;
+ break;
+ }
+ return res;
+}
+
+/**
* gst_ghost_pad_link_default:
* @pad: the #GstPad to link.
* @peer: the #GstPad peer
GST_GHOST_PAD_PRIVATE (pad) = G_TYPE_INSTANCE_GET_PRIVATE (pad,
GST_TYPE_GHOST_PAD, GstGhostPadPrivate);
- gst_pad_set_activatepull_function (GST_PAD_CAST (pad),
- gst_ghost_pad_activate_pull_default);
- gst_pad_set_activatepush_function (GST_PAD_CAST (pad),
- gst_ghost_pad_activate_push_default);
+ gst_pad_set_activatemode_function (GST_PAD_CAST (pad),
+ gst_ghost_pad_activate_mode_default);
}
static void
GST_OBJECT_LOCK (pad);
internal = GST_PROXY_PAD_INTERNAL (pad);
- gst_pad_set_activatepull_function (internal, NULL);
- gst_pad_set_activatepush_function (internal, NULL);
+ gst_pad_set_activatemode_function (internal, NULL);
/* disposes of the internal pad, since the ghostpad is the only possible object
* that has a refcount on the internal pad. */
GST_PROXY_PAD_INTERNAL (internal) = pad;
/* special activation functions for the internal pad */
- gst_pad_set_activatepull_function (internal,
- gst_ghost_pad_internal_activate_pull_default);
- gst_pad_set_activatepush_function (internal,
- gst_ghost_pad_internal_activate_push_default);
+ gst_pad_set_activatemode_function (internal,
+ gst_ghost_pad_internal_activate_mode_default);
GST_OBJECT_UNLOCK (pad);
*
* Will ref the target.
*
- * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ * Returns: (transfer floating): a new #GstPad, or NULL in case of an error.
*/
GstPad *
gst_ghost_pad_new (const gchar * name, GstPad * target)