videoaggregator: Catch errors, and allow sub-class to return NULL from get_output_buf...
authorJan Schmidt <jan@centricular.com>
Mon, 4 May 2015 08:17:21 +0000 (18:17 +1000)
committerJan Schmidt <jan@centricular.com>
Fri, 29 May 2015 15:33:49 +0000 (01:33 +1000)
A return value of GST_FLOW_OK with a NULL buffer from get_output_buffer()
means the sub-class doesn't want to produce an output buffer, so
skip it.

If gst_videoaggregator_do_aggregate() generates an error, make sure
to propagate it - don't just ignore and discard the error by
over-writing it with the gst_pad_push() result.

gst-libs/gst/video/gstvideoaggregator.c

index d31690fcf1c4f5990589b449fd10e19bd2bd2dad..2f720f382e0a7085942a4e09a5d1d25cf4704d3e 100644 (file)
@@ -1198,6 +1198,10 @@ gst_videoaggregator_do_aggregate (GstVideoAggregator * vagg,
         gst_flow_get_name (ret));
     return ret;
   }
+  if (*outbuf == NULL) {
+    /* sub-class doesn't want to generate output right now */
+    return GST_FLOW_OK;
+  }
 
   GST_BUFFER_TIMESTAMP (*outbuf) = output_start_time;
   GST_BUFFER_DURATION (*outbuf) = output_end_time - output_start_time;
@@ -1369,6 +1373,8 @@ gst_videoaggregator_aggregate (GstAggregator * agg, gboolean timeout)
   if (jitter <= 0) {
     ret = gst_videoaggregator_do_aggregate (vagg, output_start_time,
         output_end_time, &outbuf);
+    if (ret != GST_FLOW_OK)
+      goto done;
     vagg->priv->qos_processed++;
   } else {
     GstMessage *msg;
@@ -1405,6 +1411,8 @@ gst_videoaggregator_aggregate (GstAggregator * agg, gboolean timeout)
   goto done_unlocked;
 
 done:
+  if (outbuf)
+    gst_buffer_unref (outbuf);
   GST_VIDEO_AGGREGATOR_UNLOCK (vagg);
 
 done_unlocked: