mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
appsink: Only emit EOS signal after all buffers are consumed
Otherwise the application will possibly shut down the pipeline already because EOS is received, while there are still some buffers pending.
This commit is contained in:
parent
661588b150
commit
ce8d261cd6
1 changed files with 22 additions and 6 deletions
|
@ -571,20 +571,36 @@ gst_app_sink_event (GstBaseSink * sink, GstEvent * event)
|
|||
g_queue_push_tail (priv->queue, gst_event_ref (event));
|
||||
g_mutex_unlock (&priv->mutex);
|
||||
break;
|
||||
case GST_EVENT_EOS:
|
||||
case GST_EVENT_EOS:{
|
||||
gboolean emit = TRUE;
|
||||
|
||||
g_mutex_lock (&priv->mutex);
|
||||
GST_DEBUG_OBJECT (appsink, "receiving EOS");
|
||||
priv->is_eos = TRUE;
|
||||
g_cond_signal (&priv->cond);
|
||||
g_mutex_unlock (&priv->mutex);
|
||||
|
||||
/* emit EOS now */
|
||||
if (priv->callbacks.eos)
|
||||
priv->callbacks.eos (appsink, priv->user_data);
|
||||
else
|
||||
g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_EOS], 0);
|
||||
g_mutex_lock (&priv->mutex);
|
||||
/* wait until all buffers are consumed or we're flushing.
|
||||
* Otherwise we might signal EOS before all buffers are
|
||||
* consumed, which is a bit confusing for the application
|
||||
*/
|
||||
while (priv->num_buffers > 0 && !priv->flushing)
|
||||
g_cond_wait (&priv->cond, &priv->mutex);
|
||||
if (priv->flushing)
|
||||
emit = FALSE;
|
||||
g_mutex_unlock (&priv->mutex);
|
||||
|
||||
if (emit) {
|
||||
/* emit EOS now */
|
||||
if (priv->callbacks.eos)
|
||||
priv->callbacks.eos (appsink, priv->user_data);
|
||||
else
|
||||
g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_EOS], 0);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case GST_EVENT_FLUSH_START:
|
||||
/* we don't have to do anything here, the base class will call unlock
|
||||
* which will make sure we exit the _render method */
|
||||
|
|
Loading…
Reference in a new issue