tee: avoid expensive typechecks, and avoid getting ref to parent.

Speeds up tee processing 2 to 5 times.
This commit is contained in:
Edward Hervey 2009-11-18 09:01:35 +01:00
parent 4140350594
commit e572d3bf0b
2 changed files with 10 additions and 11 deletions

View file

@ -455,7 +455,7 @@ retry:
GST_OBJECT_UNLOCK (tee); GST_OBJECT_UNLOCK (tee);
GST_TEE_DYN_LOCK (tee); GST_TEE_DYN_LOCK (tee);
data = g_object_get_qdata (G_OBJECT (pad), push_data); data = g_object_get_qdata ((GObject *) pad, push_data);
if (!data->removed) if (!data->removed)
res = gst_pad_alloc_buffer (pad, offset, size, caps, buf); res = gst_pad_alloc_buffer (pad, offset, size, caps, buf);
else else
@ -482,7 +482,7 @@ retry:
/* we have a buffer, keep the pad for later and exit the loop. */ /* we have a buffer, keep the pad for later and exit the loop. */
tee->allocpad = pad; tee->allocpad = pad;
GST_OBJECT_UNLOCK (tee); GST_OBJECT_UNLOCK (tee);
g_object_notify (G_OBJECT (tee), "alloc-pad"); g_object_notify ((GObject *) tee, "alloc-pad");
GST_OBJECT_LOCK (tee); GST_OBJECT_LOCK (tee);
break; break;
} }
@ -501,7 +501,7 @@ gst_tee_buffer_alloc (GstPad * pad, guint64 offset, guint size,
GstFlowReturn res; GstFlowReturn res;
GstPad *allocpad; GstPad *allocpad;
tee = GST_TEE (GST_PAD_PARENT (pad)); tee = GST_TEE_CAST (GST_PAD_PARENT (pad));
res = GST_FLOW_NOT_LINKED; res = GST_FLOW_NOT_LINKED;
@ -517,7 +517,7 @@ gst_tee_buffer_alloc (GstPad * pad, guint64 offset, guint size,
GST_OBJECT_UNLOCK (tee); GST_OBJECT_UNLOCK (tee);
GST_TEE_DYN_LOCK (tee); GST_TEE_DYN_LOCK (tee);
data = g_object_get_qdata (G_OBJECT (allocpad), push_data); data = g_object_get_qdata ((GObject *) allocpad, push_data);
if (!data->removed) if (!data->removed)
res = gst_pad_alloc_buffer (allocpad, offset, size, caps, buf); res = gst_pad_alloc_buffer (allocpad, offset, size, caps, buf);
else else
@ -548,7 +548,7 @@ gst_tee_sink_acceptcaps (GstPad * pad, GstCaps * caps)
gboolean res, done; gboolean res, done;
GstIterator *it; GstIterator *it;
tee = GST_TEE (GST_PAD_PARENT (pad)); tee = GST_TEE_CAST (GST_PAD_PARENT (pad));
it = gst_element_iterate_src_pads (GST_ELEMENT_CAST (tee)); it = gst_element_iterate_src_pads (GST_ELEMENT_CAST (tee));
@ -623,7 +623,7 @@ clear_pads (GstPad * pad, GstTee * tee)
{ {
PushData *data; PushData *data;
data = g_object_get_qdata (G_OBJECT (pad), push_data); data = g_object_get_qdata ((GObject *) pad, push_data);
/* the data must be there or we have a screwed up internal state */ /* the data must be there or we have a screwed up internal state */
g_assert (data != NULL); g_assert (data != NULL);
@ -676,7 +676,7 @@ restart:
/* get the private data, something is really wrong with the internal state /* get the private data, something is really wrong with the internal state
* when it is not there */ * when it is not there */
pdata = g_object_get_qdata (G_OBJECT (pad), push_data); pdata = g_object_get_qdata ((GObject *) pad, push_data);
g_assert (pdata != NULL); g_assert (pdata != NULL);
if (!pdata->pushed) { if (!pdata->pushed) {
@ -751,7 +751,7 @@ gst_tee_chain (GstPad * pad, GstBuffer * buffer)
GstFlowReturn res; GstFlowReturn res;
GstTee *tee; GstTee *tee;
tee = GST_TEE (gst_pad_get_parent (pad)); tee = GST_TEE_CAST (GST_OBJECT_PARENT (pad));
GST_DEBUG_OBJECT (tee, "received buffer %p", buffer); GST_DEBUG_OBJECT (tee, "received buffer %p", buffer);
@ -759,8 +759,6 @@ gst_tee_chain (GstPad * pad, GstBuffer * buffer)
GST_DEBUG_OBJECT (tee, "handled buffer %s", gst_flow_get_name (res)); GST_DEBUG_OBJECT (tee, "handled buffer %s", gst_flow_get_name (res));
gst_object_unref (tee);
return res; return res;
} }
@ -770,7 +768,7 @@ gst_tee_chain_list (GstPad * pad, GstBufferList * list)
GstFlowReturn res; GstFlowReturn res;
GstTee *tee; GstTee *tee;
tee = GST_TEE (gst_pad_get_parent (pad)); tee = GST_TEE_CAST (gst_pad_get_parent (pad));
GST_DEBUG_OBJECT (tee, "received list %p", list); GST_DEBUG_OBJECT (tee, "received list %p", list);

View file

@ -39,6 +39,7 @@ G_BEGIN_DECLS
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEE)) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEE))
#define GST_IS_TEE_CLASS(klass) \ #define GST_IS_TEE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEE)) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEE))
#define GST_TEE_CAST(obj) ((GstTee*) obj)
typedef struct _GstTee GstTee; typedef struct _GstTee GstTee;
typedef struct _GstTeeClass GstTeeClass; typedef struct _GstTeeClass GstTeeClass;