concat: dot not reset pad states too early
authorThiago Santos <thiagoss@osg.samsung.com>
Tue, 21 Jul 2015 03:17:28 +0000 (00:17 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Tue, 21 Jul 2015 03:22:25 +0000 (00:22 -0300)
Resetting the flushing state of the pads at the end of the
PAUSED_TO_READY transition will make pads handle serialized
queries again which will wait for non-active pads and might
cause deadlocks when stopping the pipeline.

Move the reset to the READY_TO_PAUSED instead.

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

plugins/elements/gstconcat.c

index 41e93f7..5397c8e 100644 (file)
@@ -797,47 +797,35 @@ gst_concat_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_READY_TO_PAUSED:{
+      GstIterator *iter = gst_element_iterate_sink_pads (element);
+      GstIteratorResult res;
+
       self->format = GST_FORMAT_UNDEFINED;
       self->current_start_offset = 0;
       self->last_stop = GST_CLOCK_TIME_NONE;
-      break;
-    }
-    case GST_STATE_CHANGE_PAUSED_TO_READY:{
-      GstIterator *iter = gst_element_iterate_sink_pads (element);
-      GstIteratorResult res;
 
-      g_mutex_lock (&self->lock);
       do {
-        res = gst_iterator_foreach (iter, unblock_pad, NULL);
+        res = gst_iterator_foreach (iter, reset_pad, NULL);
       } while (res == GST_ITERATOR_RESYNC);
 
       gst_iterator_free (iter);
-      g_cond_broadcast (&self->cond);
-      g_mutex_unlock (&self->lock);
 
       if (res == GST_ITERATOR_ERROR)
         return GST_STATE_CHANGE_FAILURE;
-
       break;
     }
-    default:
-      break;
-  }
-
-  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-  if (ret == GST_STATE_CHANGE_FAILURE)
-    return ret;
-
-  switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:{
       GstIterator *iter = gst_element_iterate_sink_pads (element);
       GstIteratorResult res;
 
+      g_mutex_lock (&self->lock);
       do {
-        res = gst_iterator_foreach (iter, reset_pad, NULL);
+        res = gst_iterator_foreach (iter, unblock_pad, NULL);
       } while (res == GST_ITERATOR_RESYNC);
 
       gst_iterator_free (iter);
+      g_cond_broadcast (&self->cond);
+      g_mutex_unlock (&self->lock);
 
       if (res == GST_ITERATOR_ERROR)
         return GST_STATE_CHANGE_FAILURE;
@@ -848,5 +836,7 @@ gst_concat_change_state (GstElement * element, GstStateChange transition)
       break;
   }
 
+  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
   return ret;
 }