appsink: make callbacks return GstFlowReturn
authorMartin Samuelsson <martin.samuelsson at axis.com>
Thu, 9 Apr 2009 21:46:17 +0000 (23:46 +0200)
committerWim Taymans <wim@metal.(none)>
Thu, 9 Apr 2009 21:46:17 +0000 (23:46 +0200)
Make the new_buffer and new_preroll callbacks return a GstFlowReturn so that
errors can be reported properly.
Fixes #577827.

gst-libs/gst/app/gstappsink.c
gst-libs/gst/app/gstappsink.h

index 96cd0d895358c1b70250cbc3df7dc61588908292..07b20823bdbf58bdb57ddf3967c78dd102e7f6eb 100644 (file)
@@ -624,6 +624,7 @@ gst_app_sink_event (GstBaseSink * sink, GstEvent * event)
 static GstFlowReturn
 gst_app_sink_preroll (GstBaseSink * psink, GstBuffer * buffer)
 {
+  GstFlowReturn res = GST_FLOW_OK;
   GstAppSink *appsink = GST_APP_SINK (psink);
   gboolean emit;
 
@@ -633,16 +634,19 @@ gst_app_sink_preroll (GstBaseSink * psink, GstBuffer * buffer)
 
   GST_DEBUG_OBJECT (appsink, "setting preroll buffer %p", buffer);
   gst_buffer_replace (&appsink->priv->preroll, buffer);
+
   g_cond_signal (appsink->priv->cond);
   emit = appsink->priv->emit_signals;
   g_mutex_unlock (appsink->priv->mutex);
 
   if (appsink->priv->callbacks.new_preroll)
-    appsink->priv->callbacks.new_preroll (appsink, appsink->priv->user_data);
+    res =
+        appsink->priv->callbacks.new_preroll (appsink,
+        appsink->priv->user_data);
   else if (emit)
     g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_PREROLL], 0);
 
-  return GST_FLOW_OK;
+  return res;
 
 flushing:
   {
@@ -655,6 +659,7 @@ flushing:
 static GstFlowReturn
 gst_app_sink_render (GstBaseSink * psink, GstBuffer * buffer)
 {
+  GstFlowReturn res = GST_FLOW_OK;
   GstAppSink *appsink = GST_APP_SINK (psink);
   gboolean emit;
 
@@ -685,16 +690,18 @@ gst_app_sink_render (GstBaseSink * psink, GstBuffer * buffer)
   }
   /* we need to ref the buffer when pushing it in the queue */
   g_queue_push_tail (appsink->priv->queue, gst_buffer_ref (buffer));
+
   g_cond_signal (appsink->priv->cond);
   emit = appsink->priv->emit_signals;
   g_mutex_unlock (appsink->priv->mutex);
 
   if (appsink->priv->callbacks.new_buffer)
-    appsink->priv->callbacks.new_buffer (appsink, appsink->priv->user_data);
+    res =
+        appsink->priv->callbacks.new_buffer (appsink, appsink->priv->user_data);
   else if (emit)
     g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_BUFFER], 0);
 
-  return GST_FLOW_OK;
+  return res;
 
 flushing:
   {
index e35edcdef63229f870bb2794cc5a96540c14c4c4..a2395ac9fd16ee2b41e60ec55590d966d37edd56 100644 (file)
@@ -42,15 +42,15 @@ typedef struct _GstAppSinkPrivate GstAppSinkPrivate;
 
 /**
  * GstAppSinkCallbacks:
- * @eos: Signal that the end-of-stream has been reached. This signal is
- *       emited from the steaming thread.
- * @new_preroll: Signal that a new preroll buffer is available. 
- *       This signal is emited from the steaming thread.
+ * @eos: Called when the end-of-stream has been reached. This callback
+ *       is called from the steaming thread.
+ * @new_preroll: Called when a new preroll buffer is available. 
+ *       This callback is called from the steaming thread.
  *       The new preroll buffer can be retrieved with
  *       gst_app_sink_pull_preroll() either from this callback
  *       or from any other thread.
- * @new_buffer: Signal that a new buffer is available. 
- *       This signal is emited from the steaming thread.
+ * @new_buffer: Called when a new buffer is available. 
+ *       This callback is called from the steaming thread.
  *       The new buffer can be retrieved with
  *       gst_app_sink_pull_buffer() either from this callback
  *       or from any other thread.
@@ -61,9 +61,9 @@ typedef struct _GstAppSinkPrivate GstAppSinkPrivate;
  * Since: 0.10.23
  */
 typedef struct {
-  void (*eos)           (GstAppSink *sink, gpointer user_data);
-  void (*new_preroll)   (GstAppSink *sink, gpointer user_data);
-  void (*new_buffer)    (GstAppSink *sink, gpointer user_data);
+  void          (*eos)           (GstAppSink *sink, gpointer user_data);
+  GstFlowReturn (*new_preroll)   (GstAppSink *sink, gpointer user_data);
+  GstFlowReturn (*new_buffer)    (GstAppSink *sink, gpointer user_data);
 
   /*< private >*/
   gpointer     _gst_reserved[GST_PADDING];