launch: don't exit the loop on buffering in paused
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 5 Mar 2013 10:14:41 +0000 (11:14 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 11 Mar 2013 11:28:19 +0000 (12:28 +0100)
When we receive a buffering message of 100% in the paused state, we exit
the event_loop and move to the PLAYING state. What should happen is that
we wait for both ASYNC-DONE and 100% buffering before continueing.

tools/gst-launch.c

index 5d4ee46..bd7a85b 100644 (file)
@@ -493,6 +493,7 @@ event_loop (GstElement * pipeline, gboolean blocking, GstState target_state)
   GstMessage *message = NULL;
   EventLoopResult res = ELR_NO_ERROR;
   gboolean buffering = FALSE;
+  gboolean prerolled = target_state != GST_STATE_PAUSED;
 
   bus = gst_element_get_bus (GST_ELEMENT (pipeline));
 
@@ -665,19 +666,19 @@ event_loop (GstElement * pipeline, gboolean blocking, GstState target_state)
         if (GST_MESSAGE_SRC (message) != GST_OBJECT_CAST (pipeline))
           break;
 
-        /* ignore when we are buffering since then we mess with the states
-         * ourselves. */
-        if (buffering) {
-          PRINT (_("Prerolled, waiting for buffering to finish...\n"));
-          break;
-        }
-
         gst_message_parse_state_changed (message, &old, &new, &pending);
 
         /* if we reached the final target state, exit */
-        if (target_state == GST_STATE_PAUSED && new == target_state)
+        if (target_state == GST_STATE_PAUSED && new == target_state) {
+          prerolled = TRUE;
+          /* ignore when we are buffering since then we mess with the states
+           * ourselves. */
+          if (buffering) {
+            PRINT (_("Prerolled, waiting for buffering to finish...\n"));
+            break;
+          }
           goto exit;
-
+        }
         /* else not an interesting message */
         break;
       }
@@ -698,7 +699,7 @@ event_loop (GstElement * pipeline, gboolean blocking, GstState target_state)
           if (target_state == GST_STATE_PLAYING) {
             PRINT (_("Done buffering, setting pipeline to PLAYING ...\n"));
             gst_element_set_state (pipeline, GST_STATE_PLAYING);
-          } else
+          } else if (prerolled)
             goto exit;
         } else {
           /* buffering busy */