pad: update the context lazyly

This commit is contained in:
Wim Taymans 2011-05-05 11:17:20 +02:00
parent e72d062b33
commit f16180a761
2 changed files with 11 additions and 41 deletions

View file

@ -371,8 +371,6 @@ gst_pad_init (GstPad * pad)
g_static_rec_mutex_init (pad->stream_rec_lock);
pad->block_cond = g_cond_new ();
pad->context = gst_context_new ();
}
static void
@ -406,7 +404,8 @@ gst_pad_dispose (GObject * object)
pad->block_data = NULL;
}
gst_context_clear (pad->context);
if (GST_PAD_CONTEXT (pad))
gst_context_replace (&GST_PAD_CONTEXT (pad), NULL);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
@ -434,8 +433,6 @@ gst_pad_finalize (GObject * object)
pad->block_cond = NULL;
}
gst_context_unref (pad->context);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -620,7 +617,8 @@ post_activate (GstPad * pad, GstActivateMode new_mode)
/* ensures that streaming stops */
GST_PAD_STREAM_LOCK (pad);
GST_DEBUG_OBJECT (pad, "stopped streaming");
gst_context_clear (pad->context);
if (GST_PAD_CONTEXT (pad))
gst_context_clear (GST_PAD_CONTEXT (pad));
GST_PAD_STREAM_UNLOCK (pad);
break;
}
@ -3449,39 +3447,6 @@ gst_pad_chain_data_unchecked (GstPad * pad, gboolean is_buffer, void *data,
emit_signal = GST_PAD_DO_BUFFER_SIGNALS (pad) > 0;
#if 0
if (G_UNLIKELY (GST_PAD_IS_STICKY_PENDING (pad))) {
GstPadEventFunction eventfunc;
if (G_LIKELY ((eventfunc = GST_PAD_EVENTFUNC (pad)))) {
GstEvent *events[GST_EVENT_MAX_STICKY];
GstEvent *event;
guint i;
/* need to make a copy because when we release the object lock, things
* could just change */
for (i = 0; i < GST_EVENT_MAX_STICKY; i++) {
if ((event = pad->sticky[i]))
events[i] = gst_event_ref (event);
else
events[i] = NULL;
}
/* clear the flag */
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_STICKY_PENDING);
GST_OBJECT_UNLOCK (pad);
/* and push */
GST_DEBUG_OBJECT (pad, "pushing sticky events");
for (i = 0; i < GST_EVENT_MAX_STICKY; i++) {
if ((event = events[i]))
eventfunc (pad, event);
}
/* and restart, we released the lock things might have changed */
goto again;
}
}
#endif
GST_OBJECT_UNLOCK (pad);
/* see if the signal should be emited, we emit before caps nego as
@ -4497,8 +4462,12 @@ gst_pad_push_event (GstPad * pad, GstEvent * event)
/* store the event on the pad, but only on srcpads */
if (GST_PAD_IS_SRC (pad) && GST_EVENT_IS_STICKY (event)) {
pad->context = gst_context_make_writable (pad->context);
gst_context_update (pad->context, event);
if (GST_PAD_CONTEXT (pad))
GST_PAD_CONTEXT (pad) = gst_context_make_writable (GST_PAD_CONTEXT (pad));
else
GST_PAD_CONTEXT (pad) = gst_context_new ();
gst_context_update (GST_PAD_CONTEXT (pad), event);
}
peerpad = GST_PAD_PEER (pad);

View file

@ -684,6 +684,7 @@ struct _GstPadClass {
* The caps for this pad.
*/
#define GST_PAD_CAPS(pad) (GST_PAD_CAST(pad)->caps)
#define GST_PAD_CONTEXT(pad) (GST_PAD_CAST(pad)->context)
#define GST_PAD_GETCAPSFUNC(pad) (GST_PAD_CAST(pad)->getcapsfunc)
#define GST_PAD_SETCAPSFUNC(pad) (GST_PAD_CAST(pad)->setcapsfunc)
#define GST_PAD_ACCEPTCAPSFUNC(pad) (GST_PAD_CAST(pad)->acceptcapsfunc)