audioparsers: baseparse: Be careful to not lose the event ref
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Fri, 14 Jan 2011 19:30:11 +0000 (16:30 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>
Sat, 15 Jan 2011 16:48:26 +0000 (13:48 -0300)
Don't unref the event if it hasn't been handled, because the caller
assumes it is still valid and might reuse it.

I ran into this problem when transcoding an AVI (with mp3 inside)
to gpp.

https://bugzilla.gnome.org/show_bug.cgi?id=639555

gst/audioparsers/gstbaseparse.c

index 58c0ebe9eb56cbe3ee0a8dd6bccf6179df51a23e..59355c775765a1b63bcbabca33db04e619c7e30f 100644 (file)
@@ -738,7 +738,10 @@ gst_base_parse_sink_event (GstPad * pad, GstEvent * event)
  *
  * Element-level event handler function.
  *
- * Returns: TRUE if the event was handled and not need forwarding.
+ * The event will be unreffed only if it has been handled and this
+ * function returns %TRUE
+ *
+ * Returns: %TRUE if the event was handled and not need forwarding.
  */
 static gboolean
 gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
@@ -858,7 +861,9 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
 
     case GST_EVENT_FLUSH_START:
       parse->priv->flushing = TRUE;
-      handled = gst_pad_push_event (parse->srcpad, event);
+      handled = gst_pad_push_event (parse->srcpad, gst_event_ref (event));
+      if (handled)
+        gst_event_unref (event);
       /* Wait for _chain() to exit by taking the srcpad STREAM_LOCK */
       GST_PAD_STREAM_LOCK (parse->srcpad);
       GST_PAD_STREAM_UNLOCK (parse->srcpad);