summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2021-06-05 02:35:30 +0200
committerMathieu Duponchelle <mathieu@centricular.com>2021-06-05 16:55:44 +0200
commitd1fa1090833f02918f622274bfad3c1550c912f6 (patch)
treecd70ea8e5a4aa2392f0b885b027e7966a65eda98
parented6c970d9c87686407ce9500fad03af8c3a28ea4 (diff)
downloadgstreamer-plugins-base-d1fa1090833f02918f622274bfad3c1550c912f6.tar.gz
appsrc: signal enough-data even when leaking
this is convenient for application that wish to monitor whether the appsrc is leaking. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1193>
-rw-r--r--gst-libs/gst/app/gstappsrc.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/gst-libs/gst/app/gstappsrc.c b/gst-libs/gst/app/gstappsrc.c
index 4c9467602..4207192a2 100644
--- a/gst-libs/gst/app/gstappsrc.c
+++ b/gst-libs/gst/app/gstappsrc.c
@@ -2500,6 +2500,27 @@ gst_app_src_push_internal (GstAppSrc * appsrc, GstBuffer * buffer,
priv->max_buffers, GST_TIME_ARGS (priv->queued_time),
GST_TIME_ARGS (priv->max_time));
+ if (first) {
+ Callbacks *callbacks = NULL;
+ gboolean emit;
+
+ emit = priv->emit_signals;
+ if (priv->callbacks)
+ callbacks = callbacks_ref (priv->callbacks);
+ /* only signal on the first push */
+ g_mutex_unlock (&priv->mutex);
+
+ if (callbacks && callbacks->callbacks.enough_data)
+ callbacks->callbacks.enough_data (appsrc, callbacks->user_data);
+ else if (emit)
+ g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_ENOUGH_DATA], 0,
+ NULL);
+
+ g_clear_pointer (&callbacks, callbacks_unref);
+
+ g_mutex_lock (&priv->mutex);
+ }
+
if (priv->leaky_type == GST_APP_LEAKY_TYPE_UPSTREAM) {
priv->need_discont_upstream = TRUE;
goto dropped;
@@ -2538,24 +2559,6 @@ gst_app_src_push_internal (GstAppSrc * appsrc, GstBuffer * buffer,
}
if (first) {
- Callbacks *callbacks = NULL;
- gboolean emit;
-
- emit = priv->emit_signals;
- if (priv->callbacks)
- callbacks = callbacks_ref (priv->callbacks);
- /* only signal on the first push */
- g_mutex_unlock (&priv->mutex);
-
- if (callbacks && callbacks->callbacks.enough_data)
- callbacks->callbacks.enough_data (appsrc, callbacks->user_data);
- else if (emit)
- g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_ENOUGH_DATA], 0,
- NULL);
-
- g_clear_pointer (&callbacks, callbacks_unref);
-
- g_mutex_lock (&priv->mutex);
/* continue to check for flushing/eos after releasing the lock */
first = FALSE;
continue;