diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c index bb74a24cc3..89bd41e70f 100644 --- a/gst/playback/gstdecodebin2.c +++ b/gst/playback/gstdecodebin2.c @@ -5147,6 +5147,7 @@ activate_failed: { GST_DEBUG_OBJECT (element, "element failed to change states -- activation problem?"); + do_async_done (dbin); return GST_STATE_CHANGE_FAILURE; } } diff --git a/gst/playback/gstplaybin2.c b/gst/playback/gstplaybin2.c index 22faf8a3c7..050cd898a5 100644 --- a/gst/playback/gstplaybin2.c +++ b/gst/playback/gstplaybin2.c @@ -5782,6 +5782,8 @@ gst_play_bin_change_state (GstElement * element, GstStateChange transition) /* ERRORS */ failure: { + do_async_done (playbin); + if (transition == GST_STATE_CHANGE_READY_TO_PAUSED) { GstSourceGroup *curr_group; diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c index 6c5a2cfeb1..1685692d9e 100644 --- a/gst/playback/gstplaysink.c +++ b/gst/playback/gstplaysink.c @@ -4961,6 +4961,7 @@ activate_failed: { GST_DEBUG_OBJECT (element, "element failed to change states -- activation problem?"); + do_async_done (playsink); return GST_STATE_CHANGE_FAILURE; } } diff --git a/gst/playback/gstsubtitleoverlay.c b/gst/playback/gstsubtitleoverlay.c index 3f24fd5df0..719eebb507 100644 --- a/gst/playback/gstsubtitleoverlay.c +++ b/gst/playback/gstsubtitleoverlay.c @@ -1333,8 +1333,11 @@ gst_subtitle_overlay_change_state (GstElement * element, bret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); GST_DEBUG_OBJECT (self, "Base class state changed returned: %d", bret); - if (G_UNLIKELY (bret == GST_STATE_CHANGE_FAILURE)) + if (G_UNLIKELY (bret == GST_STATE_CHANGE_FAILURE)) { + do_async_done (self); return ret; + } + else if (bret == GST_STATE_CHANGE_ASYNC) ret = bret; else if (G_UNLIKELY (bret == GST_STATE_CHANGE_NO_PREROLL)) {