appsink: cleanups

Avoid some typecasting.
Avoid dereferencing appsink->priv all the time.
This commit is contained in:
Wim Taymans 2010-02-01 18:55:39 +01:00 committed by Wim Taymans
parent 3ae58733a5
commit 7cce982ee2

View file

@ -458,45 +458,49 @@ gst_app_sink_class_init (GstAppSinkClass * klass)
static void static void
gst_app_sink_init (GstAppSink * appsink, GstAppSinkClass * klass) gst_app_sink_init (GstAppSink * appsink, GstAppSinkClass * klass)
{ {
appsink->priv = G_TYPE_INSTANCE_GET_PRIVATE (appsink, GST_TYPE_APP_SINK, GstAppSinkPrivate *priv;
priv = appsink->priv =
G_TYPE_INSTANCE_GET_PRIVATE (appsink, GST_TYPE_APP_SINK,
GstAppSinkPrivate); GstAppSinkPrivate);
appsink->priv->mutex = g_mutex_new (); priv->mutex = g_mutex_new ();
appsink->priv->cond = g_cond_new (); priv->cond = g_cond_new ();
appsink->priv->queue = g_queue_new (); priv->queue = g_queue_new ();
appsink->priv->emit_signals = DEFAULT_PROP_EMIT_SIGNALS; priv->emit_signals = DEFAULT_PROP_EMIT_SIGNALS;
appsink->priv->max_buffers = DEFAULT_PROP_MAX_BUFFERS; priv->max_buffers = DEFAULT_PROP_MAX_BUFFERS;
appsink->priv->drop = DEFAULT_PROP_DROP; priv->drop = DEFAULT_PROP_DROP;
} }
static void static void
gst_app_sink_dispose (GObject * obj) gst_app_sink_dispose (GObject * obj)
{ {
GstAppSink *appsink = GST_APP_SINK (obj); GstAppSink *appsink = GST_APP_SINK_CAST (obj);
GstAppSinkPrivate *priv = appsink->priv;
GstMiniObject *queue_obj; GstMiniObject *queue_obj;
GST_OBJECT_LOCK (appsink); GST_OBJECT_LOCK (appsink);
if (appsink->priv->caps) { if (priv->caps) {
gst_caps_unref (appsink->priv->caps); gst_caps_unref (priv->caps);
appsink->priv->caps = NULL; priv->caps = NULL;
} }
if (appsink->priv->notify) { if (priv->notify) {
appsink->priv->notify (appsink->priv->user_data); priv->notify (priv->user_data);
} }
appsink->priv->user_data = NULL; priv->user_data = NULL;
appsink->priv->notify = NULL; priv->notify = NULL;
GST_OBJECT_UNLOCK (appsink); GST_OBJECT_UNLOCK (appsink);
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
if (appsink->priv->preroll) { if (priv->preroll) {
gst_buffer_unref (appsink->priv->preroll); gst_buffer_unref (priv->preroll);
appsink->priv->preroll = NULL; priv->preroll = NULL;
} }
while ((queue_obj = g_queue_pop_head (appsink->priv->queue))) while ((queue_obj = g_queue_pop_head (priv->queue)))
gst_mini_object_unref (queue_obj); gst_mini_object_unref (queue_obj);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
G_OBJECT_CLASS (parent_class)->dispose (obj); G_OBJECT_CLASS (parent_class)->dispose (obj);
} }
@ -504,11 +508,12 @@ gst_app_sink_dispose (GObject * obj)
static void static void
gst_app_sink_finalize (GObject * obj) gst_app_sink_finalize (GObject * obj)
{ {
GstAppSink *appsink = GST_APP_SINK (obj); GstAppSink *appsink = GST_APP_SINK_CAST (obj);
GstAppSinkPrivate *priv = appsink->priv;
g_mutex_free (appsink->priv->mutex); g_mutex_free (priv->mutex);
g_cond_free (appsink->priv->cond); g_cond_free (priv->cond);
g_queue_free (appsink->priv->queue); g_queue_free (priv->queue);
G_OBJECT_CLASS (parent_class)->finalize (obj); G_OBJECT_CLASS (parent_class)->finalize (obj);
} }
@ -517,7 +522,7 @@ static void
gst_app_sink_set_property (GObject * object, guint prop_id, gst_app_sink_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec) const GValue * value, GParamSpec * pspec)
{ {
GstAppSink *appsink = GST_APP_SINK (object); GstAppSink *appsink = GST_APP_SINK_CAST (object);
switch (prop_id) { switch (prop_id) {
case PROP_CAPS: case PROP_CAPS:
@ -542,7 +547,7 @@ static void
gst_app_sink_get_property (GObject * object, guint prop_id, GValue * value, gst_app_sink_get_property (GObject * object, guint prop_id, GValue * value,
GParamSpec * pspec) GParamSpec * pspec)
{ {
GstAppSink *appsink = GST_APP_SINK (object); GstAppSink *appsink = GST_APP_SINK_CAST (object);
switch (prop_id) { switch (prop_id) {
case PROP_CAPS: case PROP_CAPS:
@ -576,13 +581,14 @@ gst_app_sink_get_property (GObject * object, guint prop_id, GValue * value,
static gboolean static gboolean
gst_app_sink_unlock_start (GstBaseSink * bsink) gst_app_sink_unlock_start (GstBaseSink * bsink)
{ {
GstAppSink *appsink = GST_APP_SINK (bsink); GstAppSink *appsink = GST_APP_SINK_CAST (bsink);
GstAppSinkPrivate *priv = appsink->priv;
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
GST_DEBUG_OBJECT (appsink, "unlock start"); GST_DEBUG_OBJECT (appsink, "unlock start");
appsink->priv->unlock = TRUE; priv->unlock = TRUE;
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return TRUE; return TRUE;
} }
@ -590,13 +596,14 @@ gst_app_sink_unlock_start (GstBaseSink * bsink)
static gboolean static gboolean
gst_app_sink_unlock_stop (GstBaseSink * bsink) gst_app_sink_unlock_stop (GstBaseSink * bsink)
{ {
GstAppSink *appsink = GST_APP_SINK (bsink); GstAppSink *appsink = GST_APP_SINK_CAST (bsink);
GstAppSinkPrivate *priv = appsink->priv;
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
GST_DEBUG_OBJECT (appsink, "unlock stop"); GST_DEBUG_OBJECT (appsink, "unlock stop");
appsink->priv->unlock = FALSE; priv->unlock = FALSE;
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return TRUE; return TRUE;
} }
@ -605,24 +612,26 @@ static void
gst_app_sink_flush_unlocked (GstAppSink * appsink) gst_app_sink_flush_unlocked (GstAppSink * appsink)
{ {
GstMiniObject *obj; GstMiniObject *obj;
GstAppSinkPrivate *priv = appsink->priv;
GST_DEBUG_OBJECT (appsink, "flush stop appsink"); GST_DEBUG_OBJECT (appsink, "flush stop appsink");
appsink->priv->is_eos = FALSE; priv->is_eos = FALSE;
gst_buffer_replace (&appsink->priv->preroll, NULL); gst_buffer_replace (&priv->preroll, NULL);
while ((obj = g_queue_pop_head (appsink->priv->queue))) while ((obj = g_queue_pop_head (priv->queue)))
gst_mini_object_unref (obj); gst_mini_object_unref (obj);
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
} }
static gboolean static gboolean
gst_app_sink_start (GstBaseSink * psink) gst_app_sink_start (GstBaseSink * psink)
{ {
GstAppSink *appsink = GST_APP_SINK (psink); GstAppSink *appsink = GST_APP_SINK_CAST (psink);
GstAppSinkPrivate *priv = appsink->priv;
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
GST_DEBUG_OBJECT (appsink, "starting"); GST_DEBUG_OBJECT (appsink, "starting");
appsink->priv->started = TRUE; priv->started = TRUE;
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return TRUE; return TRUE;
} }
@ -630,14 +639,15 @@ gst_app_sink_start (GstBaseSink * psink)
static gboolean static gboolean
gst_app_sink_stop (GstBaseSink * psink) gst_app_sink_stop (GstBaseSink * psink)
{ {
GstAppSink *appsink = GST_APP_SINK (psink); GstAppSink *appsink = GST_APP_SINK_CAST (psink);
GstAppSinkPrivate *priv = appsink->priv;
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
GST_DEBUG_OBJECT (appsink, "stopping"); GST_DEBUG_OBJECT (appsink, "stopping");
appsink->priv->flushing = TRUE; priv->flushing = TRUE;
appsink->priv->started = FALSE; priv->started = FALSE;
gst_app_sink_flush_unlocked (appsink); gst_app_sink_flush_unlocked (appsink);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return TRUE; return TRUE;
} }
@ -645,20 +655,21 @@ gst_app_sink_stop (GstBaseSink * psink)
static gboolean static gboolean
gst_app_sink_event (GstBaseSink * sink, GstEvent * event) gst_app_sink_event (GstBaseSink * sink, GstEvent * event)
{ {
GstAppSink *appsink = GST_APP_SINK (sink); GstAppSink *appsink = GST_APP_SINK_CAST (sink);
GstAppSinkPrivate *priv = appsink->priv;
switch (event->type) { switch (event->type) {
case GST_EVENT_EOS: case GST_EVENT_EOS:
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
GST_DEBUG_OBJECT (appsink, "receiving EOS"); GST_DEBUG_OBJECT (appsink, "receiving EOS");
appsink->priv->is_eos = TRUE; priv->is_eos = TRUE;
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
/* emit EOS now */ /* emit EOS now */
if (appsink->priv->callbacks.eos) if (priv->callbacks.eos)
appsink->priv->callbacks.eos (appsink, appsink->priv->user_data); priv->callbacks.eos (appsink, priv->user_data);
else else
g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_EOS], 0); g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_EOS], 0);
@ -669,10 +680,10 @@ gst_app_sink_event (GstBaseSink * sink, GstEvent * event)
GST_DEBUG_OBJECT (appsink, "received FLUSH_START"); GST_DEBUG_OBJECT (appsink, "received FLUSH_START");
break; break;
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
GST_DEBUG_OBJECT (appsink, "received FLUSH_STOP"); GST_DEBUG_OBJECT (appsink, "received FLUSH_STOP");
gst_app_sink_flush_unlocked (appsink); gst_app_sink_flush_unlocked (appsink);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
break; break;
default: default:
break; break;
@ -684,24 +695,23 @@ static GstFlowReturn
gst_app_sink_preroll (GstBaseSink * psink, GstBuffer * buffer) gst_app_sink_preroll (GstBaseSink * psink, GstBuffer * buffer)
{ {
GstFlowReturn res = GST_FLOW_OK; GstFlowReturn res = GST_FLOW_OK;
GstAppSink *appsink = GST_APP_SINK (psink); GstAppSink *appsink = GST_APP_SINK_CAST (psink);
GstAppSinkPrivate *priv = appsink->priv;
gboolean emit; gboolean emit;
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
if (appsink->priv->flushing) if (priv->flushing)
goto flushing; goto flushing;
GST_DEBUG_OBJECT (appsink, "setting preroll buffer %p", buffer); GST_DEBUG_OBJECT (appsink, "setting preroll buffer %p", buffer);
gst_buffer_replace (&appsink->priv->preroll, buffer); gst_buffer_replace (&priv->preroll, buffer);
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
emit = appsink->priv->emit_signals; emit = priv->emit_signals;
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
if (appsink->priv->callbacks.new_preroll) if (priv->callbacks.new_preroll)
res = res = priv->callbacks.new_preroll (appsink, priv->user_data);
appsink->priv->callbacks.new_preroll (appsink,
appsink->priv->user_data);
else if (emit) else if (emit)
g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_PREROLL], 0); g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_PREROLL], 0);
@ -710,7 +720,7 @@ gst_app_sink_preroll (GstBaseSink * psink, GstBuffer * buffer)
flushing: flushing:
{ {
GST_DEBUG_OBJECT (appsink, "we are flushing"); GST_DEBUG_OBJECT (appsink, "we are flushing");
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return GST_FLOW_WRONG_STATE; return GST_FLOW_WRONG_STATE;
} }
} }
@ -720,33 +730,33 @@ gst_app_sink_render_common (GstBaseSink * psink, GstMiniObject * data,
gboolean is_list) gboolean is_list)
{ {
GstFlowReturn ret; GstFlowReturn ret;
GstAppSink *appsink = GST_APP_SINK (psink); GstAppSink *appsink = GST_APP_SINK_CAST (psink);
GstAppSinkPrivate *priv = appsink->priv;
gboolean emit; gboolean emit;
restart: restart:
g_mutex_lock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
if (appsink->priv->flushing) if (priv->flushing)
goto flushing; goto flushing;
GST_DEBUG_OBJECT (appsink, "pushing render buffer%s %p on queue (%d)", GST_DEBUG_OBJECT (appsink, "pushing render buffer%s %p on queue (%d)",
is_list ? " list" : "", data, appsink->priv->queue->length); is_list ? " list" : "", data, priv->queue->length);
while (appsink->priv->max_buffers > 0 && while (priv->max_buffers > 0 && priv->queue->length >= priv->max_buffers) {
appsink->priv->queue->length >= appsink->priv->max_buffers) { if (priv->drop) {
if (appsink->priv->drop) {
GstMiniObject *obj; GstMiniObject *obj;
/* we need to drop the oldest buffer/list and try again */ /* we need to drop the oldest buffer/list and try again */
obj = g_queue_pop_head (appsink->priv->queue); obj = g_queue_pop_head (priv->queue);
GST_DEBUG_OBJECT (appsink, "dropping old buffer/list %p", obj); GST_DEBUG_OBJECT (appsink, "dropping old buffer/list %p", obj);
gst_mini_object_unref (obj); gst_mini_object_unref (obj);
} else { } else {
GST_DEBUG_OBJECT (appsink, "waiting for free space, length %d >= %d", GST_DEBUG_OBJECT (appsink, "waiting for free space, length %d >= %d",
appsink->priv->queue->length, appsink->priv->max_buffers); priv->queue->length, priv->max_buffers);
if (appsink->priv->unlock) { if (priv->unlock) {
/* we are asked to unlock, call the wait_preroll method */ /* we are asked to unlock, call the wait_preroll method */
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
if ((ret = gst_base_sink_wait_preroll (psink)) != GST_FLOW_OK) if ((ret = gst_base_sink_wait_preroll (psink)) != GST_FLOW_OK)
goto stopping; goto stopping;
@ -755,24 +765,23 @@ restart:
} }
/* wait for a buffer to be removed or flush */ /* wait for a buffer to be removed or flush */
g_cond_wait (appsink->priv->cond, appsink->priv->mutex); g_cond_wait (priv->cond, priv->mutex);
if (appsink->priv->flushing) if (priv->flushing)
goto flushing; goto flushing;
} }
} }
/* we need to ref the buffer when pushing it in the queue */ /* we need to ref the buffer when pushing it in the queue */
g_queue_push_tail (appsink->priv->queue, gst_mini_object_ref (data)); g_queue_push_tail (priv->queue, gst_mini_object_ref (data));
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
emit = appsink->priv->emit_signals; emit = priv->emit_signals;
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
if (is_list) { if (is_list) {
if (appsink->priv->callbacks.new_buffer_list) if (priv->callbacks.new_buffer_list)
appsink->priv->callbacks.new_buffer_list (appsink, priv->callbacks.new_buffer_list (appsink, priv->user_data);
appsink->priv->user_data);
} else { } else {
if (appsink->priv->callbacks.new_buffer) if (priv->callbacks.new_buffer)
appsink->priv->callbacks.new_buffer (appsink, appsink->priv->user_data); priv->callbacks.new_buffer (appsink, priv->user_data);
else if (emit) else if (emit)
g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_BUFFER], 0); g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_BUFFER], 0);
} }
@ -781,7 +790,7 @@ restart:
flushing: flushing:
{ {
GST_DEBUG_OBJECT (appsink, "we are flushing"); GST_DEBUG_OBJECT (appsink, "we are flushing");
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return GST_FLOW_WRONG_STATE; return GST_FLOW_WRONG_STATE;
} }
stopping: stopping:
@ -808,11 +817,11 @@ static GstCaps *
gst_app_sink_getcaps (GstBaseSink * psink) gst_app_sink_getcaps (GstBaseSink * psink)
{ {
GstCaps *caps; GstCaps *caps;
GstAppSink *appsink = GST_APP_SINK_CAST (psink);
GstAppSink *appsink = GST_APP_SINK (psink); GstAppSinkPrivate *priv = appsink->priv;
GST_OBJECT_LOCK (appsink); GST_OBJECT_LOCK (appsink);
if ((caps = appsink->priv->caps)) if ((caps = priv->caps))
gst_caps_ref (caps); gst_caps_ref (caps);
GST_DEBUG_OBJECT (appsink, "got caps %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (appsink, "got caps %" GST_PTR_FORMAT, caps);
GST_OBJECT_UNLOCK (appsink); GST_OBJECT_UNLOCK (appsink);
@ -824,31 +833,33 @@ static GstMiniObject *
gst_app_sink_pull_object (GstAppSink * appsink) gst_app_sink_pull_object (GstAppSink * appsink)
{ {
GstMiniObject *obj = NULL; GstMiniObject *obj = NULL;
GstAppSinkPrivate *priv;
g_return_val_if_fail (appsink != NULL, NULL);
g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL); g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL);
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
g_mutex_lock (priv->mutex);
while (TRUE) { while (TRUE) {
GST_DEBUG_OBJECT (appsink, "trying to grab a buffer/list"); GST_DEBUG_OBJECT (appsink, "trying to grab a buffer/list");
if (!appsink->priv->started) if (!priv->started)
goto not_started; goto not_started;
if (!g_queue_is_empty (appsink->priv->queue)) if (!g_queue_is_empty (priv->queue))
break; break;
if (appsink->priv->is_eos) if (priv->is_eos)
goto eos; goto eos;
/* nothing to return, wait */ /* nothing to return, wait */
GST_DEBUG_OBJECT (appsink, "waiting for a buffer/list"); GST_DEBUG_OBJECT (appsink, "waiting for a buffer/list");
g_cond_wait (appsink->priv->cond, appsink->priv->mutex); g_cond_wait (priv->cond, priv->mutex);
} }
obj = g_queue_pop_head (appsink->priv->queue); obj = g_queue_pop_head (priv->queue);
GST_DEBUG_OBJECT (appsink, "we have a buffer/list %p", obj); GST_DEBUG_OBJECT (appsink, "we have a buffer/list %p", obj);
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return obj; return obj;
@ -856,13 +867,13 @@ gst_app_sink_pull_object (GstAppSink * appsink)
eos: eos:
{ {
GST_DEBUG_OBJECT (appsink, "we are EOS, return NULL"); GST_DEBUG_OBJECT (appsink, "we are EOS, return NULL");
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return NULL; return NULL;
} }
not_started: not_started:
{ {
GST_DEBUG_OBJECT (appsink, "we are stopped, return NULL"); GST_DEBUG_OBJECT (appsink, "we are stopped, return NULL");
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return NULL; return NULL;
} }
} }
@ -885,17 +896,19 @@ void
gst_app_sink_set_caps (GstAppSink * appsink, const GstCaps * caps) gst_app_sink_set_caps (GstAppSink * appsink, const GstCaps * caps)
{ {
GstCaps *old; GstCaps *old;
GstAppSinkPrivate *priv;
g_return_if_fail (appsink != NULL);
g_return_if_fail (GST_IS_APP_SINK (appsink)); g_return_if_fail (GST_IS_APP_SINK (appsink));
priv = appsink->priv;
GST_OBJECT_LOCK (appsink); GST_OBJECT_LOCK (appsink);
GST_DEBUG_OBJECT (appsink, "setting caps to %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (appsink, "setting caps to %" GST_PTR_FORMAT, caps);
if ((old = appsink->priv->caps) != caps) { if ((old = priv->caps) != caps) {
if (caps) if (caps)
appsink->priv->caps = gst_caps_copy (caps); priv->caps = gst_caps_copy (caps);
else else
appsink->priv->caps = NULL; priv->caps = NULL;
if (old) if (old)
gst_caps_unref (old); gst_caps_unref (old);
} }
@ -916,12 +929,14 @@ GstCaps *
gst_app_sink_get_caps (GstAppSink * appsink) gst_app_sink_get_caps (GstAppSink * appsink)
{ {
GstCaps *caps; GstCaps *caps;
GstAppSinkPrivate *priv;
g_return_val_if_fail (appsink != NULL, NULL);
g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL); g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL);
priv = appsink->priv;
GST_OBJECT_LOCK (appsink); GST_OBJECT_LOCK (appsink);
if ((caps = appsink->priv->caps)) if ((caps = priv->caps))
gst_caps_ref (caps); gst_caps_ref (caps);
GST_DEBUG_OBJECT (appsink, "getting caps of %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (appsink, "getting caps of %" GST_PTR_FORMAT, caps);
GST_OBJECT_UNLOCK (appsink); GST_OBJECT_UNLOCK (appsink);
@ -947,29 +962,31 @@ gboolean
gst_app_sink_is_eos (GstAppSink * appsink) gst_app_sink_is_eos (GstAppSink * appsink)
{ {
gboolean ret; gboolean ret;
GstAppSinkPrivate *priv;
g_return_val_if_fail (appsink != NULL, FALSE);
g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE); g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE);
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
if (!appsink->priv->started)
g_mutex_lock (priv->mutex);
if (!priv->started)
goto not_started; goto not_started;
if (appsink->priv->is_eos && g_queue_is_empty (appsink->priv->queue)) { if (priv->is_eos && g_queue_is_empty (priv->queue)) {
GST_DEBUG_OBJECT (appsink, "we are EOS and the queue is empty"); GST_DEBUG_OBJECT (appsink, "we are EOS and the queue is empty");
ret = TRUE; ret = TRUE;
} else { } else {
GST_DEBUG_OBJECT (appsink, "we are not yet EOS"); GST_DEBUG_OBJECT (appsink, "we are not yet EOS");
ret = FALSE; ret = FALSE;
} }
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return ret; return ret;
not_started: not_started:
{ {
GST_DEBUG_OBJECT (appsink, "we are stopped, return TRUE"); GST_DEBUG_OBJECT (appsink, "we are stopped, return TRUE");
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return TRUE; return TRUE;
} }
} }
@ -988,11 +1005,15 @@ not_started:
void void
gst_app_sink_set_emit_signals (GstAppSink * appsink, gboolean emit) gst_app_sink_set_emit_signals (GstAppSink * appsink, gboolean emit)
{ {
GstAppSinkPrivate *priv;
g_return_if_fail (GST_IS_APP_SINK (appsink)); g_return_if_fail (GST_IS_APP_SINK (appsink));
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
appsink->priv->emit_signals = emit;
g_mutex_unlock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
priv->emit_signals = emit;
g_mutex_unlock (priv->mutex);
} }
/** /**
@ -1010,12 +1031,15 @@ gboolean
gst_app_sink_get_emit_signals (GstAppSink * appsink) gst_app_sink_get_emit_signals (GstAppSink * appsink)
{ {
gboolean result; gboolean result;
GstAppSinkPrivate *priv;
g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE); g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE);
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
result = appsink->priv->emit_signals;
g_mutex_unlock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
result = priv->emit_signals;
g_mutex_unlock (priv->mutex);
return result; return result;
} }
@ -1034,15 +1058,19 @@ gst_app_sink_get_emit_signals (GstAppSink * appsink)
void void
gst_app_sink_set_max_buffers (GstAppSink * appsink, guint max) gst_app_sink_set_max_buffers (GstAppSink * appsink, guint max)
{ {
GstAppSinkPrivate *priv;
g_return_if_fail (GST_IS_APP_SINK (appsink)); g_return_if_fail (GST_IS_APP_SINK (appsink));
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
if (max != appsink->priv->max_buffers) {
appsink->priv->max_buffers = max; g_mutex_lock (priv->mutex);
if (max != priv->max_buffers) {
priv->max_buffers = max;
/* signal the change */ /* signal the change */
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
} }
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
} }
/** /**
@ -1059,12 +1087,15 @@ guint
gst_app_sink_get_max_buffers (GstAppSink * appsink) gst_app_sink_get_max_buffers (GstAppSink * appsink)
{ {
guint result; guint result;
GstAppSinkPrivate *priv;
g_return_val_if_fail (GST_IS_APP_SINK (appsink), 0); g_return_val_if_fail (GST_IS_APP_SINK (appsink), 0);
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
result = appsink->priv->max_buffers;
g_mutex_unlock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
result = priv->max_buffers;
g_mutex_unlock (priv->mutex);
return result; return result;
} }
@ -1082,15 +1113,19 @@ gst_app_sink_get_max_buffers (GstAppSink * appsink)
void void
gst_app_sink_set_drop (GstAppSink * appsink, gboolean drop) gst_app_sink_set_drop (GstAppSink * appsink, gboolean drop)
{ {
GstAppSinkPrivate *priv;
g_return_if_fail (GST_IS_APP_SINK (appsink)); g_return_if_fail (GST_IS_APP_SINK (appsink));
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
if (appsink->priv->drop != drop) {
appsink->priv->drop = drop; g_mutex_lock (priv->mutex);
if (priv->drop != drop) {
priv->drop = drop;
/* signal the change */ /* signal the change */
g_cond_signal (appsink->priv->cond); g_cond_signal (priv->cond);
} }
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
} }
/** /**
@ -1109,12 +1144,15 @@ gboolean
gst_app_sink_get_drop (GstAppSink * appsink) gst_app_sink_get_drop (GstAppSink * appsink)
{ {
gboolean result; gboolean result;
GstAppSinkPrivate *priv;
g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE); g_return_val_if_fail (GST_IS_APP_SINK (appsink), FALSE);
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
result = appsink->priv->drop;
g_mutex_unlock (appsink->priv->mutex); g_mutex_lock (priv->mutex);
result = priv->drop;
g_mutex_unlock (priv->mutex);
return result; return result;
} }
@ -1148,30 +1186,32 @@ GstBuffer *
gst_app_sink_pull_preroll (GstAppSink * appsink) gst_app_sink_pull_preroll (GstAppSink * appsink)
{ {
GstBuffer *buf = NULL; GstBuffer *buf = NULL;
GstAppSinkPrivate *priv;
g_return_val_if_fail (appsink != NULL, NULL);
g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL); g_return_val_if_fail (GST_IS_APP_SINK (appsink), NULL);
g_mutex_lock (appsink->priv->mutex); priv = appsink->priv;
g_mutex_lock (priv->mutex);
while (TRUE) { while (TRUE) {
GST_DEBUG_OBJECT (appsink, "trying to grab a buffer"); GST_DEBUG_OBJECT (appsink, "trying to grab a buffer");
if (!appsink->priv->started) if (!priv->started)
goto not_started; goto not_started;
if (appsink->priv->preroll != NULL) if (priv->preroll != NULL)
break; break;
if (appsink->priv->is_eos) if (priv->is_eos)
goto eos; goto eos;
/* nothing to return, wait */ /* nothing to return, wait */
GST_DEBUG_OBJECT (appsink, "waiting for the preroll buffer"); GST_DEBUG_OBJECT (appsink, "waiting for the preroll buffer");
g_cond_wait (appsink->priv->cond, appsink->priv->mutex); g_cond_wait (priv->cond, priv->mutex);
} }
buf = gst_buffer_ref (appsink->priv->preroll); buf = gst_buffer_ref (priv->preroll);
GST_DEBUG_OBJECT (appsink, "we have the preroll buffer %p", buf); GST_DEBUG_OBJECT (appsink, "we have the preroll buffer %p", buf);
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return buf; return buf;
@ -1179,13 +1219,13 @@ gst_app_sink_pull_preroll (GstAppSink * appsink)
eos: eos:
{ {
GST_DEBUG_OBJECT (appsink, "we are EOS, return NULL"); GST_DEBUG_OBJECT (appsink, "we are EOS, return NULL");
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return NULL; return NULL;
} }
not_started: not_started:
{ {
GST_DEBUG_OBJECT (appsink, "we are stopped, return NULL"); GST_DEBUG_OBJECT (appsink, "we are stopped, return NULL");
g_mutex_unlock (appsink->priv->mutex); g_mutex_unlock (priv->mutex);
return NULL; return NULL;
} }
} }
@ -1265,30 +1305,32 @@ gst_app_sink_set_callbacks (GstAppSink * appsink,
GstAppSinkCallbacks * callbacks, gpointer user_data, GDestroyNotify notify) GstAppSinkCallbacks * callbacks, gpointer user_data, GDestroyNotify notify)
{ {
GDestroyNotify old_notify; GDestroyNotify old_notify;
GstAppSinkPrivate *priv;
g_return_if_fail (appsink != NULL);
g_return_if_fail (GST_IS_APP_SINK (appsink)); g_return_if_fail (GST_IS_APP_SINK (appsink));
g_return_if_fail (callbacks != NULL); g_return_if_fail (callbacks != NULL);
priv = appsink->priv;
GST_OBJECT_LOCK (appsink); GST_OBJECT_LOCK (appsink);
old_notify = appsink->priv->notify; old_notify = priv->notify;
if (old_notify) { if (old_notify) {
gpointer old_data; gpointer old_data;
old_data = appsink->priv->user_data; old_data = priv->user_data;
appsink->priv->user_data = NULL; priv->user_data = NULL;
appsink->priv->notify = NULL; priv->notify = NULL;
GST_OBJECT_UNLOCK (appsink); GST_OBJECT_UNLOCK (appsink);
old_notify (old_data); old_notify (old_data);
GST_OBJECT_LOCK (appsink); GST_OBJECT_LOCK (appsink);
} }
appsink->priv->callbacks = *callbacks; priv->callbacks = *callbacks;
appsink->priv->user_data = user_data; priv->user_data = user_data;
appsink->priv->notify = notify; priv->notify = notify;
GST_OBJECT_UNLOCK (appsink); GST_OBJECT_UNLOCK (appsink);
} }