gst_pad_can_link
gst_pad_get_caps
+gst_pad_get_caps_refed
gst_pad_get_allowed_caps
gst_pad_get_negotiated_caps
gst_pad_get_pad_template_caps
gst_pad_get_peer
gst_pad_peer_get_caps
+gst_pad_peer_get_caps_refed
gst_pad_use_fixed_caps
gst_pad_is_active
if (target) {
/* if we have a real target, proxy the call */
- res = gst_pad_get_caps (target);
+ res = gst_pad_get_caps_refed (target);
GST_DEBUG_OBJECT (pad, "get caps of target %s:%s : %" GST_PTR_FORMAT,
GST_DEBUG_PAD_NAME (target), res);
goto done;
}
+ /* this almost never happens */
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "pad has no caps");
result = gst_caps_new_empty ();
return result;
}
+/* FIXME-0.11: what about making this the default and using
+ * gst_caps_make_writable() explicitely where needed
+ */
+/**
+ * gst_pad_get_caps_refed:
+ * @pad: a #GstPad to get the capabilities of.
+ *
+ * Gets the capabilities this pad can produce or consume. Preferred function if
+ * one only wants to read or intersect the caps.
+ *
+ * Returns: the caps of the pad with incremented ref-count.
+ *
+ * Since: 0.10.25
+ */
+GstCaps *
+gst_pad_get_caps_refed (GstPad * pad)
+{
+ GstCaps *result = NULL;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ GST_OBJECT_LOCK (pad);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get pad caps");
+
+ result = gst_pad_get_caps_unlocked (pad);
+
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
/**
* gst_pad_get_caps:
* @pad: a #GstPad to get the capabilities of.
GstCaps *
gst_pad_get_caps (GstPad * pad)
{
+ GstCaps *result = gst_pad_get_caps_refed (pad);
+
+ /* be sure that we have a copy */
+ if (G_LIKELY (result))
+ result = gst_caps_make_writable (result);
+
+ return result;
+}
+
+/* FIXME-0.11: what about making this the default and using
+ * gst_caps_make_writable() explicitely where needed
+ */
+/**
+ * gst_pad_peer_get_caps_refed:
+ * @pad: a #GstPad to get the capabilities of.
+ *
+ * Gets the capabilities of the peer connected to this pad. Preferred function
+ * if one only wants to read or intersect the caps.
+ *
+ * Returns: the caps of the pad with incremented ref-count.
+ *
+ * Since: 0.10.25
+ */
+GstCaps *
+gst_pad_peer_get_caps_refed (GstPad * pad)
+{
+ GstPad *peerpad;
GstCaps *result = NULL;
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
GST_OBJECT_LOCK (pad);
- GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get pad caps");
-
- result = gst_pad_get_caps_unlocked (pad);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get peer caps");
- /* be sure that we have a copy */
- if (result)
- result = gst_caps_make_writable (result);
+ peerpad = GST_PAD_PEER (pad);
+ if (G_UNLIKELY (peerpad == NULL))
+ goto no_peer;
+ gst_object_ref (peerpad);
GST_OBJECT_UNLOCK (pad);
+ result = gst_pad_get_caps_refed (peerpad);
+
+ gst_object_unref (peerpad);
+
return result;
+
+no_peer:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ return NULL;
+ }
}
/**
* gst_pad_peer_get_caps:
* @pad: a #GstPad to get the peer capabilities of.
*
- * Gets the capabilities of the peer connected to this pad.
+ * Gets the capabilities of the peer connected to this pad. Similar to
+ * gst_pad_get_caps().
*
- * Returns: the #GstCaps of the peer pad. This function returns a new caps, so
- * use gst_caps_unref to get rid of it. this function returns NULL if there is
+ * Returns: a newly allocated copy of the #GstCaps of the peer pad. Use
+ * gst_caps_unref() to get rid of it. This function returns %NULL if there is
* no peer pad.
*/
GstCaps *
GST_DEBUG_OBJECT (pad, "caps %" GST_PTR_FORMAT, caps);
- allowed = gst_pad_get_caps (pad);
+ allowed = gst_pad_get_caps_refed (pad);
if (!allowed)
goto nothing_allowed;
gst_object_ref (peer);
GST_OBJECT_UNLOCK (pad);
- mycaps = gst_pad_get_caps (pad);
+ mycaps = gst_pad_get_caps_refed (pad);
- peercaps = gst_pad_get_caps (peer);
+ peercaps = gst_pad_get_caps_refed (peer);
gst_object_unref (peer);
caps = gst_caps_intersect (mycaps, peercaps);
G_CONST_RETURN GstCaps* gst_pad_get_pad_template_caps (GstPad *pad);
/* capsnego function for linked/unlinked pads */
+GstCaps * gst_pad_get_caps_refed (GstPad * pad);
GstCaps * gst_pad_get_caps (GstPad * pad);
void gst_pad_fixate_caps (GstPad * pad, GstCaps *caps);
gboolean gst_pad_accept_caps (GstPad * pad, GstCaps *caps);
gboolean gst_pad_set_caps (GstPad * pad, GstCaps *caps);
+GstCaps * gst_pad_peer_get_caps_refed (GstPad * pad);
GstCaps * gst_pad_peer_get_caps (GstPad * pad);
gboolean gst_pad_peer_accept_caps (GstPad * pad, GstCaps *caps);
GstCaps *peercaps, *existing;
existing = g_value_get_pointer (ret);
- peercaps = gst_pad_peer_get_caps (pad);
+ peercaps = gst_pad_peer_get_caps_refed (pad);
if (G_LIKELY (peercaps)) {
g_value_set_pointer (ret, gst_caps_intersect (existing, peercaps));
gst_caps_unref (existing);
gboolean result = FALSE;
/* first see what is possible on our source pad */
- thiscaps = gst_pad_get_caps (GST_BASE_SRC_PAD (basesrc));
+ thiscaps = gst_pad_get_caps_refed (GST_BASE_SRC_PAD (basesrc));
GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps);
/* nothing or anything is allowed, we're done */
if (thiscaps == NULL || gst_caps_is_any (thiscaps))
goto no_caps;
/* get the peer caps */
- peercaps = gst_pad_peer_get_caps (GST_BASE_SRC_PAD (basesrc));
+ peercaps = gst_pad_peer_get_caps_refed (GST_BASE_SRC_PAD (basesrc));
GST_DEBUG_OBJECT (basesrc, "caps of peer: %" GST_PTR_FORMAT, peercaps);
if (peercaps) {
GstCaps *icaps;
otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad;
/* we can do what the peer can */
- caps = gst_pad_peer_get_caps (otherpad);
+ caps = gst_pad_peer_get_caps_refed (otherpad);
if (caps) {
GstCaps *temp;
const GstCaps *templ;
GST_DEBUG_OBJECT (pad, "peer caps %" GST_PTR_FORMAT, caps);
- /* filtered against our padtemplate */
+ /* filtered against our padtemplate on the other side */
templ = gst_pad_get_pad_template_caps (otherpad);
GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ);
temp = gst_caps_intersect (caps, templ);
if (caps == NULL)
goto done;
- /* and filter against the template again */
+ /* and filter against the template of this pad */
templ = gst_pad_get_pad_template_caps (pad);
GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ);
temp = gst_caps_intersect (caps, templ);
GST_DEBUG_OBJECT (trans, "othercaps now %" GST_PTR_FORMAT, othercaps);
- peercaps = gst_pad_get_caps (otherpeer);
+ peercaps = gst_pad_get_caps_refed (otherpeer);
intersect = gst_caps_intersect (peercaps, othercaps);
gst_caps_unref (peercaps);
gst_caps_unref (othercaps);
GST_DEBUG_OBJECT (pad, "non fixed accept caps %" GST_PTR_FORMAT, caps);
/* get all the formats we can handle on this pad */
- allowed = gst_pad_get_caps (pad);
+ allowed = gst_pad_get_caps_refed (pad);
if (!allowed) {
GST_DEBUG_OBJECT (pad, "gst_pad_get_caps() failed");
goto no_transform_possible;
gst_pad_flags_get_type
gst_pad_get_allowed_caps
gst_pad_get_caps
+ gst_pad_get_caps_refed
gst_pad_get_direction
gst_pad_get_element_private
gst_pad_get_fixed_caps_func
gst_pad_pause_task
gst_pad_peer_accept_caps
gst_pad_peer_get_caps
+ gst_pad_peer_get_caps_refed
gst_pad_peer_query
gst_pad_presence_get_type
gst_pad_proxy_getcaps