gst-launch: go back down to GST_STATE_NULL in one step.
authorMathieu Duponchelle <mathieu@centricular.com>
Wed, 1 Apr 2020 13:41:49 +0000 (15:41 +0200)
committerMathieu Duponchelle <mathieu@centricular.com>
Wed, 1 Apr 2020 13:41:49 +0000 (15:41 +0200)
Going through each state on the way back down to GST_STATE_NULL
can cause deadlocks, for example:

gst-launch-1.0 audiotestsrc ! valve drop=true ! autoaudiosink

ctrl + C

Hangs forever when going to PAUSED, because the "final" state is
ASYNC, and the sink blocks waiting for a preroll buffer.

Going straight to NULL addresses this issue, and also helps
making teardown faster when piping sparse streams to a
sync sink.

tools/gst-launch.c

index deb22c215f1b9dc717d684c5ef966b0debc15c76..2e8efa5cf6d0cb7e0b44a01d6eb5e8591d3f462b 100644 (file)
@@ -1160,7 +1160,6 @@ main (int argc, char *argv[])
   loop = g_main_loop_new (NULL, FALSE);
 
   if (!savefile) {
-    GstState state, pending;
     GstStateChangeReturn ret;
     GstBus *bus;
 
@@ -1263,22 +1262,10 @@ main (int argc, char *argv[])
       }
     }
 
-    PRINT (_("Setting pipeline to PAUSED ...\n"));
-    gst_element_set_state (pipeline, GST_STATE_PAUSED);
-    if (last_launch_code == LEC_NO_ERROR)
-      gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
-
-    /* iterate mainloop to process pending stuff */
-    while (g_main_context_iteration (NULL, FALSE));
-
     /* No need to see all those pad caps going to NULL etc., it's just noise */
     if (deep_notify_id != 0)
       g_signal_handler_disconnect (pipeline, deep_notify_id);
 
-    PRINT (_("Setting pipeline to READY ...\n"));
-    gst_element_set_state (pipeline, GST_STATE_READY);
-    gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
-
 #if 0
     if (check_index) {
       print_index_stats (index_stats);