typefind: Avoid messing pads activation
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Thu, 28 Jan 2010 14:57:33 +0000 (11:57 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>
Fri, 12 Feb 2010 20:23:29 +0000 (17:23 -0300)
Typefind might mess up pads modes (pull/push) if a
downstream element is plugged and its pads activated
in 'step 2' of typefind pads activation.

This happens because the following steps don't check
if we already emitted typefound due to upstream setting
caps on buffers being pulled in the typefind helpers.

Avoid that by checking if typefound is already emmited.

Fixes #608036

plugins/elements/gsttypefindelement.c

index 2073006..8c401e5 100644 (file)
@@ -951,6 +951,18 @@ gst_type_find_element_activate (GstPad * pad)
     }
   }
 
+  /* the type find helpers might have triggered setcaps here (due to upstream)
+   * setting caps on buffers, which emits typefound signal and an element
+   * could have been linked and have its pads activated
+   *
+   * If we deactivate the pads in the following steps we might mess up
+   * downstream element. We should prevent that.
+   */
+  if (typefind->mode == MODE_NORMAL) {
+    /* this means we already emitted typefound */
+    goto really_done;
+  }
+
   /* 3 */
   gst_pad_activate_pull (pad, FALSE);
 
@@ -973,8 +985,9 @@ done:
   /* 7 */
   g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE],
       0, probability, found_caps);
-  gst_caps_unref (found_caps);
   typefind->mode = MODE_NORMAL;
+really_done:
+  gst_caps_unref (found_caps);
 
   /* 8 */
   if (gst_pad_is_active (pad))