rtpbasepayload: Save and forward the push flow return
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Fri, 22 Nov 2019 02:04:14 +0000 (21:04 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Sun, 12 Jan 2020 00:39:55 +0000 (19:39 -0500)
Save push/push_list helper flow return and in case of failure, return it
in the process function. This allow forwarding downstream flow return
even if the subclass is using the push/push_list helper.

gst-libs/gst/rtp/gstrtpbasedepayload.c

index 83d819a..1355fd7 100644 (file)
@@ -63,6 +63,8 @@ struct _GstRTPBaseDepayloadPrivate
 
   gboolean source_info;
   GstBuffer *input_buffer;
+
+  GstFlowReturn process_flow_ret;
 };
 
 /* Filter signals and args */
@@ -386,7 +388,6 @@ gst_rtp_base_depayload_handle_buffer (GstRTPBaseDepayload * filter,
       GstRTPBuffer * rtp_buffer);
   GstBuffer *(*process_func) (GstRTPBaseDepayload * base, GstBuffer * in);
   GstRTPBaseDepayloadPrivate *priv;
-  GstFlowReturn ret = GST_FLOW_OK;
   GstBuffer *out_buf;
   guint32 ssrc;
   guint16 seqnum;
@@ -396,6 +397,7 @@ gst_rtp_base_depayload_handle_buffer (GstRTPBaseDepayload * filter,
   GstRTPBuffer rtp = { NULL };
 
   priv = filter->priv;
+  priv->process_flow_ret = GST_FLOW_OK;
 
   process_func = bclass->process;
   process_rtp_packet_func = bclass->process_rtp_packet;
@@ -511,13 +513,16 @@ gst_rtp_base_depayload_handle_buffer (GstRTPBaseDepayload * filter,
 
   /* let's send it out to processing */
   if (out_buf) {
-    ret = gst_rtp_base_depayload_push (filter, out_buf);
+    if (priv->process_flow_ret == GST_FLOW_OK)
+      priv->process_flow_ret = gst_rtp_base_depayload_push (filter, out_buf);
+    else
+      gst_buffer_unref (out_buf);
   }
 
   gst_buffer_unref (in);
   priv->input_buffer = NULL;
 
-  return ret;
+  return priv->process_flow_ret;
 
   /* ERRORS */
 not_negotiated:
@@ -916,6 +921,9 @@ gst_rtp_base_depayload_push (GstRTPBaseDepayload * filter, GstBuffer * out_buf)
   else
     gst_buffer_unref (out_buf);
 
+  if (res != GST_FLOW_OK)
+    filter->priv->process_flow_ret = res;
+
   return res;
 }
 
@@ -942,6 +950,9 @@ gst_rtp_base_depayload_push_list (GstRTPBaseDepayload * filter,
   else
     gst_buffer_list_unref (out_list);
 
+  if (res != GST_FLOW_OK)
+    filter->priv->process_flow_ret = res;
+
   return res;
 }