PROBE_PUSH (pad, type, data, probe_stopped);
- parent = GST_OBJECT_PARENT (pad);
+ ACQUIRE_PARENT (pad, parent, no_parent);
GST_OBJECT_UNLOCK (pad);
/* NOTE: we read the chainfunc unlocked.
GST_DEBUG_FUNCPTR_NAME (chainlistfunc), gst_flow_get_name (ret));
}
+ RELEASE_PARENT (parent);
+
GST_PAD_STREAM_UNLOCK (pad);
return ret;
}
return ret;
}
+no_parent:
+ {
+ GST_DEBUG_OBJECT (pad, "No parent when chaining %" GST_PTR_FORMAT, data);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+ return GST_FLOW_FLUSHING;
+ }
no_function:
{
+ RELEASE_PARENT (parent);
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
g_critical ("chain on pad %s:%s but it has no chainfunction",
GST_DEBUG_PAD_NAME (pad));
ASSERT_OBJECT_REFCOUNT (bus, "bus", 2);
ASSERT_OBJECT_REFCOUNT (src, "src", 1);
- ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 2);
ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
/* change state to PLAYING, spawning three messages */
* sink might have an extra reference if it's still blocked on preroll
* pipeline posted a new-clock message too. */
ASSERT_OBJECT_REFCOUNT_BETWEEN (src, "src", 2, 3);
- ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 2, 3);
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 2, 4);
ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 3);
pop_messages (bus, 3);
/* src might have an extra reference if it's still pushing */
ASSERT_OBJECT_REFCOUNT_BETWEEN (src, "src", 1, 2);
/* sink might have an extra reference if it's still blocked on preroll */
- ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 1, 2);
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 1, 3);
ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
/* go back to READY, spawning six messages */