plugins/elements/gsttee.c: Check for changed pads-list before checking the last returned
authorWim Taymans <wim.taymans@gmail.com>
Mon, 8 Dec 2008 22:28:05 +0000 (22:28 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 8 Dec 2008 22:28:05 +0000 (22:28 +0000)
Original commit message from CVS:
* plugins/elements/gsttee.c: (gst_tee_handle_buffer):
Check for changed pads-list before checking the last returned
GstFlowReturn because the pad could have been removed and we
need to ignore the value in that case.

ChangeLog
plugins/elements/gsttee.c

index 14af407..b823d83 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2008-12-08  Wim Taymans  <wim.taymans@collabora.co.uk>
 
+       * plugins/elements/gsttee.c: (gst_tee_handle_buffer):
+       Check for changed pads-list before checking the last returned
+       GstFlowReturn because the pad could have been removed and we
+       need to ignore the value in that case.
+
+2008-12-08  Wim Taymans  <wim.taymans@collabora.co.uk>
+
        * libs/gst/base/gstbasetransform.c:
        (gst_base_transform_prepare_output_buffer),
        (gst_base_transform_getrange), (gst_base_transform_chain):
index c160de3..b22cb18 100644 (file)
@@ -593,6 +593,18 @@ restart:
       GST_LOG_OBJECT (tee, "pad already pushed with %s",
           gst_flow_get_name (ret));
     }
+
+    /* before we go combining the return value, check if the pad list is still
+     * the same. It could be possible that the pad we just pushed was removed
+     * and the return value it not valid anymore */
+    if (GST_ELEMENT_CAST (tee)->pads_cookie != cookie) {
+      GST_LOG_OBJECT (tee, "pad list changed");
+      /* the list of pads changed, restart iteration. Pads that we already
+       * pushed on and are still in the new list, will not be pushed on
+       * again. */
+      goto restart;
+    }
+
     /* stop pushing more buffers when we have a fatal error */
     if (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED)
       goto error;
@@ -602,14 +614,6 @@ restart:
       GST_LOG_OBJECT (tee, "Replacing ret val %d with %d", cret, ret);
       cret = ret;
     }
-
-    if (GST_ELEMENT_CAST (tee)->pads_cookie != cookie) {
-      GST_LOG_OBJECT (tee, "pad list changed");
-      /* the list of pads changed, restart iteration. Pads that we already
-       * pushed on and are still in the new list, will not be pushed on
-       * again. */
-      goto restart;
-    }
     pads = g_list_next (pads);
   }
   GST_OBJECT_UNLOCK (tee);