ghostpad: API: Expose gst_proxy_pad_get_internal()

This allows to get the internal pad of ghostpads and
proxypads without using gst_pad_iterate_internal_links()
and is much more convenient.

The internal pad of a ghostpad is the pad of the opposite direction
that is used to link to the ghostpad target.
This commit is contained in:
Sebastian Dröge 2011-05-06 15:16:09 +02:00
parent e8688b62b2
commit a216426bb6
5 changed files with 39 additions and 7 deletions

View file

@ -902,14 +902,20 @@ gst_format_get_type
<SECTION> <SECTION>
<FILE>gstghostpad</FILE> <FILE>gstghostpad</FILE>
<TITLE>GstGhostPad</TITLE> <TITLE>GstGhostPad</TITLE>
GstProxyPad
GstGhostPad GstGhostPad
gst_ghost_pad_new gst_ghost_pad_new
gst_ghost_pad_new_no_target gst_ghost_pad_new_no_target
gst_ghost_pad_new_from_template gst_ghost_pad_new_from_template
gst_ghost_pad_new_no_target_from_template gst_ghost_pad_new_no_target_from_template
gst_ghost_pad_set_target gst_ghost_pad_set_target
gst_ghost_pad_get_target gst_ghost_pad_get_target
gst_ghost_pad_construct gst_ghost_pad_construct
gst_proxy_pad_get_internal
<SUBSECTION Standard> <SUBSECTION Standard>
GstGhostPadClass GstGhostPadClass
GST_GHOST_PAD GST_GHOST_PAD

View file

@ -73,7 +73,6 @@ struct _GstProxyPadPrivate
G_DEFINE_TYPE (GstProxyPad, gst_proxy_pad, GST_TYPE_PAD); G_DEFINE_TYPE (GstProxyPad, gst_proxy_pad, GST_TYPE_PAD);
static GstPad *gst_proxy_pad_get_target (GstPad * pad); static GstPad *gst_proxy_pad_get_target (GstPad * pad);
static GstPad *gst_proxy_pad_get_internal (GstPad * pad);
static void gst_proxy_pad_dispose (GObject * object); static void gst_proxy_pad_dispose (GObject * object);
static void gst_proxy_pad_finalize (GObject * object); static void gst_proxy_pad_finalize (GObject * object);
@ -108,7 +107,8 @@ static gboolean
gst_proxy_pad_do_event (GstPad * pad, GstEvent * event) gst_proxy_pad_do_event (GstPad * pad, GstEvent * event)
{ {
gboolean res = FALSE; gboolean res = FALSE;
GstPad *internal = gst_proxy_pad_get_internal (pad); GstPad *internal =
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad)));
if (internal) { if (internal) {
res = gst_pad_push_event (internal, event); res = gst_pad_push_event (internal, event);
@ -152,7 +152,8 @@ gst_proxy_pad_do_bufferalloc (GstPad * pad, guint64 offset, guint size,
GstCaps * caps, GstBuffer ** buf) GstCaps * caps, GstBuffer ** buf)
{ {
GstFlowReturn result = GST_FLOW_WRONG_STATE; GstFlowReturn result = GST_FLOW_WRONG_STATE;
GstPad *internal = gst_proxy_pad_get_internal (pad); GstPad *internal =
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad)));
if (internal) { if (internal) {
result = gst_pad_alloc_buffer (internal, offset, size, caps, buf); result = gst_pad_alloc_buffer (internal, offset, size, caps, buf);
@ -364,18 +365,32 @@ gst_proxy_pad_get_target (GstPad * pad)
return target; return target;
} }
static GstPad * /**
gst_proxy_pad_get_internal (GstPad * pad) * gst_proxy_pad_get_internal:
* @pad: the #GstProxyPad
*
* Get the internal pad of @pad. Unref target pad after usage.
*
* The internal pad of a #GstGhostPad is the internally used
* pad of opposite direction, which is used to link to the target.
*
* Returns: (transfer full): the target #GstProxyPad, can be NULL.
* Unref target pad after usage.
*/
GstProxyPad *
gst_proxy_pad_get_internal (GstProxyPad * pad)
{ {
GstPad *internal; GstPad *internal;
g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL);
GST_PROXY_LOCK (pad); GST_PROXY_LOCK (pad);
internal = GST_PROXY_PAD_INTERNAL (pad); internal = GST_PROXY_PAD_INTERNAL (pad);
if (internal) if (internal)
gst_object_ref (internal); gst_object_ref (internal);
GST_PROXY_UNLOCK (pad); GST_PROXY_UNLOCK (pad);
return internal; return GST_PROXY_PAD_CAST (internal);
} }
static void static void

View file

@ -59,6 +59,8 @@ struct _GstProxyPadClass
GType gst_proxy_pad_get_type (void); GType gst_proxy_pad_get_type (void);
GstProxyPad* gst_proxy_pad_get_internal (GstProxyPad *pad);
#define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ()) #define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ())
#define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD)) #define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD))

View file

@ -255,7 +255,7 @@ GST_END_TEST;
GST_START_TEST (test_link) GST_START_TEST (test_link)
{ {
GstElement *b1, *b2, *src, *sink; GstElement *b1, *b2, *src, *sink;
GstPad *srcpad, *sinkpad, *gpad; GstPad *srcpad, *sinkpad, *gpad, *ppad, *tmp;
GstPadLinkReturn ret; GstPadLinkReturn ret;
b1 = gst_element_factory_make ("pipeline", NULL); b1 = gst_element_factory_make ("pipeline", NULL);
@ -278,6 +278,14 @@ GST_START_TEST (test_link)
/* now setup a ghostpad */ /* now setup a ghostpad */
gpad = gst_ghost_pad_new ("sink", sinkpad); gpad = gst_ghost_pad_new ("sink", sinkpad);
/* Check if the internal pads are set correctly */
ppad = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (gpad)));
fail_unless (ppad == GST_PAD_PEER (sinkpad));
tmp = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (ppad)));
fail_unless (tmp == gpad);
gst_object_unref (tmp);
gst_object_unref (ppad);
gst_object_unref (sinkpad); gst_object_unref (sinkpad);
/* need to ref as _add_pad takes ownership */ /* need to ref as _add_pad takes ownership */
gst_object_ref (gpad); gst_object_ref (gpad);

View file

@ -832,6 +832,7 @@ EXPORTS
gst_print_element_args gst_print_element_args
gst_print_pad_caps gst_print_pad_caps
gst_progress_type_get_type gst_progress_type_get_type
gst_proxy_pad_get_internal
gst_proxy_pad_get_type gst_proxy_pad_get_type
gst_qos_type_get_type gst_qos_type_get_type
gst_query_add_buffering_range gst_query_add_buffering_range