static void gst_proxy_pad_do_fixatecaps (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); if (target) { gst_pad_fixate_caps (target, caps); gst_object_unref (target); } }
static const GstQueryType * gst_proxy_pad_do_query_type (GstPad * pad) { GstPad *target = gst_proxy_pad_get_target (pad); const GstQueryType *res = NULL; if (target) { res = gst_pad_get_query_types (target); gst_object_unref (target); } return res; }
/** * gst_ghost_pad_get_target: * @gpad: the #GstGhostPad * * Get the target pad of @gpad. Unref target pad after usage. * * Returns: (transfer full): the target #GstPad, can be NULL if the ghostpad * has no target set. Unref target pad after usage. */ GstPad * gst_ghost_pad_get_target (GstGhostPad * gpad) { GstPad *ret; g_return_val_if_fail (GST_IS_GHOST_PAD (gpad), NULL); ret = gst_proxy_pad_get_target (GST_PAD_CAST (gpad)); GST_DEBUG_OBJECT (gpad, "get target %s:%s", GST_DEBUG_PAD_NAME (ret)); return ret; }
static GList * gst_proxy_pad_do_internal_link (GstPad * pad) { GList *res = NULL; GstPad *target = gst_proxy_pad_get_target (pad); if (target) { res = gst_pad_get_internal_links (target); gst_object_unref (target); } return res; }
static gboolean gst_proxy_pad_do_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstPad *target = gst_proxy_pad_get_target (pad); if (target) { res = gst_pad_query (target, query); gst_object_unref (target); } return res; }
static GstIterator * gst_proxy_pad_do_iterate_internal_links (GstPad * pad) { GstIterator *res = NULL; GstPad *target = gst_proxy_pad_get_target (pad); if (target) { res = gst_pad_iterate_internal_links (target); gst_object_unref (target); } return res; }
static gboolean gst_proxy_pad_do_acceptcaps (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); gboolean res; if (target) { res = gst_pad_accept_caps (target, caps); gst_object_unref (target); } else { /* 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; }
static GstCaps * gst_proxy_pad_do_getcaps (GstPad * pad) { GstPad *target = gst_proxy_pad_get_target (pad); GstCaps *res; GstPadTemplate *templ = GST_PAD_PAD_TEMPLATE (pad); if (target) { /* if we have a real target, proxy the call */ res = gst_pad_get_caps (target); gst_object_unref (target); GST_DEBUG_OBJECT (pad, "get caps of target: %" GST_PTR_FORMAT, res); /* filter against the template */ if (templ && res) { GstCaps *filt, *tmp; filt = GST_PAD_TEMPLATE_CAPS (templ); if (filt) { tmp = gst_caps_intersect (filt, res); 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); goto done; } /* last resort, any caps */ GST_DEBUG_OBJECT (pad, "pad has no template, returning ANY"); res = gst_caps_new_any (); } done: return res; }
static gboolean gst_proxy_pad_do_setcaps (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); gboolean res; if (target) { res = gst_pad_set_caps (target, caps); gst_object_unref (target); } else { /* We don't have any target, but we shouldn't return FALSE since this * would stop the actual push of a buffer (which might trigger a pad block * or probe, or properly return GST_FLOW_NOT_LINKED. */ res = TRUE; } return res; }
static void gst_ghost_pad_do_unlink (GstPad * pad) { GstPad *target; GstPad *internal; target = gst_proxy_pad_get_target (pad); internal = GST_PROXY_PAD_INTERNAL (pad); GST_DEBUG_OBJECT (pad, "unlinking ghostpad"); /* The target of the internal pad is no longer valid */ gst_proxy_pad_set_target (internal, NULL); if (target) { if (GST_PAD_UNLINKFUNC (target)) GST_PAD_UNLINKFUNC (target) (target); gst_object_unref (target); } }