subtitleoverlay: fix state change stall on PAUSED->READY->PAUSED

After a PAUSED->READY change the sink pads are currently not set to
blocking state. When the element is set back to PAUSED, the change will
be done asynchronously, but as the _pad_blocked_cb() callback is now not
called, the state change never completes.

Fix that by setting the sink pads to blocking state on a PAUSED->READY
change, which ensures that the _pad_blocked_cb() is called when needed
on any future READY->PAUSED change. The sink pads are already put to
blocking state on NULL->READY change, so this behavior is consistent.

Fixes bug #668097.
This commit is contained in:
Anssi Hannula 2012-01-17 16:05:41 +02:00 committed by Vincent Penquerc'h
parent 71f70c98ef
commit dd8f9aca92

View file

@ -1400,6 +1400,15 @@ gst_subtitle_overlay_change_state (GstElement * element,
break; break;
case GST_STATE_CHANGE_PAUSED_TO_READY: case GST_STATE_CHANGE_PAUSED_TO_READY:
GST_DEBUG_OBJECT (self, "State change PAUSED->READY"); GST_DEBUG_OBJECT (self, "State change PAUSED->READY");
/* Set the pads back to blocking state */
GST_SUBTITLE_OVERLAY_LOCK (self);
gst_pad_set_blocked_async_full (self->video_block_pad, TRUE,
_pad_blocked_cb, self, NULL);
gst_pad_set_blocked_async_full (self->subtitle_block_pad, TRUE,
_pad_blocked_cb, self, NULL);
GST_SUBTITLE_OVERLAY_UNLOCK (self);
do_async_done (self); do_async_done (self);
break; break;