subtitleoverlay: fix state change stall on PAUSED->READY->PAUSED
authorAnssi Hannula <anssi.hannula@iki.fi>
Tue, 17 Jan 2012 14:05:41 +0000 (16:05 +0200)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 20 Jan 2012 17:29:06 +0000 (17:29 +0000)
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.

gst/playback/gstsubtitleoverlay.c

index 3d93c273085ff97a0c136d90e7f971df78539c42..126ffd2af780f4dad7e16c159f06a089f91d0f77 100644 (file)
@@ -1400,6 +1400,15 @@ gst_subtitle_overlay_change_state (GstElement * element,
       break;
     case GST_STATE_CHANGE_PAUSED_TO_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);
 
       break;